ESP32 + PCA9685(16通道 PWM 扩展模块)来驱动多个 9g 舵机

PCA9685的引脚定义等详细信息参考这个链接

PCA9685的引脚定义及其驱动板详解

接线参考

PCA9685 引脚 接线说明
VCC 接 ESP32 的 3.3V
GND 接 ESP32 的 GND
SDA 接 ESP32 的 SDA(例如 GPIO21)
SCL 接 ESP32 的 SCL(例如 GPIO22)
V+ 接舵机电源 5V(推荐独立供电)

通常这些插槽的排布是这样的(以常见的 3 排舵机接口为例):

每个插槽从左到右:

[ GND | V+ | PWM ]

所以插入舵机时:

  • 棕色/黑色线(GND) → 接 GND
  • 红色线(VCC) → 接 V+(舵机电源,推荐 5V 外部电源)
  • 黄色/橙色线(信号/PWM) → 接 PWM 通道输出

通道编号说明

第 0 路(通道 0)
第 1 路(通道 1)
......
第 16 路(通道 16)

你可以在代码中直接操作1~ 16号通道控制16个舵机。

示例代码:控制左边 4 个舵机

#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

#define SERVO_MIN  150
#define SERVO_MAX  600

int angleToPulse(int angle) {
  return map(angle, 0, 180, SERVO_MIN, SERVO_MAX);
}

void setup() {
  Serial.begin(115200);
  Wire.begin(21, 22);  // ESP32 默认 I2C

  pwm.begin();
  pwm.setPWMFreq(50);  // 50Hz 是舵机控制标准
  delay(1000);
}

void loop() {
  // 控制 0~3 四个舵机来回摆动
  for (int angle = 0; angle <= 180; angle += 5) {
    for (int ch = 0; ch < 4; ch++) {
      pwm.setPWM(ch, 0, angleToPulse(angle));
    }
    delay(30);
  }

  for (int angle = 180; angle >= 0; angle -= 5) {
    for (int ch = 0; ch < 4; ch++) {
      pwm.setPWM(ch, 0, angleToPulse(angle));
    }
    delay(30);
  }
}

有些同学可能会想要了解实现这个控制的底层封装 or 对寄存器的操作?etc 这里不多赘述了!

posted @ 2025-08-12 11:44  huh&uh  阅读(205)  评论(0)    收藏  举报