PCA9685舵机驱动板I2C地址冲突的排查和解决

2026-10-24 16:22:03 53阅读

用PCA9685做舵机扩展的时候,很多人第一块板子插上就用,16个通道全部跑满都没问题。但当你想接第二块、第三块板子来带更多舵机的时候,I2C地址冲突就成了第一个要解决的坎。这个问题其实不复杂,但网上很多教程讲得含糊,这篇把原理和操作方法一次性说清楚。

PCA9685的默认I2C地址是0x40。每块板子上有6个焊盘(A0到A5),通过焊锡短接不同的焊盘组合可以修改地址。6个焊盘对应6位二进制,理论上一共有64个地址(0x40到0x7F),但实际可用的范围要排除一些保留地址(比如0x70到0x7F是广播地址),所以一块总线上最多能挂大约32块PCA9685。

操作方法很简单。第一块板子不动,地址0x40。第二块板子焊上A0,地址变成0x41。第三块焊A1,地址0x42。以此类推。关键是在代码里初始化的时候要用对应的地址:Adafruit_PCA9685(0x40)、Adafruit_PCA9685(0x41),每块板子单独初始化。

但实际操作中有几个容易翻车的地方。

第一个是焊接质量。A0到A5的焊盘很小,很多人用烙铁手抖焊连了,导致地址不是预期的值。最简单的验证方法是用Arduino的I2C Scanner扫描一遍总线,看返回的地址是不是你期望的。这个Scanner代码只有20行,GitHub上一搜就有。

第二个是I2C总线的上拉电阻。PCA9685板子上自带了上拉电阻(一般是10K),但如果你挂了很多块板子,总线的电容会增加,信号上升沿变慢,最终导致通信不稳定。经验法则是:同一总线上超过4块PCA9685时,建议在SDA和SCL线上各加一个4.7K的外部上拉电阻。如果总线长度超过30厘米,还需要考虑用I2C总线缓冲器(比如PCA9600)来隔离和增强信号。

第三个是电源问题,这个比地址冲突更容易被忽略。PCA9685的逻辑电源(VCC,给芯片用)和舵机电源(V+,给舵机用)是分开的。但很多人只接了VCC没接V+,或者V+的电源功率不够带16个舵机同时转动。单个SG90舵机峰值电流大约700mA,16个同时动就是11A,需要至少15A的电源余量。实际使用中不可能16个同时满载,但至少要按8到10个同时工作来算电源。

如果你的项目需要超过32块PCA9685(512个通道),I2C地址就不够用了。这时候的解决方案是换用I2C多路复用器(比如TCA9548A),它可以在一条I2C总线上分出8条独立子总线,每条子总线都能跑自己的地址范围。两块TCA9548A就能覆盖16条子总线,理论上一共能挂512块PCA9685,8192个通道。当然,走到这一步的时候,你可能该考虑换CAN总线的舵机方案了。


作者:舵机老炮
链接:https://www.aiddithome.com/p/8fc6f2086e2d3.html
本作版权归作者所有,未经允许请勿转载。若存在违规行为,您可以点击 “举报”。


登录 后发表评论
4条评论
锡点
1楼 · 2026-10-24 16:22:04

上拉电阻这个问题太真实了,我挂了5块PCA9685就开始丢包,加了4.7K上拉立马稳定

探头看一眼
2楼 · 2026-10-24 16:22:04

电源问题很多人确实会忽略。SG90同时转16个的电流真的很大,我后来换成了MG996R才发现更费电

拆开看看再说
3楼 · 2026-10-24 16:22:04

TCA9548A多路复用器是个好方案,不过代码要改一下,每次切换子总线要先写TCA的寄存器

阿伟不emo
4楼 · 2026-10-24 16:22:03

I2C Scanner确实是排查地址冲突的神器,我之前一块板子怎么都不响应,扫了一下才发现焊盘连了