舵机控制实验
- 前言
- 一、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+1myservo.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进阶之舵机使用