1.通过简单案例认识舵机

案例1:自动吃食的小动物模型

难度:⭐
相关材料:舵机(MG90S)、木板或硬纸板、剪刀
程序:舵机范例程序
点击查看【bilibili】

案例2:自动转头的小动物模型

难度:⭐
相关元器件:相关材料:舵机(MG90S)、木板或硬纸板、剪刀
程序:舵机范例程序
点击查看【bilibili】

2.舵机的原理

这种电机内置电路可将电机输出轴的位置进行反馈,因此它的输出轴可以被Arduino等控制在某一个固定角度。它的主要应用为控制模型的运动方向(这就是”舵机“这一名称来历。),很多小型机械臂也会使用舵机驱动。舵机有些是可以旋转360度的,但有些只能旋转180度。
期末开放任务素材:舵机 - 图1
期末开放任务素材:舵机 - 图2
舵机的转动的角度是通过调节PWM(脉冲宽度调制)信号的占空比来实现的,标准PWM(脉冲宽度调制)信号的周期固定为20ms(50Hz),理论上脉宽分布应在1ms到2ms 之间,但是,事实上脉宽可由0.5ms 到2.5ms 之间,脉宽和舵机的转角0°~180°相对应。有一点值得注意的地方,由于舵机牌子不同,对于同一信号,不同牌子的舵机旋转的角度也会有所不同。
期末开放任务素材:舵机 - 图3
点击查看【bilibili】

舵机控制基本程序:

  1. /**********************************************************************
  2. 舵机的直接控制
  3. -----------------------------------------------------------------------
  4. 修订历史/Revision History
  5. 日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
  6. 2021/05/18 金陵中学 1.0 金陵中学Arduino选修课使用
  7. -----------------------------------------------------------------------
  8. */
  9. #include <Servo.h>
  10. Servo myServo; //创建Servo对象myServo
  11. int pos=90; // 创建变量pos存储舵机角度值
  12. void setup() {
  13. myServo.attach(9);
  14. }
  15. void loop() { // 检查串口缓存是否有数据等待传输
  16. myServo.write(pos); // 使用pos变量数值设置伺服电机
  17. delay(15);
  18. }
  19. }

舵机的往复控制:

  1. /**********************************************************************
  2. 舵机的往复控制
  3. -----------------------------------------------------------------------
  4. 修订历史/Revision History
  5. 日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
  6. 2021/05/18 金陵中学 1.0 金陵中学Arduino选修课使用
  7. -----------------------------------------------------------------------
  8. */
  9. #include <Servo.h>
  10. Servo myservo; //创建Servo对象myservo
  11. int pos = 0; // 创建变量pos存储舵机角度值
  12. void setup()
  13. {
  14. myservo.attach(9);
  15. }
  16. void loop()
  17. {
  18. for(pos = 0; pos < 180; pos += 1) // 舵机从0到180度,间隔为1
  19. {
  20. myservo.write(pos); //告知舵机前往变量pos所对应的位置
  21. delay(15); // 等待15ms
  22. }
  23. for(pos = 180; pos>=1; pos-=1) // 舵机从180到0度
  24. {
  25. myservo.write(pos); // tell servo to go to position in variable 'pos'
  26. delay(15); // waits 15ms for the servo to reach the position
  27. }
  28. }

串口控制示例程序:

  1. /**********************************************************************
  2. 通过串口实现舵机的控制
  3. -----------------------------------------------------------------------
  4. 修订历史/Revision History
  5. 日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
  6. 2021/05/18 金陵中学 1.0 金陵中学Arduino选修课使用
  7. -----------------------------------------------------------------------
  8. */
  9. #include <Servo.h>
  10. Servo myservo; //创建Servo对象myservo
  11. int dataIndex = 0; //创建整数型变量,存储输入数据序列号
  12. void setup() {
  13. myservo.attach(9);
  14. Serial.begin(9600); //启动串口通讯,传输波特率9600
  15. Serial.println("Please input serial data.");
  16. }
  17. void loop() { // 检查串口缓存是否有数据等待传输
  18. if ( Serial.available()>0 ) {
  19. dataIndex++; // 处理数据序列号并通过串口监视器显示
  20. Serial.print("dataIndex = ");
  21. Serial.print(dataIndex);
  22. Serial.print(" , ");
  23. int pos = Serial.parseInt(); // 解析串口数据中的整数信息并赋值给变量pos
  24. Serial.print("Set servo position: ");
  25. Serial.println(pos); // 通过串口监视器显示变量pos数值
  26. myservo.write(pos); // 使用pos变量数值设置伺服电机
  27. delay(15);
  28. }
  29. }