前言
Servo motor,又稱伺服馬達或舵機。簡單的說就是可以較精確地控制其轉動角度的馬達,其最大的特徵是有3條連接綫。
關於Servo和其他類別的馬達會在往後再詳細介紹。
工房內常見的Servo有右邊的幾種,大型(右下)和小型(其他)主要的分別是負重的力度不同,但控制的方法和編程都是一樣的。
要控制Servo,必須要正確地接Servo的3條連接綫到控制板上。一般Servo板上的綫都是棕紅黃或黑紅白三色,連接方法為:
棕/黑:代表地線,連接控制板上的GND/G/負極
紅:代表正極,連接控制板上的5V/V/正極
黃/白:代表訊號,連接控制板上的0~13/A0~A5
最基本的連接方法是直接用3線綫把Servo連在Arduino底板,但由於底板的V/GND有限,如果要同時接上多個Servo會不夠腳位用
為了方便連接Servo,也讓控制板可以同時控制多個Servo或其他零件,我們會用到Arduino Sensor Shield這款擴充板,它把G(GND)及V(正極)伸延到0~13及A0~A5腳每隻腳的上方,所以我們只需注意好方向直接接上Servo就可以了
除了Arduino Sensor Shield擴充板(往後通稱擴充板/Sensor Shield),在IS擴充板(往後通稱IS擴充板/IS Shield)上也有預留了5個位置(A0~A4)可以直接連接Servo的位置,如下圖。(*如使用A1等腳接Servo就不能同時使用A1的可變/光敏電阻)
在Arduino內置的基本程式中,並沒有直接控制Servo的指令,但是可以通過"請外援"的方式來增加控制指令
參見右面例子(書p.30):
#include <Servo.h>就是一個外置的程式庫,我們通稱這種"外援"為library。說穿了其運作方式和之前提到的function差不多,一樣是把一堆複雜的程式碼簡化,不過這些library是由別人做好了,而具體的程式碼通常放在電腦主盤內的User\Documents\Arduino\libraries文件夾內。你也可以把function制作成一個library放在libraries文件夾內使用,或者上網尋找別人寫好的其他library,但這部份就留在其他章節再詳談了。
說回程式例子,在第一方加入了Servo.h的library後
第二行就是自定義一個文字指令去控制,像這裏就定義了myServo這個字
接下來就只需要2句指令,myServo.attach( );和myServo.write( );
myServo.attach( ); 定義了Servo是接在幾號腳位,
myServo.write( ); 則是讓Servo轉動到幾多角度
以左邊的例子Servo是接在9號腳,而在loop內的指令則是讓Servo轉到90度的位置。
而Servo上方的長條狀膠片、通稱Servo碟。Servo碟可以拆下來再改變角度裝回Servo上方,所以右方示意圖的180°也可以改成向左方的180°或其他範圍的180°
Servo的可轉動的範圍一般是180°
實物的實際角度會比180°再少一點
1. 把IS擴充板上的所有jumper移除
2. 把Servo disc(Servo碟)移除
3. 把Servo接到A4(SDA)腳位
把上方例子內的myServo換成你的班級學號試試,例如F4B00Servo;
另外把attach()內的腳位改成A4號腳,把Servo調整到90°
完成後把Servo碟保持垂直地安裝回Servo上
右方是書中p.32版的例子,功能是控制Servo在0°~90°來回擺動
把內的myServo換成你的班級學號,腳位換成A4,控制Servo在0°~180°來回擺動
在1b的基礎上,我們可以再加入一隻Servo,只需要把Servo相關的指令複製一次並設成不同的關鍵字就可以了。以書的例子為例,在A3加入一隻Servo,並設定成和第一隻Servo擺動位置相反:
#include <Servo.h>
Servo F4B00Servo1; //第一隻Servo的自定指令是F4B00Servo1
Servo F4B00Servo2; //第二隻Servo的自定指令是F4B00Servo2
int angle = 0;
void setup(){
F4B00Servo1.attach(A4);//第一隻Servo的腳位是A4
F4B00Servo2.attach(A3);//第二隻Servo的腳位是A3
}
void loop(){
F4B00Servo1.write(angle);
F4B00Servo2.write(90-angle); //第二隻Servo的角度和第一隻相反90°
angle = 90-angle;
delay(500);
}
第二隻Servo接在A3
之前我們試過用A1可變電阻的輸入訊號控制LED的亮度(1.4 進階練習 3a)
今次我們把Output換成Servo,以A1可變電阻的輸入訊號控制Servo角度(0~1023輸入控制0~180角度)
int analogpin_1=A1;
int analoginput_1,output_angle_1;
#include <Servo.h>
Servo F4B00Servo1;
void setup() {
F4B00Servo1.attach(A4);
Serial.begin(9600);
}
void loop() {
analoginput_1=analogRead(analogpin_1);
angle_1=map(analoginput_1,_,____,_,___); //把analoginput的值由0~1023等比變成0~180的角度
F4B00Servo1.write(angle);
Serial.print("The input signal is: ");
Serial.print(analoginput_1);
Serial.print(" The output signal is: ");
Serial.println(angle_1);
}
要用可變電阻記得加上Jumper在A1
結合1c和2a,在A3和A4加入2隻Servo,分別以A1和A2的可變電阻的輸入訊號控制Servo角度(0~1023輸入控制0~180角度)
要用可變電阻記得加上Jumper在A1,A2