风筝
发表于: 2019-3-20 14:26:52 | 显示全部楼层

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


在本篇文章中,我们将使用Arduino和超声波传感器制作一个避障小车。这里,超声波传感器用于通过计算机器人和障碍物之间的距离来感测路径中的障碍物。如果机器人发现任何障碍物,它会改变方向并继续移动。

Obstacle Avoiding-Robot-using-Arduino-and-Ultrasonic-Sensor.jpg


超声波传感器如何用于避免障碍物

在制作之前,了解超声波传感器的工作原理非常重要,因为这种传感器在检测障碍物方面起着重要作用。超声波传感器工作的基本原理是记录传感器在撞击表面后传输超声波束和接收超声波束所需的时间。然后使用该公式计算距离。在本文中,使用了广泛使用的HC-SR04超声波传感器。

Ultrasonic-Sensor-HC-SR04.jpg


因此,HC-SR04的Trig引脚高至少10 us。声波束以8个40KHz的脉冲传输。

Ultrasonic-Timing-Diagram.gif


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

Ultrasonic-Sensor-Working.jpg

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

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

可轻松找到避免机器人的障碍物的组件。为了搭建底盘,可以使用任何玩具底盘或者可以定制。


需要的组件

●    Arduino NANO或Uno开发板

●    HC-SR04超声波传感器

●    LM298N电机驱动器模块

●    5V直流电动机

●    电池

●    车轮

●    机壳

●    跳线


电路原理图

Circuit-Diagram-for-Obstacle Avoiding-Robot-using-Arduino-and-Ultrasonic-Sensor.png

Circuit-Hardware-for-Obstacle-Avoiding-Robot-using-Arduino-and-Ultrasonic-Sensor.jpg


避障小车的Arduino编程

在本文末尾处将给出了完整程序。该程序将包括设置HC-SR04模块并将信号输出到电机引脚以相应地移动电机方向。此项目中不会使用任何库。


首先在程序中定义HC-SR04的TRIG和ECHO引脚。在本文中,trig引脚连接到GPIO9,echo引脚连接到Arduino NANO的GPIO10。

  1. int trigPin = 9;      // trig pin of HC-SR04
  2. int echoPin = 10;     // Echo pin of HC-SR04
复制代码

定义用于输入LM298N电机驱动器模块的引脚。 LM298N有4个数据输入引脚,用于控制连接到它的电机方向。

  1. int revleft4 = 4;       //REVerse motion of Left motor
  2. int fwdleft5 = 5;       //ForWarD motion of Left motor
  3. int revright6 = 6;      //REVerse motion of Right motor
  4. int fwdright7 = 7;      //ForWarD motion of Right motor
复制代码

LM298N-Motor-Driver-Module.jpg

LM298N电机驱动器模块


setup()函数中,定义使用的GPIO引脚的数据方向。四个电机引脚和Trig引脚设置为输出,Echo引脚设置为输入。

  1. pinMode(revleft4, OUTPUT);      // set Motor pins as output
  2. pinMode(fwdleft5, OUTPUT);
  3. pinMode(revright6, OUTPUT);
  4. pinMode(fwdright7, OUTPUT);
  5. pinMode(trigPin, OUTPUT);         // set trig pin as output
  6. pinMode(echoPin, INPUT);          //set echo pin as input to capture reflected waves
复制代码

loop()函数中,从HC-SR04获取距离并根据距离移动电机方向。距离将显示机器人前方的物体距离。通过将超声波束发射至10 us并在10us后接收来获取距离。

  1. digitalWrite(trigPin, LOW);
  2. delayMicroseconds(2);   
  3. digitalWrite(trigPin, HIGH);     // send waves for 10 us
  4. delayMicroseconds(10);
  5. duration = pulseIn(echoPin, HIGH); // receive reflected waves
  6. distance = duration / 58.2;   // convert to distance
  7. delay(10);
复制代码

如果距离大于定义的距离意味着其路径中没有障碍物并且它将向前移动。

  1. if (distance > 19)            
  2.             {
  3.             digitalWrite(fwdright7, HIGH);                    // move forward
  4.             digitalWrite(revright6, LOW);
  5.             digitalWrite(fwdleft5, HIGH);                                
  6.             digitalWrite(revleft4, LOW);                                                      
  7.             }
复制代码

如果距离小于规定的距离以避开障碍物意味着前方存在一些障碍物。因此,在这种情况下,机器人将停止一段时间并在此之后向后移动再次停止一段时间,然后转向另一个方向。

  1.     if (distance < 18)
  2.              {
  3.              digitalWrite(fwdright7, LOW);  //Stop               
  4.              digitalWrite(revright6, LOW);
  5.              digitalWrite(fwdleft5, LOW);                                
  6.              digitalWrite(revleft4, LOW);
  7.              delay(500);
  8.              digitalWrite(fwdright7, LOW);      //movebackword         
  9.              digitalWrite(revright6, HIGH);
  10.              digitalWrite(fwdleft5, LOW);                                
  11.              digitalWrite(revleft4, HIGH);
  12.              delay(500);
  13.              digitalWrite(fwdright7, LOW);  //Stop               
  14.              digitalWrite(revright6, LOW);
  15.              digitalWrite(fwdleft5, LOW);                                
  16.              digitalWrite(revleft4, LOW);  
  17.              delay(100);  
  18.              digitalWrite(fwdright7, HIGH);      
  19.              digitalWrite(revright6, LOW);   
  20.              digitalWrite(revleft4, LOW);                                 
  21.              digitalWrite(fwdleft5, LOW);  
  22.              delay(500);
  23.             }
复制代码

代码

本文使用的完整代码如下: main.rar (831 Bytes, 下载次数: 385)

跳转到指定楼层
月魂离人
发表于: 2019-12-9 22:41:23 | 显示全部楼层

版主,为什么我做出来的小车只会后退停止,然后转向,它不会向前走?
回复

使用道具 举报

xinhoujue
发表于: 2020-8-13 11:39:57 | 显示全部楼层

程序里就没有向前走,自然不会向前走了。仔细看例程自己改一下,不难的。
回复

使用道具 举报

小憨熊
发表于: 2020-12-17 12:32:39 | 显示全部楼层

为什么out1,out2没有输出呢,就是out1,out2连接的电机没有转动
回复

使用道具 举报

风筝
发表于: 2020-12-17 14:01:40 | 显示全部楼层

小憨熊 发表于 2020-12-17 12:32
为什么out1,out2没有输出呢,就是out1,out2连接的电机没有转动

用示波器看看有没有PWM输出,另外,看一下工作电源能不能达到要求
回复

使用道具 举报

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

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-23 15:37 , Processed in 0.038079 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

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