风筝
发表于: 2022-7-27 16:09:29 | 显示全部楼层

想要在不构建电机控制器的情况下为您的下一个Arduino项目添加运动功能?那么伺服电机可以是您的坚实起点。与直流电机不同,您可以精确控制这些电机的位置。指示他们指向哪里,他们就会指向相应的位置。


它们在许多机器人项目中都很有用,例如转动远程遥控模型上的前轮以进行转向或转动传感器以环顾机器人车辆。


什么是伺服系统?

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


闭环系统使用反馈信号来调整电机的速度和方向,以达到预期的效果。

Servo-Motor-Closed-Loop-System-Block-Diagram.jpg


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


输出轴驱动一个伺服臂,还连接一个电位器(Pot)。

Servo-Motor-Internal-Structure-Illustration.jpg


电位器向伺服控制单元提供位置反馈,将电机的当前位置与目标位置进行对比。根据误差,控制单元修正电机的实际位置,使其与目标位置相匹配。


伺服电机如何工作?

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


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

Servo-Motor-Working-Timing-Diagram.jpg


●    如果脉冲的高电平持续1ms,则伺服角度为零。

●    如果脉冲的高电平持续1.5ms,则伺服将处于其中心位置。

●    如果脉冲的高电平持续2ms,则伺服将处于180。

●    1ms和2ms之间的脉冲将使伺服轴移动整个180度的行程。


伺服电机的引脚排列

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

Servo-Motor-Pinout.jpg


GND 是电机和逻辑的公共接地。

5V 是为伺服电机供电的正电压。

Control 是控制系统的输入。


将伺服电机连接到Arduino UNO开发板

让我们将伺服电机连接到Arduino。示例中我们使用的是SG90微型伺服电机。它工作在4.8-6VDC(典型值为 5V)下,可以旋转大约180度(每个方向90度)。


它在空闲时消耗大约10mA,在移动时消耗100mA到250mA,因此我们可以通过Arduino上的5V输出为其供电。如果您的伺服电机消耗电流超过250mA,请考虑为您的伺服电机使用独立的电源。


将伺服电机的红线连接到Arduino的5V,黑/棕线接地。最后将橙色/黄色线连接到启用PWM的引脚9。

Connecting-Servo-Motor-to-Arduino-Uno-Sweep-Code.jpg


Arduino代码 - Sweep

对于第一个Arduino草图,我们将使用Arduino IDE附带的一个内置示例。


转到示例子菜单。选择Servo并加载Sweep草图。

Servo-sweep-example.jpg


上传草图到Arduino。 您会立即看到电机朝一个方向移动,然后又朝另一个方向返回。

  1. #include <Servo.h>

  2. int servoPin = 9;
  3. Servo servo;
  4. int angle = 0;  // servo position in degrees

  5. void setup() {
  6.     servo.attach(servoPin);
  7. }

  8. void loop() {

  9.     // scan from 0 to 180 degrees
  10.     for(angle = 0; angle < 180; angle++) {
  11.         servo.write(angle);
  12.         delay(15);
  13.     }
  14.    
  15.     // now scan back from 180 to 0 degrees
  16.     for(angle = 180; angle > 0; angle--) {
  17.         servo.write(angle);
  18.         delay(15);
  19.     }
  20. }
复制代码

代码介绍

控制伺服电机不是一件容易的事,但幸运的是,Arduino IDE已经包含一个非常好的库,称为Servo。它包括简单的命令,以便您可以快速指示伺服转向特定角度。


如果您要使用这些命令,您需要通过以下命令告诉Arduino IDE您正在使用该库:

  1. #include <Servo.h>
复制代码

接下来我们要做的是声明伺服电机的控制引脚连接到的Arduino引脚。

  1. int servoPin = 9;
复制代码

下面的代码创建了一个Servo对象。

  1. Servo servo;
复制代码

实际上可以通过这种方式定义多达八个伺服电机,例如,如果我们有两个伺服电机,那么可以编写成如下内容:

  1. Servo servo1;
  2. Servo servo2;
复制代码

变量angle用于以度为单位存储伺服的当前角度。

  1. int angle = 0;
复制代码

setup()函数中,我们使用以下命令将servo对象链接到控制伺服的引脚:

  1. servo.attach(servoPin);
复制代码

loop()函数实际上包含两个for循环。第一个循环增加一个方向的角度,第二个循环增加相反方向的角度。


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

  1. servo.write(angle);
复制代码

用电位器控制伺服电机

我们的下一步是添加一个电位器,这样就可以通过转动旋钮来控制伺服电机的位置。当您想要控制连接到伺服的传感器的平移和倾斜时,此项目非常有用。


如接线图所示,您需要一个电位器,可以是10k以上的任何值。将电位器的一端接地,另一端连接到Arduino的5V,将中间抽头连接到模拟输入A0。

Connecting-Servo-Motor-to-Arduino-Uno-For-Potentiometer-Control.jpg


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

  1. #include <Servo.h>

  2. int potPin = 0;
  3. int servoPin = 9;
  4. Servo servo;

  5. void setup() {
  6.     servo.attach(servoPin);
  7. }

  8. void loop() {
  9.     int reading = analogRead(potPin);
  10.     int angle = map(reading, 0, 1023, 0, 180);
  11.     servo.write(angle);
  12. }
复制代码

请注意,现在有一个名为potPin的新变量。在loop()函数中,我们首先从模拟引脚A0读取值。

  1. int reading = analogRead(potPin);
复制代码

该函数返回了一个介于0和1023之间的值。但我们需要按比例缩小它,因为伺服只能旋转180度。


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

  1. int angle = map(reading, 0, 1023, 0, 180);
复制代码

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

  1. servo.write(angle);
复制代码

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1479



手机版|

GMT+8, 2024-3-28 18:24 , Processed in 2.452473 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表