用户工具

站点工具


侧边栏

索引

抱歉,您没有权限增加页面
电机和电机驱动板:16路舵机驱动板

1、 产品图片

2、产品购买地址

3、产品概述

此舵机驱动板使用PCA9685芯片,是16通道12bit PWM舵机驱动,用2个引脚通过I2C就可以驱动16个舵机。不仅如此,你还可以通过级联的方式最多级联62个驱动板,总共可以驱动992个舵机!

4、产品参数

  1. 电压:DC5V供电
  2. 通信接口:I2C
  3. 产品尺寸:15+61mm
  4. 工作电压:3-5V
  5. 逻辑电压:3-5V
  6. V+引脚:5V-6V
  7. 工作频率:40-1000HZ

5、接线方式

.主控板————舵机驱动板
.5V—————–VCC
.GND————–GND
.A4—————–SDA
.A5—————–SCL
.舵机—————舵机驱动板
.PWM(黄线)——–PWM(黄色)
.VCC(红线)——— V+(红色)
.GND(黑或褐线)—–GND(黑色)
.外部供电:
.正极———————–V+(外部供电接线柱)
.负极———————–GND(外部供电接线柱)

6、示例程序一

//中贝斯特UltiRobot舵机驱动板16路示例教程
//程序效果:16路舵机同时转动。原理是定义脉宽最大和最小,通过改变0-15号舵机的脉宽大小实现角度转动
//淘宝店地址:zhongbest.taobao.com
//专业Arduino资料网站:www.arduino365.com

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

// called this way, it uses the default address 0x40
///以这种方式调用,它使用默认地址0x40。
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// you can also call it with a different address you want
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);
//也可以用不同的地址调用它

// Depending on your servo make, the pulse width min and max may vary, you 
// want these to be as small/large as possible without hitting the hard stop
// for max range. You'll have to tweak them as necessary to match the servos you
// have!
/*根据你的伺服制作,脉冲宽度最小和最大可能变化,你想要这些尽可能小大而不碰到
硬停止,对于最大范围。你必须调整它们以匹配你的伺服系统!*/
#define SERVOMIN  150 // this is the 'minimum' pulse length count (out of 4096)
//这是“最小”脉冲长度计数(在4096中)
#define SERVOMAX  600 // this is the 'maximum' pulse length count (out of 4096)
//这是“最大”脉冲长度计数(在4096中)

// our servo # counter
//uint8_t servonum = 0;

void setup() {
   Serial.begin(9600);
   Serial.println("16 channel Servo test!");

  pwm.begin();

   pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates
//模拟伺服在60赫兹更新下运行

}

// you can use this function if you'd like to set the pulse length in seconds
// e.g. setServoPulse(0, 0.001) is a ~1 millisecond pulse width. its not precise!
void setServoPulse(uint8_t n, double pulse) {
   double pulselength;//精度浮点数

   pulselength = 1000000;   // 1,000,000 us per second 每秒100万
   pulselength /= 60;   // 60 Hz
   Serial.print(pulselength); Serial.println(" us per period"); 
   pulselength /= 4096;  // 12 bits of resolution 12位分辨率
   Serial.print(pulselength); Serial.println(" us per bit"); 
   pulse *= 1000;
   pulse /= pulselength;
   Serial.println(pulse);
   pwm.setPWM(n, 0, pulse);
}

void loop() {
// Drive each servo one at a time
//Serial.println(servonum);
//每次驱动一个伺服驱动器
//串行打印(伺服);
   for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++) {
     pwm.setPWM(0, 0, pulselen);
     pwm.setPWM(1, 0, pulselen);
     pwm.setPWM(2, 0, pulselen);
     pwm.setPWM(3, 0, pulselen);
     pwm.setPWM(4, 0, pulselen);
     pwm.setPWM(5, 0, pulselen);
     pwm.setPWM(6, 0, pulselen);
     pwm.setPWM(7, 0, pulselen);
     pwm.setPWM(8, 0, pulselen);
     pwm.setPWM(9, 0, pulselen);
     pwm.setPWM(10, 0, pulselen);
     pwm.setPWM(11, 0, pulselen);
     pwm.setPWM(12, 0, pulselen);
     pwm.setPWM(13, 0, pulselen);
     pwm.setPWM(14, 0, pulselen);
     pwm.setPWM(15, 0, pulselen);
   }
   delay(500);
   for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen--) {
     pwm.setPWM(0, 0, pulselen);
     pwm.setPWM(1, 0, pulselen);
     pwm.setPWM(2, 0, pulselen);
     pwm.setPWM(3, 0, pulselen);
     pwm.setPWM(4, 0, pulselen);
     pwm.setPWM(5, 0, pulselen);
     pwm.setPWM(6, 0, pulselen);
     pwm.setPWM(7, 0, pulselen);
     pwm.setPWM(8, 0, pulselen);
     pwm.setPWM(9, 0, pulselen);
     pwm.setPWM(10, 0, pulselen);
     pwm.setPWM(11, 0, pulselen);
     pwm.setPWM(12, 0, pulselen);
     pwm.setPWM(13, 0, pulselen);
     pwm.setPWM(14, 0, pulselen);
     pwm.setPWM(15, 0, pulselen);
   }
   delay(500);
}

7、函数解释

.uint8_t:1字节 uint8_t //无符号整型
.uint16_t:2字节 uint16_t
.B就是Byte,也就是字节;b是bit的缩写,b就是bit,也就是比特位(bit)。B与b不同,注意区分,KB是千字节,Kb是千比特位。
.8bit(比特位)=1Byte(字节);
.1024Byte(字节)=1KB(千字节);
.1024KB(千字节)=1MB(兆字节);
.1MB(兆字节)=1024KB(千字节)=1024*1024B(字节)=1048576B(字节);
.1024MB=1GB;
.1024GB=1TB;

8、注意事项

  1. 电压供电范围3-5V,不需要很大的电压驱动。
  2. 断电操作,不要在上电情况下进行接线。避免损坏元器件。
  3. 如果自行修改程序后,如何舵机或者舵机驱动板发热,或者舵机抖动,说明程序有问题导致堵转,堵转会产生高电流烧毁舵机或者舵机驱动板,所以如果堵转请尽快断电。

9、示例程序二

这个示例主要是演示如何单独控制每个舵机,主要涉及的是map函数。 接线方式是四个电位器的中间信号引脚分别按序接到主控板的A0、A1、A2、A3(由于A4、A5已经被IIC接口占用,所以UNO最多还能用本示例的方法控制4个舵机,如果需要控制更多舵机的,主控板需要换成MEGA2560。)电位器左侧引脚接VCC,右侧引脚接GND,如果电位器引脚布局不清楚的,可以跳转到我们电位器教程页面。 四个舵机分别接入舵机扩展板的0、1、2、3四排引脚。

//中贝斯特UltiRobot舵机驱动板16路示例教程二
//程序效果:四个电位器分别单独控制四个舵机转动
//淘宝店地址:zhongbest.taobao.com
//专业Arduino资料网站:www.arduino365.c

#include <SPI.h>      //the communication interface with the modem
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

#define SERVOMIN  140 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX  650 // this is the 'maximum' pulse length count (out of 4096)

// our servo # counter
uint8_t servonum = 4;

int msg[5]; //Total number of data to be sent (data package)

int flex_3 = A3;
int flex_2 = A2;
int flex_1 = A1;
int flex_0 = A0;


int flex_3_val;
int flex_2_val;
int flex_1_val;
int flex_0_val;

void setup(){
 Serial.begin(9600);
  Serial.println("16 channel Servo test!");

  pwm.begin();

  pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates

}


void loop(){

  flex_3_val = analogRead(flex_3);
  flex_3_val = map(flex_3_val,0,1024,140,600);

  flex_2_val = analogRead(flex_2);
  flex_2_val = map(flex_2_val,0,1024,140,600);

  flex_1_val = analogRead(flex_1);
  flex_1_val = map(flex_1_val,0,1024,140,600);

  flex_0_val = analogRead(flex_0);
  flex_0_val = map(flex_0_val,0,1024,140,600);


 msg[3] = flex_3_val;
 msg[2] = flex_2_val;
 msg[1] = flex_1_val;
 msg[0] = flex_0_val;


 pwm.setPWM(3, 0, msg[3] );  
 delay(10); 

 pwm.setPWM(2, 0, msg[2] );  
 delay(10); 

 pwm.setPWM(1, 0, msg[1] );
 delay(10); 

 pwm.setPWM(0, 0, msg[0] );  
 delay(10); 

  }

效果演示:观看视频

10、相关资料下载

电机和电机驱动板/16路舵机驱动板.txt · 最后更改: 2019/08/18 16:57 由 ultirobot