PCA9685 16路舵机驱动板

来自Duinopeak_COM
跳转至: 导航搜索

产品简介

当你的在一个项目中,碰到了微控制芯片的PWM输出引脚不够用的情况,那么这款PCA9685 16路舵机就能很快帮你解决这个问题了!只要你的主控芯片具备了I2C通信,就能够让主控芯片和PCA9685通信,实现多个 舵机的同时控制了。
01aa.jpg0ss2.jpg
PCA9685 16路舵机是一个一个采用i2c通信 ,内置了PWM驱动器和一个时钟。这意味着,这将和TLC5940系列有很大不同。你不需要不断发送信号占用你的单片机! 它是5V的兼容,这意味着你还可以用3.3V单片机控制并且安全地驱动到6V输出(当你想控制白色或蓝色指示灯用3.4+正电压也是可以的) 6地址选择引脚使你可以把62个驱动板挂在单个i2c总线上,总共有992路PWM输出。那将是非常庞大的资源。 约1.6Khz可调频PWM输出 为步进电机准备输出12位分辨率,这意味着在60Hz的更新率能够达到4us分辨率 可配置的推拉输出或开路输出 输出使能引脚能够快速禁用所有输出

注意:由于PCA9685 16路舵机的输出是PWM,所以该控制板不能用来驱动直流或者交流电机,同时也不能用来驱动纯数字舵机。如果你需要连接其他电机的驱动方式,请参阅: 1A 双路电机驱动小板 TB6612FNG,AFMotor Shield 电机扩展板,Ardumoto Shield 电机扩展板.

规格参数

  • PCA9685芯片被包裹在小板的中央
  • 电源输入端子
  • 绿色电源指示灯
  • 在4组3针连接器中方便你一次插入16个伺服电机(伺服电机的插头稍宽于0.1",所以你可以放4对0.1"的接头)
  • 接线板上输入的反向极性保护
  • 级联设计
  • V+线上放置一个大电容(在某些场合你会需要) 外围输入最大电压取决于这个10V1000uf的电容
  • 所有PWM输出线上都放一个220欧姆系列电阻器来保护他们,并能轻易的驱动LED。

应用示例

需要的材料

  1. Arduino开发板
  2. 舵机
  3. 杜邦针若干
  4. usb线

接线

按照下面的图示,用杜邦针将PCA9685和Arduino主控板连接起来,
Servos-and-nunchuck bb.png

编程

下载PCA9685的完整代码,文件:AdafruitPWMServoDriverLibrary.zip,然后放在你的Arduino的工作目录(可以是你自己新建的,也可以是ArduinoIDE下面的Example文件夹),然后将ArduinoIDE的路径指向放有PCA9685的文件夹,
将下面的代码复制到ArduinoIDE,然后上传到Arduino主控板上面

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

// called this way, it uses the default address 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)
#define SERVOMAX  600 // this is the 'maximum' pulse length count (out of 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
}

// 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
  pulselength /= 60;   // 60 Hz
  Serial.print(pulselength); Serial.println(" us per period"); 
  pulselength /= 4096;  // 12 bits of resolution
  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);
  }
  delay(500);
  for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen--) {
    pwm.setPWM(0, 0, 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);
  }
  delay(500);
}

当程序上传到Arduino主控板的时候,是不是已经听到了舵机转动的声音了!

应用场合

  • RGB或RGBA LED驱动器
  • 多路舵机控制,并且可以级联
  • LED状态信息
  • LED显示器
  • LCD背光控制
  • 手机或手持设备的键盘背光


资源


PCA9685 16路舵机驱动板原理图: 文件:Breakout 16 Servo breakout schematic.pdf

PCA9685 16路舵机驱动板程序: 文件:AdafruitPWMServoDriverLibrary.zip

PCA9685 16路舵机驱动板芯片PCA9685数据手册: 文件:PCA9685 ds en.pdf

如何购买

Duinopeak 官方淘宝商城
PCA9685 16路舵机驱动板购买链接

支持

如果你有什么建议或者好的点子, 你可以来我们的DuinoPeak论坛参与讨论.

外部链接

PCA9685来自NXP网站

视频