使用超声波传感器和Arduino构建一个避障机器人

机器人

519人已加入

描述

  避障机器人是一种智能设备,它可以自动感知前方障碍物,并通过转向另一个方向来避开它们。这种设计允许机器人通过避免碰撞在未知环境中导航,这是任何自主移动机器人的主要要求。避障机器人的应用范围不受限制,现在大多数军事组织都在使用它,这有助于执行许多士兵无法完成的危险工作。

  这次我们将使用超声波传感器和 Arduino 构建一个避障机器人。这里使用超声波传感器通过计算机器人与障碍物之间的距离来感知路径中的障碍物。如果机器人发现任何障碍物,它会改变方向并继续移动。

  如何使用超声波传感器构建避障机器人

  在构建机器人之前,了解超声波传感器的工作原理非常重要,因为该传感器将在检测障碍物方面发挥重要作用。超声波传感器工作的基本原理是记下传感器发射超声波束和撞击表面后接收超声波束所花费的时间。然后进一步使用公式计算距离。在这个项目中,使用了广泛使用的HC-SR04 超声波传感器。

Arduino

  因此,HC-SR04 的 Trig 引脚被设为高电平至少 10 us。一个声束以 8 个 40KHz 的脉冲传输。

Arduino

  信号然后撞击表面并返回并由 HC-SR04 的接收器 Echo 引脚捕获。Echo 引脚在发送高电平时已经变为高电平。

Arduino

  光束返回所需的时间保存在变量中,并使用如下适当的计算转换为距离

  距离 = (时间 x 空气中的声速 (343 m/s))/2

  这个避障机器人的组件很容易找到。为了制作底盘,可以使用任何玩具底盘,也可以定制。

  所需组件

  Arduino NANO 或 Uno(任何版本)

  HC-SR04 超声波传感器

  LM298N 电机驱动模块

  5V直流电机

  电池

  轮子

  机壳

  跳线

  电路原理图

  该项目的完整电路图如下所示,您可以看到它使用了 Arduino nano。但是我们也可以使用具有相同电路(遵循相同引脚)和代码的 Arduino UNO 构建一个避障机器人。

Arduino

  一旦电路准备好,我们必须通过将电路组装在机器人底盘顶部来构建我们的避障车,如下所示。

Arduino

使用 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运动

 

Arduino

 在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);

}


}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分