• Arduino程序设计(十四)舵机控制实验(SG90)



    前言

    • 本文介绍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舵机功能
    GNDGND(棕色)负极
    5VVCC(红色)正极
    D9PWM(橙色)信号输入

    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 头文件 。

    代码实现:

    //SG90舵机控制
    //舵机0~180°来回转动
    
    #include             //加载文件库
    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+1
        myservo.write(pos);
        delay(15);					
      }
      for (pos = 180; pos >= 0; pos -= 1) {
        myservo.write(pos);
        delay(15); 					
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • (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 
    
    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°");
          
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • (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进阶之舵机使用

  • 相关阅读:
    IDEA创建第一个spring项目
    【仁川出差】记2022.10仁川出差
    国产龙芯双核64位系统迅为2K开发板应用到工控轨道交通电力能源等领域
    动态规划习题——
    Java学习----集合1
    手机银行体验性测试:如何获取用户真实感受
    (附源码)ssm高考志愿智能选择系统 毕业设计 134565
    spinal HDL - 11 - 使用状态机语法编写“1001“序列检测
    前端秘法基础式终章----欢迎来到JS的世界
    羊城杯2022 部分web
  • 原文地址:https://blog.csdn.net/weixin_44887565/article/details/133754246