SG-90 伺服馬達

取自 葉難 老師在部落上所寫

http://yehnan.blogspot.tw/2013/09/arduinotower-pro-sg90.html

2013/09/02

Arduino練習:伺服馬達以Tower Pro SG90為例

這一篇介紹伺服馬達,以Tower Pro(輝盛)的小型伺服馬達SG90為例,價格便宜,在拍賣網站上大約80元,可作為初步練習之用。

我的板子是Arduino Uno R3,Arduino軟體開發環境是1.0.5版。

伺服馬達(servo motor),因常用於遙控模型飛機,所以又常稱為RC伺服機(RC Servo,Radio Control Servo,Remote Control Servo)、伺服馬達舵機。

伺服馬達裡含有直流馬達、齒輪箱、軸柄、以及控制電路,我們可透過訊號控制軸柄的停止角度,大概都是0到180度,但不同廠牌型號會有不同的範圍;經由齒輪箱降速後,變成適當可用的轉速,並且提供更高的轉矩(扭轉力)。

另外還有能連續轉動的伺服馬達,有些出廠時便能連續轉動,有些則是玩家自己動手改造,這種馬達透過訊號可控制轉動的速度。

一般伺服馬達有三條線,電源(紅色)、接地(黑或棕色)、訊號線(白、黃、橘、藍,甚至是黑色)。透過訊號線傳送PWM脈波來控制軸柄的停止位置旋轉角度,這個訊號脈波必須每秒重複50次(也就是50Hz),而脈衝持續時間長短便代表了馬達該將軸柄轉到什麼位置,範圍從1.0ms到2.0ms(millisecond,毫秒,千分之一秒),若想置中則是1.5ms;也可將1.0ms當做角度0度,那麼1.5ms會是90度,2.0ms則是轉到底180度。注意,也有可能反過來。

不過每個廠牌型號的伺服馬達可允許旋轉的角度各不相同,也就是說可接受的訊號脈衝範圍也不相同,必須查閱產品資料規格書,若超出範圍可能會損害伺服馬達。底下是Tower Pro SG90的規格

    • 重量:9g

    • 尺寸:23*12.2*29mm

    • 工作電壓:4.8V

    • 轉矩:1.8kg-cm,當工作電壓為4.8V時

    • 運轉速度:0.1秒 ∕ 60度 ,當工作電壓為4.8V時

    • 脈衝寬度範圍:500~2400µs

    • 死頻帶寬度(dead band width):10µs

從中我們可知,可允許的脈衝範圍是500~2400µs,也就是0.5~2.4ms,比剛剛說的一般範圍還要寬,也就代表這個伺服馬達能旋轉的角度更大。另外有項值得一提的數據是死頻帶寬度,意思是說,因為訊號可能不穩上下起伏,當這一次脈衝寬度與上一次相差不超過死頻帶寬度時,伺服馬達便不會動作。

硬體線路很簡單,因為只有一個伺服馬達,我直接由Arduino的5V腳位供電。若想使用超過兩個,則應以另外的電源供電,而且要記得共同接地。

電路圖如下,除了電源5V與接地外,訊號線接往Arduino的數位腳位9。

照片如下,Tower Pro SG90的三條線顏色分別是黃、紅、棕,對應訊號、電源、接地。

Arduino內建操控伺服馬達的程式庫,已經將零零總總的東西通通包起來,使用方法非常簡單,讓我們能以非常簡單的方式操控伺服馬達的旋轉角度。因為需使用PWM,所以會影響原本的PWM腳位,使用此程式庫時,數位腳位9與10便無法輸出PWM,不管有無接伺服馬達,於是我們通常也會將伺服馬達的訊號線接在數位腳位9或10。

接下來是軟體的部份,先讓伺服馬達來回旋轉吧。

#include <Servo.h>

Servo myservo; // 建立Servo物件,控制伺服馬達

void setup() {

myservo.attach(9); // 連接數位腳位9,伺服馬達的訊號線

}

void loop() {

for(int i = 0; i <= 180; i+=1){

myservo.write(i); // 使用write,傳入角度,從0度轉到180度

delay(20);

}

for(int i = 180; i >= 0; i-=1){

myservo.write(i);// 使用write,傳入角度,從180度轉到0度

delay(20);

}

}

不過Servo預設的脈衝寬度範圍是544到2400µs,跟SG90的500到2400差了一些些,我們可修正此點。

#include <Servo.h>

Servo myservo;

void setup() {

myservo.attach(9, 500, 2400); // 修正脈衝寬度範圍

myservo.write(90); // 一開始先置中90度

delay(3000);

}

void loop() {

for(int i = 500; i <= 2400; i+=100){

myservo.writeMicroseconds(i); // 直接以脈衝寬度控制

delay(300);

}

for(int i = 2400; i >= 500; i-=100){

myservo.writeMicroseconds(i);

delay(300);

}

}

要注意的是,必須查詢伺服馬達的規格表,查知正確的脈衝寬度範圍,使用writeMicroseconds時也要小心,不可傳入超出範圍的值,否則會損壞伺服馬達。

Servo程式庫中,還有read()可用,但只是讀取上次傳入write()的值;還有detach(),呼叫後伺服馬達就不動了,也就可以使用腳位9的PWM功能。

參考資料:

由上述分享可知,

想要使用Servo,可以套用函式庫 <Servo.h>

然後函式庫一開始要對伺服馬達 命名 ex Servo 名稱;

要在void setup(){ 中

指定伺服馬達的連接腳位 myservo.attach(9);

要使伺服馬達動作需要指定角度,格式為

myservo.write(角度); (角度為 0~180)

取材自 http://gsyan888.blogspot.tw/2014/12/diy-towerpro-sg90-servo-360.html

(如有不妥,請告知)

DIY : TowerPro SG90 Servo 改裝為360度旋轉(之一)

一般的伺服馬達(舵機)裡面除了馬達與減速齒輪,另外帶有一個可變電阻,馬達旋轉時,帶動可變電阻,用以計算旋轉的角度。以 TowerPro SG90 來說,除了有個 5k ohm 的可變電阻偵測旋轉角度,在連接搖臂的齒輪下方多了二小塊突起,旋轉的角度因此被限制在180度以內。知道它控制旋轉角度的機置,前述的兩點限制如果解除了,就可以將原本只能旋轉180度的伺服馬達改成可連續旋轉,超過一圈。

工具及材料

    • 小螺絲起子。

    • 斜口鉗、美工刀。

    • 電烙鐵。

    • 焊鍚。

    • 2.2k ohm 電阻(紅、紅、紅)兩個。

    • 膠帶。

改裝程序

1.以螺絲起子拆下 SG90 下蓋的四顆小螺絲。

2.將搖臂側的上蓋拆下,即可看到連接搖臂的齒輪,將它拆下來。

3.除去搖臂齒輪下方的兩小塊突起。個人是先使用斜口鉗剪掉,再以美工刀修整。

齒輪限制旋轉角度的突起

刮除突起物

去除齒輪上的突起物後,即可將齒輪及上蓋裝回去,

4.拆開下蓋,並將連接可變電阻的導線由電路板上解焊。

下蓋(螺絲側)打開後,可看見電路板

將可變電阻的導線由電路板上解焊

已去除可變電阻導線的電路板

5.將兩個 2.2k ohm 的電阻(紅、紅、紅)的其中一腳焊在一起,變成三支腳。

6.將電阻焊在電路板上,置換原來的可變電阻

7.收納電阻,先在電阻靠電路板側貼上一小塊膠帶,然後將焊好的兩顆電阻小心的往電路板折,緊貼小小的電路板。

8.重新蓋回上、下蓋,並鎖上螺絲。

接線測試

改裝完的360度旋轉 SG90 要如何使用呢?接線方式和原來舵機的方式一樣,只是原來橙色的控制線是用來指定角度,變成用來控制馬達的旋轉方向和速度。以 S4A 來說,我們可以將改裝過的 SG90 橙線接在 Arduino 的 D8,然後用 motor 的動作控制方塊來控制可連續旋轉的 SG90,輸入一個接近 180 度的值和一個接近 0度的值,它們的旋轉方向就會不同,不同大小的值,也會改變旋轉的速度。

馬達停止的方法

哈~問題來了,那到底哪一個角度值可以讓改裝過的 SG90 停下來呢?基本上它應該是在 90 度上下,於是我在 S4A 中以底下的程序,讓它由 80 慢慢加一後,找到了我的 SG90 可以輸入 106 或 107 來停止馬達的旋轉。

至於您改裝過的 SG90 要多少才能停下來呢?可以用上面的程序觀察看看。或許能用計算的方式來找出最佳的值,目前先用最笨的方式滿足一下需求。

DIY : SG90 Servo 改裝為360度旋轉之二

2014年底曾經記錄過這篇「雄 : DIY : TowerPro SG90 Servo 改裝為360度旋轉」,去年有網友留言問我:「請問一下若直接使用裡面的可變電阻是否可行?」,當時沒有改裝的需求(哈!應該是在研究別的東西,不想分神。),也就沒花時間去試。最近又對車子有興趣,需要有減速機構的馬達,於是拆了幾顆 SG90 來試,成功了!只要把 SG90 內的電位器固定在馬達不轉動時的位置即可,不用拿電烙鐵在小小的電路板上焊電阻,有老花眼也能輕鬆改裝。

SG90 如何拆解可以參考 2014 年那篇舊筆記,就不再贅述。看看底下這顆已拿掉齒輪的馬達:

右側的電位器就是我們要處理的目標。

將 SG90 接到 Arduino 上,並送控制 SG90 轉至90度的指令,接著開始轉動電位器至類似圖中的角度,微調至馬達完全不轉動為止。

最後,以膠或是任何方法固定電位器,讓它不再轉動。

第二部份是要處理原本用來轉動電位器的那個齒輪。

因為我們不希望照片中的這個齒輪帶動電位器,所以要將它底部的孔擴大一點點,只要比電位器中間的那根軸稍大即可。

最後再將齒輪底部那塊突起切掉。至此改裝算完成了,只要把齒輪通通裝回去,螺絲鎖好固定,SG90 就變身為 360 度旋轉的 servo,以後一樣用 servo 的控制程式,角度大於 90 度和小於 90度的旋轉方向會相反,角度等於 90 度時則可以讓馬達靜止不動。

底下是測試的影片: