Ameba Arduino: [RTL8195] AmebaMotors – 用Ameba控制4輪小車

AmebaMotors 介紹
這個 library提供控制馬達相關的library,其中一些內容的實作使用Ameba for Arduino SDK 1.0.6版的內容。
你可以在這個地方下載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就可以得到更高的轉速。馬達可以承受的電流要參考馬達的規格。
    1
    一般買到的小車套件都已經為馬達包裝成適合加上輪子,我們可以測試一下它的轉向,底下是常見的包裝,中間有凸起來的地方代表這面裝輪子:
    2
  • L298N H-Bridge
    L298N模組在市面上可以看到不同包裝,但一般都會有底下這些pin
    3

    • +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

並且接線如下圖:
4

注意事項:

  • 這邊我們將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的控制。

    1. 首先我們需要先設定GPIO: pinMode(in3, OUTPUT);
    2. 接著我們記下這根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
      
    3. 控制GPIO
      // 將in3輸出功能的port的bit設為1,此時in3為HIGH
      *portOutputRegister(in3_port) |=  in3_bitmask;
      // 將in3輸出功能的port的bit設為0,此時in3為LOW
      *portOutputRegister(in3_port) &= ~in3_bitmask;