WEMOS D1 R1/R2 [ESP8266] + PCA9685 驱动舵机

本文详细介绍了如何使用PCA9685 16通道舵机驱动模块配合WEMOS D1 R1/R2(基于ESP8266)来控制舵机。重点讲解了PCA9685的引脚配置、接线方法以及Arduino IDE中的代码实现,包括设置PWM频率、控制舵机转动。此外,还提供了如何通过修改代码适应不同舵机通道及重置I2C引脚的技巧。
摘要由CSDN通过智能技术生成

WEMOS D1 R1/R2 [ESP8266] + PCA9685 驱动舵机

PCA9685 16-Channel 12-BIT PWM Driver,某些淘宝卖家只是标注了16路舵机驱动模块。

PCA9685上有黄红黑三排针脚(红黑为正负极,黄色为PWM),每排标注0-15,共计16组。每组可以控制一个舵机。

本文以PCA9685代替前述名称。

这里需要注意 SDA和SCL引脚,SDA默认为4,SCL默认为5。

本文以 wemos d1 r1/r2控制,其名称也常带 UNO。外形酷似arduino uno。本质是基于ESP8266,但有5V输出,有DC接口,也可以在VIN供电使用较宽电压供电(如两节3.7V锂电池直接供电),类似arduino uno。
除了Wemos D1 R1与R2外还有D1 开发板 R32基于ESP32均是UNO类型的。理论上均可以使用本文代码,包括ardunio uno。除SDA和SCL针脚不可参考本文其他地方接线也适用。

观察wemos D1 R1开发板上的对应标注的是D4=SDA=D14,D3=SCL=D15。通过wemos D1 R1引脚定义头文件也可知道D4=4,D3=5。
wemos D1 R2开发板也标注了 三处SDA和SCL ,这些是互通的。SDA=D2,SCL=D1。

其它开发板正常情况4和5也是 SDA和SCL引脚。

但是记得WEMOS D1 开发板除D0不支持I2C以外其他引脚均可以,因此用其他引脚也是可以的,需要修改代码。

接线
  • wemos D1 R1/R2 与PCA9685接线

    wemos D1 R1/R2引脚PCA9685引脚
    5VV+
    3.3VVCC
    SDASDA
    SCLSCL
    GNDGND
  • PCA9685与舵机接线

    鄙人使用的SG90舵机,PCA9685上有黄红黑三排针脚,每排0-15,共计16组。每组可以控制一个舵机。

    后文提供的代码,是以0号位的三根黄红黑接入SG90舵机为例。

    PCA9685引脚SG90舵机引脚
    黄色(PWM)黄色
    红色 (V+)红色
    黑色 (GND)棕色
  • 总体接线

舵 机
PCA9685
0
D1 R1/R2
黄色
红色
棕色
V+
VCC
SDA
SCL
GND
黄色PWM
红色V+
黑色GND
3.3V
5V
SDA
SCL
GND
代码
  • 需要库 adafruit/Adafruit PWM Servo Driver Library

    • 使用arduino IDE

      使用arduino IDE可以在库管理 搜索Adafruit PWM Servo Driver Library

      选择 项目 -> 加载库 -> 库管理 打开库管理进行搜索

      或者按 Ctrl + Shift + I 打开库管理进行搜索

      arduino IDE 打开库管理

      Adafruit PWM Servo Driver Library

    • 使用platformio(基于Vscode或者clion)

      platformio.ini添加以下内容:

      lib_deps = adafruit/Adafruit PWM Servo Driver Library@^2.4.0
      
  • 代码内容

    根据自己接入的舵机是[0-15]具体哪一通道需要修改loop中调用 pwm.setPWM 传参的第一个参数。

    本例子是先正转到上限,回正再反转到上限。设置了上限下限和中间值的点。可以根据实际情况调节上下限。
    此处for循环是逐步设置角度,使得稍微丝滑一些,不用循环也是可以的。

    
    #include <Adafruit_PWMServoDriver.h>
    #include <Wire.h>
    
    Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
    
    #define SERVOUP 150    //上限
    #define SERVOMID 375   // 中间值
    #define SERVODOWN 600  // 下限
    
    void setup() {
        Serial.begin(115200);
    
        Serial.println("channel [0] Servo test!");
    
        pwm.begin();
        pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates
    }
    
    void loop() {
        Serial.println("off ");
        for (uint16_t pulselen = SERVOMID; pulselen < SERVODOWN; pulselen++) {
            // 舵机接在 第n组针脚上,则是 pwm.setPWM(n, 0, pulselen);
            pwm.setPWM(0, 0, pulselen);
        }
        delay(500);
        for (uint16_t pulselen = SERVODOWN; pulselen > SERVOMID; pulselen--) {
            pwm.setPWM(0, 0, pulselen);
        }
        Serial.println("on ");
        delay(1000);
        for (uint16_t pulselen = SERVOMID; pulselen > SERVOUP; pulselen--) {
            pwm.setPWM(0, 0, pulselen);
        }
        delay(500);
        for (uint16_t pulselen = SERVOUP; pulselen < SERVOMID; pulselen++) {
            pwm.setPWM(0, 0, pulselen);
        }
    
        delay(3000);
    }
    
    
  • 重设SDA SCL

    若不希望使用默认I2C引脚,同时其他引脚也支持I2C,可以参照当前方法重设I2C引脚。

    读源码可知,调用 TwoWire 的pins函数重设sda /scl引脚

    void TwoWire::pins(int sda, int scl)
    {
        default_sda_pin = sda;
        default_scl_pin = scl;
    }
    

    Adafruit_PWMServoDriver 重设sda scl引脚部分示例,此处只给出了setup函数

    #include <Adafruit_PWMServoDriver.h>
    #include <Wire.h>
    
    TwoWire wire = TwoWire();
    Adafruit_PWMServoDriver pwm =
        Adafruit_PWMServoDriver(PCA9685_I2C_ADDRESS, wire);
        
    void setup() {
        Serial.begin(115200);
        while (!Serial) {
        }
        Serial.println("servoArm start!");
        wire.pins(D11, D10);
        pwm.begin();
    
        pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates
    }
    // 其它内容省略
    
PCA9685是一款常用的16通道PWM控制器,广泛应用于驱动舵机、LED灯等设备。它通过I2C接口与主控板(如Arduino、Raspberry Pi等)通信,可以同时控制多达16个舵机。以下是使用PCA9685驱动舵机的基本步骤: 1. **硬件连接**: - 将PCA9685模块的VCC和GND分别连接到电源和地。 - 将PCA9685模块的SCL和SDA分别连接到主控板的I2C接口。 - 将舵机的信号线连接到PCA9685的PWM输出引脚。 2. **软件配置**: - 安装相应的库。例如,使用Arduino时,可以通过Arduino IDE的库管理器安装Adafruit PCA9685库。 - 编写代码进行初始化和舵机控制。 以下是一个使用Arduino和Adafruit PCA9685库控制舵机的示例代码: ```cpp #include <Wire.h> #include <Adafruit_PWMServoDriver.h> // 创建PCA9685对象 Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); #define SERVOMIN 150 // 最小脉冲长度(由舵机规格决定) #define SERVOMAX 600 // 最大脉冲长度(由舵机规格决定) void setup() { pwm.begin(); pwm.setPWMFreq(60); // 舵机通常工作在60Hz } void loop() { for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++) { pwm.setPWM(0, 0, pulselen); } for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen--) { pwm.setPWM(0, 0, pulselen); } } ``` 在这个示例中,我们首先包含了I2C和Adafruit PCA9685库,然后创建了一个PCA9685对象。`setup`函数中,我们初始化了PCA9685并设置了PWM频率。`loop`函数中,我们通过改变脉冲长度来控制舵机的旋转。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值