准备:arduino板,舵机,面包板和杜邦线等。
就是这个东西
原理与控制方式:
舵机有三条控制线,分别是电源、地、信号线。电源和地用于提供内部的直流马达及控制线所需的能量,电压通常介于4V-6V,由于舵机内部的马达会产生噪声,所以该电源应该尽可能与处理系统的电源隔离,即舵机最好单独供电。信号线控制为一PWM信号,高电平时间通常在1ms-2ms,低电平时间应在5ms-20ms,舵机每20ms必须收到高电平信号,否则舵机将断电,并且不能维持原来的位置。下图展示了一个典型PWM信号与舵机位置的关系。
当然这是一个大概的对应关系,可根据实际情况调节,其他角度按以上关系控制。
电路连接图如图
不用多解释,5V、GND、信号线接6号引脚。(哪个引脚都行)
上代码
1,我们根据上面的对应关系,写个最简单的代码,使舵机转动到固定角度。比如比如135°-2ms-2000us。
void setup()
{
pinMode(6,OUTPUT);
}
void loop()
{
delay(15);
digitalWrite(6,HIGH);
delayMicroseconds(2000);
digitalWrite(6,LOW);
delay(15);
}
2,我们让它在0°和180°之间摇摆
int n;
void setup(){
pinMode(6,OUTPUT);
}
void loop(){
for(int i=0;i<=50;i++){ //产生PWM个数,等效延时以保证能转到响应角度
servogo(1);
}
for(int i=0;i<=50;i++){ //产生PWM个数,等效延时以保证能转到响应角度
servogo(18);
}
}
void servogo(int angle){//angle=1~18 .对应20°~180°
n=(angle*110)+500;//将角度转化为500-2480 的脉宽值
digitalWrite(6,HIGH);
delayMicroseconds(n);
digitalWrite(6,LOW);
delay(20-n/1000);//延时周期内剩余时间
}
效果看一下
3,串口控制,输入角度值,转动到指定角度
int n;
int val;//val=0~9 .对应0°~180°
void setup(){
pinMode(6,OUTPUT);
Serial.begin(9600);
}
void loop(){
if(Serial.available()){
val=Serial.read();
val=val-'0';//将ASCII码转换成数值,例'9'-'0'=0x39-0x30=9
val=val*2;
}
servogo(val);
}
void servogo(int angle){//angle=1~18 .对应20°~180°
n=(angle*110)+500;//将角度转化为500-2480 的脉宽值
digitalWrite(6,HIGH);
delayMicroseconds(n);
digitalWrite(6,LOW);
delay(20-n/1000);//延时周期内剩余时间
}
看一下效果
4,串口控制,‘W’、‘S’键盘控制角度增减
int n;
int val;//val=0~18 .对应0°~180°
int a=0;
void setup(){
pinMode(6,OUTPUT);
Serial.begin(9600);
}
void loop(){
if(Serial.available()){
val=Serial.read();
switch(val){
case 'W':
a+=2;
if(a>18){
a=18;
}
break;
case 'S':
a-=2;
if(a<0){
a=0;
}
break;
default:
break;
}
}
servogo(a);
}
void servogo(int angle){//angle=1~18 .对应20°~180°
n=(angle*110)+500;//将角度转化为500-2480 的脉宽值
digitalWrite(6,HIGH);
delayMicroseconds(n);
digitalWrite(6,LOW);
delay(20-n/1000);//延时周期内剩余时间
}
看一下效果
代码为什么这样写?for循环有点儿莫名其妙?
我的舵机为什么喜欢抖动?抽搐?
还请听下回分解!