避障机器人是一种智能设备,可以自动感知前方的障碍物,并通过朝另一个方向转动来避开障碍物。这种设计允许机器人通过避免碰撞在未知环境中导航,这是任何自主移动机器人的主要要求。避障机器人的应用不受限制,现在已在大多数军事组织中使用,这有助于执行许多士兵无法完成的危险工作。
我们先前使用Raspberry Pi和PIC Microcontroller构建了“避免障碍机器人”。这次,我们将使用超声波传感器和Arduino构建避障机器人。此处,超声波传感器用于通过计算机器人与障碍物之间的距离来感应路径中的障碍物。如果机器人发现任何障碍物,它将改变方向并继续移动。
如何使用超声波传感器构建避障机器人
在建造机器人之前,了解超声波传感器的工作原理非常重要,因为该传感器在检测障碍物方面将发挥重要作用。超声波传感器工作的基本原理是记下传感器撞击表面后发射超声波束和接收超声波束所花费的时间。然后,进一步使用公式计算距离。在该项目中,使用了广泛使用的HC-SR04超声波传感器。为了使用该传感器,将在上面说明类似的方法。
因此,HC-SR04的Trig引脚被拉高了至少10 us。声束以每个40KHz的8个脉冲传输。
然后,信号撞击表面并返回并被HC-SR04的接收器回波引脚捕获。回音引脚在发送高电平时已经变高。
光束返回所需的时间保存在变量中,并使用如下所示的适当计算转换为距离
距离=(时间x空中声速(343 m / s))/ 2
我们在许多项目中使用了超声波传感器,以了解有关超声波传感器的更多信息,并检查与超声波传感器相关的其他项目。
可以轻松找到该避障机器人的组件。为了制造底盘,可以使用或可以定制任何玩具底盘。
所需组件
- Arduino NANO或Uno(任何版本)
- HC-SR04超声波传感器
- LM298N电机驱动器模块
- 5V直流电动机
- 电池
- 轮圈
- 机壳
- 跳线
电路原理图
下面给出了该项目的完整电路图,您可以看到它使用了Arduino nano。但是我们也可以使用具有相同电路(遵循相同引脚排列)和代码的Arduino UNO来避开机器人。
电路准备就绪后,我们必须通过将电路组装在机器人机箱的顶部来构建避障汽车,如下所示。
使用Arduino避开机器人-代码
该项目的结尾给出了带有演示视频的完整程序。该程序将包括设置HC-SR04模块并将信号输出到电机引脚以相应地移动电机方向。此项目中将不使用任何库。
首先在程序中定义HC-SR04的触发和回波引脚。在此项目中,触发引脚连接到GPIO9,回波引脚连接到Arduino NANO的GPIO10。
int trigPin = 9; // HC-SR04的触发引脚 int echoPin = 10; // HC-SR04的回波针
定义用于LM298N电机驱动器模块输入的引脚。LM298N具有4个数据输入引脚,用于控制与其相连的电动机的方向。
int revleft4 = 4; // REVerse左电机的运动 int fwdleft5 = 5; // Forward Wars of Left motor int revright6 = 6; // REVerse右电机的运动 int fwdright7 = 7; //右马达前移
在 setup() 函数中,定义使用的GPIO引脚的数据方向。四个电机引脚和Trig引脚设置为OUTPUT,Echo引脚设置为Input。
pinMode(revleft4,OUTPUT); //将电机引脚设置为输出 pinMode(fwdleft5,OUTPUT); pinMode(revright6,OUTPUT); pinMode(fwdright7,OUTPUT); pinMode(trigPin,输出); //将触发引脚设置为输出 pinMode(echoPin,INPUT); //将回波引脚设置为输入以捕获反射波
在 loop() 函数中,获取与HC-SR04的距离,并根据该距离移动电动机方向。该距离将显示进入机器人前方的物体距离。该距离是通过将超声波束爆裂到10 us并在10us之后接收来获得的。要了解有关使用超声波传感器和Arduino测量距离的更多信息,请单击链接。
digitalWrite(trigPin,LOW); delayMicroseconds(2); digitalWrite(trigPin,HIGH); //发送10 us的 wave delayMicroseconds(10); 持续时间= pulseIn(echoPin,HIGH); //接收反射波的 距离=持续时间/ 58.2; //转换为距离 延迟(10);
如果该距离大于定义的距离,则表示该路径中没有障碍物,它将向前移动。
if(距离> 19) { digitalWrite(fwdright7,HIGH); //向前移动 digitalWrite(revright6,LOW); digitalWrite(fwdleft5,HIGH); digitalWrite(revleft4,LOW); }
如果该距离小于定义的距离,则说明避开障碍物意味着前方存在障碍物。因此,在这种情况下,机器人将停止一会儿,然后向后移动,然后再次停止一会儿,然后转向另一个方向。
if(距离<18) { digitalWrite(fwdright7,LOW); //停止 digitalWrite(revright6,LOW); digitalWrite(fwdleft5,LOW); digitalWrite(revleft4,LOW); 延迟(500); digitalWrite(fwdright7,LOW); // movebackword digitalWrite(revright6,HIGH); digitalWrite(fwdleft5,LOW); digitalWrite(revleft4,HIGH); 延迟(500); digitalWrite(fwdright7,LOW); //停止 digitalWrite(revright6,LOW); digitalWrite(fwdleft5,LOW); digitalWrite(revleft4,LOW); 延迟(100); digitalWrite(fwdright7,HIGH); digitalWrite(revright6,LOW); digitalWrite(revleft4,LOW); digitalWrite(fwdleft5,LOW); 延迟(500); }
因此,这就是机器人如何避免其路径上的障碍物而不会卡在任何地方的方式。在下面找到完整的代码和视频。