1.通过简单案例认识舵机
案例1:自动吃食的小动物模型
难度:⭐
相关材料:舵机(MG90S)、木板或硬纸板、剪刀
程序:舵机范例程序
点击查看【bilibili】
案例2:自动转头的小动物模型
难度:⭐
相关元器件:相关材料:舵机(MG90S)、木板或硬纸板、剪刀
程序:舵机范例程序
点击查看【bilibili】
2.舵机的原理
这种电机内置电路可将电机输出轴的位置进行反馈,因此它的输出轴可以被Arduino等控制在某一个固定角度。它的主要应用为控制模型的运动方向(这就是”舵机“这一名称来历。),很多小型机械臂也会使用舵机驱动。舵机有些是可以旋转360度的,但有些只能旋转180度。

舵机的转动的角度是通过调节PWM(脉冲宽度调制)信号的占空比来实现的,标准PWM(脉冲宽度调制)信号的周期固定为20ms(50Hz),理论上脉宽分布应在1ms到2ms 之间,但是,事实上脉宽可由0.5ms 到2.5ms 之间,脉宽和舵机的转角0°~180°相对应。有一点值得注意的地方,由于舵机牌子不同,对于同一信号,不同牌子的舵机旋转的角度也会有所不同。

点击查看【bilibili】
舵机控制基本程序:
/**********************************************************************舵机的直接控制-----------------------------------------------------------------------修订历史/Revision History日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description2021/05/18 金陵中学 1.0 金陵中学Arduino选修课使用-----------------------------------------------------------------------*/#include <Servo.h>Servo myServo; //创建Servo对象myServoint pos=90; // 创建变量pos存储舵机角度值void setup() {myServo.attach(9);}void loop() { // 检查串口缓存是否有数据等待传输myServo.write(pos); // 使用pos变量数值设置伺服电机delay(15);}}
舵机的往复控制:
/**********************************************************************舵机的往复控制-----------------------------------------------------------------------修订历史/Revision History日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description2021/05/18 金陵中学 1.0 金陵中学Arduino选修课使用-----------------------------------------------------------------------*/#include <Servo.h>Servo myservo; //创建Servo对象myservoint pos = 0; // 创建变量pos存储舵机角度值void setup(){myservo.attach(9);}void loop(){for(pos = 0; pos < 180; pos += 1) // 舵机从0到180度,间隔为1{myservo.write(pos); //告知舵机前往变量pos所对应的位置delay(15); // 等待15ms}for(pos = 180; pos>=1; pos-=1) // 舵机从180到0度{myservo.write(pos); // tell servo to go to position in variable 'pos'delay(15); // waits 15ms for the servo to reach the position}}
串口控制示例程序:
/**********************************************************************通过串口实现舵机的控制-----------------------------------------------------------------------修订历史/Revision History日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description2021/05/18 金陵中学 1.0 金陵中学Arduino选修课使用-----------------------------------------------------------------------*/#include <Servo.h>Servo myservo; //创建Servo对象myservoint dataIndex = 0; //创建整数型变量,存储输入数据序列号void setup() {myservo.attach(9);Serial.begin(9600); //启动串口通讯,传输波特率9600Serial.println("Please input serial data.");}void loop() { // 检查串口缓存是否有数据等待传输if ( Serial.available()>0 ) {dataIndex++; // 处理数据序列号并通过串口监视器显示Serial.print("dataIndex = ");Serial.print(dataIndex);Serial.print(" , ");int pos = Serial.parseInt(); // 解析串口数据中的整数信息并赋值给变量posSerial.print("Set servo position: ");Serial.println(pos); // 通过串口监视器显示变量pos数值myservo.write(pos); // 使用pos变量数值设置伺服电机delay(15);}}
