舵机控制实验
- 前言
- 一、SG90舵机
- 1、SG90舵机简介
- 2、硬件电路连线
- 3、Servo库常用函数
- 二、舵机实验
- 1、舵机0°~180°来回转动
- 2、串口控制舵机转动固定角度
- 总结
前言
- 本文介绍SG90舵机控制原理及实验,主要内容有:
- 1、介绍SG90舵机;
- 2、舵机0°~180°来回转动;
- 3、串口控制舵机转动固定角度。
一、SG90舵机
1、SG90舵机简介
-
(1)舵机是一种位置(角度)伺服的驱动器。舵机只是一种通俗的叫法,其实质是一个伺服马达。在需要角度不断变化并可以保持的控制系统中应用广泛。如遥控机械人、飞机模型等。
-
(2)舵机的转动角度为0~180°,其内部结构包括电机,控制电路和机械结构三部分。电机有三根线引出,分别接VCC、GNG和信号线。
-
(3)舵机引出线的格式:棕、红、橙(棕色连接GND、红色连接VCC、橙色连接信号)。
-
(4)参数介绍
-
(5)舵机原理
-
(6)舵机控制原理
2、硬件电路连线
Arduino开发板引脚 | SG90舵机 | 功能 |
---|---|---|
GND | GND(棕色) | 负极 |
5V | VCC(红色) | 正极 |
D9 | PWM(橙色) | 信号输入 |
3、Servo库常用函数
Servo库函数 | 说明 | 语法 | 参数 |
---|---|---|---|
servo.attach() | 设置Arduino舵机的引脚连接 | servo.attach(pin) | pin:连接舵机数据线的Arduino引脚号 |
servo.write() | 控制舵机旋转;对于标准180°舵机,write()函数会将舵机轴旋转到相应的角度位置。 | servo.write(angle) | angle:旋转角度数值;对于标准180°舵机,angle范围为0~180 |
二、舵机实验
1、舵机0°~180°来回转动
-
(1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。
-
(2)舵机0°~180°来回转动的电路图,如下图所示:
-
(3)实现功能:舵机0~180°来回转动。
-
(4)注意:编译代码前,需要下载安装 Servo 库文件,并在程序中添加 #include <Servo.h> 头文件 。
代码实现:
//SG90舵机控制
//舵机0~180°来回转动
#include <Servo.h> //加载文件库
int pos = 0;
int SG90 = 9;
Servo myservo;
void setup()
{
myservo.attach(SG90, 500, 2500); //修正脉冲宽度
}
void loop()
{
for (pos = 0; pos <= 180; pos += 1) { //pos+=1等价于pos=pos+1
myservo.write(pos);
delay(15);
}
for (pos = 180; pos >= 0; pos -= 1) {
myservo.write(pos);
delay(15);
}
}
- (5)实现现象(部分显示):
2、串口控制舵机转动固定角度
-
(1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。
-
(2)串口控制舵机转动固定角度的电路图,如下图所示:
-
(3)实现功能:
-
① 串口输入0,led0、led1、led2熄灭,舵机转动到0°,同时串口打印 “ 舵机转动到0° ” ;
-
② 串口输入1,led0、led1熄灭,led2点亮,舵机转动到30°,同时串口打印 “ 舵机转动到30° ” ;
-
③ 串口输入2,led0、led2熄灭,led1点亮,舵机转动到60°,同时串口打印 “ 舵机转动到60° ” ;
-
④ 串口输入3,led1、led2点亮,led0熄灭,舵机转动到90°,同时串口打印 “ 舵机转动到90° ” ;
-
⑤ 串口输入4,led1、led2熄灭,led0点亮,舵机转动到120°,同时串口打印 “ 舵机转动到120° ” ;
-
⑥ 串口输入5,led0、led2点亮,led1熄灭,舵机转动到150°,同时串口打印 “ 舵机转动到150° ” ;
-
⑦ 串口输入6,led0、led1点亮,led2熄灭,舵机转动到180°,同时串口打印 “ 舵机转动到180° ” 。
代码实现:
//SG90舵机控制
/*实验现象:
① 串口输入0,led0、led1、led2熄灭,舵机转动到0°,同时串口打印“舵机转动到0°”;
② 串口输入1,led0、led1熄灭,led2点亮,舵机转动到30°,同时串口打印“舵机转动到30°”;
③ 串口输入2,led0、led2熄灭,led1点亮,舵机转动到60°,同时串口打印“舵机转动到60°”;
④ 串口输入3,led1、led2点亮,led0熄灭,舵机转动到90°,同时串口打印“舵机转动到90°”;
⑤ 串口输入4,led1、led2熄灭,led0点亮,舵机转动到120°,同时串口打印“舵机转动到120°”;
⑥ 串口输入5,led0、led2点亮,led1熄灭,舵机转动到150°,同时串口打印“舵机转动到150°”;
⑦ 串口输入6,led0、led1点亮,led2熄灭,舵机转动到180°,同时串口打印“舵机转动到180°”。
*/
#include <Servo.h>
int led0 = 5;
int led1 = 6;
int led2 = 7;
int SG90 = 9;
Servo myservo; //创建舵机对象
void setup() {
myservo.attach(SG90, 500, 2500);
pinMode(led0, OUTPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
char c = Serial.read();
if (c == '0') {
digitalWrite(led0, LOW);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
myservo.write(0);
Serial.println("舵机转动到0°");
} else if (c == '1') {
digitalWrite(led0, LOW);
digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
myservo.write(30);
Serial.println("舵机转动到30°");
} else if (c == '2') {
digitalWrite(led0, LOW);
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
myservo.write(60);
Serial.println("舵机转动到60°");
} else if (c == '3') {
digitalWrite(led0, LOW);
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
myservo.write(90);
Serial.println("舵机转动到90°");
} else if (c == '4') {
digitalWrite(led0, HIGH);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
myservo.write(120);
Serial.println("舵机转动到120°");
} else if (c == '5') {
digitalWrite(led0, HIGH);
digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
myservo.write(150);
Serial.println("舵机转动到150°");
} else if (c == '6') {
digitalWrite(led0, HIGH);
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
myservo.write(180);
Serial.println("舵机转动到180°");
}
}
}
- (4)实现现象(部分显示):
- ① 串口输入0,led0、led1、led2熄灭,舵机转动到0°,同时串口打印 “ 舵机转动到0° ” ;
- ② 串口输入3,led1、led2点亮,led0熄灭,舵机转动到90°,同时串口打印 “ 舵机转动到90° ” ;
- ③ 串口输入6,led0、led1点亮,led2熄灭,舵机转动到180°,同时串口打印 “ 舵机转动到180° ” 。
- 拓展:PWM信号简介
总结
- 本文主要介绍SG90舵机的工作原理及两个舵机控制实验,通过上述学习,掌握使用Arduino库函数Servo控制舵机转动到指定角度,实现预设功能。
参考资料1: Arduino教程三—舵机
参考资料2: Arduino控制舵机详解(含代码)
参考资料3: arduino进阶之舵机使用