避障机器人是一种智能设备,它可以自动感知前方障碍物,并通过转向另一个方向来避开它们。这种设计允许机器人通过避免碰撞在未知环境中导航,这是任何自主移动机器人的主要要求。避障机器人的应用范围不受限制,现在大多数军事组织都在使用它,这有助于执行许多士兵无法完成的危险工作。
这次我们将使用超声波传感器和 Arduino 构建一个避障机器人。这里使用超声波传感器通过计算机器人与障碍物之间的距离来感知路径中的障碍物。如果机器人发现任何障碍物,它会改变方向并继续移动。
如何使用超声波传感器构建避障机器人
在构建机器人之前,了解超声波传感器的工作原理非常重要,因为该传感器将在检测障碍物方面发挥重要作用。超声波传感器工作的基本原理是记下传感器发射超声波束和撞击表面后接收超声波束所花费的时间。然后进一步使用公式计算距离。在这个项目中,使用了广泛使用的HC-SR04 超声波传感器。
因此,HC-SR04 的 Trig 引脚被设为高电平至少 10 us。一个声束以 8 个 40KHz 的脉冲传输。
信号然后撞击表面并返回并由 HC-SR04 的接收器 Echo 引脚捕获。Echo 引脚在发送高电平时已经变为高电平。
光束返回所需的时间保存在变量中,并使用如下适当的计算转换为距离
距离 = (时间 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; //左电机反向运动 int fwdleft5 = 5; //左电机的ForWarD运动 int revright6 = 6; //右电机反向运动 int fwdright7 = 7; //右电机ForWarD运动
在setup()函数中,定义使用的 GPIO 引脚的数据方向。四个 Motor 引脚和 Trig 引脚设置为 OUTPUT,Echo 引脚设置为 Input。
pinMode(revleft4,输出);// 将电机引脚设置为输出 pinMode(fwdleft5, OUTPUT); pinMode(revright6,输出); pinMode(fwdright7,输出); pinMode(trigPin,输出);// 将触发引脚设置为输出 pinMode(echoPin, INPUT); //将回波引脚设置为输入以捕获反射波
在loop()函数中,获取到 HC-SR04的距离并根据距离移动电机方向。距离将显示机器人前方的物体距离。距离是通过将一束超声波发射到 10 微秒并在 10 微秒后接收它来获取的。
数字写入(trigPin,低); 延迟微秒(2); digitalWrite(trigPin, HIGH); // 发送波形 10 us delayMicroseconds(10); 持续时间=脉冲输入(回声针,高);// 接收反射波 距离 = 持续时间 / 58.2; // 转换为距离 延迟(10);
如果距离大于定义的距离,则表示其路径中没有障碍物,它将向前移动。
if (距离 > 19) { digitalWrite(fwdright7, HIGH); // 前进 digitalWrite(revright6, LOW); 数字写入(fwdleft5,高); 数字写入(revleft4,低); }
如果距离小于定义的避障距离,则表示前方有障碍物。所以在这种情况下,机器人会停一会,然后向后移动,然后再停一会,然后转向另一个方向。
if (距离 < 18) { digitalWrite(fwdright7, LOW); //停止 digitalWrite(revright6, LOW); 数字写入(fwdleft5,低); 数字写入(revleft4,低); 延迟(500); 数字写入(fwdright7,低);//movebackword digitalWrite(revright6, HIGH); 数字写入(fwdleft5,低); 数字写入(revleft4,高); 延迟(500); 数字写入(fwdright7,低);//停止 digitalWrite(revright6, LOW); 数字写入(fwdleft5,低); 数字写入(revleft4,低); 延迟(100); 数字写入(fwdright7,高); 数字写入(revright6,低); 数字写入(revleft4,低); 数字写入(fwdleft5,低); 延迟(500); }
这就是机器人如何避开路径上的障碍物而不会卡在任何地方的方法。
int revright6 = 6; //右电机反向运动
int fwdright7 = 7; //右电机ForWarD运动
持续时间长,距离远;
无效设置(){
延迟(随机(500,2000));// 随机时间延迟
Serial.begin(9600);
pinMode(revleft4,输出);// 将电机引脚设置为输出
pinMode(fwdleft5, OUTPUT);
pinMode(revright6,输出);
pinMode(fwdright7,输出);
pinMode(trigPin,输出);// 将触发引脚设置为输出
pinMode(echoPin, INPUT); //将回波引脚设置为输入以捕获反射波
}
无效循环(){
数字写入(trigPin,低);
延迟微秒(2);
digitalWrite(trigPin, HIGH); // 发送波形 10 us
delayMicroseconds(10);
持续时间=脉冲输入(回声针,高);// 接收反射波
距离 = 持续时间 / 58.2; // 转换为距离
延迟(10);
// 如果你的机器人没有得到正确的运动,那么改变引脚号
if (distance > 19)
{
digitalWrite(fwdright7, HIGH); // 前进
digitalWrite(revright6, LOW);
数字写入(fwdleft5,高);
数字写入(revleft4,低);
}
if (距离 < 18)
{
digitalWrite(fwdright7, LOW); //停止
digitalWrite(revright6, LOW);
数字写入(fwdleft5,低);
数字写入(revleft4,低);
延迟(500);
数字写入(fwdright7,低);//movebackword
digitalWrite(revright6, HIGH);
数字写入(fwdleft5,低);
数字写入(revleft4,高);
延迟(500);
数字写入(fwdright7,低);//停止
digitalWrite(revright6, LOW);
数字写入(fwdleft5,低);
数字写入(revleft4,低);
延迟(100);
数字写入(fwdright7,高);
数字写入(revright6,低);
数字写入(revleft4,低);
数字写入(fwdleft5,低);
延迟(500);
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)