AmebaMotors – 用Ameba控制4輪小車
你可以在這個地方下載library: AmebaMotors
下載之後,參考Arduino官方網站的教學文章將zip檔的library加入Ameba: https://www.arduino.cc/en/Guide/Libraries#toc4
材料準備
- Ameba x 1
- L298N H-Bridge x 1
- 4輪車 or 2輪車+萬向輪
L298N用來控制馬達的模組,它可以驅動2個DC馬達,或是2相4個DC馬達。
這個範例將L298N用於2相4個DC馬達,所以材料上使用4輪車。手邊如果沒有4輪車也可以使用2輪車
4輪車套件通常含有以下內容:
- 4個DC馬達
- 4個輪子
- 車體
- 4個測速碼盤
你可以在網路上找到類似的內容:
http://www.ebay.com/itm/4WD-Robot-Smart-Car-Chassis-Kits-car-with-Speed-Encoder-DC-3v-5V-6V-for-Arduino-/171122633517
http://www.dx.com/p/arduino-compatible-bluetooth-controlled-robot-car-kits-146418#.Vtf6J_l96Uk
http://goods.ruten.com.tw/item/show?21550316391242
價錢可能會因為一些額外的模組而有不同,有些會多加電池盒、藍芽模組、超音波測距模組、紅外線測距模組……。
建議寫程式並測試完馬達運作之後,再將車子組裝起來。
材料說明
- DC馬達
一般的DC馬達使用兩根線控制正反轉。如下圖,當我們將L接GND,R接3V3,馬達就會開始轉動,將L接3V3,R接GND,馬達就會反轉。如果將3V3改成5V就可以得到更高的轉速。馬達可以承受的電流要參考馬達的規格。
一般買到的小車套件都已經為馬達包裝成適合加上輪子,我們可以測試一下它的轉向,底下是常見的包裝,中間有凸起來的地方代表這面裝輪子: - L298N H-Bridge
L298N模組在市面上可以看到不同包裝,但一般都會有底下這些pin- +12V: L298N的板子供電,不同模組可以接受的電壓不同,常見的range有+6V~+12V, +5V~+12V, +7V~+12V, >=+12V
- GND: 接電源的GND
- +5V: 如果L298N供電的部份大於+7V,那麼+5V的地方可以再供電給其它板子(EX. Ameba)。+12V上面有個jumper,Jumper接上才有提供+5V。
- OUT1, OUT2: 用來輸出並控制第一組馬達。它的接點使用螺絲,一般最多接兩條線,所以可以一次控制兩個馬達。(但要注意螺絲是否有鎖緊,或是有接觸不良的情況)
- OUT3, OUT4: 用來輸出並控制第二組馬達
- ENA, IN1, IN2: 接受輸入訊號來控制OUT1與OUT2
- ENA用來控制第二組馬達轉速,一般會用PWM來控制。如果不需要控制轉速可以用jumper接到5V。
- IN1與IN2控制第一組馬達正反轉:
IN1 IN2 OUT1 OUT2 LOW LOW LOW LOW HIGH LOW HIGH LOW LOW HIGH LOW HIGH
- ENB, IN3, IN4: 接受輸入訊號來控制OUT3與OUT4
- ENB用來控制第二組馬達轉速,一般會用PWM來控制。如果不需要控制轉速可以用jumper接到5V。
- IN3與IN4控制第一組馬達正反轉:
IN3 IN4 OUT1 OUT2 LOW LOW LOW LOW HIGH LOW HIGH LOW LOW HIGH LOW HIGH
範例說明
打開範例 “Files” -> “Examples” -> “AmebaMotors” -> “car2wd_digit_control”。(如果沒看到範例,請參考前面的步驟確定library已安裝)
範例裡使用這幾根PIN:
ENA | IN1 | IN2 | IN3 | IN4 | ENB |
8 | 9 | 10 | 11 | 12 | 13 |
並且接線如下圖:
注意事項:
- 這邊我們將Ameba的5V接到L298N的+12V供電的地方,但並不是每個L298N模組都可以使用5V供電。如果不行的話,請使用其它電源(Ex. +12V)供電給L298N的+12V接腳,再用L298N的+5V供電給Ameba
- 馬達的接法可能會左右相反,可以在跑完測試程式之後再決定是否要交換。(建議在測試完之前不要組裝車子)
- 為了接線方便,可以考慮花點時間將馬達的接線整理成杜邦線接頭。L298N的螺絲接頭也可以整理成杜邦線接頭。
接線完之後,在每次需要改動程式時,可以先將L298N的電源拔掉,避免馬達不預期地亂跑。然後再將Ameba接上電源。上傳完程式並確定開始測試時再將L298N的電源插上。
這裡我們將範例程式 car2wd_digital_control 編譯並上傳到Ameba。
這個程式會讓車子做以下的動作:
往前跑2s => 停止1s => 往後跑2s => 停止1s => 向右順時鐘旋轉2s => 停止1s => 向左逆時鐘旋轉2s => 停止 1s => 前進右轉再左轉 => 停止1s => 後退左轉再右轉 => 停止1s => ……
底下是車子動作的控制說明:
- 車子速度:ENA與ENB我們用PWM控制,頻率設定在200 (resolution=256)
- 往前跑:
IN1 IN2 IN3 IN4 HIGH LOW HIGH LOW - 往後跑:
IN1 IN2 IN3 IN4 LOW HIGH LOW HIGH - 向右順時鐘旋轉:我們讓左邊的馬達往前跑,右邊的馬達往後跑:
IN1 IN2 IN3 IN4 HIGH LOW LOW HIGH - 向左逆時鐘旋轉:我們讓右邊的馬達往前跑,左邊的馬達往後跑:
IN1 IN2 IN3 IN4 LOW HIGH HIGH LOW - 前進右轉:完成這個動作的方式有兩種。
- 第一種是讓兩邊的馬達轉速不同,但是市售的小車套件的輪胎可能抓地力不好,所以即使兩邊轉速不同,車子也可能直直往前跑
- 第二種方式是讓右邊的馬達跑一下、停一下。因為這種方式適用於大多數的輪胎,所以我們使用這種方式。
我們先將馬達設定成往前跑的模樣:IN1 IN2 IN3 IN4 HIGH LOW HIGH LOW 然後再將IN3設定成LOW,並維持80ms。然後再設定成HIGH,維持20ms。再設定成LOW,維持80ms……
前進左轉、後退左轉、後退右轉,都使用同樣的方式。
測試完,如果反應正確,就可以組裝車子了。除了小車套件的零件固定完之外,一些細節可以使用像皮筋做固定。
底下是我們demo的影片:
程式碼說明
- Control GPIO in register level
控制馬達需要即時地控制,使用Arduino比較上層的API (Ex.digitalWrite()
)反應上較慢,Arduino為了這種情況提供register讓使用者直接控制GPIO,Ameba仿照Arduino的方式提供GPIO的控制。- 首先我們需要先設定GPIO:
pinMode(in3, OUTPUT);
- 接著我們記下這根GPIO的port與bit mask。通常IC的GPIO的輸入、輸出、或其它控制,會擺在同一個register。以Ameba 32-bit的CPU為例,會安排多個GPIO的輸出控制擺在同個register,但如果一個register不夠用就會再安排更多的register。這裡的port指的就是我們要控制的GPIO在哪個register。而bit mask指的就是我們要控制的GPIO是在這個register的哪個bit。(如果不小心改到其它bit,會影響其它pin的行為,要小心操作)
in3_port = digitalPinToPort(in3); //取得in3的port in3_bitmask = digitalPinToBitMask(in3); // 取得in3的bit mask
- 控制GPIO
// 將in3輸出功能的port的bit設為1,此時in3為HIGH *portOutputRegister(in3_port) |= in3_bitmask; // 將in3輸出功能的port的bit設為0,此時in3為LOW *portOutputRegister(in3_port) &= ~in3_bitmask;
- 首先我們需要先設定GPIO: