风筝
发表于: 2020-2-3 20:59:14 | 显示全部楼层

通常,伺服电机由四部分组成:常见的直流电机、一组齿轮、一个电位器和控制电路。其中,电位器用作位置传感器。这样,就可以实现非常精确地控制伺服电机。特别是,可以将命令发送到伺服电机,以使伺服电机的轴旋转到特定位置。但是,这些伺服电机的缺点是旋转范围受到限制(例如在0至180度之间)。尽管有缺点,如果项目需要具有精确控制和得知其当前位置的电机,则伺服电机非常有用。


SG90是可旋转约180°的伺服电机。而且,它非常小巧轻巧(重量:9g;尺寸:22.2 x 11.8 x 31毫米)。在本篇文章中,我们将主要介绍如何控制SG90伺服电机。为了控制电动机,使用了所谓的旋转角度传感器模块。该模块只不过是一个带旋钮的常规电位器。因此,几乎任何电位器上都可以简单地替换它,此处仅出于方便的原因而使用。

sg90.jpg


所需的材料清单:

–  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)。

sg90_bb.png


示例源代码:

幸运的是,Arduino IDE已经内置了伺服电机库。为了使用该库,我们需要包含其头文件。接下来,我们定义两个引脚:用于伺服电机的数字引脚9和用于旋转角度传感器(或电位器)的模拟引脚A0。然后,创建一个伺服电机对象,该对象将用于控制伺服电机。随后,定义了两个变量。第一个用于存储从传感器/电位器获取的值。第二个变量是将发送到伺服电机的旋转值。


在setup函数中,我们将数字引脚9附加到伺服对象上。现在已完全初始化了伺服对象,并准备控制伺服电机。


在loop函数中,我们读取旋转角度传感器旋钮的模拟值(或电位器的值)。由于Arduino的模数转换器会将电压映射到0到1023之间的值,因此我们必须将这些值重新映射到伺服电机支持的旋转角度值。由于SG90支持大约180°,因此我们将值映射为5和175之间的值。根据经验,如果使用整个180°范围,SG90会工作不正常。因此,为了避免损坏伺服电机,我们减去了10°。调用映射函数后,结果值将用于使伺服器旋转其轴。在loop函数结束时,我们添加了20ms的延迟,以使伺服器有一些时间转动轴。

  1. #include "Servo.h"
  2. #define PIN_SERVO 9
  3. #define PIN_KNOB A0
  4. Servo servo; // creates servo object to control the SG90 servo
  5. int value_knob = 0; // will be used to store the value of the potentiometer/knob
  6. int value_servo = 0; // will be used to control the servo => should be between 5 and 175 degrees
  7. void setup()
  8. {
  9.   servo.attach(PIN_SERVO); // assigns pin 9 to the servo object
  10. }
  11. void loop()
  12. {
  13.   value_knob = analogRead(PIN_KNOB); // reads value of the knob/potentiometer. Return value will be between 0 and 1023.
  14.   value_servo = map(value_knob, 0, 1023, 5, 175); // will map knob value range to servo value range
  15.   servo.write(value_servo); // shaft of servo will start to rotate. value_servo is interpreted as an absolute position.
  16.   delay(20); // give servo some time to rotate
  17. }
复制代码

将程序传输到Arduino Uno之后,您应该能够旋转伺服电机的轴。

sg90_rotary_angle_sensor_in_action.jpg

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

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-25 10:14 , Processed in 0.038995 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

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

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