Ameba Arduino: [RTL8195] 使用6軸控制小車

材料準備

小車材料:

  • Ameba x 1
  • L298N H-Bridge x 1
  • 4輪車 or 2輪車+萬向輪
  • 18650 Li-ion battery >=2 (optional)
  • 18650 batter holder x 1 (optional)

Ameba控制端:

  • Ameba x 1
  • MPU6050 x 1
  • lithium polymer (optional)

範例說明

小車的範例我們使用之前沒有攝影機的範例 “car2wd_mobile_control”
另外我們準備另一塊Ameba板子,上面搭載MPU6050,並且握著Ameba來控制小車。
1請先下載AmebaMotors 1.0.2版的library:
https://github.com/Ameba8195/Arduino/raw/master/libraries/AmebaMotors-1.0.2.zip
下載之後,參考Arduino官方網站的教學文章將zip檔的library加入Ameba:
https://www.arduino.cc/en/Guide/Libraries#toc4

打開範例 “File” -> “Examples” -> “AmebaMotor” -> “car2wd_mpu6050_control”
電源的部份,我們使用鋰離子電池,這樣方便握著Ameba。鋰離子電池的電壓為3.7V,充飽時為4.2V,將它的正極接到Ameba板子上5V的地方,板子上有降壓模組會將電壓轉至3.3V給Ameba。
底下是接線圖,請注意MPU6050的X軸與Y軸的方向。
2

接起來的成品:(電池藏在背後)
3

控制的方式分兩階段
1. 啟動控制器:當Ameba控制端連線到小車後,為了避免誤觸六軸感測器造成車子亂跑,我們設定啟動手勢,在3秒內將Ameba翻轉至背面再轉回來2次,就可以啟動控制。
2. 控制小車:想像Ameba前面有個小鋼珠,當Ameba往前傾,車子就往前。往後傾車子就往後。往右傾就右轉,往左傾就左轉。
底下是控制車子的影片:

 

程式碼說明


程式裡多了Wifi,有幾個要注意的地方:

  • Wifi傳送資料需要時間,如果時間太長,就需要將MPU6050的DMP FIFO清空
    清空的實作如下。它會等到下一次Interrupt發生時,再發送I2C的請求,讓MPU6050清空FIFO:

    // wait until UVC is ready for streaming
    void safeResetMPU6050() {
      /* If dmp interrupt happends at I2C send/recv, then MPU6050 would hang and can only recover 
       * by plug out/in VCC. To avoid this happen we wait next interrupt and then reset buffer */
      mpuInterrupt = false;
      while (!mpuInterrupt) {
         os_thread_yield(); // without yield, the empty busy loop might make CPU behave un-expected
      }
      mpu.resetFIFO();
      mpuInterrupt = false;
    }
    
  • 控制小車:我們只使用Pitch與Roll。
    其中Roll對應到我們接線的方式,轉的是X軸,根據右手法則,往下壓數值會減少,往上拉則數值增加
    4
    Pitch轉的是Y軸,用同樣的方式處理:
    5
    在轉換數值時,可以加個不動作的區間,範例程式裡,當角度在-24~+24度之間,就不動作。取-24~-48與+24~+48對應到小車的動作。