adafruit_products_ID815servo_LRG.jpg
Arduino的Servo库驱动舵机是很容易的,但是会占用宝贵的引脚,还会占用Arduino的处理能力。PCA9685模块拥有16通道,12位PWM,可以驱动16个舵机,并且只占用了I2C的2个引脚!板载PWM控制器可以同时驱动所有的16个信道,无需Arduino的处理。更重要的是,你可以连接多达62个模块,一共992个舵机,还是只用2个引脚!

PCA9685模块特别适用于需要大量舵机项目。
adafruit_products_hexapod.jpg
连接到Arduino
PCA9685模块采用I2C,所以只需要4根导线连接到你的Arduino:

Arduino连线(Uno, Mega & Leonardo):

  • 5V - > VCC(仅仅给模块供电,而不是舵机的电源!) GND - > GND SDA - > SDA SCL - > SCL adafruit_products_I2C_bb-1024.jpg VCC引脚仅仅是给芯片本身供电。如果想使用的V+引脚连接舵机或LED,则必须给V+供电。即使VCC为3.3V(该芯片也可以使用5V),V+引脚电压可以高达6V。我们建议通过蓝色接线端子连接电源。 舵机电源 大多数舵机设计为在5V~6V运行。但是请记住,很多舵机在同一时间运动(尤其是大功率的舵机)需要大量的电流。即使微型舵机在运动时也会消耗几百毫安。一些高扭矩舵机每个会消耗1A以上。

良好的电源选择是:
5V 2A开关电源
5V 10A开关电源
4xAA电池座 - 6V的碱性电池。4.8V的镍氢充电电池。
4.8或6V 舵机专用电池组。
不要用Arduino的5V引脚给舵机供电!电气噪声和大电流消耗导致的“限电”可能会使Arduino运行错误,复位和发烫。
adafruit_products_Connections_bb-1024.jpg
连接舵机
大多数舵机都是标准的3针排母可以直接插入PCA9685模块的排针。一定要对准信号线(通常为黄色或白色)和地线(通常为黑色或棕色)。
adafruit_products_Servo_bb-1024.jpg
使用更多舵机
一个板可以使用16个舵机。如果需要控制16个以上的舵机系统,可以再加入额外的驱动板。
adafruit_products_AllServos_bb-1024.jpg
多个PCA9685模块 由 比尔·厄尔
多个PCA9685模块(最多62个)可以控制更多的舵机。可以直接用6pin排母从一个板连到下一个。
adafruit_products_MultiBoard_bb-1024.jpg
I2C地址
每个板都必须分配唯一的地址。这是通过右上角的地址跳线来完成。每个板的I2C基地址是0x40,使用跳线设置的二进制偏移地址加上基地址就是板子的真实地址。

为了设置偏移地址,在焊盘上使用焊锡将焊盘连接起来,意味着相应的二进制位为“1”。
adafruit_products_2012_10_13_IMG_0692-1024.jpg
板0:地址= 0x40的偏移=二进制00000(无需焊接跳线)
板1:地址= 0x41的偏移=二进制00001(焊上A0如上图)
板2:地址= 0x42的偏移=二进制00010(焊上A1)
板3:地址= 0x43的偏移=二进制00011(焊上A0和A1)
板4:地址= 0x44的偏移=二进制00100(焊上A2)

以此类推
在你的Arduino程序中,你需要为每个板声明一个单独的对象。每个对象先调用begin进行初始化,并通过这个对象可以控制相应的舵机。例如:

include

include

Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver pwm2 = Adafruit_PWMServoDriver(0x41);

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

pwm1.begin();
pwm1.setPWMFreq(1600); // This is the maximum PWM frequency

pwm2.begin();
pwm2.setPWMFreq(1600); // This is the maximum PWM frequency
}

安装PCA9685模块的库
由于驱动器使用I2C总线,非常容易与其他微控制器或微计算机控制。在本演示中,我们将使用Arduino的IDE,但Arduino很容易移植到C++。
下载
可以访问GitHub的仓库手动下载,或者直接点击下面的按钮。
下载
解压缩之后,确认Adafruit_ PWMServoDriver文件夹包含Adafruit_PWMServoDriver.cpp 和 Adafruit_PWMServoDriver.h

将Adafruit_ PWMServoDriver文件夹放在Arduino的sketch目录/libraries/ 文件夹中。
如果你使第一次使用库,你可能需要创建libraries文件夹,重新启动IDE。

如果你对如何安装库不懂,可以看下面的教程:
http://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use
用示例代码进行测试:
首先确保Arduino的IDE已关闭。

接着打开Arduino的IDE,然后选择文件- > Examples-> Adafruit_PWMServoDriver->servo。这将在IDE窗口中打开示例文件。
adafruit_products_demo.png
按照之前说的连接驱动板。不要忘记提供Vin与V+的电源,Vin是(3-5V)逻辑电平,V+是舵机供电的电源。确认绿色指示灯是点亮的!

连接舵机
将一个舵机插入的PWM#0端口,就是第一个端口。你应该可以看到舵机来回180度转动。
校准舵机
舵机的脉冲时间对于不同品牌和型号是不同的。模拟舵机是模拟电路,常常同一型号也有一些差异。对于精确的位置控制,你会想要用代码校准最小和最大脉宽来匹配舵机的准确位置。

找出最小脉宽:
使用示例代码,编辑SERVOMIN的值,直到最低点 到达行程的极限。

找到最大脉宽:
再次使用示例代码,编辑SERVOMAX的值,直到最高点 到达行程的极限。
调整SERVOMIN和SERVOMAX时要非常小心。击中行程开关可能会崩齿并永久损坏舵机。
转换角度到脉冲长度
Arduino的map函数可以很简单的转换校准角度和脉冲长度。对于180度的典型舵机; 一旦确定SERVOMIN是0度位置,SERVOMAX是180度的位置,则可以使用下面的代码将0~180度的角度转换成相应的脉冲长度:
pulselength = map(degrees, 0, 180, SERVOMIN, SERVOMAX);
代码文档
setPWMFreq(freq)
描述
此功能用于调整PWM频率,决定了PCA9685每秒生成多少完整的脉冲。换句话说,考虑到脉冲的高段和低段,频率决定了每个脉冲从开始到结束的持续时间的“长度”。

频率在PWM非常重要,如果设定的频率太高了,非常小的占空比可能会导致问题,因为“上升时间”的信号(它从0V到VCC的时间)可能会比有效时间更长,且PWM输出端出现平滑,甚至可能无法到达VCC,潜在地导致了一些问题。

参数
频率:单位赫兹,40和1000之间

下面的代码将设置PWM频率达到1000Hz:
复制代码
PWM .setPWMFreq(1000)
setPWM(channel, on, off)
描述
该函数设置特定通道上PWM脉冲的高电平的开始(开)和结束(关)。

参数
channel:会被设置的信道(0~15)
on:当时间为这个参数的值时(0~4095),信号应该从低到高跳变
off:当时间为这个参数的值时(0~4095),信号应该从高到低跳变


下面的例子将设置信道15,开始为低,当第1024个滴答变高,3072个滴答变低,所以占空比为50%:
复制代码
pwm.setPWM(15, 1024, 3072)
常问问题
这个板子能用于LED吗?还是只能用于舵机?
它可用于LED,以及任何其他PWM的装置
我怎么使LED完全灭?
使用setPWM(pin, 4096, 0);而不是setPWM(pin, 4095, 0);
我不能用这个模块使我的7段LED显示工作。
该PCA9865芯片具有0x70的“呼叫”地址。这是用于配置的地址。其他芯片的地址如果为0x70将导致地址冲突。
下载
PCA9685数据手册
Arduino的驱动程序库
在GitHub上EagleCAD PCB文件
在Adafruit的Fritzing库Fritzing对象
电路图及PCB
adafruit_products_schem.png
adafruit_products_fabprint.png