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: