|
很多电子竞赛都需要一个可以移动的平台来完成一些任务,四轮小车是最常见的移动平台之一,瑞昱的Ameba单片机同样可以用来制作一个行动敏捷的四轮小车,以下是具体操作:
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轮车套件通常含有以下内容: 价钱可能会因为一些额外的模组而有不同,有些会多加电池盒、蓝芽模组、超音波测距模组、红外线测距模组……。
建议写程式并测试完马达运作之后,再将车子组装起来。
材料说明 - 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”。(如果没看到范例,请参考前面的步骤确定l​​ibrary已安装)
范例里使用这几根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 |
- 前进右转:完成这个动作的方式有两种。
测试完,如果反应正确,就可以组装车子了。除了小车套件的零件固定完之外,一些细节可以使用像皮筋做固定。
程式码说明 - 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的portin3_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;
|
|