一般伺服馬達有三條線,電源(紅色)、接地(黑或棕色)、訊號線(白或橘)。透過訊號線傳送PWM脈波來控制旋轉角度,而一個週期中(20ms),其中高電位脈波持續時間長短便代表了馬達將轉到什麼角度,範圍從1.0ms到2.0ms(毫秒);若1.0ms當做角度0度,那麼1.5ms會是90度,2.0ms則是轉到底180度。
市面上買到的伺服馬達可能會有兩種顏色配對的接線:
(紅、黑、白)-- 對應 Vcc、 GND、PWM訊號
(紅、黑、白)-- 對應 Vcc、 GND、PWM訊號
(紅、棕、橘)-- 對應 Vcc、 GND、PWM訊號
本實驗是以Tower Pro(輝盛)的小型伺服馬達SG90作為零件,三條線的顏色分別為(紅、棕、橘),電路接線方法如下:
1. 直接輸入角度,讓伺服馬達依序從0度-> 30度->60度->…..->180度->150度->…->30度->0度循迴運轉
#include <Servo.h>
Servo myservo; // 建立Servo物件
void setup()
{
myservo.attach(9); // 將PIN9當成伺服馬達的訊號線
}
void loop()
{
myservo.write(0); // 轉到0度
delay(100);
myservo.write(30); // 轉到30度
delay(100);
myservo.write(60); // 轉到60度
delay(100);
myservo.write(90); // 轉到90度
delay(100);
myservo.write(120); // 轉到120度
delay(100);
myservo.write(150); // 轉到150度
delay(100);
myservo.write(180); // 轉到180度
delay(100);
myservo.write(150); // 轉到150度
delay(100);
myservo.write(120); // 轉到120度
delay(100);
myservo.write(90); // 轉到90度
delay(100);
myservo.write(60); // 轉到60度
delay(100);
myservo.write(30); // 轉到0度
delay(100);
}
|
若轉動角度變化更小,例如每次移動一度,則可以用for-loop的語法減化程式設計的複雜度:
#include <Servo.h>
Servo myservo; // 建立Servo物件
void setup()
{
myservo.attach(9); // 將PIN9當成伺服馬達的控制訊號線
}
void loop()
{
for(int i = 0; i <= 180; i=i+1)
{
myservo.write(i); // 傳入0度轉到180度的累增數值
delay(10);
}
for(int i = 180; i >= 0; i=i-1)
{
myservo.write(i);// 傳入180度轉到0度的遞減數值
delay(10);
}
}
|
2. 直接利用脈波來控制角度
#include
<Servo.h>
Servo
myservo; // 建立Servo物件
void
setup()
{
myservo.attach(9); // 將PIN9當成伺服馬達的訊號線
}
void
loop()
{
myservo.writeMicroseconds(1000); // 指定脈波寬度為1.00ms
delay(500);
myservo.write(1500); // 指定脈波寬度為1.50ms
delay(500);
myservo.write(2000); // 指定脈波寬度為2.00ms
delay(500);
myservo.write(1500); // 指定脈波寬度為1.50ms
delay(500);
}
|
#include
<Servo.h>
Servo
myservo; // 建立Servo物件
void
setup()
{
myservo.attach(9); // 將PIN9當成伺服馬達的訊號線
}
void
loop()
{
myservo.writeMicroseconds(544); // 指定脈波寬度為0.54ms
delay(500);
myservo.write(1472); // 指定脈波寬度為1.472ms
delay(500);
myservo.write(2450); // 指定脈波寬度為2.45ms
delay(500);
myservo.write(1472); // 指定脈波寬度為1.472ms
delay(500);
}
|
沒有留言:
張貼留言