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对应到小车的动作。