使用 Arduino Due 进行伺服电机控制;如前所述,Arduino Due 是一款基于 ARM 控制器的主板,专为电子工程师和爱好者设计。该 DUE 板可用于制造 CNC 机器、3D 打印机、机械臂等。所有这些项目都有一个共同的功能,那就是位置控制。这些项目中的任何一个都需要准确定位其位置。这些机器中的精确位置可以通过伺服电机实现。在本次会议中,我们将使用 Arduino Due 控制伺服电机的位置。我们已经介绍了伺服电机与 Arduino Uno 的接口和伺服电机与 8051 微控制器的接口< a i=10>.
伺服电机:
伺服电机以其精确的轴运动或位置而闻名。这些不建议用于高速应用。这些建议用于低速、中等扭矩和精确位置应用。这些电机用于机械臂机器、飞行控制和控制系统。伺服电机也用于一些打印机和传真机。
伺服电机有不同的形状和尺寸。我们将在本教程中使用SG90伺服电机。 SG90是180度伺服电机。因此,通过这个伺服系统,我们可以将轴定位在 0 到 180 度之间。
伺服电机主要有三根线,一根用于正电压,一根用于接地,最后一根用于位置设定。红线连接到电源,棕色线连接到地,黄线(或白色)连接到信号。
A 伺服电机是直流电机、位置控制系统和齿轮的组合。在伺服中,我们有一个从信号引脚获取 PWM 信号的控制系统。它对信号进行解码并从中获取占空比。之后,它将比率与预定义的位置值进行比较。如果值存在差异,则会相应调整伺服器的位置。因此,伺服电机的轴位置取决于 SIGNAL 引脚的 PWM 信号的占空比。
PWM(脉冲宽度调制)信号的频率可能因伺服电机的类型而异。这里重要的是 PWM 信号的占空比。使用 Arduino Due 检查 PWM。然而在这种情况下,我们甚至不需要担心占空比的选择。在Arduino中我们有一个特殊的函数;调用它后,我们只需指定角度即可调整舵机的位置。我们将在下面的工作部分讨论这一点。
在将伺服电机连接到 Arduino Due 之前,您可以借助此工具测试您的伺服系统伺服电机测试仪电路。另请检查这些项目以通过弯曲传感器控制伺服或通过力传感器 .
成分:
硬件:Arduino Due、电源(5v)、伺服电机。
软件:Arduino nightly,从下面的链接下载(https://www.arduino.cc/en/Main/Software< /span>)
有关如何下载和安装此软件的详细信息,请访问第一个教程Arduino Due 入门。
电路图及工作说明:
正如前面在 ARDUINO 中所说,我们有预定义的库,一旦调用或包含头文件,它将相应地设置频率和占空比。在 ARDUINO 中,我们只需声明所需的伺服器位置,DUE 就会为伺服器生成适当的 PWM 信号。为了获得伺服器的准确位置,我们需要做的事情是,
-
#include
-
伺服我的伺服;
-
myservo.attach(servo_signal_pin_attached_to);
-
myservo.write(needed_position_angle);
头文件“#include 包含了我们需要的所有特殊函数,调用时不再需要不必担心 PWM 的频率,也不必担心信号的占空比。这样用户就可以直接输入需要的舵机位置,没有任何模糊性。
其次,使用“Servo myservo”为舵机选择名称 myservo 是选择的名称,因此在写入位置时我们将使用这个名称,当我们要控制许多舵机时,此功能会派上用场,我们可以通过以下方式控制多达 12 个舵机这个。
由于Arduino有12个PWM通道,我们需要告诉DUE舵机的信号引脚连接在哪里或者需要连接到哪里产生PWM信号。为此,我们有 “myservo.attach (2);”,这里我们告诉 DUE 我们已将舵机的信号引脚连接到 PIN2 .
剩下的就是设置位置了,我们将使用“myservo.write(45);来设置舵机的位置。 ”,通过该命令舵机手移动45度。如果我们将“45”更改为“175”,伺服轴角度将变为 175 度并保持不变。之后,每当我们需要改变舵机的位置时,我们只需要调用命令“myservo.write(needed_position_angle);” .
在程序中,我们将使用循环来增加和减少角度。所以舵机从 0 扫描到 180,然后从 180 扫描到 0,依此类推。 Arduino Due 的伺服电机控制最好通过 C 代码的逐步说明 在下面。
#include <Servo.h>
Servo myservo; // providing a name
int angle = 0; // variable to store the servo position
void setup() {
myservo.attach(2); // attaches the servo on pin 2 to the servo object
}
void loop() {
for (angle = 0; angle <= 180; angle += 1) { // goes from 0 degrees to 180 degrees, in steps of 1 degree
myservo.write(angle); // tell servo to go to position in variable 'angle'
delay(15); // waits 15ms for the servo to reach the position
}
for (angle = 180; angle >= 0; angle -= 1) { // goes from 180 degrees to 0 degrees
myservo.write(angle);
delay(15); // waits 15ms for the servo to reach the position
}
}
文章评论