格物致知、诚意正心
想要在不构建电机控制器的情况下将运动添加到您的下一个Arduino项目吗?然后,伺服电机可能是您的坚实出发点。
与直流电动机不同,您可以精确控制这些电动机的位置。指示他们指向何处,他们会为您服务。
它们在许多机器人项目中很有用,例如在RC模型上转动前轮以转向或旋转传感器以在机器人车辆上环顾四周。
伺服是闭环控制系统的总称。
闭环系统使用反馈信号来调整电动机的速度和方向,以获得所需的结果。
RC伺服电机的工作原理相同。它包含一个通过齿轮连接到输出轴的小型直流电动机。
输出轴驱动伺服臂,并且还连接到电位计(电位计)。
电位计向伺服控制单元提供位置反馈,在此将电机的当前位置与目标位置进行比较。
根据该错误,控制单元会校正电动机的实际位置,使其与目标位置相匹配。
您可以通过向信号线发送一系列脉冲来控制伺服电机。传统的模拟伺服电机期望大约每20毫秒接收一次脉冲(即信号应为50Hz)。
脉冲的长度决定了伺服电机的位置。
伺服电机通常具有三个连接,如下所示:
地线 是电机和逻辑的共同点。
5伏 是为伺服器供电的正电压。
控制 是控制系统的输入。
让我们将伺服电机连接到Arduino。
例如,让我们使用SG90微型伺服电机。它在4.8-6VDC(典型值为5V)上运行,并且可以旋转大约180度(每个方向90度)。
它在空闲时消耗约10mA的电流,在移动时消耗100mA至250mA的电流,因此我们可以通过Arduino上的5伏输出为其加电。
如果您的伺服器消耗的电流超过250mA,请考虑为伺服器使用单独的电源。
将红色线连接至Arduino的5V(或DC插孔),并将黑色/棕色线接地。最后,将橙/黄线连接到PWM使能引脚9。
对于我们的第一个Arduino草图,我们将使用Arduino IDE随附的内置示例之一。
转到“示例”子菜单。选择“伺服”并加载“扫掠”草图。
继续并上传草图。您将立即看到电动机朝一个方向移动,然后又朝另一个方向移动。
#include <Servo.h> int servoPin = 9; Servo servo; int angle = 0; // servo position in degrees void setup() { servo.attach(servoPin); } void loop() { // scan from 0 to 180 degrees for(angle = 0; angle < 180; angle++) { servo.write(angle); delay(15); } // now scan back from 180 to 0 degrees for(angle = 180; angle > 0; angle--) { servo.write(angle); delay(15); } }
控制伺服器不是一件容易的事,但是对我们来说幸运的是,Arduino IDE已经包含了一个非常漂亮的库Servo。它包含简单的命令,因此您可以快速指示伺服器转向特定角度。
如果要使用这些命令,则需要通过以下命令告诉Arduino IDE您正在使用该库:
#include <Servo.h>
接下来要做的是声明与伺服电机的控制引脚相连的Arduino引脚。
int servoPin = 9;
下面的线创建一个伺服对象。
Servo servo;
实际上,您可以通过这种方式最多定义八个伺服器,例如,如果我们有两个伺服器,则可以编写如下代码:
Servo servo1; Servo servo2;
该变量angle用于存储舵机当前角度(以度为单位)。
angle
int angle = 0;
在设置功能中,我们servo使用以下命令将对象链接到将控制伺服的引脚:
servo
servo.attach(servoPin);
循环功能实际上包含两个for循环。第一个回路在一个方向上增加角度,第二个回路在相反方向上增加角度。
下面的命令告诉伺服器将其位置更新到指定角度。
servo.write(angle);
如果您决定直接从Arduino运行,有时您的伺服器可能会出现异常。这样做的原因是,伺服器会消耗大量功率,尤其是在启动过程中,这会导致Arduino板复位。
如果发生这种情况,通常可以通过在GND和5V之间放置一个相当大的电解电容器(470uF – 1000uF)来解决此问题。
电容器充当电能的储存器,因此当电动机启动时,它会从电容器以及Arduino电源中获取电荷。
电容器的较长引线应连接到5V,负极引线应连接到GND。
下一步是添加一个电位计,以便我们可以通过旋转旋钮来控制伺服器的位置。
当您要控制连接到伺服系统的传感器的平移和倾斜时,该项目可能非常有用。
如接线图所示,您将需要一个电位计,从10k起的任何值都可以。将电位器的一端接地,另一端与Arduino 5V相连,抽头与模拟输入A0相连。
使伺服跟随旋钮位置的代码比使其扫掠更简单。
#include <Servo.h> int potPin = 0; int servoPin = 9; Servo servo; void setup() { servo.attach(servoPin); } void loop() { int reading = analogRead(potPin); int angle = map(reading, 0, 1023, 0, 180); servo.write(angle); }
请注意,现在有一个名为的新变量potPin。
potPin
在循环功能中,我们首先从模拟引脚A0读取值。
int reading = analogRead(potPin);
这给我们提供了一个介于0到1023之间的值。但是我们需要按比例缩小它,因为伺服器只能旋转180度。
一种方法是使用Arduino map()函数,该函数将一个范围内的数字重新映射到另一个范围。因此,下面的线更改读数以表示0到180度之间的角度。
int angle = map(reading, 0, 1023, 0, 180);
最后,我们使用write()命令告诉伺服器将其位置更新为电位计选择的角度。
write()
您的邮箱地址不会被公开。 必填项已用 * 标注
评论 *
显示名称 *
邮箱 *
网站
在此浏览器中保存我的显示名称、邮箱地址和网站地址,以便下次评论时使用。