今日實驗要如何控制Servo,利可變電阻來控制馬達。
介紹
本文介紹伺服馬達,伺服馬達亦稱伺服機,一般用在遙控汽車、船、飛機等角度控制機構中。其外觀構造如圖所示。通常伺服機出力軸上會接「伺服擺臂」,如圖中伺服機上方的白色機構。
常用的伺服機有三條接線,在圖中黑線接地線(GND),紅線接電源(6V),白線為訊號線。伺服機內部由齒輪組和馬達、電路(圖 0‑2的2)所構成。馬達的運動由電路所控制再透過齒輪組輸出,可達到位置定點的控制。
伺服機的主要規格,除了尺寸大小外,扭力與速度也是選購伺服機時重要依據,使用者須先了解自己所需要規的規格,再來決定伺服機的種類。以伺服馬達來說,扭力與速度大大影響了價格,通常大扭力的價格是以指數型成長。
伺服機的控制方式有別於一般的直流馬達,必須送出週期為20ms(頻率為50Hz)的PWM訊號,利用脈波寬度來控制伺服機轉動的角度,也就是前一章節所介紹PWM訊號,但要注意的是周期為20ms。Arduino的analogWrite()指令所輸出的PWM,預設的周期約為2ms(P3、P9、P10、P11)或者1ms(P5、P6),因此控制伺服機並不能直接用analogWrite()指令,而得透過servo.h函式庫。
控制伺服馬達訊號的PWM脈波週期是20ms,訊號的脈波寬度在1.0ms到2.0ms之間,脈波的寬度決定伺服擺臂轉動的方向和角度;當輸出脈波寬度在1.5ms時,伺服馬達會轉動到90度位置,如圖 0‑3左邊;若脈波寬度超過1.5ms會往一個方向轉動,如:脈寬為2.0ms時,伺服馬達會轉動到180度位置,如圖 0‑3中間;若脈波寬度小於1.5ms會往另一個方向轉動,如:脈寬為1.0ms時,伺服馬達會旋轉到0度位置,如圖 0‑3右邊。
伺服機的控制方式有別於一般的直流馬達,必須送出週期為20ms(頻率為50Hz)的PWM訊號,利用脈波寬度來控制伺服機轉動的角度,也就是前一章節所介紹PWM訊號,但要注意的是周期為20ms。Arduino的analogWrite()指令所輸出的PWM,預設的周期約為2ms(P3、P9、P10、P11)或者1ms(P5、P6),因此控制伺服機並不能直接用analogWrite()指令,而得透過servo.h函式庫。
控制伺服馬達訊號的PWM脈波週期是20ms,訊號的脈波寬度在1.0ms到2.0ms之間,脈波的寬度決定伺服擺臂轉動的方向和角度;當輸出脈波寬度在1.5ms時,伺服馬達會轉動到90度位置,如圖 0‑3左邊;若脈波寬度超過1.5ms會往一個方向轉動,如:脈寬為2.0ms時,伺服馬達會轉動到180度位置,如圖 0‑3中間;若脈波寬度小於1.5ms會往另一個方向轉動,如:脈寬為1.0ms時,伺服馬達會旋轉到0度位置,如圖 0‑3右邊。
接線方式:按鈕在Arduino的實際配線法,如圖 0‑4
程式
#include <Servo.h> //呼叫控制伺服馬達的函式庫
Servo servo_motor; //宣告伺服馬達變數
void setup(){
servo_motor.attach(9); //伺服馬達接PWM腳位9
servo_motor.write(90); //控制伺服馬達到90度的位置
servo_motor.writeMicroseconds(1500); //指定脈波寬度為1.5ms
delay(5000); // 延遲5秒
}
void loop(){
servo_motor.write(0); //控制伺服馬達轉到0度位置
servo_motor.writeMicroseconds(1020); //指定脈波寬度為1.02ms
delay(5000);
servo_motor.write(180); //控制伺服馬達轉到180度的位置
servo_motor.writeMicroseconds(1980); //指定脈波寬度為1.98ms
delay(5000);
}
說明
- 執行上述程式,伺服馬達的擺臂會先轉到90度位置等待5秒,接著轉到0度位置等待5秒,再轉到180度等待5秒,如此重複擺動。
- 使用伺服馬達的程式指令需用到函式庫,所以在撰寫程式時要先呼叫伺服馬達的函式庫,用#include <Servo.h>表示。#include後面接的是標頭檔Servo.h,代表所呼叫的函式庫。函式庫在呼叫後,需要宣告命令集的名稱,上述程式裡Servo後面接的是命令集的名稱servo_motor。servo.h的命令有servo_motor.attach()和servo_motor.write(),其中servo_motor.attach()是設定所使用的PWM腳位,servo_motor.write()是設定伺服馬達轉動的角度。有關Servo函式庫放在Arduino-0018\ libraries\ Servo資料夾中。
- 紅色字體 使用servo_motor.write()可以使伺服馬達轉動到指定的角度,另外伺服馬達函式庫裡也有其他程式指令可使伺服馬達到達類似的指定角度,例如servo_motor.writeMicroseconds()也是其中一個控制命令,差別在於此命令是給予脈波寬度大小進而使伺服馬達轉動到所要求的位置,參考程式如下。(此命令可以控制的精度較高)。
成果
沒有留言:
張貼留言