在本教程中,我们将学习如何伺服电机的工作和如何控制伺服使用Arduino和PCA9685 PWM驱动器。你可以观看下面的视频或阅读下面的书面教程。
有许多类型的伺服电机,它们的主要特点是能够精确控制其轴的位置。伺服电机是一个闭环系统,使用位置反馈来控制其运动和最终位置。
在工业类型的伺服电机位置反馈传感器通常是一个高精度的编码器,而在较小的RC或爱好伺服位置传感器通常是一个简单的电位器。这些设备捕获的实际位置反馈到误差检测器,在那里它与目标位置相比较。然后根据误差校正电机的实际位置,以匹配目标位置。
在本教程中,我们将详细查看爱好伺服电机。我们将解释如何这些伺服的工作和如何控制他们使用Arduino。
爱好伺服是小型驱动器用于控制遥控玩具汽车,船,飞机等。他们也被工程专业的学生用来制作机器人的原型,制造机械手臂,仿生机器人,类人机器人等等。
RC /爱好伺服如何工作
在一个爱好伺服有四个主要组件,一个直流电机,一个变速箱,一个电位器和一个控制电路。直流电动机是高速和低扭矩,但变速箱将转速降低到60转/分左右,同时增加扭矩。
电位器安装在最后的齿轮或输出轴上,因此,当电机旋转时,电位器也旋转,从而产生与输出轴的绝对角度相关的电压。在控制电路中,电位器的电压与来自信号线的电压相比较。如果需要,控制器激活集成的h桥,使电机可以在任意方向旋转,直到两个信号达到零差。
通过通过信号线发送一系列脉冲来控制伺服电机。控制信号的频率应为50Hz或脉冲应每20ms出现一次。脉冲的宽度决定了伺服器的角度位置,这些类型的伺服器通常可以旋转180度(它们有旅行的物理限制)。
通常1ms持续时间的脉冲对应于0度位置,1.5ms持续时间为90度,2ms持续时间为180度。尽管脉冲的最小和最大持续时间有时会因不同品牌而异,它们可以为0度0.5ms和180度2.5ms。
Arduino伺服电机控制
让我们把上面说的测试和做一个实际的例子控制一个爱好伺服使用Arduino。我将使用MG996R,这是一个高扭矩伺服具有金属齿轮与失速扭矩10公斤-厘米。高扭矩是有代价的那就是伺服的失速电流是2。5a。工作电流为500mA ~ 900mA,工作电压为4.8 ~ 7.2V。
从目前的额定值来看,我们不能将这个伺服直接连接到Arduino,但是我们必须为它使用单独的电源。这是这个例子的电路原理图。
我们只需要将伺服的控制引脚连接到Arduino板的任何数字引脚上,将接地和正极线连接到外部的5V电源上,也将Arduino地连接到伺服地。
你可以从下面的链接中获得这个例子所需的组件:
- MG996R伺服电机 ...............................亚马逊/Banggood/阿里巴巴全球速卖通
- 或S90微伺服 ...................................亚马逊/Banggood/阿里巴巴全球速卖通
- Arduino电路板 ...........................................亚马逊/Banggood/阿里巴巴全球速卖通
- 5 v直流电源 ............................亚马逊/Banggood/阿里巴巴全球速卖通
yaboAG娱乐城披露:这些是附属链接。作为一名亚马逊助理,我从合格的购买中获得收入。
Arduino伺服电机控制代码
现在让我们看一下控制伺服电机的Arduino代码。代码非常简单。我们只需要定义伺服连接的引脚,定义引脚为输出,并在回路部分产生脉冲与特定的持续时间和频率,正如我们之前解释的。
/* Servo Motor Control - 50Hz Pulse Train Generator by Dejan, https://亚搏手机版官方下载www.kuaixg.com */ #define servoPin 9 void setup() {pinMode(servoPin, OUTPUT);} void loop(){//脉冲每20ms digitalWrite(servoPin, HIGH);delayMicroseconds (1450);//脉冲持续时间(微秒)delayMicroseconds (18550);// 20ms -脉冲持续时间//脉冲持续时间:600 - 0deg;1450 - 90度;2300 - 180℃}
经过一些测试,我提出了以下值的脉冲与我的伺服工作的持续时间。持续时间为0.6ms的脉冲对应于0度位置,1.45ms到90度和2.3ms到180度。
我将万用表与伺服串联以检查电流。最大的电流draw,我注意到是高达0.63A在失速。那是因为这不是原来的塔pro MG996R伺服,但一个更便宜的复制品,显然有更差的性能。
不过,让我们看看一种使用Arduino控制伺服的更方便的方法。这是使用Arduino伺服库。
/*伺服电机控制使用Arduino伺服库由Dejan, //www.kuaixg.com */ #包括亚搏手机版官方下载 Servo myservo;//创建一个伺服对象来控制一个伺服空setup() {myservo.attach(9,600,2300);// (pin, min, max)} void loop() {myservo.write(0);//告诉伺服去一个特定的角度延迟(1000);myservo.write (90);延迟(500);myservo.write (135);延迟(500);myservo.write (180);延迟(1500); }
这里我们只需要包含库,定义伺服对象,并使用attach()函数定义伺服连接到的引脚,以及定义脉冲持续时间的最小值和最大值。然后使用write()函数,我们简单地将伺服器的位置从0到180度。有了这个库,我们可以同时驱动12个伺服或48个伺服使用Arduino Mega board。
Arduino和PCA9685 PWM/伺服驱动
还有另一种通过Arduino控制伺服的方法,那就是使用PCA9685伺服驱动器。这是一个16通道的12位PWM和伺服驱动器,使用I2C总线与Arduino通信。它有一个内置时钟,所以它可以驱动16个伺服自由运行,或独立于Arduino。
更酷的是,我们可以在一个I2C总线上串接多达62个这样的驱动程序。因此,理论上我们可以控制多达992伺服使用从Arduino板的两个I2C引脚。6个地址选择引脚用于为每个额外的驱动设置不同的I2C地址。我们只需要根据这张表连接焊盘。
这是电路原理图,我们可以再次注意到,我们需要一个单独的电源为伺服。
你可以从下面的链接中获得这个例子所需的组件:
- MG996R伺服电机 ...............................亚马逊/Banggood/阿里巴巴全球速卖通
- PCA9685 PWM伺服驱动...................亚马逊/Banggood/阿里巴巴全球速卖通
- Arduino电路板 ...........................................亚马逊/Banggood/阿里巴巴全球速卖通
- 6 5 v直流电源 ............................亚马逊/Banggood/阿里巴巴全球速卖通
yaboAG娱乐城披露:这些是附属链接。作为一名亚马逊助理,我从合格的购买中获得收入。
现在让我们看看Arduino代码。为了控制这个伺服驱动程序,我们将使用PCA9685库,可以从GitHub。
PCA9685 Arduino代码
/* Servo Motor Control using Arduino and PCA9685 Driver by Dejan, https://亚搏手机版官方下载www.kuaixg.com Library: https://github.com/NachtRaveVL/PCA9685-Arduino */ #include#include "PCA9685.h" PCA9685 Driver;// PCA9685 output = 12-bit = 4096 steps // 2.5% of 20ms = 0.5ms;12.5% of 20ms = 2.5ms // 2.5% of 4096 = 102 steps;12.5% of 4096 = 512 steps PCA9685_ServoEvaluator// PCA9685_ServoEvaluator PCA9685_ServoEvaluator pmservo2 (102, 310, 505);// (0deg, 90deg, 180deg) void setup() {Wire.begin();//首先启动Wire. setclock (400000);//支持的波特率为100kHz, 400kHz, 1000kHz驱动。resetdevices ();// Software reset all PCA9685 devices on Wire line driver.init(B000000);//地址引脚A5-A0设置为B000000 driver.setPWMFrequency(50); // Set frequency to 50Hz } void loop() { driver.setChannelPWM(0, pwmServo.pwmForAngle(-90)); delay(1000); driver.setChannelPWM(0, pwmServo.pwmForAngle(0)); delay(1000); driver.setChannelPWM(0, pwmServo.pwmForAngle(90)); delay(1000); }
因此,首先需要包含库并定义PCA9685对象。然后使用Servo_Evaluator实例定义脉冲持续时间或驱动程序的PWM输出。请注意输出是12位的,也就是4096步的分辨率。所以最小脉冲持续时间0.5ms或0度位置对应102步,最大脉冲持续时间2.5ms或180度位置对应512步。但如前所述,这些值应根据您的伺服电机调整。在我的例子中,从102到470的值对应于0到180度的位置。
在设置部分,我们需要定义I2C时钟速率,设置驱动程序地址和设置频率为50Hz。
在循环部分,使用setChannelPWM()和pwmForAngle()函数,我们只需将伺服器设置为所需的角度。
我连接了第二个伺服驱动器,正如我所料,它的定位不一样的第一个,这是因为我使用的伺服是廉价的复制品,他们不是那么可靠。然而,这不是一个大问题,因为使用Servo_Evaluator实例,我们可以为每个伺服设置不同的输出设置。我们也可以调整90度的位置,以防它不是正好在中间。以这种方式,所有伺服将工作相同的位置在准确的角度。
通过Arduino和PCA9685驱动控制大量伺服
我们将看一个更多的例子,这是控制许多伺服与多个连锁的PCA9685驱动器。
为此,我们需要连接驱动器彼此和连接合适的地址选择焊盘。这是电路原理图:
现在让我们看看Arduino代码。
/* Servo Motor Control using Arduino and PCA9685 Driver by Dejan, https://亚搏手机版官方下载www.kuaixg.com Library: https://github.com/NachtRaveVL/PCA9685-Arduino */ #include#include "PCA9685.h" PCA9685 Driver;// PCA9685 output = 12-bit = 4096 steps // 2.5% of 20ms = 0.5ms;12.5% of 20ms = 2.5ms // 2.5% of 4096 = 102 steps;12.5% of 4096 = 512 steps PCA9685_ServoEvaluator//(-90℃,+90℃)// Second Servo PCA9685_ServoEvaluator pwmServo2(102, 310, 505);// (0deg, 90deg, 180deg) void setup() {Wire.begin();//首先启动Wire. setclock (400000);//支持的波特率为100kHz, 400kHz, 1000kHz驱动。resetdevices ();// Software reset all PCA9685 devices on Wire line driver.init(B000000);//地址引脚A5-A0设置为B000000 driver.setPWMFrequency(50); // Set frequency to 50Hz } void loop() { driver.setChannelPWM(0, pwmServo.pwmForAngle(-90)); delay(1000); driver.setChannelPWM(0, pwmServo.pwmForAngle(0)); delay(1000); driver.setChannelPWM(0, pwmServo.pwmForAngle(90)); delay(1000); }
因此,我们应该为每个驱动程序创建单独的PCA9685对象,为每个驱动程序定义地址,并将频率设置为50Hz。现在只需使用setChannelPWM()和pwmForAngle()函数,我们就可以设置任何驱动器上的任何伺服器来定位我们想要的任何角度。
这就是本教程的全部内容,我希望你喜欢它并学到了一些新东西。欢迎在评论区提出任何问题,并确保你可以Arduino项足彩网女欧洲杯目集合。
亲爱的机电一体化,
我写的是一个非常快速的问题(对你可能也看起来很傻的一个)关于你的“伺服电机如何工作&如何控制伺服使用Arduino”视频在YouTube上。
我刚刚开始与Arduino和伺服工作。我去ar完全一样的视频中,这意味着我也必须使用外部电源。这是一个挑战,我认为我使用了错误的电源-因为电线变得热。请您分享更多关于您正在使用的电源的信息,以及您是如何通过面包板连接电源的?
电源我用的是220V到5V, 15A
巴特
5V是正确的电源,额定安培在你的情况下并不重要,这只是意味着它可以处理更多的伺服工作在同一时间(取决于伺服电流绘制)。伺服中线为5V,棕色GND,黄色为信号线。
你好,我还有一个问题。我使用的是6V -7.4V爱好王伺服电机。最初我使用arduino的电源来驱动它。后来,我把它与直流电源7 V,我也设置了最大700 mA的电流限制在安全的一边,但仍然我的伺服电机被破坏。我想知道原因是什么,我怎样才能纠正它。谢谢
嘿,Arduino本身不能为这样一个伺服电机供电,它不能提供那么多的电力。用单独的电源供电是正确的,你说的7v, 700mA,听起来很合理,不应该破坏电机。问题可能是伺服本身,或也许7V太高,你应该尝试6V最大,但我不能确定。
干得好,你描述的方式很好
很高兴你觉得有用,谢谢!