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”。(如果没看到范例,请参考前面的步骤确定l​​ibrary已安装)
范例里使用这几根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;