|
通常,伺服电机由四部分组成:常见的直流电机、一组齿轮、一个电位器和控制电路。其中,电位器用作位置传感器。这样,就可以实现非常精确地控制伺服电机。特别是,可以将命令发送到伺服电机,以使伺服电机的轴旋转到特定位置。但是,这些伺服电机的缺点是旋转范围受到限制(例如在0至180度之间)。尽管有缺点,如果项目需要具有精确控制和得知其当前位置的电机,则伺服电机非常有用。
SG90是可旋转约180°的伺服电机。而且,它非常小巧轻巧(重量:9g;尺寸:22.2 x 11.8 x 31毫米)。在本篇文章中,我们将主要介绍如何控制SG90伺服电机。为了控制电动机,使用了所谓的旋转角度传感器模块。该模块只不过是一个带旋钮的常规电位器。因此,几乎任何电位器上都可以简单地替换它,此处仅出于方便的原因而使用。
所需的材料清单: – Arduino Uno开发板 – 跳线 – 迷你面包板 – 旋转角度传感器 – 电位计(替代旋转角度传感器) – SG90伺服电机
伺服电机SG90与Arduino Uno的连接: 首先,我们将SG90伺服电机连接到Arduino Uno。伺服和旋转角度传感器都需要供电。由于Arduino Uno只有一个5V引脚,因此我们使用面包板分割5V信号。 Arduino的5V引脚连接到面包板上。然后,将伺服电机的红线连接到试验板。接下来,需要将SG90的棕色线连接到Arduino的其中一个GND引脚。为了控制SG90伺服电机,必须通过黄线发送PWM信号(脉冲宽度调制)。在本文中,将使用Arduino的数字引脚9,因此将该引脚连接到SG90的黄色引脚。 接下来,我们将旋转角度传感器连接到Arduino。传感器的左侧引脚是GND,将其连接到Arduino的其中一个GND引脚。中间的引脚是VCC,将其连接到面包板上的5V信号。最后,传感器的SIG引脚连接到Arduino的其中一个模拟输入引脚。本文使用的是模拟引脚A0。如果使用电位器代替旋转角度传感器:通常,电位器的外部引脚必须连接到电源(Arduino的GND和5V引脚)。中间的引脚是信号引脚,它对应于传感器的SIG引脚,并且必须连接到模拟输入引脚(例如A0)。
示例源代码: 幸运的是,Arduino IDE已经内置了伺服电机库。为了使用该库,我们需要包含其头文件。接下来,我们定义两个引脚:用于伺服电机的数字引脚9和用于旋转角度传感器(或电位器)的模拟引脚A0。然后,创建一个伺服电机对象,该对象将用于控制伺服电机。随后,定义了两个变量。第一个用于存储从传感器/电位器获取的值。第二个变量是将发送到伺服电机的旋转值。
在setup函数中,我们将数字引脚9附加到伺服对象上。现在已完全初始化了伺服对象,并准备控制伺服电机。
在loop函数中,我们读取旋转角度传感器旋钮的模拟值(或电位器的值)。由于Arduino的模数转换器会将电压映射到0到1023之间的值,因此我们必须将这些值重新映射到伺服电机支持的旋转角度值。由于SG90支持大约180°,因此我们将值映射为5和175之间的值。根据经验,如果使用整个180°范围,SG90会工作不正常。因此,为了避免损坏伺服电机,我们减去了10°。调用映射函数后,结果值将用于使伺服器旋转其轴。在loop函数结束时,我们添加了20ms的延迟,以使伺服器有一些时间转动轴。 - #include "Servo.h"
- #define PIN_SERVO 9
- #define PIN_KNOB A0
- Servo servo; // creates servo object to control the SG90 servo
- int value_knob = 0; // will be used to store the value of the potentiometer/knob
- int value_servo = 0; // will be used to control the servo => should be between 5 and 175 degrees
- void setup()
- {
- servo.attach(PIN_SERVO); // assigns pin 9 to the servo object
- }
- void loop()
- {
- value_knob = analogRead(PIN_KNOB); // reads value of the knob/potentiometer. Return value will be between 0 and 1023.
- value_servo = map(value_knob, 0, 1023, 5, 175); // will map knob value range to servo value range
- servo.write(value_servo); // shaft of servo will start to rotate. value_servo is interpreted as an absolute position.
- delay(20); // give servo some time to rotate
- }
复制代码
将程序传输到Arduino Uno之后,您应该能够旋转伺服电机的轴。
|