六足机器人、多关节机械爪、人形小模型,一上来就是十几个舵机。Arduino Uno 满打满算十几个 PWM 引脚,全喂给舵机还不够,还得自己算定时器资源。PCA9685 这块 16 路 PWM 驱动板就是干这个的:板载 12 位 PWM 控制器,通过 I2C 总线只用 SDA、SCL 两根信号线就能管 16 路舵机,16 路同时出波,主控几乎不占算力。官方页还给了个更夸张的数:多板可级联最多 62 块,同一对总线控制 992 个舵机。这篇按 Adafruit 官方教程(2012 年首发,2026 年 8 月还在更新)把接线、地址、库用法过一遍。

为什么用 I2C 扩展 PWM,而不是硬占引脚
Arduino 自带的 Servo 库驱动一个舵机就要吃掉一个引脚,还搭上一点处理能力。PCA9685 的思路是把 PWM 波形生成整个搬下板:主控通过 I2C 只发"目标位置"这种指令,16 路 PWM 由板上芯片独立输出,互不干扰。对六足这种 12 到 18 个关节的项目,引脚压力和刷新开销一起解决。
还有一个省心的点:级联不增线。板子两头都留了引脚排,第二块板用排线接到第一块板上,地址错开就行,还是那两根 I2C 线。对要多扩一路"感知+执行"的玩家,I2C 总线比一排 PWM 引脚干净得多。
引脚认识:两组电源要分清

板子两侧的控制输入引脚完全一样,接哪边都行,也方便级联并排插线。电源分两组,这是新手最容易混的地方:
VCC 是逻辑电源,给板上芯片供电,接 3 到 5V,别超 5V。SDA、SCL 上的 10K 上拉电阻也挂在 VCC 上,所以 VCC 最好和主控逻辑电平一致。GND 是电源和信号共用地,必须接。V+ 是舵机功率电源,芯片完全不用它,可从端子排或每路的 V+ 针脚注入,官方建议 5 到 6V 供电,最高可到 12V 但千万别把 VCC 接到 V+ 上,会烧板。控制线上还有 SCL、SDA(3V/5V 逻辑都行,弱上拉到 VCC)和 OE 使能脚(默认低电平全开,可不接)。
接线:4 根线搞定,舵机单独供电

R3 及以后的 Arduino(Uno、Mega、Leonardo)板边有专用 SDA/SCL 针,直接对连:VCC 接 5V、GND 接 GND、SDA 接 SDA、SCL 接 SCL。老款 Uno 用模拟口 A4 对 SDA、A5 对 SCL;老 Mega 用数字 20 对 SDA、21 对 SCL。
注意 VCC 这路 5V 只是给驱动板供电,不是舵机电源。舵机要走 V+ 独立供电,官方页给的选择是 5V 2A 开关电源(少量舵机)、5V 10A 电源(多路大扭矩)、4 节 AA 电池盒(碱性 6V、镍氢 4.8V)或 4.8/6V 航模电池组。微型舵机动起来也要几百 mA,大扭矩舵机堵转单只可超 1A,全插在 Arduino 的 5V 上必然重启或复位。多板级联时,端子排电源只在第一块板上注一次就够。

板上有预留的电解电容焊位,电源随舵机动作抖得厉害时可以补焊。官方给的估算起点是每个舵机 100uF,5 只就是 470uF 起步——它取决于舵机电流和电源内阻,没有万能值,所以套件里不配。舵机插排有方向:地线(黑或棕)朝下排,信号线(黄或白)朝上排,大部分标准 3Pin 舵机线可以直接插。
I2C 地址与多板级联设置
默认 I2C 地址是 0x40。板子右上角有 A0 到 A5 一排地址跳线,用焊锡桥接对应位,二进制偏移量加在 0x40 基址上:板 0 不桥接就是 0x40,桥 A0 是 0x41,桥 A1 是 0x42,A0 和 A1 都桥是 0x43,依此类推,链上每块板地址必须唯一。官方页还提到一个 FAQ 坑:芯片另有一个 0x70 的 All Call 地址,如果你的项目里恰好有别的 0x70 设备,把驱动板跳到 0x71 以外的地址就能避开。

代码里每块板声明一个独立的驱动对象,各自 begin:
#include "Wire.h"
#include "Adafruit_PWMServoDriver.h"
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
}
库安装与舵机角度控制
库走 Arduino IDE 的库管理器最省事:搜"adafruit pwm",装 Adafruit PWM Servo Driver(源码在 Adafruit 的 GitHub 仓库)。装完打开 File、Examples、Adafruit_PWMServoDriver 里的 Servo 示例,先确认绿色电源灯亮着,舵机插 0 号通道,应该看到它在大约 180 度范围内来回扫。
两个关键函数。setPWMFreq 设整个板子的 PWM 频率,范围 40 到 1600Hz;舵机标准刷新是 60Hz 左右,16 路共用同一个频率——官方特别提醒不能一半通道跑 1KHz 驱 LED、一半跑 60Hz 驱舵机,要换用途就整板重设。setPWM(channel, on, off) 用 0 到 4095 的 tick 值定义每路脉冲里高电平的起止,例如 pwm.setPWM(15, 1024, 3072) 就是 25% 处拉高、75% 处拉低。
舵机的脉宽上下限各品牌甚至各批次都有差异,示例代码里的 SERVOMIN、SERVOMAX 就是为标定留的:逐步逼近、在到达物理行程极限前停下,分别找准 0 度和 180 度位置。标定完,把角度换算成脉长一行就够,官方原文给的是:
pulselength = map(degrees, 0, 180, SERVOMIN, SERVOMAX);16 路同时动就是循环里对不同 channel 各发一次 setPWM,六足的三角步态、机械爪的多指开合都靠这个结构展开。写代码时要注意:平台会剥掉尖括号头文件,所以上文一律用双引号 include,在 Arduino IDE 下两种写法等价,不影响编译。
收尾几句
PCA9685 的价值在于把"引脚不够"和"主控忙不过来"一起解决:两根 I2C 线换 16 路独立 PWM,电源走 V+ 独立轨道,级联只多一块板的地址。对准备上多关节项目的玩家,这是比一路一路接舵机性价比高得多的路线。参数都取自 Adafruit 官方教程页与 PCA9685 数据手册(站内 Downloads 页可直接下 PDF),逐项核对过,照着接不会踩坑。











VCC 和 V+ 这组电源分离确实是 PCA9685 板子最容易被坑的点。我早年间把六足的舵机全挂在 UNO 的 5V 上,一上电复位循环,查了两天才反应过来是供电问题。文章里 4 节电池盒那个选择很实在,桌面调试 4.8V 镍氢完全够用,动手能力强的直接上 5V 10A 电源一劳永逸。级联那部分也讲得对,A0 到 A5 六个跳线位正好对应 62 块板的上限,地址规划要提前想好,不然两块板撞地址 I2C 扫描都扫不出来。
跟着接了一下,A4/A5 接 SDA/SCL 这里帮大忙了,老 UNO 板边上真没有那两个专用针。
60Hz 别和 1KHz 混用这个提醒很重要,之前见过有人一半通道点 LED 一半驱舵机,结果两边都不对劲。
map 那一行换算脉长是真省事,标定 SERVOMIN/SERVOMAX 的时候记得一点一点来,别一把直接怼到 4095。