準備: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循環有點兒莫名其妙?
我的舵機為什麼喜歡抖動?抽搐?
還請聽下回分解!