前言

  • 本文介绍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 <Servo.h> 头文件 。

代码实现:

//SG90舵机控制
//舵机0~180°来回转动

#include <Servo.h>            //加载文件库
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); 					
  }
}
  • (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 <Servo.h>

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°");
      
    }
  }
}
  • (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进阶之舵机使用

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐