使用arduino控制多个PCA968516路舵机控制板从而达到最多可以控制992个伺服舵机

1.摘要

在本教程中,我将向您展示如何使用这些通过 I2C 接口控制的 16 通道 PCA9685 PWM 驱动器将多达992 个伺服器连接到 Arduino。这些板中的每一个都可以驱动多达 16 个舵机或 PWM 输出,您可以将多达 62 个16路舵机驱动板连接在一起,这意味着您可以驱动多达 992 个舵机——全部由 Arduino 上的两个引脚控制。

2.硬件准备

在这里插入图片描述

这是教程和操作中的舵机的视频摘要,请继续阅读后续说明和代码:
为了复现本教程中的内容,您需要一些硬件设备:
Arduino Uno // Arduino 控制板
16 Channel PWM Driver // 16路舵机驱动器,PCA968516即可
Micro Servos// 微型舵机
Ribbon Cable // 杜邦线
Female Pin Header 
Male Pin Header 
5V 5A Power Supply // 5V电源

2.1 舵机控制板说明

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

1.控制输入引脚
每块板有两组控制输入引脚,每侧一个。您可以使用任一组控制输入将您的电路板连接到您的 Arduino,但它们主要用于将驱动程序链接在一起。每个板都可以插入它之前板上的引脚,第一个连接到您的 Arduino。
在这里插入图片描述
2.电源供电处在这里插入图片描述
每块PCA968516舵机控制板的顶部有两个电源端子,需要5-6V电源供电,可以为底部控制舵机的16个输出端提供电源。PCA968516可以直接与舵机的3针插孔相连。你可以把伺服舵机直接插到PCA968516电路板上。
3.每个舵机控制板的地址
在这里插入图片描述
在每个PCA968516板的右上角是一组可桥接的地址跳线(通过短接某些点来更改电路板的通讯地址,便于用一个arduino控制多个舵机控制板),允许桥接不同的组合,为多达62个同时工作的舵机控制板创建一个唯一的地址。如果要改变一个板的地址,只需要在两个地址终端上焊接一个桥接器(短接)。这将改变地址如下:
板0 - Address端子000000(不使用跳线)-地址0x40
板1 -地址端子000001 (A0上的焊料跳线)-地址0x41
板2 -地址端子000010 (A1上的焊料跳线)-地址0x42
板3 -地址端子000011 (A1和A0上的焊料跳线)-地址0x43
等等……
3.舵机控制板也可以用来控制LED灯
你也可以用这些舵机控制板来控制led灯,一个arduino板控制62个舵机控制板从而可以控制992个led灯,并控制它们的亮度。虽然每个通道是完全独立的,但是每个PCA968516单板必须在相同的PWM频率下工作。这意味着,如果你想组合使用led和伺服舵机,你需要将它们分开在两块舵机控制板上,因为伺服舵机通常在50Hz而led在1kHz运行。此外,每个引脚的最大电流输出是25mA,并且已经有220欧姆电阻与所有的PWM引脚串联。

后续会出一个:看看这个使用这些 PCA9685 伺服驱动器构建的 7 段显示时钟。

3.将电路板连接在一起并连接到您的 Arduino

1.为了将两块舵机控制板连接在一起,我们需要在板的右侧焊接一些引脚用于连接下一块舵机控制板。
在这里插入图片描述
焊接后的效果
在这里插入图片描述
2.我们将桥接(焊接)右侧的第二块舵机控制板的地址跳线,以更改第二块板上的地址,以便我们的 Arduino 可以区分两者。
在这里插入图片描述
焊接后的效果
在这里插入图片描述
焊接后的效果
我们再看一下电路板的背面,电路板可以看到有三种地方可以接受电源电压,一个vcc在3-5V、另一个是logic 3-5V还有v+可以到6V,这是供应输出引脚。还有一个注意事项说,在顶部的端子有反向极性保护,而通过控制引脚的一侧的输入没有。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
电源V+在这里插入图片描述
侧面V+在这里插入图片描述
通过上图端子提供的电源被馈送到 V+ 控制引脚,这意味着我们不需要给每块板子的侧边v+供电,除非每个板上都消耗大量电流(驱动多个舵机)。
现在,我们已经添加了第二组控制引脚,并更改了第二板上的地址,你只需要连接4个引脚到你的Arduino和每个板之间,地面,两个I2C引脚和逻辑电源电压VCC。另外两个引脚OE和V+用于使能或关闭单板,并向输出引脚提供电压。我已经创建了带状电缆连接所有六个引脚之间的板,以便输出电压馈送到第二板,以便我可以使用使能引脚在未来,如果需要。
在这里插入图片描述

下图是第一块舵机控制板与arduino连接图在这里插入图片描述
将 PWM 驱动器连接到 Arduino 时,请确保使用正确的 I2C 引脚。
在这里插入图片描述
Vcc只是提供驱动器上的逻辑电路,而不是给舵机输出扭矩供电。为了舵机驱动输出,建议通过电源供电处使用专用电源供电。
在这里插入图片描述
现在继续将您的伺服系统插入电路板上的输出引脚。确保插头以正确的方式放置,棕色线接地,橙色线为 PWM 信号。

4.编程您的 Arduino 以控制伺服系统

通过代码控制每个伺服
我们将使用Adafruit PWM伺服驱动器库。您可以通过进入Sketch -> Include Libraries -> Manage Libraries,然后搜索Adafruit PWM并单击安装,轻松地从Arduino IDE安装这个库。
在这里插入图片描述
安装库后,我们可以编写一个简单的程序来单独移动每个板上的 6 个伺服系统。

//Michael Klements
//The DIY Life
//3 May 2020

#include <Adafruit_PWMServoDriver.h>                             //Include the PWM Driver library

Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x40);    //Create an object of board 1
Adafruit_PWMServoDriver pwm2 = Adafruit_PWMServoDriver(0x41);    //Create an object of board 2 (A0 Address Jumper)

int servoMin =  150;        // This is the servos minimum pulse length count (out of 4096)
int servoMax =  600;        // This is the servos maximum pulse length count (out of 4096)
int servoFrequency = 50;    // Servo update frequency, analog servos typically run at ~50 Hz

void setup()
{
  pwm1.begin();             //Start each board
  pwm2.begin();
  pwm1.setOscillatorFrequency(27000000);    //Set the PWM oscillator frequency, used for fine calibration
  pwm2.setOscillatorFrequency(27000000);
  pwm1.setPWMFreq(servoFrequency);          //Set the servo operating frequency
  pwm2.setPWMFreq(servoFrequency);
}

void loop()
{
  for (int i=0 ; i<=5 ; i++)   //Cycle through moving 6 servos on each board
  {
    for (int pulseLength = servoMin ; pulseLength <= servoMax ; pulseLength++)    //Move each servo from servoMin to servoMax
    {
      pwm1.setPWM(i, 0, pulseLength);           //Set the current PWM pulse length on board 1, servo i
      pwm2.setPWM(i, 0, pulseLength);           //Set the current PWM pulse length on board 2, servo i
      delay(1);
    }
    delay(100);
    for (int pulseLength = servoMax ; pulseLength >= servoMin ; pulseLength--)    Move each servo from servoMax to servoMin
    {
      pwm1.setPWM(i, 0, pulseLength);           //Set the current PWM pulse length on board 1, servo i
      pwm2.setPWM(i, 0, pulseLength);           //Set the current PWM pulse length on board 2, servo i
      delay(1);
    }
    delay(100);
  }
  delay(500);
}

下载Sketch - pca9685教程
我们从导入Adafruit库开始。
然后,我们为每个连接的板创建一个新对象,并记住更改地址以适合我们使用的地址跳线。
然后,我们为我们的伺服设定了最小和最大行程限制。这是相当重要的,所以你没有过度旅行你的伺服,这可能会导致他们烧毁或剥离齿轮。我们还设置了伺服工作频率。大多数模拟伺服运行在50hz。
在设置功能中,我们启动各板,然后设置振荡器频率和伺服频率。
在环路函数中,我们有一个循环,通过六个伺服数字循环,从0到5按照板输出数字编号。
然后我们有一个循环,驱动当前的伺服器(每块板上一个),从它们的最小位置到它们的最大位置,运动之间有1ms的延迟,这是一个相对缓慢的伺服器运动。
然后,我们等待100毫秒,以相同的速度将这两个伺服器从它们的最大位置移回它们的最小位置。
然后,我们再等待100毫秒,然后进入下两个伺服系统。
一旦所有6个伺服都移动到每块板上,我们等待500毫秒,然后开始再次移动前两个伺服,循环继续。
让我们上传草图,看看伺服的移动。
在这里插入图片描述
能够像这样控制伺服使您能够通过释放Arduino的IO和减少处理负载来构建更复杂的项目,因为这些伺服驱动器产生自己的PWM信号。它们非常适合制造机械臂、行走机器人以及涉及大量led的项目,比如立方体、时钟和简单的游戏。

以上部分的视频讲解:https://www.youtube.com/watch?v=mQK3Scp3Qls
以上部分的文字讲解:https://www.the-diy-life.com/connect-up-to-992-servos-to-an-arduino-using-just-2-pins/

其他教程:使用PCA9685模块和Arduino V2控制16台伺服电机
https://www.youtube.com/watch?v=bal2STaoQ1M
http://robojax.com/learn/arduino/?vid=robojax_PCA9685-V2

https://howtomechatronics.com/how-it-works/how-servo-motors-work-how-to-control-servos-using-arduino/
在这里插入图片描述

  • 16
    点赞
  • 138
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
以下是用Arduino控制光电开关和PCA9685舵机的示例代码: ```C++ #include <Wire.h> #include <Adafruit_PWMServoDriver.h> #define SERVOMIN 150 // 舵机的最小脉冲宽度 #define SERVOMAX 600 // 舵机的最大脉冲宽度 #define SERVO_FREQ 50 // 脉冲频率 Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); // 创建PCA9685对象 int pin_sensor = 2; // 光电开关连接的引脚 int servo_channel = 0; // 舵机连接的通道 void setup() { pinMode(pin_sensor, INPUT_PULLUP); // 配置光电开关引脚为输入模式,启用上拉电阻 pwm.begin(); // 初始化PCA9685 pwm.setPWMFreq(SERVO_FREQ); // 设置脉冲频率 } void loop() { // 读取光电开关状态 int sensor_state = digitalRead(pin_sensor); // 如果光电开关被按下,将舵机角度设置为90度 if (sensor_state == LOW) { int pulse_width = SERVOMIN + (SERVOMAX - SERVOMIN) / 2; pwm.setPWM(servo_channel, 0, pulse_width); } // 如果光电开关没有被按下,将舵机角度设置为0度 else { int pulse_width = SERVOMIN; pwm.setPWM(servo_channel, 0, pulse_width); } } ``` 这个代码使用了Adafruit的PCA9685库来控制PCA9685舵机驱动器。在`setup()`函数中,我们初始化了PCA9685并设置了脉冲频率。在`loop()`函数中,我们读取了光电开关的状态,并根据状态设置了舵机的角度。如果光电开关被按下,舵机将被设置为90度,否则将被设置为0度。注意,我们使用了`SERVOMIN`和`SERVOMAX`常量来确定舵机的最小和最大脉冲宽度,并使用`SERVO_FREQ`常量来设置脉冲频率。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大家好我是科林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值