You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PCA9685级联驱动SG90舵机:第二块板无响应排查求助

问题描述

三块PCA9685板级联驱动40个SG90舵机,仅第二块板(地址0x41)连接的舵机无响应,其余两块(地址0x40、0x42)正常。已完成以下排查:

  • 按要求设置地址:board2短接A0引脚设为0x41,board3短接A1引脚设为0x42
  • 更换过board2,排除单块板的焊接或硬件故障
  • 检查过各板外接电源电压及接线
  • 尝试用明确位置值测试、注释其他板代码,串口显示发送给board2的指令与其他板一致

核心代码如下:

初始化代码

Adafruit_PWMServoDriver board1 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver board2 = Adafruit_PWMServoDriver(0x41);
Adafruit_PWMServoDriver board3 = Adafruit_PWMServoDriver(0x42);

初始化及频率设置

board1.begin();
board1.setPWMFreq(60); // Analog servos run at ~60 Hz updates
board2.begin();
board2.setPWMFreq(60);
board3.begin();
board3.setPWMFreq(60);

舵机控制代码片段

if (allServo){
 for (int angle = servoAngleMin; angle <= servoAngleMax; angle += servoStep)
 {
  Serial.println("ALL SERVOS");
  for (int i = 0; i < 40; i++)
  {
   board1.setPWM(i, 0, angleToPulse(angle));
   board2.setPWM(i, 0, angleToPulse(angle));
   board3.setPWM(i, 0, angleToPulse(angle));
  }
  delay(100);
  Serial.println("All Servo delay");
 }
排查方向及可能原因

1. I2C地址验证与冲突

  • 用I2C扫描工具(如Arduino内置的I2C Scanner示例程序)确认board2的实际地址是否为0x41:先单独连接board2扫描,再级联三块板扫描,确保三个地址都能被识别。部分PCA9685板的地址跳线可能需要短接到VCC/GND的特定引脚,而非单纯短接A0引脚,需核对板卡手册。
  • 若扫描不到0x41,检查board2的A0引脚短接是否牢固,或尝试更换短接方式(如直接用杜邦线连接A0与VCC)。

2. I2C总线信号完整性

  • board2作为级联中间节点,检查SDA/SCL线路与前后板的连接是否牢固,线路长度是否过长(I2C总线建议长度不超过1米,超长需添加4.7kΩ拉电阻)。
  • 多板级联时可能因拉电阻过多导致信号异常:若每块PCA9685都自带拉电阻,可尝试拆除board2上的拉电阻(通常是板上的0402封装小电阻)后测试。

3. 代码隐性逻辑问题

  • 检查angleToPulse函数的输出值是否在SG90舵机的有效PWM范围内(一般为100-500对应0-180度),若输出值超出PCA9685的12位PWM范围(0-4095),board2无法输出有效信号。
  • 单独编写测试代码控制board2:仅初始化board2,调用board2.setPWM(0, 0, 300);(舵机中位值),验证单舵机是否动作,排除循环中索引i超过board2通道数(PCA9685仅16通道,i>15的操作无效,但前16个通道应正常)的问题。
  • 验证board2初始化是否成功:Adafruit库的begin()返回bool值,添加代码确认:
    if (!board2.begin()) {
      Serial.println("Board2 init failed!");
      while(1);
    }
    

4. 电源供电细节

  • 单独为board2的外接电源供电,断开其他板的电源,测试舵机是否动作(多舵机启动时电流需求大,可能导致中间板电压骤降)。
  • 检查board2的VCC/GND引脚是否存在虚焊,或接线时是否将GND接反。

5. 芯片复位操作

  • 给board2的RESET引脚单独做复位:将RESET引脚连接到Arduino数字引脚,初始化前执行复位:
    pinMode(2, OUTPUT); // 假设RESET接数字2引脚
    digitalWrite(2, LOW);
    delay(10);
    digitalWrite(2, HIGH);
    delay(10);
    board2.begin();
    

内容的提问来源于stack exchange,提问作者Utopist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 11:43:26