0、结果
说明:让舵机转动,需要用PWM来控制,下面的程序是舵机从0度一直转到180度,然后又从180度转到0度的这样一个过程。
1、外观
说明:虽然舵机的型号有很多种,但是只要是180度的舵机,控制方式都是差不多的。
2、连线
说明:只需要连接三根线。
uno————舵机
VCC------红颜色的
GND------黑颜色的
D9------黄颜色的
3、源程序
说明:采用非阻塞方式编写,一定时间转动一个角度,并将对应功能进行函数化,方便移植。
/****************************************servo part****************************************/
/*
接线:
VCC------VCC
GND------GND
9------OUT
注意:信号脚必须接PWM脚
*/
#include <Servo.h> //调用库文件
Servo myservo; //实例化对象
#define servoTimeInterval 20 //控制舵机旋转的速度,数字越小转的越快,不建议过小
unsigned long servoTimes = 0; //记录设备运行时间
int posAngle = 1; //舵机的角度
int tempVal = 1; //舵机正转反转逻辑的转化
/****************************************set up and loop part*********************************/
void setup() {
Serial.begin(9600); //设置波特率
myservo.attach(9); // 设置四个舵机的信号输出角
myservo.write(posAngle); //设备上电后,舵机的位置在1度,这要设备工作会更加稳定
Serial.println("设备上线");
}
void loop() {
servoControl(); //舵机控制
}
/****************************************servo part****************************************/
/*舵机控制*/
void servoControl() {
if (millis() - servoTimes >= servoTimeInterval) { //非阻塞模式
servoTimes = millis();
if ((tempVal == 1) && (posAngle < 181)) { //1°~180°来回运动
myservo.write(posAngle);
posAngle += 1; //角度增加
}
if (posAngle == 181) {
tempVal = 2; //表示正转转完了,现在反转
}
if ((tempVal == 2) && (posAngle >= 1)) { //从180°~转到1°
myservo.write(posAngle);
posAngle -= 1;
}
if (posAngle == 0) { //表示反转转完了,现在正转,循环转来转去
tempVal = 1;
}
}
}
4、注意事项
说明:如果控制的舵机数量很多,需要外部供电。如果设定转动的角度大于实际转动的角度,电机可能会坏掉。金属舵机力气比塑料舵机力气大,但是也更容易坏。
5、基本原理
SG90舵机是一种微型伺服电机,广泛应用于模型飞机、机器人、汽车、船只等控制系统中。其工作原理与其他舵机类似,也是基于反馈控制系统实现角度位置控制。
SG90舵机内部包括一个直流电机、一组齿轮、位置反馈器件和控制电路。当外部的信号输入到舵机控制电路中时,电路会将信号解析成对应的控制信号,并通过驱动电机旋转一定的角度来实现控制。同时,舵机内部的位置反馈器件也会将电机当前的角度信息反馈回来给控制电路,以便控制电路可以按照预定的目标角度进行精确控制。
具体而言,SG90舵机的工作原理是:当外部输入控制信号时,舵机内部的控制电路会对该信号进行判断,然后输出一定的PWM信号给电机。控制电路不断地调整PWM信号的占空比,以便控制电机的旋转速度和旋转方向,从而使得舵机输出轴的位置和角度达到预期的目标位置。
另外,SG90舵机还包括一个位置反馈器件,其通过检测电机旋转时输出轴的位置变化,来反馈实际位置信息给控制电路。控制电路根据反馈信号进行调整,以保证舵机输出轴的位置和角度精确地达到预期的目标位置。