Arduino Uno 舵机控制

硬件

SG90舵机相关介绍:

角度:90度 - 180度通用
红色为5V电源线,棕色为地线,橙色为信号线
无负载转速:0.12秒/60度 (4.8V)
堵转扭矩:1.2 - 1.4公斤/厘米 (4.8V)

软件:

servo类函数的用法

方法                            

  描述

Servo.attach( )

连接舵机信号线引脚(自带库仅9/10脚有效)

Servo.write ( )

写入角度

Servo.writeMicrseconds ( )

写入更精准的角度(um级)

Servo.read ( )

读取上一次舵机转动角度

Servo.attached ( )

检查舵机是否连接在控制板上

Servo.detach ( )

断开舵机连接

注:也可以声明一个 Servo对象名,如Servo myDj; myDj.attach();

1. attach()-设定信号引脚

描述:将Servo变量附加到引脚

注意:在Arduino 0016及之前的版本上,Servo库仅支持将舵机连接至第9和第10脚上。

语法

servo.attach(pin)

servo.attach(pin, min, max)

参数说明

servo:一个类型为servo的变量

pin:连接至舵机的引脚编号

min(可选):舵机为最小角度(0度)时的脉冲宽度,单位为微秒,默认为544

max(可选):舵机为最大角度(180度时)的脉冲宽度,单位为微秒,默认为2400

2. write()-设定舵机旋转角度(0~180);

描述:向舵机写入一个数值,来直接控制舵机的轴。在一个标准的舵机中,这将设定齿轮的角度,将齿轮转到对应的位置。在一个连续旋转的舵机中,这将设置一个舵机的角度(0作为全速向一边,180为全速向另一边,在90附近的值为停止)。

语法

servo.write(angle)

参数说明

servo:一个类型为servo的变量

angle:写向舵机的角度,从0到180之间

3. writeMicroseconds()-更精准的角度控制(μm级)

描述:向舵机写入一个微秒的值来控制舵机的轴。在一个标准舵机中,这将设置舵机齿轮的角度。在标准舵机中,参数设置为1000为完全逆时针方向,2000完全顺时针方向,1500为在中间。

注意:一些生产厂商没有按照这个标准,以至于舵机通常响应在700到2300之间的值。*地增加终点值直到舵机不再增加它的范围。让舵机旋转超过它的终点(有可能会发出异常声响)是一个高电流状态,应该被避免。连续旋转舵机对该函数的响应类似于write()函数

语法

servo.writeMicroseconds(uS)

参数说明

servo,一个类型为servo的变量

uS,一个代表微秒值的整数参数

4. read()

描述:读取舵机当前的角度(最后一次用write()函数写入的值)

语法

servo.read()

参数说明

servo,一个类型为servo的变量

返回值

舵机的角度,从0至180度

仅将其调用,但不使用,会使舵机出现异常;

5. attached-检查舵机及是否连接控制板上

描述:检查一个servo变量是否被附加到一个引脚

语法

servo.attached()

参数说明

servo,一个类型为servo的变量

返回值

返回true,如果被附加到一个引脚,反之返回false

6. detach-断开舵机连接,使接口(9/10脚)可做PWM输出

描述:将servo变量与引脚脱离,如果所有servo变量均被脱离,第9和第10脚将可以用analogWrite()函数进行PWM输出。

语法

servo.detach()

参数说明

servo,一个类型为servo的变量

范例1

//自感应开盖垃圾桶

#include "Servo.h"  //使用servo类之前先导入库

#define Echo D2

#define Trig D8

#define PIN_SERVO D5  //定义舵机信号线连接的引脚

#define openTheBox myDuoJi.write(10)//开盖

#define closeTheBox myDuoJi.write(150) //关盖

Servo myDuoJi;//定义一个舵机

void initCeJu()

{

  pinMode(Echo, INPUT);      //D2为输入

  pinMode(Trig, OUTPUT);    //D8为输出

}

long getTime()

{

   //超声波触发

  digitalWrite(Trig,0);      //D8为低电平

  delayMicroseconds(10);     //delay10US

  digitalWrite(Trig,1);      //D8为高电平

 delayMicroseconds(10); //delay10US

 

  return pulseIn(Echo, HIGH);  //返回D2的高电平脉冲值

}

void setup() {

  // put your setup code here, to run once:

  initCeJu();

  myDuoJi.attach(PIN_SERVO);//舵机初始化,5#引脚

  Serial.begin(115200);

}

void loop() {

  // put your main code here, to run repeatedly:

  long dis;

  dis = getTime()/58;   //超声波感应距离

  Serial.print(dis);

  Serial.println("cm");

 

  if(dis < 28){

    openTheBox;//开盖(预处理定义)

   

  }else if(dis > 50){

    closeTheBox;//关盖(预处理定义)

  }

  delay(500);

   

}

上一篇:Arduino学习笔记---蜂鸣器


下一篇:Arduino学习笔记---Blink without delay