电路板如下图:
组件
PCA9685PW,112 | x 1 |
RC0603FR-0710KL 10k |
× 9 |
SG73P1JTTD2203F KOA Speer 电子公司 |
× 17 |
156125YS75000 伍尔特电子 |
x 1 |
IRLML6401 UMW(广东友台半导体) |
x 1 |
593D106X9016A2TE3 威世斯普拉格 |
x 1 |
描述
带PWM控制的伺服电机控制卡
您能想象通过互联网控制任何设备吗?灯、灌溉水泵、门驱动器和许多其他东西。
该板结合了多项功能,可让您自动化和控制连接到互联网的设备。
该项目是与印刷电路板制造商 PCBWay 共同开发的。您可以访问该站点,下载所有电子板文件并免费获得 10 个 PCBWay 单元。
阅读全文并逐步了解接收电子板的步骤。
市场上有多种解决方案可用于通过互联网控制设备。但是,有一个很大的问题:你不能修改控制代码。这会阻止您创建自己的想法并根据您或客户的需要创建一些东西。
PCA8695 PWM 伺服控制器 PCBWay 板的电子原理图
伺服控制电路及编程
编程
连接到 Arduino
PWM/伺服驱动器使用 I2C,因此只需 4 根线即可连接到您的 Arduino:
“经典”Arduino 接线:
+5v -> VCC(这只是 BREAKOUT 的电源,不是伺服电源!)
接地 -> 接地
模拟 4 -> SDA
模拟 5 -> SCL
较旧的 Mega 接线:
+5v -> VCC(这只是 BREAKOUT 的电源,不是伺服电源!)
接地 -> 接地
数字 20 -> SDA
数字 21 -> SCL
R3 及之后的 Arduino 布线(Uno、Mega 和 Leonardo):
(这些板在最靠近 USB 连接器的接头上有专用的 SDA 和 SCL 引脚)
+5v -> VCC(这只是 BREAKOUT 的电源,不是伺服电源!)
接地 -> 接地
SDA -> SDA
SCL -> SCL
舵机电源
大多数伺服系统设计为在大约 5 或 6v 的电压下运行。请记住,许多伺服系统同时移动(特别是大而强大的伺服系统)将需要大量电流。即使是微型伺服系统在移动时也会消耗数百毫安。一些高扭矩伺服系统在负载下会消耗超过 1A 的电流。
好的电源选择是:
5v 2A开关电源
5v 10A开关电源
4xAA 电池座 - 6v 碱性电池。4.8v 镍氢充电电池。
来自爱好商店的 4.8 或 6v 可充电 RC 电池组。
将电容器添加到通孔电容器插槽
我们在 PCB 上有一个用于焊接电解电容器的点。根据您的使用情况,您可能需要也可能不需要电容器。如果您从电源驱动大量伺服电机,当伺服电机移动时电源电压下降很多,n * 100uF(其中 n 是伺服电机的数量)是一个很好的起点 - 例如 470uF 或更多用于 5 个伺服电机。由于它如此依赖于伺服电流消耗、每个电机的扭矩和电源,因此我们无法建议“一个神奇的电容器值”,这就是我们不在套件中包含电容器的原因。将电容器添加到通孔电容槽
连接舵机
大多数伺服系统都带有一个标准的 3 针母连接器,可直接插入伺服驱动器的接头中。务必将插头与地线(通常为黑色或棕色)与最下面一行和顶部的信号线(通常为黄色或白色)对齐。连接舵机
添加更多伺服系统
一块板上最多可以连接 16 个舵机。如果您需要控制 16 个以上的舵机,可以按照下一页所述链接其他板。
链接驱动程序
可以链接多个驱动器(最多 62 个)以控制更多的伺服系统。电路板两端都有接头,接线就像将 6 针并行电缆从一个电路板连接到另一个电路板一样简单。
向董事会致辞
链中的每个板都必须分配一个唯一的地址。这是通过板右上边缘的地址跳线完成的。每个板的 I2C 基地址是 0x40。您使用地址跳线编程的二进制地址被添加到 I2C 基址。
要对地址偏移量进行编程,请使用一滴焊料桥接地址中每个二进制“1”的相应地址跳线。
板 0:地址 = 0x40 偏移量 = 二进制 00000(无需跳线)
Board 1: Address = 0x41 Offset = binary 00001 (bridge A0 as in the photo above)
电路板 2:地址 = 0x42 偏移量 = 二进制 00010(桥 A1)
电路板 3:地址 = 0x43 偏移量 = 二进制 00011(桥 A0 和 A1)
电路板 4:地址 = 0x44 偏移量 = 二进制 00100(桥 A2)
等等
在您的草图中,您需要为每个板声明一个单独的 pobject。在每个对象上调用 begin,并通过它所附加的对象控制每个伺服。例如:
#include
#include
Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver pwm2 = Adafruit_PWMServoDriver(0x41);
无效设置(){
序列号.begin(9600);
Serial.println("16通道PWM测试!");
pwm1.开始();
pwm1.setPWMFreq(1600); // 这是最大 PWM 频率
pwm2.开始();
pwm2.setPWMFreq(1600); // 这是最大 PWM 频率
}
使用 Adafruit 库
由于 PWM 伺服驱动器是通过 I2C 控制的,因此它非常容易与任何微控制器或微型计算机一起使用。在这个演示中,我们将展示如何将它与 Arduino IDE 一起使用,但 C++ 代码可以轻松移植
安装 Adafruit PCA9685 库
要开始读取传感器数据,您需要安装 Adafruit_PWMServo 库(我们的 github 存储库中的代码)。它可从 Arduino 库管理器获得,因此我们建议使用它。
从 IDE 打开库管理器...并输入 adafruit pwm 以找到库。点击安装
我们还有一个关于 Arduino 库安装的很棒的教程:
http://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use
使用示例代码进行测试:
首先确保关闭 Arduino IDE 的所有副本。
接下来打开 Arduino IDE 并选择 File->Examples->Adafruit_PWMServoDriver->Servo。这将在 IDE 窗口中打开示例文件。
如果使用突破:
如上一页所示连接驱动板和舵机。不要忘记为 Vin(3-5V 逻辑电平)和 V+(5V 伺服电源)供电。检查绿色 LED 是否亮起!
如果使用盾牌:
将扩展板插入您的 Arduino。不要忘记,您还必须为 V+ 接线端子提供 5V 电压。红色和绿色 LED 都必须点亮。
如果使用 FeatherWing:
将 FeatherWing 插入您的 Feather。不要忘记,您还必须为 V+ 接线端子提供 5V 电压。检查绿色 LED 是否亮起!
连接伺服
单个伺服应插入 PWM #0 端口,第一个端口。您应该看到舵机在大约 180 度范围内来回扫过。
校准你的舵机
伺服脉冲时序因品牌和型号而异。由于是模拟控制电路,同品牌同型号样品之间往往存在一定差异。对于精确的位置控制,您需要校准代码中的最小和最大脉冲宽度以匹配伺服的已知位置。
找到最小值:
使用示例代码,编辑 SERVOMIN,直到扫描的低点达到最小行程范围。最好逐渐接近并在达到行程的物理极限之前停止。
找到最大值:
再次使用示例代码,编辑 SERVOMAX,直到扫描的高点达到最大行程范围。同样,最好逐渐接近并在达到行程的物理极限之前停止。
从度数转换为脉冲长度
Arduino“map()”函数是一种在旋转度数与校准的 SERVOMIN 和 SERVOMAX 脉冲长度之间进行转换的简单方法。假设一个典型的舵机旋转 180 度;将 SERVOMIN 校准到 0 度位置并将 SERVOMAX 校准到 180 度位置后,您可以使用以下代码行将 0 到 180 度之间的任何角度转换为相应的脉冲长度:
pulselength = map(度, 0, 180, SERVOMIN, SERVOMAX);
图书馆参考
setPWMFreq(频率)
描述
此功能可用于调整 PWM 频率,它决定了 IC 每秒产生多少完整“脉冲”。换句话说,考虑到脉冲的高段和低段,频率决定了每个脉冲从开始到结束的持续时间“有多长”。
频率在 PWM 中很重要,因为将频率设置得太高且占空比非常小会导致问题,因为信号的“上升时间”(从 0V 到 VCC 所需的时间)可能长于时间信号有效,PWM 输出将显得平滑,甚至可能达不到 VCC,这可能会导致许多问题。
参数
freq:表示频率的数字,单位为 Hz,介于 40 和 1600 之间
例子
以下代码将 PWM 频率设置为 1000Hz:
脉宽调制.setPWMFreq(1000)
setPWM(通道,开,关)
描述
此函数设置特定通道上 PWM 脉冲高段的开始(开)和结束(关)。当信号打开和关闭时,您指定 0..4095 之间的“刻度”值。通道指示 16 个 PWM 输出中的哪一个应该更新为新值。
参数
channel:应使用新值 (0..15) 更新的通道
on:信号应从低电平转换为高电平时的刻度(在 0..4095 之间)
off:信号应该从高到低转换时的刻度(0..4095 之间)
例子
以下示例将导致通道 15 从低开始,进入脉冲约 25% 的高电平(勾选 4096 中的 1024),转换回低 75% 进入脉冲(勾选 3072),并在最后 25% 的时间内保持低电平脉搏:
pwm.setPWM(15, 1024, 3072)
用作 GPIO
还有一些特殊设置可以完全打开或完全关闭引脚
您可以将引脚设置为完全开启
pwm.setPWM(pin, 4096, 0);
您可以将引脚设置为完全关闭
pwm.setPWM(pin, 0, 4096);
例子
以下示例将导致通道 15 从低开始,进入脉冲约 25% 的高电平(勾选 4096 中的 1024),转换回低 75% 进入脉冲(勾选 3072),并在最后 25% 的时间内保持低电平脉搏:
pwm.setPWM(15, 1024, 3072)
用作 GPIO
还有一些特殊设置可以完全打开或完全关闭引脚
您可以将引脚设置为完全开启
pwm.setPWM(pin, 4096, 0);
您可以将引脚设置为完全关闭
pwm.setPWM(pin, 0, 4096);
bef
代码
PCA9685
C/C++
/*************************************************** | |
This is an example for our Adafruit 16-channel PWM & Servo driver | |
Servo test - this will drive 8 servos, one after the other on the | |
first 8 pins of the PCA9685 | |
Pick one up today in the adafruit shop! | |
------> http://www.adafruit.com/products/815 | |
These drivers use I2C to communicate, 2 pins are required to | |
interface. | |
Adafruit invests time and resources providing this open source code, | |
please support Adafruit and open-source hardware by purchasing | |
products from Adafruit! | |
Written by Limor Fried/Ladyada for Adafruit Industries. | |
BSD license, all text above must be included in any redistribution | |
****************************************************/ | |
#include | |
#include | |
// called this way, it uses the default address 0x40 | |
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); | |
// you can also call it with a different address you want | |
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41); | |
// you can also call it with a different address and I2C interface | |
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40, Wire); | |
// Depending on your servo make, the pulse width min and max may vary, you | |
// want these to be as small/large as possible without hitting the hard stop | |
// for max range. You'll have to tweak them as necessary to match the servos you | |
// have! | |
#define SERVOMIN120 // This is the 'minimum' pulse length count (out of 4096)(use135) | |
#define SERVOMAX630 // This is the 'maximum' pulse length count (out of 4096)(use615) | |
// our servo # counter | |
uint8_t servonum = 0; | |
void setup() { | |
Serial.begin(9600); | |
Serial.println("16 channel Servo test!"); | |
pwm.begin(); | |
pwm.setPWMFreq(60);// Analog servos run at ~60 Hz updates | |
} | |
void loop() { | |
pwm.setPWM(0, 0, 135); | |
delay(500); | |
pwm.setPWM(1, 0, 135); | |
delay(500); | |
pwm.setPWM(2, 0, 135); | |
delay(500); | |
pwm.setPWM(3, 0, 135); | |
delay(500); | |
pwm.setPWM(0, 0, 615); | |
delay(500); | |
pwm.setPWM(1, 0, 615); | |
delay(500); | |
pwm.setPWM(2, 0, 615); | |
delay(500); | |
pwm.setPWM(3, 0, 615); | |
delay(500); | |
pwm.setPWM(0, 0, 135); | |
pwm.setPWM(1, 0, 135); | |
pwm.setPWM(2, 0, 135); | |
pwm.setPWM(3, 0, 135); | |
delay(1500); | |
pwm.setPWM(0, 0, 615); | |
pwm.setPWM(1, 0, 615); | |
pwm.setPWM(2, 0, 615); | |
pwm.setPWM(3, 0, 615); | |
delay(1500); | |
} |
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !