欢迎光临
我们一直在努力

16路PWM舵机驱动板 示例教程 适用于Arduino平台

1. 产品图片

2. 产品购买地址点我购买

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

4. 产品参数
电压:DC5V供电
通信接口:I2C
产品尺寸:15+61mm
工作电压:3-5V
逻辑电压:3-5V
V+引脚:5V-6V
工作频率: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;

_t的意思到底表示什么?
它就是一个结构的标注,可以理解为type/typedef的缩写,表示它是通过typedef定义的,而不是其它数据类型
头文件内定义:
typedef signed char int8_t;
//无符号整型
typedef unsigned char uint8_t;
typedef int int16_t;
typedef unsigned int uint16_t;

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. 相关下载
百度网盘:点我下载

未经允许不得转载:Arduino-Maker » 16路PWM舵机驱动板 示例教程 适用于Arduino平台

支付宝扫码打赏 微信打赏

原创文章,若帮到您,欢迎打赏

分享到:更多 ()

评论 抢沙发

评论前必须登录!

 

线上商城

中贝斯特创客空间蘑菇云创客教育