您会理解,“编辑解释说”,它应该是娱乐性的,新鲜的,充满有趣的冒险经历的,以便读者无法脱身。
I. Ilf,E。Petrov “如何创建鲁滨逊” 。
像其他任何软件或硬件平台一样,Arduino入门对于某些实际项目总是更加有趣。 同时,程序员编写显示“你好,世界”的代码,建筑学家使LED闪烁。 小时候,每个人都很高兴。
我决定从一个高级项目开始,包括暗中希望从Counter-Strike(失败)中撕下年轻一代。
您可以从名称RoboCar4W猜到,第一个项目是四轮机器人汽车。 开始工作后,我已经具有编程经验,我曾经很长一段时间都知道如何焊接,但是我什至不知道Arduino的引脚排列,也根本不阅读文档。 我研究了游戏过程中的所有智慧,并得到了Google的帮助。
由于项目本身从根本上来说不是新项目,因此在网络中进行这样的描述就足够了,所有组件均已知,因此不会感到意外。 因此,这个想法是用最笼统的术语表述的,其主要目标是使用Arduino作为快速原型制作的平台,使自己沉浸在“事物世界”中。 在这个作品中,也许有人在旅途的开始就认出了自己。
所有的硬件都是在ebay上购买的,根据我自己的经验,我想说的是,立即购买入门工具包(用Arduino入门工具包的话查找它)要容易一些,而不是详细地组装它。 是的,而且全部在一起。 决定不费吹灰之力,购买普通的底盘,普通的车轮,普通的马达,以至于它“很贵”。
在eBay上成功购物的主要秘诀是从顶级卖家那里购买商品,并仔细阅读产品说明。 互联网上有很多关于此的文章。
选择哪个Arduino板?
我参加了Arduino UNO,其中有很多项目都有其描述。 但是现在我将使用Arduino Mega 2560,它具有更多的数字和模拟输出,并且与UNO的项目完全兼容。
项目概况
在软件开发领域,这也称为“系统需求”。
该项目的想法如下。 名为RoboCar4W的机器人机器的第一个版本应执行简单的操作:
- 前进,后退,转弯
- 测量到障碍物的距离
- 能够自动绕过前方的障碍物。
必须通过Android手机上的蓝牙手动控制机器的第二版本。
为了使您更好地工作,请完成整个RoboCar4W项目的最终组装工作(此处没有蓝牙)。

这是海上试验的视频。
在第一个视频中,RoboCar4W在两个不同版本的“固件”(即 因此,如果有人最热衷并注意到机器人在不同情节中的行为会略有不同,则可以进行素描。

在第二个视频中,RoboCar4W借助“驱动程序”通过蓝牙从Android下的手机通过蓝牙传输的命令移动。 手机上安装了“蓝牙遥控车”。 此外,如果前方有障碍物,则机器人会停止,即 敲打东西将不起作用(但是,有一个“秘密”按钮会禁用安全模式)。

在第三个视频中,RoboCar4W演示了一个带有转弯的预编程演示运动程序。 演示程序是通过同一Android手机上的命令激活的。 机器人只是骑了一段时间然后转弯。

运动控制算法
将我们的方法称为“避障算法”或“路径查找”是错误的。 这些是独立的数学学科,纯数学。 如果您真的非常喜欢数学,那么请用谷歌搜索这些短语,以便您阅读六个月。
同时,我们对事情变得容易得多感兴趣。 因此,我们将其简称为-四轮机器人的运动控制算法。 当然,我们所说的是无需人工干预的自动控制。
这是用文字写下的简单算法,对于更复杂的算法,有必要(无论是否需要)组成框图。
现在,同时查看草图RoboCar4W-1.ino的源代码。
- 我们测量到前方障碍物的距离。
- 如果此测得的距离小于
DST_TRH_BACK
值(距离阈值的缩写),则我们停下来并在转弯时反向行驶。 旋转方向的选择如下:如果您先前向左转,则向右转,反之亦然。 - 如果测得的距离大于
DST_TRH_BACK
,但小于DST_TRH_TURN
,则只需旋转即可。 旋转方向是随机选择的。 - 如果您远离障碍物,那就继续前进。
- 我们再重复一遍。
我们有4个车轮和全轮驱动有什么好处? 我们可以执行(编程)几种类型的转弯:
- 平稳旋转。 所有轮子都旋转,但一侧的轮子旋转得更快。
- 急转弯。 车轮仅在一侧旋转。
- 掉头到位。 像拖拉机一样,一侧的车轮向后旋转,另一侧向前旋转。
在该程序的第二版中,当通过Android手机进行控制时,如果两次按下该程序,则可以关闭机器人试图防止正面碰撞的安全模式

并通过按一次将其重新打开。
重要说明 。 所有逻辑都在Arduino的控制之下。 Android在这里的行为就像游戏机(没有大脑)一样,它的任务是通过蓝牙将按键操作(即命令)愚蠢地传输到Arduino RoboCar4W。
组成部分
最初,该机器包括一个伺服驱动器,该驱动器将超声波测距仪旋转一定角度以在三个方向上进行测量。 但是在测试过程中,由于操作不当,导致伺服器烧坏,因此现在距离传感器只是牢固地固定在机壳前面。
没有一线希望,但是草图变得容易一些。
对于将来,要购买最简单,最便宜的伺服器,就不需要给定角度的特殊功率,速度和旋转精度,而且事实证明禁用伺服器非常容易。 价值2美元的SG90非常合适。
因此,RoboCar4W项目的组成部分给出了英文描述,以方便在ebay等上进行搜索:
- Arduino UNO R3
- 现成的底盘4轮驱动移动机器人平台智能汽车底盘Arduino兼容
- 双向旋转的直流电动机-4个
- 车轮-4个
- 用于控制4个直流电机的板电机驱动罩L293D
- 超声波测距仪HC-SR04超声波模块测距传感器
- 镍氢1.2 V电池-8个
- 用于电池的塑料盒支架,电池盒支架4节AA电池-2个。
- 电池类型“ Krona” 8.4 V-1个。
- 可选拨动开关-电源开关
套件中立即购买了底盘,直流电动机和车轮,甚至附带安装说明。
引脚排列
模拟输入可用作I / O端口的数字引脚。 与模拟输入对应的Arduino引脚编号为14到19。这仅适用于Arduino引脚,不适用于Atmega微控制器的物理引脚号。
您不必画图,只需将所有东西放在桌子上即可。 我是这样做的。

如果使用任何直流电动机或步进电动机,则引脚D4,D7,D8,D12将处于繁忙状态。
仅当使用伺服电机时,才使用引脚D9(伺服1号控制),D10(伺服2号控制)。
Arduino引脚不占用用于控制Motor Drive Shield L293D的Arduino引脚。
3.3 V,5 V和接地的电源引脚已在电动机驱动器护板上复制了足够的数量。 因此,无需担心它们的短缺。
如果您仍然想绘制精美的图片,那么免费的Fritzing程序将为您提供帮助。
营养学
这是第二个非常重要的观点。 营养很大程度上取决于营养。 例如,当以给定角度旋转轴时,伺服电动机开始消耗大量电流。 同时,如果伺服器由5 V Arduino供电,则电压会“下降”,其余电路开始出现故障,Arduino甚至可以同时重新启动。
无论如何,如果在船上使用电动机,则需要电动机驱动器护罩(或类似电路)。
因此,我们有4个直流电动机,一个伺服驱动器,Arduino板本身和几个传感器。 电机是最繁琐的,但是传感器可以通过Arduino板本身的连接器成功供电,因此使用它们的一切都很简单。 为了方便起见,我在一张桌子上减少了整个经济。
| 推荐或典型电压。 消耗电流 | 最大电压 | 计划喂什么 | 注意事项 |
---|
Arduino UNO R3开发板 | 7-12V,200mA(平均) | 6-20 | “克朗9V”锂电池650mAh,8.4V | 中心连接器 |
伺服马达MG-995 | 5-6 V,0.1-0.3A(峰值) | 4.8-7.2 | 电池(5)个 镍氢1.2V = 6V | 食物仅来自单独的来源。 如果您与Arduino一起使用,那么一切都会失败。 4pcs镍氢电池电压 * 1.2V = 4.8V是不够的。 有人认为该伺服不应在4.8伏特的情况下使用4.8伏特 |
直流电动机(4个) | 6-8V,电流从70mA到250mA | 3-12 | 电池(5 + 3)个 镍氢1.2V = 9.6V | 您将无法使用9V电池正常启动引擎,因此,甚至不要浪费时间(和电池)! |
电机驱动罩L293D | 不需要 | 4.5-36 | 不需要 | |
蓝牙模块HC-0506 | 3.3 V,50 mA | 1.8—3.6 | 带引脚3.3V Arduino板 | |
超声波测距仪HC-SR04 | 5 V,2毫安 | 5 | 带引脚5V Arduino板 | |
我没有DC / DC电压转换器。 克朗9V并不是很好的电源,我已经拥有了。
但是我拒绝使用锂离子大容量电池。 首先,由于成本高昂,其次,在中国的在线购物中很容易造假。 更准确地说,不是“轻松”,而是“总是”。 另外,锂离子电池需要特殊处理,因此不安全。
因此,从表中可以看出,我们需要3个独立的电源:
- 用于Arduino开发板和传感器。
- 用于伺服电机。
- 适用于4个直流电动机。
在哪里可以得到这么多? 无论如何,Arduino板本身必须由单独的电源供电,因为 例如,当电压“骤降”(由于电动机启动)时,电路板可能会重新启动或完全失效。 在这里,我们使用Krona 9V外形尺寸的电池,并且将要连接到Arduino的连接器应带有“中间加号”。
对于伺服电机和4台直流电机,可以使用一个电源。 唯一的问题是,伺服电机的设计电压为5-6V(最大7.2V),电流为100-300mA(峰值),而DC电机需要6-8V(最大12V),电流为250mA。
为了解决这个问题,有DC-DC转换器,但是我没有。 结果,我应用了我的“专有”接线图(没有任何降压电子电路,只有环境友好的电压和电流!):我连接了8个。 如图所示,将1.2V电池串联,并在正确的位置制作水龙头。

伺服电动机达到6V,直流电动机达到9.6。 显然,1-5号电池会增加负载。
为了控制伺服和直流电动机,我使用了基于L293D芯片的4通道电动机驱动器护罩。
组装方式
组装完成的机箱是一个小问题。 但是不要以为没有掺杂就可以马上得到所有。 因此,准备文件。


正常情况下,无法将多个电机,伺服电机或步进电机直接连接到Arduino。 由于Arduino的引脚(结论)是低电流的。 为了解决该问题,还有一个附加的驱动控制模块-基于L293D芯片的Motor Drive Shield,这是为此目的设计的最常见的芯片之一。 L293D芯片也称为H桥。
我使用的板提供了4个通道,用于连接两个L293D芯片和一个移位寄存器。 在eBay上以5美元的价格购买。
此驱动器控制模块板具有以下规格。
- L293D电机驱动器护罩与Arduino Mega 1280和2560,UNO,Duemilanove,Diecimila兼容
- 4通道控制
- 4.5V至36V的电动马达
- 每通道允许的负载电流600mA,峰值电流-1.2A
- 过热保护
- 2个接口和一个精确的Arduino定时器(不会有“抖动”),用于将伺服电机连接到5V,如果电源电压需要更高,则必须按如下所述重新进行电源连接
- 可以同时控制4个双向DC集电极电机或2个步进电机和2个伺服电机
- 4个双向直流电动机每个都连接到8位总线,以进行单独的速度选择
- 最多可连接2个步进驱动器(单极或双极),带有一个线圈,双线圈或交替步进
- 用于连接外部电源的连接器,用于为控制逻辑和电机提供单独的电源
- 重置Arduino按钮
- Adafruit AFMotor库用于管理。
Motor Drive Shield需要一些改进,以便您可以在其后连接任何东西。 我在顶部焊接了必要的连接器,这就是发生的情况。

可以将电动机连接到相对于Arduino板的附加电源。 我只推荐这种连接方法。 为此,请卸下并打开跳线,如图所示。

在这种情况下,Arduino的电源和电动机的电源彼此独立。
电动机通电时,电动机护罩上的LED会亮起,如果未点亮,则电动机将无法工作。
新问题。
电源跳线的位置不适用于伺服器,它们仍将由5V Arduino供电。 由于伺服电机通常会消耗大量电流,并且如果功率不足,则整个设备就会开始出现故障,在“最佳”情况下,只有伺服驱动器会发生故障-它不会以设定角度旋转,或者一直到每转一圈先以0度旋转,然后才旋转以给定的角度(如果可以跟上)。 因此,我建议也通过附加电源为伺服系统供电。 为此,您将不得不稍微重做连接图:从标准连接器上咬掉正极线(通常是红色),然后将其直接连接到电源的正极。

连接电动机驱动器护罩时,不使用模拟引脚。 不使用数字引脚2、13。
仅在连接和使用相应的直流电动机或步进电动机时,才使用以下引脚:
- D11:1号直流电机/ 1号步进电机(激活和速度控制)
- D3:2号直流电机/ 1号步进电机(激活和速度控制)
- D5:3号直流电机/ 2号步进电机(激活和速度控制)
- D6:4号直流电机/ 2号步进电机(激活和速度控制)
如果使用任何DC /步进器,则这些引脚将处于忙状态:D4,D7,D8,D12。
仅当使用适当的伺服电机时,才会占用以下引脚:

要开始使用Motor Drive Shield,您需要下载并安装Adafruit AFMotor库。
控制电机的示例代码:
#include <AFMotor.h> // Adafruit #include <Servo.h> // AF_DCMotor motor(1); // , DC Motor Shiled , , frequency Servo servo; // servo.attach(10); // 9 10 ( Motor Shiled) motor.setSpeed(speed); // DC 0 () 255 ( ) motor.run(RELEASE); // DC motor.run(FORWARD); // DC motor.run(BACKWARD); // DC servo.write(90); // 90 .
直流电动机仅在指示速度大于100时才开始旋转,如果小于100,则仅会发出嗡嗡声。 您将必须通过实验确定电动机的最小速度。
对于连接到M1和M2的电动机,您可以设置频率:MOTOR12_64KHZ,MOTOR12_8KHZ,MOTOR12_2KHZ,MOTOR12_1KHZ。 最高转速在64KHz时达到,可以听到此频率,较低的频率和速度在1KHz时也消耗较少的能量。 电动机3和4始终以1KHz运行;其他值将被忽略。 默认位置是1KHz。
之后,有必要进行电动机测试。 测试草图可以在这里获取 。 在草图的开头,在以下类型的一行(或多行)中更改电动机编号:
AF_DCMotor motor(…);
绘制草图一段时间会沿着机器人的运动使电动机向前旋转,然后向后旋转。 仔细查看电动机是否沿该方向旋转,并在必要时更改连接的极性。
我们连接了超声波测距仪HC-SR04超声波模块。 引脚排列:
超声波测距仪在测量上所花费的时间(根据经验确定):
- 如果距离太长(超出范围),则最大为240毫秒
- 如果距离太短至少1毫秒
- 在大约10毫秒内确定1.5 m的距离

超声波测距仪传感器,由于其物理特性,而不是因为中国,在某些情况下无法确定到障碍物的距离:
- 如果障碍物的形状复杂,那么超声波会以不同的角度反射并且传感器是错误的,
- 超声波被软垫的家具或玩具完全吸收(即不被反射),并且传感器认为其前面没有任何东西。
换句话说,对于超声波测距仪,如果所有障碍物都呈垂直于超声波辐射方向的实心平面的形式,则理想地是极好的。
红外距离传感器可以解决一些问题。 但这也不是完美的:
- 与超声波相比,最大射程较小:0.3-0.8 m和4 m
- 与超声波相比,最小距离大:10厘米和2厘米
- 传感器的灵敏度取决于整体照度。
尽管如果将这些测距仪成对安装,则它们的工作效率将大大提高。
连接蓝牙HC-05
从数据表中可以看到“裸” HC-05的主要引脚:
- TX(引脚1)传输
- RX(引脚2)接收
- 3.3V(引脚12)电源3.3V
- GND(引脚13)接地
- PIO8(引脚31)模式指示灯
- PIO9(引脚32)连接状态,如果建立连接,输出将为高
- PIO11(引脚34)启用AT命令模式
我们的模块焊接到了分线器/基板上,那里已经有一个分压器,因此它的工作电压范围为3.3V至6V。
我们连接我们的蓝牙模块组件:
- Arduino(TX)-(RX)HC-05
- Arduino(RX)-(TX)HC-05
- Arduino(+ 5V)-(VCC)蓝牙
- Arduino(GND)-(GND)蓝牙
- LED,KEY引脚未使用
为HC-05蓝牙模块供电后,其LED指示灯应闪烁,这表示蓝牙正在工作。
打开手机上的蓝牙,找到名称为HC-05的设备并连接,密码为1234。
为了进行测试,请在Arduino中填写一个简单的草图:
int count = 0; void setup() { Serial.begin(9600); Serial.println("Test Arduino + Bluetooth. http://localhost"); } void loop() { count++; Serial.print("Count = "); Serial.println(count); delay(1000); }
在Android手机上,安装蓝牙终端。 我们已连接到HC-05设备,并在电话屏幕上观察到计数器递增的蠕变线。
为了使模块可以接收AT命令,您需要将其置于适当的模式-为此,您需要将KEY输出(PIO11)设置为逻辑1。在某些Breakout / Base Board上,有一个EN(ENABLE)输出而不是KEY输出,该输出可能或可能不焊接到芯片本身的引脚上。 这仅适用于HC05芯片。 那只是我的EN端子输出没有焊接在任何地方。 因此,可以用另一根导线将其焊接到芯片的端子KEY(PIO11)。 或者,在操作过程中,要将HC05置于AT指令模式,请将KEY芯片输出(PIO11)与Vcc电源输出短路几秒钟。 对于HC06,不需要KEY引脚。
软体类
注意事项 每次将程序下载到Arduino之前,请确保未将Bluetooth模块连接至Arduino。 这将导致草图填充问题。 只需断开蓝牙模块的电源或连接Arduino和RX,TX模块引脚的电线即可。
在草图的开头,在以下类型的行中更改电动机编号:
AF_DCMotor motor(…);
带有避障功能的自动模式草图请在此处下载 。
如果您替换字符串
byte debug = 0;
在
byte debug = 10;
这将启用调试模式。
在调试模式下,RoboCar4W不会真正行驶或行驶。 相反,激活串行端口监视器,然后您将看到它如何“虚拟”驱动。 字符串“ Forward”将被写入串行端口监视器,而不是真正的向前驱动,而不是向左转“ Return Back L(eft)”等反向。 超声波距离传感器也不执行任何操作,而是通过编程方式随机生成到障碍物的距离。
如果您更改移动算法,而不是抓住打字机在房间周围,只需要检查空闲状态,则此调试模式非常方便。
可在此处下载用于手动控制的蓝牙草图 。 草图没有调试模式,因为那里的所有东西都是透明的。 您按下按钮-机器人走了。
Adnroid蓝牙遥控车程序 。
好吧,就是这样! 旅途愉快!
