舵机

作者:hardihuang   hardihuang   
伺服电机与Arduino接口的教程

想要在不构建电机控制器的情况下将运动添加到您的下一个Arduino项目吗?然后,伺服电机可能是您的坚实出发点。

与直流电动机不同,您可以精确控制这些电动机的位置。指示他们指向何处,他们会为您服务。

它们在许多机器人项目中很有用,例如在RC模型上转动前轮以转向或旋转传感器以在机器人车辆上环顾四周。

什么是伺服? #

伺服是闭环控制系统的总称。

闭环系统使用反馈信号来调整电动机的速度和方向,以获得所需的结果。

伺服电机闭环系统框图

RC伺服电机的工作原理相同。它包含一个通过齿轮连接到输出轴的小型直流电动机。

输出轴驱动伺服臂,并且还连接到电位计(电位计)。

伺服电机内部结构图

电位计向伺服控制单元提供位置反馈,在此将电机的当前位置与目标位置进行比较。

根据该错误,控制单元会校正电动机的实际位置,使其与目标位置相匹配。

伺服电机如何工作? #

您可以通过向信号线发送一系列脉冲来控制伺服电机。传统的模拟伺服电机期望大约每20毫秒接收一次脉冲(即信号应为50Hz)。

脉冲的长度决定了伺服电机的位置。

伺服电机工作时序图
  • 如果脉冲在1ms内为高电平,则伺服角度将为零。
  • 如果脉冲在1.5ms内为高电平,则伺服将处于其中心位置。
  • 如果脉冲在2ms内为高电平,则伺服将以180度旋转。
  • 在1ms到2ms之间的脉冲将使伺服轴在其行程的整个180度内移动。

提示

脉冲的持续时间有时会因品牌不同而有所不同,0度时为0.5毫秒,180度时为2.5毫秒。

伺服电机引脚排列 #

伺服电机通常具有三个连接,如下所示:

伺服电机引脚排列

地线 是电机和逻辑的共同点。

5伏 是为伺服器供电的正电压。

控制 是控制系统的输入。

提示

伺服电机之间电线的颜色会有所不同,但是红色电线始终为5V,而GND将为黑色或棕色。控制线通常为橙色或黄色。

将伺服电机连接到Arduino UNO #

让我们将伺服电机连接到Arduino。

例如,让我们使用SG90微型伺服电机。它在4.8-6VDC(典型值为5V)上运行,并且可以旋转大约180度(每个方向90度)。

它在空闲时消耗约10mA的电流,在移动时消耗100mA至250mA的电流,因此我们可以通过Arduino上的5伏输出为其加电。

如果您的伺服器消耗的电流超过250mA,请考虑为伺服器使用单独的电源。

将红色线连接至Arduino的5V(或DC插孔),并将黑色/棕色线接地。最后,将橙/黄线连接到PWM使能引脚9。

将伺服电机连接到arduino uno扫描代码

Arduino代码–扫一扫 #

对于我们的第一个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用于存储舵机当前角度(以度为单位)。

int angle = 0;

在设置功能中,我们servo使用以下命令将对象链接到将控制伺服的引脚:

servo.attach(servoPin);

循环功能实际上包含两个for循环。第一个回路在一个方向上增加角度,第二个回路在相反方向上增加角度。

下面的命令告诉伺服器将其位置更新到指定角度。

servo.write(angle);

故障排除 #

如果您决定直接从Arduino运行,有时您的伺服器可能会出现异常。这样做的原因是,伺服器会消耗大量功率,尤其是在启动过程中,这会导致Arduino板复位。

如果发生这种情况,通常可以通过在GND和5V之间放置一个相当大的电解电容器(470uF – 1000uF)来解决此问题。

电容器充当电能的储存器,因此当电动机启动时,它会从电容器以及Arduino电源中获取电荷。

电容器的较长引线应连接到5V,负极引线应连接到GND。

将带有电容器的伺服电机连接到arduino uno

用电位器控制伺服 #

下一步是添加一个电位计,以便我们可以通过旋转旋钮来控制伺服器的位置。

当您要控制连接到伺服系统的传感器的平移和倾斜时,该项目可能非常有用。

接线

如接线图所示,您将需要一个电位计,从10k起的任何值都可以。将电位器的一端接地,另一端与Arduino 5V相连,抽头与模拟输入A0相连。

将伺服电机连接到arduino uno进行电位计控制

Arduino代码

使伺服跟随旋钮位置的代码比使其扫掠更简单。

#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

在循环功能中,我们首先从模拟引脚A0读取值。

int reading = analogRead(potPin);

这给我们提供了一个介于0到1023之间的值。但是我们需要按比例缩小它,因为伺服器只能旋转180度。

一种方法是使用Arduino map()函数,该函数将一个范围内的数字重新映射到另一个范围。因此,下面的线更改读数以表示0到180度之间的角度。

int angle = map(reading, 0, 1023, 0, 180);

最后,我们使用write()命令告诉伺服器将其位置更新为电位计选择的角度。

servo.write(angle);

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注