Servo motor伺服馬達在機械人中佔一個很重要的地位。Servo motor並不會像一般馬達那樣連續旋轉,而是會依指令在0度到180度的範圍內轉動或停止。

Servo motor整合了控制電路,控制馬達的角度,整個反饋控制迴路(feedback control loop)藉由電位器(potentiometer),即可變電阻,量度馬達的輸出角度,控制電路讀取電阻值後,便會依此數值來調整馬達的運轉方向和轉速,從而令馬達保持在指令的角度。
Servo motor的角度會由0度累加至180度,再由180度累減至0度。如此循環。



x1#include <Servo.h> 2
3Servo myservo;4byte angle;5byte step = 1;6
7void setup(){8 myservo.attach(9);9}10
11void loop(){12 angle += step;13 if(angle > 180 || angle < 0){14 step *= -1;15 }16 myservo.write(angle);17 delay(50);18}#include <Servo.h> : Servo是Arduino內建的library之一,但它不像Serial library已經包含在程式之中,需要另外呼叫Serial.h文件去令它運作。
Servo myservo; : 就是設定一個Servo物件,叫myservo。
byte angle;
byte step = 1;
設定一個變數angle,再設定一個累加的步數,下面每一個loop()回圈,angle就會累加step的值。
myservo.attach(9); : 一開始需要告訴Arduino servo是接在那一腳位,現在是接在9腳。
angle += step;
if(angle > 180 || angle < 0){
step *= -1;
}
angle每一次loop()的循環都會累加step的數值。angle += step 即 angle = angle + step的簡寫。
如果angle大於180度或者angle少於0度,step = step * -1,所以如果angle大於180度,就變成 angle = angle - step,之後再累減到少於0度,又會變成angle = angle + step。
myservo.write(angle); : 就是寫入角度,Arduino的Servo library可以直接寫入角度,一般的servo motor,signal腳位控制角度的訊號是這樣的:

signal腳位收的訊號是PWM訊號,週期約20ms,pulse的寬度為1ms時,servo motor的角度為0度,pulse的寬度為1.5ms時,角度為90度,pulse寬2ms,角度為180度。
當然,每一個品牌的servo都會有少量的差異,有的可能是90度servo,有的可能出廠時最大只有0 - 160度,但一般都大同小異,如果需要微調,請參考這裡。
參考第一章的analogRead(),試用analogRead()讀取電位器的數值,用map()把0-1023的讀數重速縮放為0-180度,再控制servo的角度。

參考上一章的digital input,當按下按鍵時,servo由原本的0度變成180度,當再按下時,由180度復原為0度,如此反復運作。
把IR反射式sensor綁在servo之上,令其跟著servo如上面的例題般左右轉動,參考上一章的digital input,當IR反射式sensor搜尋到有物件阻擋時,停止servo轉動並在Serial監視器列印出servo當時的轉動角度。