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

2023-05-16

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/
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 无法通过 USB 将计算机时间同步到 Arduino

    我想将时间从我的电脑同步到arduino 我正在使用他们的时间库 但它不起作用 如何让arduino与我的电脑上的时间相同 我目前使用的是Mac 他们的文件说 在unix系统上 可以使用shell命令设置时间 TZ adjust 8 ech
  • 将字符串转换为字节数组,然后返回原始字符串

    在Java或Android中是否可以将字符串转换为字节数组 然后将其转换回原始字符串 我的目标是将一些字符串发送到微控制器 Arduino 并将其存储到 EEPROM 这是唯一的 1 KB 中 我尝试使用MD5 http en wikipe
  • Arduino 支持线程吗?

    我有几个任务需要用arduino来做 但其中一个需要很长时间 所以我想使用线程来同时运行它们 我有一个 Arduino Mega 更新 四年后 我终于可以在我的 arduino mega 上安装 FreeRTOS 这里有一个link htt
  • android BluetoothChat 使用来自另一个类的发送接收方法

    您好 我使用 BluetoothChat 示例来与 arduino 进行通信 到目前为止 一切正常 现在我想访问 sendMessage 方法 以便能够不从主类发送数据 而是从我创建的另一个类发送数据 这是BluetoothChat jav
  • 如何在观察者中处理具有不同状态值类型的 Observables

    首先是上下文和问题 框架代码在帖子底部 我们正在创建并实现一个 C 框架 以便在 Arduino 等环境中使用 为此 我想使用观察者模式 其中任何对传感器状态变化感兴趣的组件 Observables 可以注册自己 并且它将通过 Observ
  • 如何在Arduino上将int转换为字符串?

    如何转换 int n 到一个字符串 以便当我通过串行发送它时 它作为字符串发送 这是我到目前为止所拥有的 int ledPin 13 int testerPin 8 int n 1 char buf 10 void setup pinMod
  • 蓝牙 HC-05 发送错误 1F 仅适用于 INQ 命令

    我的新蓝牙 HC 05 模块有问题 在 AT 模式下 它可以与我需要的所有命令完美配合 除了 INQ 我已经尝试事先发送一大堆其他命令 AT INIT OK AT ORGL OK AT ROLE 1 OK AT CLASS 0 OK 他们都
  • 读取串行端口 - 忽略在一定时间内写入串行端口的部分数据

    我想定期读取串行端口上的数据和Arduino 所以本质上是这样的 读一读 Wait 读一读 Wait Take etc 我面临的问题是端口将缓冲其信息 因此一旦我调用等待函数 串行端口上的数据就会开始缓冲 等待函数完成后 我尝试再次读取数据
  • Android 和 Arduino 都通过蓝牙接收奇怪的值

    我正在 Android 端使用 BluetoothChat 代码使用聊天框向 Arduino UNO 发送开 关信号 我发送 110 119 或下面定义的其他情况 但是当我显示接收到的值时 它显示奇怪的Arduino 串行监视器中的值 即
  • Arduino:使用串口和软件串口与蓝牙模块

    我的目的是使用 Arduino 通过 HC 05 蓝牙模块在 PC 和 Android 设备之间建立通信 我使用 PC 和 Arduino 串行监视器 之间的 USB 通信以及 SoftwareSerial 来连接到 HC 05 我的问题是
  • 如何将值从 Arduino 发送到 Python,然后使用该值

    我正在构建一个使用 Python 进行远程控制的机器人 通过简单的 GUI 通过互联网发送控制消息 我的部分代码 GUI 和控制系统 运行得很好 但我陷入了困境 我正在尝试使用视差平传感器来获取与物体的距离信息Arduino Mega ht
  • Android BLE 扫描与 UUID 过滤器列表混淆

    我正在 Android 移动设备 A 上执行 UUID 过滤扫描 并且有两个测试用例 一个人在另一台 Android 设备 移动设备 b 上使用名为 BLE Scanner 的应用程序来创建具有两个测试服务 每个服务都有自己唯一的 UUID
  • 静态 uint8_t 数组的输入过程和类型

    我目前正在尝试将 Arduino IDE 中的整数变量转换为静态 uint8 t 数组的值 我在用 include
  • C++:将成员函数作为普通函数指针传递的闭包

    我正在尝试调用外部库的成员函数 该函数接受函数指针作为参数 Timer every unsigned long period void callback void 但不幸的是我想传递的参数是一个成员函数 void MyClass the m
  • 是否有通用 I2C 命令来查看设备是否仍然存在于总线上?

    是否有通用的 I2C 命令来查看设备在初始化一次后是否仍然存在于总线上 例如 OLED 显示器 我问这个的原因是为了避免主程序由于库代码中存在无限循环而冻结 当设备断开连接时 例如 Wire 库 在 MCU 启动时 我想检查设备是否可用 并
  • 带/不带类的回调函数指针 C++

    我被困 我正在尝试形成一个函数 它将吃掉无类函数指针和对象中的函数指针 这是我当前的代码 希望能解释更多 它应该在 Arduino 上运行 所以我不能使用大型库 首先 我在 Arduino 上使用这个库 SimpleTimer A time
  • HM10 ble改变特征值AT命令Arduino

    谁能帮我用AT命令写入特征值 或者如何使用Hm10模块将数据从arduino发送到另一个ble设备 HM10发送AT START后 会通告数据包 并且可以检测服务和特征 但特征值是默认的0x00 如何更改 多次检查数据表 但找不到能够执行相
  • ESP8266 I2C从机不确认数据

    我有一个 TM4C123 处理器作为 I2C 主处理器 一个 ESP8266 作为从处理器 对于 ESP 我使用的是 Arduino IDE 并在 2 5 2 版安装了 ESP8266 支持 它应该支持 I2C 从模式 但是 我无法让它工作
  • 如何为 Arduino 或类似的微控制器编写 JavaScript 编译器? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我意识到这个问题会引起一些人的注意 并且我意识到 JavaScript 传统上是一种解释性语言 请让我解释一下 我是一名专门从事 We
  • 如何提高 PySerial 读取速度

    我目前正在构建一台使用 Arduino Mega2560 作为主控制器的机器 Arduino 通过串口连接 获取命令 执行它并每 1ms 吐出一堆测量数据 我有一个运行 Python 的 Raspberry Pi 为用户提供一个漂亮的 GU

随机推荐