Arduino与SG90舵机握手

简介: Arduino与SG90舵机握手

1.0 简介

  • 舵机:是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的伺服控制系统。在高档遥控玩具,如飞机、潜艇模型,遥控机器人中已经得到了普遍应用。本篇通过官方驱动库和自定义函数来实现舵机控制。
  • 外形结构:主要是由外壳、无核心马达、四级减速齿轮、电路板和位置检测器所构成。

1.jpgimage.jpeg

  • 工作原理:

其工作原理是由接收机或者单片机发出信号给舵机,其内部有一个基准电路,产生周期为20ms,宽度为1.5ms 的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。经由电路板上的IC 判断转动方向,再驱动无核心马达开始转动,透过减速齿轮将动力传至摆臂,同时由位置检测器送回信号,判断是否已经到达定位。

舵机转动的角度是通过调节PWM「脉冲宽度调制」信号的占空比来实现的。标准的PWM信号的周期固定为20ms,理论上脉宽分布应该在1ms到2ms之间,实际上可由0.5ms到2.5ms之间,脉宽与转角0°—180°相对应。不同厂家不同型号的舵机也会有所差异。

3.gif

4.jpg

  • SG90舵机(180°)相关参数见下表:

5.png

2.0 实验材料

  • Arduino Uno R3开发板
  • USB数据线
  • 三根公母线
  • SG90舵机
  • 一台安装Arduino开发环境的电脑

3.0 实验步骤

3.1 根据原理图搭建电路

舵机红色线接开发板5V,棕色线接开发板GND,橙色信号线接开发板数字引脚10。

实验原理图:

6.jpg

实验接线图:

7.jpg

3.2 新建sketch,拷贝如下代码并进行保存编译上传

代码1:

#include <Servo.h>            // 调用Servo库
Servo servo_10;             // 定义Servo对象来控制
void setup(){
  servo_10.attach(10);          // 控制线连接数字10
}
void loop(){
  for (pos = 0; pos <= 180; pos ++) {   // 0°到180°
    // in steps of 1 degree
    servo_10.write(pos);              // 舵机角度写入
    delay(5);                         // 控制移动速度
  }
  for (pos = 180; pos >= 0; pos --) {   // 从180°到0°
    servo_10.write(pos);                // 舵机角度写入
    delay(5);                         // 控制移动速度
  }
}

代码2:

int servopin = 10; //设置舵机驱动脚到数字口10
int myangle;//定义角度变量
int pulsewidth;//定义脉宽变量
int val;
void servopulse(int servopin, int myangle) /*定义一个脉冲函数,用来模拟方式产生PWM值*/
{
  pulsewidth = (myangle * 11) + 500; //将角度转化为500-2480 的脉宽值
  digitalWrite(servopin, HIGH); //将舵机接口电平置高
  delayMicroseconds(pulsewidth);//延时脉宽值的微秒数
  digitalWrite(servopin, LOW); //将舵机接口电平置低
  delay(20 - pulsewidth / 1000); //延时周期内剩余时间
}
void setup()
{
  pinMode(servopin, OUTPUT); //设定舵机接口为输出接口
  Serial.begin(9600);//设置波特率为9600
  Serial.println("servo=o_seral_simple ready" ) ;
}
void loop()//将0 到9 的数转化为0 到180 角度,并让LED 闪烁相应数的次数
{
  val = Serial.read(); //读取串口收到的数据
  if (val >= '0' && val <= '9') //判断收到数据值是否符合范围
   {
    val = val - '0'; //将ASCII码转换成数值,例'9'-'0'=0x39-0x30=9
    val = val * (180 / 9); //将数字转化为角度,例9*(180/9)=180
    Serial.print("moving servo to ");
    Serial.print(val, DEC);
    Serial.println();
    for (int i = 0; i <= 50; i++) //给予舵机足够的时间让它转到指定角度
    {
      servopulse(servopin, val); //引用脉冲函数
    }
  }
}

3.3 实验现象

代码1:

                                           8.gif

代码2:

9.jpg

4.0 总结

  • 用Arduino 控制舵机的方法有两种,代码1是直接利用Arduino 自带的Servo 函数进行舵机的控制,这种控制方法的优点在于程序编写,缺点是只能控制2 路舵机,因为Arduino 自带函数只能利用数字9、10 接口。代码2是通过Arduino 的普通数字传感器接口产生占空比不同的方波,模拟产生PWM 信号进行舵机定位,控制原理更加清晰。
  • Arduino 的驱动能力有限,所以当需要控制1 个以上的舵机时需要外接电源。
  • 在以后的博文中我们将学会用arduino常用传感器和执行器,从而实现对外部世界进行感知,充分认识这个有机与无机的环境,科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。
目录
相关文章
|
网络协议 IDE 开发工具
基于ESP8266远程舵机的控制与实现
基于ESP8266远程舵机的控制与实现
2368 0
基于ESP8266远程舵机的控制与实现
|
Linux Python
如何更新pip源
如何更新pip源
|
芯片
STM32外设系列—sg90(舵机)
本文介绍了什么是舵机,舵机的控制原理。以sg90为例,介绍了180°舵机的控制方法,给出了详细的程序设计。最后,介绍了360°舵机的控制方法。
4321 1
STM32外设系列—sg90(舵机)
|
传感器
DIY_实现光敏电阻传感器简单控制LED
DIY_实现光敏电阻传感器简单控制LED
4202 2
如何在 Arduino 中使用 PWM
PWM(脉冲宽度调制)是 Arduino 中常用的技术,用于控制电机速度、LED 亮度等。通过设置数字引脚的 `analogWrite()` 函数,可以生成不同占空比的 PWM 信号,实现精确控制。
2677 2
USB Type-C引脚解析 && CC、DFP、UFP、DRP用途解析
USB Type-C引脚解析 && CC、DFP、UFP、DRP用途解析
|
机器学习/深度学习 人工智能 算法
GitHub星标破千!斯坦福大学的284个机器学习小抄(漫画中文版)
说到人工智能必然要了解机器学习,从信息化软件,到电子商务,然后到高速发展互联网时代,到至今的云计算、大数据等,渗透到我们的生活、工作之中,在互联网的驱动下,人们更清晰的认识和使用数据,不仅仅是数据统计、分析,我们还强调数据挖掘、预测。 机器学习就是对计算机一部分数据进行学习,然后对另外一些数据进行预测与判断。 机器学习的核心是”使用算法解析数据,从中学习,然后对新数据作出决定或预测”。也就是说计算机利用已获取的数据得出某一模型,然后利用此模型进行预测的一种方法,这个过程跟人的学习过程有些类似,比如人获取一定的经验,可以对新问题进行预测。
|
传感器
【经典案例】STM32F407使用HAL库配置I2C详解
STM32F407是一个强大的微控制器,广泛应用于嵌入式系统中。在许多应用中,我们需要使用I2C总线来与传感器、EEPROM、显示屏等外设进行通信。本文将详细介绍如何使用STM32 HAL库来配置和使用I2C接口。
3016 2
|
自然语言处理 编译器 C语言
【C/C++ 标准的发展】C/C++ 语言标准的历史和演变
【C/C++ 标准的发展】C/C++ 语言标准的历史和演变
1200 3