做机械臂、六足或多关节机器狗,最先撞的墙多半是同一个:舵机多了,主控的PWM脚不够用。Arduino UNO一共才十几个数字脚,真想驱动六只脚的18个舵机,总不能一个个接主控。这时候PCA9685就该出场了——一块几十块钱的舵机驱动板,一根I2C总线最多拖16个舵机,就是它解决这个问题的底气。今天把接线、供电、扩展一次讲清。
PCA9685到底解决了什么问题
它本质上是块16通道的PWM驱动芯片,专门把"用多少舵机"这件事从主控身上卸下来。常见一颗舵机需要一路PWM信号,而PCA9685用一根I2C总线(只有SCL和SDA两根信号线)就能同时控制16路PWM输出,等于把主控的引脚压力解了。
更关键的是,它在后台由硬件自己产生PWM波形,不用主控反复中断去维持,跑得稳又不占CPU。所以不管是MG996R、MG90S这种模拟舵机,还是DIY机械臂的多关节方案,很多都用它做多舵机控制的核心。
接线:逻辑和电源要分开看
先记一句话:PCA9685上有两种"电"。一种是给芯片和I2C用的逻辑电(VCC和GND),一种是给舵机用的动力电(V+和GND)。很多人接错,就是把舵机直接怼在逻辑5V上,一上电就抽搐或复位。
逻辑侧:把板的VCC接到主控的5V或3.3V,GND接GND,SCL接主控的A5(Arduino)对应引脚,SDA接主控的A4。就这么四根线,PCA9685和主控就通了。
动力侧:V+接的是舵机自己的电源,通常是5V到6V,具体看你用的舵机。MG996R这种力气大的建议5V配电流足够的桌面电源或电池直接供,别指望USB口那点电流;GND一定要和主控共地,不共地信号会乱飘,舵机走两步就抽。
I2C地址和并联:一个板不够怎么办
一块PCA9685管16路,18个舵机的六足显然不够。别急着加第二块,I2C是支持多设备的,PCA9685板子上一排A0-A5焊盘就是用来拨地址的,通过桥接这些焊盘可以把芯片地址从默认的0x40改到不同的值。
这样最多能并几十块板子,每块16路,理论上能驱动几百个舵机。做大型机械臂或者多点位控制,基本都用这个办法扩展。改完地址记得代码里也要把对应的I2C地址声明对,否则控制不到那一块板。
软件:Arduino库几行代码跑起来
接线好、供电稳,剩下的就是软件。Arduino上最常用的是Adafruit_PWMServoDriver这个库,装上后初始化把PWM频率设为50Hz(舵机标准频率),然后一行写脉宽就能让每个通道转起来。
写代码的核心是理解脉宽:给舵机发0.5ms到2.5ms的脉宽,对应0到180度左右。不同舵机、不同批次零位可能略有差异,实际用的时候要先标定一下前后极限,别一上来就把脉宽怼满,容易顶死舵机齿轮。这个坑,改装过360°或者做过机械臂的人应该都懂。
供电避坑:舵机一多抽搐的原因多半在这
舵机一多就抽搐、抖动、或者主控复位,八成不是算法,是供电顶不住。处理器和舵机共用一组小电源,驱动瞬间电流一上冲、电压一掉,逻辑部分就乱了。这就解释了为什么单独调单个舵机没事,一起跑就崩。
解法就两个:一是舵机单独一路电源,别和主控混;二是共地不可省,动力地必须和逻辑地接上,否则信号参考点没有,漂移和乱抖就跑不出来。再不行换个大电流电源或者加电容缓冲,基本就稳了。
总结一下
PCA9685这板子是DIY多舵机项目的实用解:四根I2C线搞定16路PWM,靠拨地址能继续扩展,配合Adafruit库写代码也简单。真正决定项目能不能稳跑起来的,往往是供电和共地这两件容易被忽略的小事。先把这两关过了,你的机械臂或机器狗就不会再一上电就"跳舞"了。


补一句,Adafruit库里的setOscillatorFrequency校准也很关键,不同板子晶振有偏差,跑久了角度会飘,校准一下舵机更跟手。
拨A0-A5焊盘改地址这个是真省事,我并了两块板子控制机械臂,一次点亮,比想象中好弄。
看完最想救的就是共地这一条,以前做多舵机一控制器就各种抽,把动力地和逻辑地单独接稳立刻安静了,这个坑跪过的人应该不少。
这块板子几十块确实香,四根线管16个舵机,收藏了,周末买块来试。
原来V+和VCC是两种电,难怪我之前舵机一直抽筋,回去重新接一遍。