Arduino Uno 实验7——SG90舵机

SG90舵机简介

  舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。主要是由外壳、电路板、驱动马达(直流电机)、减速齿轮组、位置检测元件(控制电路)所构成,是一套自动(闭环)控制装置
  所谓自动(闭环)控制就是用一个闭环反馈控制回路不断校正输出的偏差,使系统的输出保持恒定。
  注意:①舵机的连线接口和舵机转动范围
     ②舵机内有位置控制电路,一旦通电后,不要用手转动舵盘,容易导致逻辑内减速齿轮的损坏。里面有传感器,读取对应的数值,形成闭环控制。
在这里插入图片描述

在这里插入图片描述

SG90舵机工作原理

  由接收机发出讯号给舵机,经由电路板上的 IC驱动无核心马达开始转动,透过减速齿轮将动力传至摆臂,同时由位置检测器送回讯号,判断是否已经到达定位。位置检测器其实就是可变电阻,当舵机转动时电阻值也会随之改变,藉由检测电阻值便可知转动的角度
  如果轴的位置与控制信号相符,那么电机就会关闭。如果控制电路发现这个角度不正确,它就会控制马达转动,直到它达到指定的角度。舵机角度根据制造商的不同而有所不同。比如,一个180度的舵机,它可以在0度至180度之间运动。由于限位装置被安装在主输出装置上,超出这个范围机械结构就不能再转动了
  舵机的输出功率与它所需要转动的距离成正比。如果输出轴需要转动很长的距离,马达就会全速运转,如果它只需要短距离转动,马达就会以较慢的速度运行,这叫做速度比例控制。
在这里插入图片描述

如何让舵机转到指定角度?

  控制线用于传输角度控制信号。这个角度是由控制信号脉冲的持续时间决定的,这叫做脉冲编码调制(PCM)。舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围,总间隔为2ms。脉冲的宽度将决定马达转动的距离。例如:1.5毫秒的脉冲,电机将转向90度的位置(通常称为中立位置,对于180°舵机来说,就是90°位置)。如果脉冲宽度小于1.5毫秒,那么电机轴向朝向0度方向。如果脉冲宽度大于1.5毫秒,轴向就朝向180度方向。以180度舵机为例,对应的控制关系是这样的
0.5ms————-0度;1.0ms————45度;1.0ms————45度;2.0ms———–135度;2.5ms———–180度;
在这里插入图片描述

SG90舵机的使用

类库的使用规则

在这里插入图片描述
在这里插入图片描述

两个示例程序

在这里插入图片描述

实验一:舵机来回扫(示例:Sweep)

项目要求:

  实现舵机在0~180度来回转动

电路搭建

在这里插入图片描述

参考程序
#include <Servo.h>
Servo myservo;  
int pos = 0;   
void setup() {
  myservo.attach(9);  
}
void loop() {
  for (pos = 0; pos <= 180; pos += 1) { 
    myservo.write(pos);             
    delay(15);                      
  }
  for (pos = 180; pos >= 0; pos -= 1) {
    myservo.write(pos);              
    delay(15);                       
  }
}

实验二:电位器控制舵机(示例:Knob)

项目要求:

  实现电位器转动,带动舵机转动。

电路搭建

在这里插入图片描述

参考程序
#include<Servo.h>  //数控制舵机运行
Servo myServo;  //新建一个舵机对象myServo
const int servoPin=12; //设置舵机的连接引脚为12
const int potPin=A0; //设置电位器的连接引脚为A0

void setup() {
  myServo.attach(servoPin); //使用舵机库功能函数attach(),该函数的功能是告诉Arduino舵机连接到9数字引脚
}
void loop() {
  int val = analogRead(potPin);
  val = map(val, 0, 1023, 0, 180); //将val从0~1023映射到0~180
  myServo.write(val);  //功能函数write(angle)功能是用于设定舵机旋转角度(angle),角度范围为0°~180°
  delay(100); //延迟时间,让舵机转动到位
}

实验三:串口控制舵机

项目要求:

  在串口监视器上输入角度后,舵机转动到指定的角度。

电路搭建

在这里插入图片描述

参考程序
#include <Servo.h>

const int servoPin = 9;   //设置舵机引脚为9
Servo myServo;              //创建Servo对象myServo

int dataIndex = 0;          //创建整数型变量,存储输入数据序列号
void setup() {
  myServo.attach(servoPin);
  Serial.begin(9600);    //启动串口通讯,传输波特率9600
  Serial.println("Please input serial data.");
}

void loop() {
  if ( Serial.available() > 0 ) {       // 检查串口缓存是否有数据等待传输
    int pos = Serial.parseInt();   // 解析串口数据中的整数信息并赋值给变量pos
    if (pos < 0 || pos > 180) {
      Serial.println("Wrong number,please input again");
    } else {
      dataIndex++;                        // 处理数据序列号并通过串口监视器显示
      Serial.print("dataIndex = ");
      Serial.print(dataIndex);
      Serial.print(" , ");
      Serial.print("Set servo position: ");
      Serial.println(pos);           // 通过串口监视器显示变量pos数值
      myServo.write(pos);             // 使用pos变量数值设置伺服电机
      delay(15);
    }
  }
}


  • 10
    点赞
  • 151
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值