SG90舵机简介


  舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。主要是由外壳、电路板、驱动马达(直流电机)、减速齿轮组、位置检测元件(控制电路)所构成,是一套自动(闭环)控制装置
  所谓自动(闭环)控制就是用一个闭环反馈控制回路不断校正输出的偏差,使系统的输出保持恒定。
  注意:①舵机的连线接口和舵机转动范围
     ②舵机内有位置控制电路,一旦通电后,不要用手转动舵盘,容易导致逻辑内减速齿轮的损坏。里面有传感器,读取对应的数值,形成闭环控制
在这里插入图片描述


在这里插入图片描述


SG90舵机工作原理


  由接收机发出讯号给舵机,经由电路板上的 IC驱动无核心马达开始转动,透过减速齿轮将动力传至摆臂,同时由位置检测器送回讯号,判断是否已经到达定位。位置检测器其实就是可变电阻,当舵机转动时电阻值也会随之改变,藉由检测电阻值便可知转动的角度
  如果轴的位置与控制信号相符,那么电机就会关闭。如果控制电路发现这个角度不正确,它就会控制马达转动,直到它达到指定的角度。舵机角度根据制造商的不同而有所不同。比如,一个180度的舵机,它可以在0度至180度之间运动。由于限位装置被安装在主输出装置上,超出这个范围机械结构就不能再转动了
  舵机的输出功率与它所需要转动的距离成正比。如果输出轴需要转动很长的距离,马达就会全速运转,如果它只需要短距离转动,马达就会以较慢的速度运行,这叫做速度比例控制。
在这里插入图片描述


如何让舵机转到指定角度?


  控制线用于传输角度控制信号。这个角度是由控制信号脉冲的持续时间决定的,这叫做脉冲编码调制(PCM)。舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围,总间隔为2ms。脉冲的宽度将决定马达转动的距离。例如:1.5毫秒的脉冲,电机将转向90度的位置(通常称为中立位置,对于180°舵机来说,就是90°位置)。如果脉冲宽度小于1.5毫秒,那么电机轴向朝向0度方向。如果脉冲宽度大于1.5毫秒,轴向就朝向180度方向。以180度舵机为例,对应的控制关系是这样的
0.5ms————-0度;1.0ms————45度;1.0ms————45度;2.0ms———–135度;2.5ms———–180度;
在这里插入图片描述


SG90舵机的使用


类库的使用规则


在这里插入图片描述
在这里插入图片描述


两个示例程序


在这里插入图片描述


实验一:舵机来回扫(示例:Sweep)


项目要求:


  实现舵机在0~180度来回转动


电路搭建


在这里插入图片描述


参考程序


#include <Servo.h>
Servo myservo;
int pos = 0;
void setup() {
myservo.attach(9);
}
void loop() {
for (pos = 0; pos <= 180; pos += 1) {
myservo.write(pos);
delay(15);
}
for (pos = 180; pos >= 0; pos -= 1) {
myservo.write(pos);
delay(15);
}
}

实验二:电位器控制舵机(示例:Knob)


项目要求:


  实现电位器转动,带动舵机转动。


电路搭建


在这里插入图片描述


参考程序


#include<Servo.h>  //数控制舵机运行
Servo myServo; //新建一个舵机对象myServo
const int servoPin=12; //设置舵机的连接引脚为12
const int potPin=A0; //设置电位器的连接引脚为A0

void setup() {
myServo.attach(servoPin); //使用舵机库功能函数attach(),该函数的功能是告诉Arduino舵机连接到9数字引脚
}
void loop() {
int val = analogRead(potPin);
val = map(val, 0, 1023, 0, 180); //将val从0~1023映射到0~180
myServo.write(val); //功能函数write(angle)功能是用于设定舵机旋转角度(angle),角度范围为0°~180°
delay(100); //延迟时间,让舵机转动到位
}
    >

实验三:串口控制舵机


项目要求:


  在串口监视器上输入角度后,舵机转动到指定的角度。


电路搭建


在这里插入图片描述


参考程序


#include <Servo.h>

const int servoPin = 9; //设置舵机引脚为9
Servo myServo; //创建Servo对象myServo

int dataIndex = 0; //创建整数型变量,存储输入数据序列号
void setup() {
myServo.attach(servoPin);
Serial.begin(9600); //启动串口通讯,传输波特率9600
Serial.println(“Please input serial data.”);
}

void loop() {
if ( Serial.available() > 0 ) { // 检查串口缓存是否有数据等待传输
int pos = Serial.parseInt(); // 解析串口数据中的整数信息并赋值给变量pos
if (pos < 0 || pos > 180) {
Serial.println(“Wrong number,please input again”);
} else {
dataIndex++; // 处理数据序列号并通过串口监视器显示
Serial.print(“dataIndex = “);
Serial.print(dataIndex);
Serial.print(“ , “);
Serial.print(“Set servo position: “);
Serial.println(pos); // 通过串口监视器显示变量pos数值
myServo.write(pos); // 使用pos变量数值设置伺服电机
delay(15);
}
}
}