CH8 馬達控制 最簡單的互動設計 – Arduino一試就上手 孫駿榮、吳明展、盧聰勇
前言 機器手臂也好、自走車也好、或是即時影像監控裝置,這些系統除了需要許多前面介紹到的感應器或是燈號、LCD等輸出介面外,還有一種類型的模組在我們這個章節要跳出來當作主角,其實它們原本就很重要,那就是致動器,又叫驅動器。 馬達就是將電能轉換為機械能來驅動其他不同的機械設備。
直流馬達 轉子(rotor) 電流轉向器(commutator) 電刷(brushes) 中心軸(axis) 永久磁鐵(magnet) 電源來源供應(power supply)
馬達內部架構
電流方向與電刷方向 電源從黃色電源線的上方那條進入,藍色的部分在上方,此時因為右手定則瞭解藍色部分為N極,這時候跟馬達外殼的永久磁鐵產生同性相斥、異性相吸的道理,故轉動半圈。
無刷馬達 無刷馬達需要一個控制器,因為直流無刷馬達,類似交流三向馬達,由三條線圈,依序送入正負電源,及各相差60度角,一個循環共有6個步驟,所以又稱為六步方波。
控制直流馬達 直流馬達是依照電流的流向來決定轉動的方向,馬達的接線實際上是依照電路的接法來決定電流流進端和流出端,因此我們在使用上通常會注重電路電流的大小限制,使用不同的元件來放大或保護單晶片不要被過大的電流燒毀,。
電晶體控制 由電子訊號來控制,比起繼電器等機械式開關的速度快上許多倍,最簡單的電晶體為9012、9013兩種,分別是PNP與NPN的控制形式。
達靈頓電晶體 兩個電晶體直接耦合的一種方式,當兩電晶體做這樣連接時,稱之為達靈頓電晶體。這種電晶體也已經有製造封裝接出三支接腳的成品。
達靈頓電晶體使用範例
橋式電路控制馬達 除了能夠讓馬達轉動外,我們也希望能夠控制馬達的正反轉,這樣才能讓馬達的效能完全發揮。 功能 右上PNP 右下NPN 前進 1 後退 煞車1 煞車2
L298N 包含兩組橋式電路 功能 橋式電路1 橋式電路2 致能(ENABLE) 6 7 輸入(INPUT) 5、7 10、12 輸出(OUTPUT) 2、3 13、14
L298N擴充板
步進馬達 直流馬達的轉動是直接驅動於電源的輸入,這種馬達的使用是在需要持續運轉的情況下,只依靠PWM訊號來改變轉速的快慢。若是應用的場合需要比較精密的距離移動或是轉動角度,有時候會使用步進馬達來達成需求。 步進馬達是驅動周圍的激磁線圈來產生磁性帶動中央的轉子。
一相驅動 時針旋轉時,需依序激發:A、B、A_bar、B_bar 上:順,下:逆
一相驅動時序 根據需要轉動的速度快慢來決定每隻腳位的切換速度,下圖便是針對逆時針轉動時單晶片所需要控制的接腳電位時序。
二相驅動 上:順,下:逆
進階驅動時序 二相驅動時序 一二相驅動時序
步進馬達接線 步進馬達有兩種常見的控制方式,分為4線式和5線式、6線式。雖然說原理相同不過需要的相關硬體不太一樣。
搭配晶片 ULN2003,內部提供了7個達靈頓電晶體。若是四線式的步進馬達,則可以使用L298N。這些驅動晶片主要目的都在於放大電流,避免單晶片損耗。
步進馬達程式範例 控制步進馬達順時針和逆時針轉動,只需注意腳位控制的順序。 一二相激磁方式,其實說穿了就是激磁的步驟變多了,原本一個激磁週期只要4個步驟,一二相的變為8個,其他地方並於不同之處
狀態保護 步進馬達有個缺點,它並沒有原點的設計,所以只能轉動相對角度,長時間的運作下可能造成超過一圈的旋轉,在機構上若無保護的設計有機會造成設備的損壞或是線路打結的情況。為了避免這種情形,我們可以在左右極限的位置加上感應器,而這個感應器就叫做極限開關。
極限開關 極限開關上有一長形鐵片,不同種類的極限開關會有不同的長度,當接觸到鐵片會壓下下方的開關,因而觸發內部電路。
狀態保護 透過這樣的設計,我們可以將NC接地,而NO接上一個訊號原,C點則接到Arduino上的一個數位接腳。我們只要監控所接上的腳位電壓改變,就可以知道是否有觸碰到開關,則表示已經到了某一端點的極限,不能再繼續朝此方向轉動,需反向。 透過步進馬達和極限開關的配合,我們就可以輕易的設定轉動的極限或是判斷是否到達目標所在,像是自動門、電梯都有類似的設計。
控制伺服馬達 步進馬達只能得到相對角度,如果我們想要控制絕對的轉動角度,則可以使用伺服馬達。 它是遙控飛機和機器人當中的主要角色。透過它,我們可以控制飛機舵面的變化,也可以調整機器人步行的動作。
伺服馬達參數 速度方面伺服馬達都會以轉動60度所需要的時間當作基準點。扭力大小則會依據馬達上方舵片的不同孔位的安裝而改變,距離中心轉動軸越遠,扭力越小。 S3001參數 4.8V 6V 扭力(Torque) 2.4kg-cm 3kg-cm 轉動速度(Speed) 0.28(s)/60° 0.22(s)/60°
伺服馬達的控制原理 依據PWM訊號的變化。PWM訊號是以50Hz也就是20(ms)為一週期,調整一個週期當中高低電位的比例,就可以控制角度的變化。
Arduino控制伺服馬達 Arduino對於伺服馬達有好處也有壞處:好處是在於ATMEGA系列的單晶片已經內建有PWM腳位,我們只需要設定一些參數後便可以直接輸出PWM訊號,有些沒有PWM腳位的單晶片就必須自己寫PWM時脈訊號來控制伺服馬達,步驟就複雜了許多。壞處則是Arduino的PWM腳位共有6個(這邊指的是ATMEGA168以上的系列,舊款ATMEGA8只有3個),實際能輸出到50Hz的只有2隻腳位,就是Arduino上的第9、10兩隻。
Arduino接線
Arduino部分程式 #include <Servo.h> //伺服馬達的函式庫 Servo myservo; //定義伺服馬達變數 void setup() { myservo.attach(9); //初始化使用第9腳位來控制馬達 myservo.write(90); //先讓馬達回歸90度中心點 } myservo.write(pos); //下角度指令給伺服馬達
注意!! 在玩馬達的時候,有一個要特別關心的地方,就是電流的大小。多半使用Arduino的人都是經由電腦的USB來供電,電腦的USB最大的輸出電流只在0.5A左右,所以當馬達沒有任何負載的情況下,也許可以順利轉動,但是要小心接上多顆馬達或是馬達有負載的時候,電流可能會超過負擔,輕則馬達不動,重則USB接孔損壞,因此這部分可要好好注意。
多顆伺服馬達 在網路上可以找到利用Arduino控制8顆伺服馬達的程式範例,不過Arduino的所有腳位也才28隻,扣掉基本電路後,再加上控制8個馬達的腳位,就所剩無幾了,因此,也可以使用所謂的串列式伺服馬達控制板,這種方式的好處在於只需要一組串列埠就可以控制多顆馬達,又不會多佔掉單晶片的腳位,方便其他硬體的使用。
Serial Servo Controller Pololu SSC可以輸入兩種準位的串列埠訊號,也就是說可以直接接上電腦,透過電腦控制,或是由單晶片的TTL準位來控制。它的優點還可以自動判斷輸入的串列埠鮑率,從1200-38400。也包含了兩種命令格式。
Mini SSC II Mode 開始字元一定是:0xFF,這是每個命令都固定的開頭字元。伺服馬達的號碼由0x00到0xFE,表示最多可以控制到128個馬達。最後則是角度,數值範圍從0x00到0xFE,這邊的角度比起Arduino原本只能分成180度要來的細,它將180度分成255等分,也就是最小轉動角度為:180/255 = 0.7度左右。 範例:第一顆馬達轉到約90度的位置 0xFF 0x00 0x7F
Pololu Mode 裝置ID:以8軸的SSC來說是0x01。指令的部分,由於有些是特殊的伺服馬達才會用到的,這邊我們固定使用:0x04,表示絕對位置。而這邊的馬達號碼就只有0到7了。最後至數值的部分,因為剛剛有說到這種指令是控制脈波寬度,數值最大到5500。 範例:第一顆馬達,脈波長度2000 0x80 0x01 0x04 0x00 0x0E 0x7F
2軸控制機構 這邊選用的是全金屬齒的大扭力伺服馬達MG995,雖說是大扭力,也只有約12-13公斤,還有20公斤等級以上的。扭力也是在應用上要選擇的一個重要指標,因為每個人的應用方向都不太一樣,最後機構承載的重量大小也不同,若扭力選擇太小,馬達可以會有燒毀的可能,或是無法轉動,所以在購買前需要思考一下自己的系統規格,有可能的應用範圍。
2軸控制機構 依據想要的應用來決定安裝的模組或設備,不會還是要小心平衡及總重的問題。
類比搖桿 包含了X、Y2軸的移動外,還有Z方向的按鈕選擇。
光源追蹤系統 結合了Arduino上的電壓讀取和驅動伺服馬達的能力。 如果接的是太陽能板,要注意它的最大電壓和電流輸出,不要選購超出Arduino能力的唷!不然就是需要再透過降壓等方式來保護Arduino了。