mBlock & Arduino(9)伺服馬達控制


伺服馬達(Servo motor)英文常簡稱 Servo,中文也有人稱伺服機,由控制電路、齒輪、直流馬達等組成,可使用〈mBlock & Arduino(4)利用 PWM 模擬類比訊號〉中談過的 PWM 技術來控制馬達轉動角度,像 Plotclock 就應用了三個伺服馬達,以手臂在白板上繪製出目前的時間。

Plotclock

伺服馬達控制原理

伺服馬達的基本原理是接受 PWM 訊號,經由內部電路計算出馬達的轉動角度,根據我查到的資料來看,大多數伺服馬達旋轉角度是 0 到 180 度,PWM 訊號的頻率必須是 50 Hz,控制馬達角度的脈衝持續時間約是 1.0 ms 到 2.0 ms,脈衝持續時間若為 1.0 ms 時角度為 0 度,1.2 ms 時角度為 45 度,1.5 ms 時角度為 90 度,2.0 ms 時角度為 180 度。

Plotclock 用的是 Tower Pro 9g servos(SG90 digital servo),為三線式伺服馬達,紅線接電源,棕色的線接 GND,橘色線為訊號線:

SG90

在 Fritzing 中,是以紅色線接電源,黑色線接地,黃色為訊號線作代表,你可以如下連接線路:

伺服馬達控制

如果直接使用 Arduino 官方語言,可以使用 delayMicroseconds 函式來控制脈衝寬度,不過 mBlock 中只有「等待」方塊,沒辦法達到這麼短的時間控制,然而,mBlock 中有個「設置伺服馬達腳位…」的方塊,可以直接指定馬達轉動角度,例如,以下的程式,可以一秒為間隔,不斷轉動馬達為 0、45、90、135 與 180 度:

伺服馬達控制

雖然使用了 PWM 訊號來控制馬達轉動,不過,這不表示要使用 Arduino 的 PWM 腳位,只不過根據 Servo library 的說明,除了 Arduino Mega 之外,如果使用了 Arduino 的 Servo 程式庫,D9 與 D10 腳位的 PWM 功能就會被停用,因此,通常會把伺服馬達的訊號線接在 D9 或 D10 腳位,實際測試 mBlock 的「設置伺服馬達腳位…」方塊時,也是如此。

有指針的亮度感應器

在〈mBlock & Arduino(8)光敏電阻、亮度感應器與光線追蹤器〉中,我們使用光敏電阻製作了簡單的亮度感應器,你可以加上伺服馬達,配合 SG90 的手臂,作個有指針的亮度感應器,你可以如下拉設電路:

伺服馬達控制

實際測試我手中的光敏電阻,完全蓋住它的話,類比輸入腳位約可量得 400 左右的值,以手電筒直接照射下,約為 1000 出頭的值,因此暫且定義全暗為 400,全亮為 1000,這個範圍要轉動馬達 0 到 180 度,因此,每個類比輸入量得的值減去 400,再乘上 0.3,就是打算轉動的角度:

伺服馬達控制

因為我們讀取指針的習慣,多半是順時針方向是越來越大,這正好與伺服馬達的角度計算方向相反,所以使用 180 減去算出來的角度,就可以改為順時針指示亮度大小。

示範影片