> 文章列表 > Arduino控制MG995/MG996 360舵机连续旋转

Arduino控制MG995/MG996 360舵机连续旋转

Arduino控制MG995/MG996 360舵机连续旋转

Arduino控制MG995/MG996 360舵机连续旋转

参考:

  1. 调试
  2. 从线机器人 - PID控制 - 安卓设置 : 12 步骤(附图) - 指导 (instructables.com)

MG995 舵机

技术参数

将了解MG995舵机。MG995舵机电机是一种舵机电机,可以连续移动,没有任何旋转程度的限制。“360”版本是连续旋转的伺服器,无法控制位置。它只是做你描述的事情。它根本不是真正的“伺服器”。它是一个带有自己控制器的减速电机。

MG996R是MG995伺服的升级版。新的PCB和IC控制系统使其更加精确。
其内部齿轮和电机也进行了升级,以改善死带宽和定心。MG996R伺服具有高定位速度,可精确控制和调节您的项目。工作电压范围为 4.8 V – 7.2 V。

如果您曾经使用过塔式Pro SG90和MG996R等舵机电机,该舵机电机是标准舵机类型,可以使用指定的度角进行控制。可以使用命令myservo.write(degrees);轻松移动舵机电机,然后舵机将移动到该j角度。MG995 舵机在操作方式上有所不同。我尝试多次对Arduino进行编程,以使用Arduino IDE上提供的默认程序控制舵机电机,但它不起作用。

  • 重量:55g
  • 尺寸:40.7×19.7×42.9毫米
  • 失速扭矩:9.4公斤/厘米(4.8伏);11公斤/厘米(6.0伏)
  • 运行速度:0.19秒/60度(4.8v);0.15秒/60度(6.0V)
  • 工作电压:4.8~ 6.6V
  • 齿轮类型:金属齿轮
  • 温度范围:0-55?
  • 伺服插头:JR(适合JR和双叶)
  • 死带宽度:1us

Arduino控制MG995/MG996 360舵机连续旋转

所以,在我研究并寻找如何控制这个连续舵机之后,我找到了驱动这个舵机电机的方法。

正常的闭环定位舵机通过编程来响应脉冲宽度以确定角度:1.0ms 脉冲为位置 0°,1.5ms 脉冲为位置 90°,2.0ms 脉冲为位置 180°。

由于MG995 360是连续旋转的舵机类型,因此必须指定3个条件,即停止位置,左转和右转。在这三个位置中,基本命令是使用“写入微秒”命令。

根据我所做的几个实验,这些条件时的微秒值为:

  • 停止位置 – 写入微秒(1500)
  • 左转 – 写入微秒(1000)
  • 向右转 – 写入微秒(2000)
  • 脉冲在1.0和1.5ms或1.5ms和2.0ms之间,将产生成比例的速度。

Adafruit指出,连续旋转的伺服可能需要某种校准才能使停止真正停止。如果伺服器本身没有偏移调整,您可能需要在软件中进行调整,即完全停止可能是“89°”或“91°”而不是“90°”。没有位置检测,它只是以命令的速度运行开环。

但是,当“扫描”测试程序驱动连续旋转伺服时,脉冲命令被解释为速度而不是位置。因此,旋转速度的命令从1.0ms=全速顺时针,到1.5ms=慢速/停止,到2.0ms=全速逆时针,到1.5ms=慢速/停止,到1.0ms=全速顺时针。舵机实际上正在执行----1.0ms=spin-CW1.5ms=stop2.0ms=spin-CCW1.5ms=stop1.0ms=spin-CW… ----…类似于闭环伺服的行为方式。

布线

为了能够练习上述值,请将舵机连接到您的 Arduino。在其中一个PWM引脚上使用它。PWM 引脚分别为 3、5、6、9、10 和 11。可以在此处查看电路。对于供电,应给MG996R

基本代码

之后,我编写了下面的基本程序代码。请上传以下程序到Arduino Uno。

#include <Servo.h>
Servo servo;void setup() {servo.attach(3);
}void loop() {// rotate counter-clockwise full-speedservo.writeMicroseconds(1000);delay(2000);// rotation stoppedservo.writeMicroseconds(1500);delay(1000);// rotate clockwise full-speedservo.writeMicroseconds(2000);delay(2000);// rotation stoppedservo.writeMicroseconds(1500);delay(1000);
}

您可以看到结果。

如何放慢速度

如果在某个位置它不起作用,例如您无法平稳地向左转,您可以尝试将微秒的值更改为略大于或小于 1000 的值。

如果要缓慢执行此操作,则必须将.writeMicroseconds(1500)值更改为较低的值以向左转,更改较高值以向右转。

  • value = 1500 将停止舵机
  • value**<** 1500 将向旋转,值越小向左旋转将变慢
  • value > 1500 将向旋转,值越大,向旋转将变慢

根据我的实验,每个舵机有时的命令与其他舵机略有不同。由此,请为您的舵机校准合适的微秒值。

如何将SG90舵机旋转到特定位置?

技术说明

现在我们将尝试旋转Arduino伺服电机。通常,要驱动伺服电机,最大循环时间为2ms。1°为0ms,1°为5.90ms,2°为180ms。请看下图:

Arduino控制MG995/MG996 360舵机连续旋转

使用串行监视器进行伺服控制,需要将字符转换为int

如果我们发送一个串行监视器值,例如 90,目的是将伺服旋转到 90 度,这将不起作用。因为我们从串行监视器收到的值是 字符 .同时,确定电机位置的值是整数数据类型。

要将数据类型从 char 更改为 int,我们可以使用命令“Serial.parseInt ()”。

#include <Servo.h>Servo myServo;void setup() {Serial.begin(9600);myServo.attach(9);
}void loop() {while (Serial.available() != 0) {int val = Serial.parseInt();Serial.println(val);myServo.write(val);delay(5);}
}

上述程序已被尝试并成功。