|
在本篇文章中,我们将了解伺服电机的工作原理以及如何使用Arduino开发板和PWM驱动器PCA9685控制伺服电机。伺服电机种类繁多,它们的主要特征是能够精确控制轴的位置。伺服电机是一种闭环系统,它使用位置反馈来控制其运动和最终位置。
在工业型伺服电机中,位置反馈传感器通常是高精度编码器,而在较小的RC或Hobby伺服电机中,位置传感器通常是一个简易的电位器。这些设备捕获的实际位置被反馈到误差检测器,在那里将其与目标位置进行比较。然后根据误差,控制器校正电机的实际位置以匹配目标位置。
在本篇文章中,我们将详细介绍Hobby伺服电机。我们将解释这些伺服电机是如何工作的,以及如何使用Arduino开发板控制它们。
Hobby伺服电机是用于控制RC玩具汽车、船只、飞机等的小型执行器。它们也被工程学生用于机器人原型制作、机器人手臂、生物机器人、人形机器人等。
RC / Hobby伺服电机是如何工作的? 在Hobby伺服电机中,有四个主要部件:直流电机、变速箱、电位器和控制电路。直流电机是高速和低扭矩,但变速箱将速度降低到大约60 RPM,同时增加扭矩。
电位器安装在最末端的齿轮或输出轴上,因d此当电动机旋转时,电位器也会旋转,从而产生与输出轴的绝对角度相关的电压。在控制电路中,将该电位器电压与来自信号线的电压进行比较。如果需要,控制器激活集成的H桥,使电机能够沿任一方向旋转,直到两个信号达到零差。
伺服电机是通过信号线发送一系列脉冲来实现控制的。控制信号的频率应为50Hz或每20ms发生一次脉冲。脉冲的宽度决定了伺服电机的角度位置,这种类型的伺服机构通常可以旋转180度(它们物理上都会设置行程限制)。
通常,持续时间为1ms的脉冲对应于0度位置,1.5ms持续时间对应于90度,2ms对应180度。虽然如此,但是脉冲的最小和最大持续时间有时会随着不同的品牌而变化,对于0度可以是0.5ms,对于180度位置可以是2.5ms。
Arduino控制伺服电机 让我们把上面说的内容测试一下,并制作一个使用Arduino控制hobby伺服电机的实际例子。我将使用MG996R伺服电机,这是一种大扭矩伺服,具有金属齿轮,失速扭矩为10 kg-cm。高扭矩是有代价的,而伺服的失速电流是2.5A。运行电流为500mA至900mA,工作电压为4.8至7.2V。
电流额定值表明我们无法直接将此伺服连接到Arduino开发板,必须使用单独的电源。以下是此示例的电路原理图。
我们只需要将伺服的控制引脚连接到Arduino开发板的任何数字引脚,将地线和正极线连接到外部5V电源,并将Arduino地连接到伺服电机地。
Arduino控制伺服电机的代码 现在让我们来看看用于控制伺服电机的Arduino代码。 代码非常简单。 我们只需要定义伺服连接的引脚,将该引脚定义为输出,并在loop函数部分产生具有特定持续时间和频率的脉冲,如前所述。 - /*
- Servo Motor Control - 50Hz Pulse Train Generator
- by Dejan, https://howtomechatronics.com
- */
- #define servoPin 9
- void setup() {
- pinMode(servoPin, OUTPUT);
- }
- void loop() {
- // A pulse each 20ms
- digitalWrite(servoPin, HIGH);
- delayMicroseconds(1450); // Duration of the pusle in microseconds
- digitalWrite(servoPin, LOW);
- delayMicroseconds(18550); // 20ms - duration of the pusle
- // Pulses duration: 600 - 0deg; 1450 - 90deg; 2300 - 180deg
- }
复制代码
经过一些测试后,我找到了用于与伺服系统一起使用的脉冲持续时间的以下值。 持续时间为0.6ms的脉冲对应于0度位置,1.45ms对应90度和2.3ms对应180度。 我将万用表与伺服系统串联,以检查电流消耗。 我注意到的最大电流消耗在失速时高达0.63A。 那是因为这不是原来的TowerPro MG996R伺服,而是更便宜的复制品,显然性能更差。
不过,让我们来看看使用Arduino控制伺服的更方便的方法。 那就是使用Arduino伺服库。 - /*
- Servo Motor Control using the Arduino Servo Library
- by Dejan, https://howtomechatronics.com
- */
- #include <Servo.h>
- Servo myservo; // create servo object to control a servo
- void setup() {
- myservo.attach(9,600,2300); // (pin, min, max)
- }
- void loop() {
- myservo.write(0); // tell servo to go to a particular angle
- delay(1000);
-
- myservo.write(90);
- delay(500);
-
- myservo.write(135);
- delay(500);
-
- myservo.write(180);
- delay(1500);
- }
复制代码
这里我们只需要包含库,定义伺服对象,并使用attach()函数定义伺服所连接的引脚,并定义脉冲持续时间的最小值和最大值。 然后使用write()函数,我们只需将伺服位置设置为0到180度。 通过该库,我们可以同时驱动多达12个伺服电机或使用Arduino Mega开发板驱动48个伺服电机。 |