硬件
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);
} |