硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1704|回复: 1
收起左侧

瑞昱Ameba物联网开发板--Ameba四轮小车制作

[复制链接]

27

主题

20

回帖

101

积分

初级会员

积分
101
发表于 2020-7-20 08:51:46 | 显示全部楼层 |阅读模式

很多电子竞赛都需要一个可以移动的平台来完成一些任务,四轮小车是最常见的移动平台之一,瑞昱的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轮车套件通常含有以下内容:
  • 4个DC马达
  • 4个轮子
  • 车体
  • 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
  • 前进右转:完成这个动作的方式有两种。
    • 第一种是让两边的马达转速不同,但是市售的小车套件的轮胎可能抓地力不好,所以即使两边转速不同,车子也可能直直往前跑
    • 第二种方式是让右边的马达跑一下、停一下。因为这种方式适用于大多数的轮胎,所以我们使用这种方式。
      我们先将马达设定成往前跑的模样:
      IN1
      IN2
      IN3
      IN4
      HIGH
      LOW
      HIGH
      LOW
      然后再将IN3设定成LOW,并维持80ms。然后再设定成HIGH,维持20ms。再设定成LOW,维持80ms……
      前进左转、后退左转、后退右转,都使用同样的方式。


测试完,如果反应正确,就可以组装车子了。除了小车套件的零件固定完之外,一些细节可以使用像皮筋做固定。



程式码说明
  • 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;




回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
发表于 2020-7-20 10:04:48 | 显示全部楼层
谢谢分享。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-20 18:39 , Processed in 0.293643 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表