0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用Arduino测量障碍物的距离

科技观察员 来源:DevicePlus 作者:DevicePlus 2022-04-03 10:22 次阅读

有没有想过停车传感器是如何工作的,您的车怎么知道离撞墙有多远?肯定见过机器人避开障碍物吧,想知道它们是如何发现障碍物的吗?这些问题的答案都涉及到短程测距。在这个项目中,我们将使用Arduino UNO结合ROHM测距传感器,测量15cm以内的木制目标的距离。

虽然这个项目看起来很简单,但是传感器并不能直接给出与目标之间的距离。这时,我们要用到光电晶体管,它根据与目标之间的距离输出一定的电压,需要将这个电压转换成距离。由于光电晶体管产生的电压变化与距离不呈线性关系,这个方法的复杂程度增加了。这涉及一种称为曲线拟合的方法,以从实验数据中获得尽可能最接近的方程。

概述

在这个DIY项目中,我们将开发一个电路,使用Arduino的数字引脚为测距传感器的LED供电。LED发出的光将从木制目标反射,并被光电晶体管接收,光电晶体管将产生电压信号,由Arduino中的模拟引脚读取。由于电压变化相对于距离变化不呈线性关系,在与目标不同距离处收集的数据将用于使用MATLAB生成控制方程。然后,将通过Arduino在代码中使用该方程来测量距离。将按照以下顺序介绍这个项目:

所需元器件

电路原理

设置Arduino IDE

校准编程

使用MATLAB进行曲线拟合

最终编程

测试

所需元器件

pYYBAGJGxB6ADb-3AABuHJJ9TXM792.png

电路原理图

所有元器件都采购齐全后,第一步是把所有东西都连接起来。这个项目不需要很多元器件;只需要通过正确的电阻器将Arduino与ROHM RPR-220传感器正确连接即可。实际上,为了使其成为便携式系统,我们使用双面胶带将Arduino贴在面包板的背面,将ROHM传感器贴在面包板的正面。ROHM传感器引脚的定义如下所示:

poYBAGJGxBuAVU42AAIp90pn7uk031.png

连接示意图如下所示:

poYBAGJGxBeAf1erAALg6XzbZaw236.png

实际接线如下所示:

poYBAGJGxBOAVI0lAAbS6UqUCxQ803.png

poYBAGJGxA6AcyzjAAZDH25HCIE304.png

设置Arduino IDE

Arduino编程需要设置Arduino IDE。Arduino IDE可在Linux和Windows上使用。对于这个DIY项目,我们将使用Windows桌面应用程序。访问以下链接下载并安装Arduino IDE:

https://www.arduino.cc/en/Main/Software

选择以下链接:

Windows Installer,适用于Windows XP及更高版本

成功安装后,打开Arduino IDE并使用USB B数据线连接Arduino UNO R3:在Arduino IDE中,从“工具”》“端口”》“COM 3 (Arduino Genuino / UNO)”中选择适当的COM端口。这时,您已经完成设置,可以开始编程了。

校准编程

首先,开发程序,以获取目标放在不同距离时的传感器值。包含注释的代码如下所示:

#define IR_INPUT_PIN A0 //Pin to read values from phototransistor

#define IR_LED_PIN 8 //Pin to light LED

void setup()

{

Serial.begin(9600);

pinMode(IR_INPUT_PIN, INPUT);

pinMode(IR_LED_PIN, OUTPUT);

}

void loop(){

int ambient = 0;

int lit = 0;

int value = 0;

digitalWrite(IR_LED_PIN, LOW); //Turning off LED to measure ambient light

delay(5); //To give ADC and LED transition time

ambient = analogRead(IR_INPUT_PIN); //Saving value for ambient light

digitalWrite(IR_LED_PIN, HIGH); //Turning on LED

delay(5);

lit = analogRead(IR_INPUT_PIN); //Measuring total reflected light on sensor

value = lit – ambient; //Removing ambient light value to calculate the net value of LED

Serial.print(“value = “);

Serial.println(value); //Printing final sensor value on serial monitor

delay(1000);

}

完成上述代码后,编译并将其上传到Arduino。如果所有接线正确,LED将会点亮。如下所示设置用于校准的仪器(将一个目标放在15cm的距离处,标尺放在下面):

pYYBAGJGxAqARrilAAVEljxFkbo850.png

现在,在Arduino IDE中,打开“工具”》“串口监视器”。执行以下操作:

当目标放在15cm处时,检查传感器值。

当目标放在10cm处时,检查传感器值。

当目标放在5cm处时,检查传感器值。

当目标放在2cm处时,检查传感器值。

如上所述,由于目标的颜色、环境光和环境不同,这些值可能会有所不同。在本例中,距离为15、10、5和2cm处对应的值分别为15、30、97和487。

pYYBAGJGxAWANm3sAAD27OaH3H0110.png

很明显,这种关系不是线性的,我们需要一个方程来计算距离。这个方程将使用下面介绍的曲线拟合方法获得。

使用MATLAB进行曲线拟合

打开MATLAB,如下所示写入x和y坐标数据:

pYYBAGJGxACATgFKAAF9dbMFQMA347.png

现在转到应用程序中的曲线拟合。

pYYBAGJGw_qABB1VAAF9aKX8AI4409.png

拟合类型选择幂函数。

pYYBAGJGw_aAN9pFAAFcHM1R8hc376.png

记下方程和常数a和b的值。

最终编程

最终编程时,修改代码以包括从曲线拟合获得的方程,并删除打印命令,但最终距离除外,这是必需的。由于已经使用曲线拟合找到了传感器值与距离之间的关系,因此将声明一个附加变量来存储距离的大小。

#define IR_INPUT_PIN A0 //Pin to read values from phototransistor

#define IR_LED_PIN 8 //Pin to light LED

double a= 73.11; //Constants obtained from MATLAB Curve fitting

double b= –0.585;

double dist;

void setup()

{

Serial.begin(9600);

pinMode(IR_INPUT_PIN, INPUT);

pinMode(IR_LED_PIN, OUTPUT);

}

void loop()

{

int ambient = 0;

int lit = 0;

int value = 0;

digitalWrite(IR_LED_PIN, LOW); //Turning off LED to measure ambient light

delay(5); //To give ADC and LED transition time

ambient = analogRead(IR_INPUT_PIN); //Saving value for ambient light

digitalWrite(IR_LED_PIN, HIGH); //Turning on LED

delay(5);

lit = analogRead(IR_INPUT_PIN); //Measuring total reflected light on sensor

value = lit – ambient; //Removing ambient light value to calculate the net value of LED

//Using power function and formulating equation generated by MATLAB

dist = pow(value,b);

dist = a*dist;

//Displaying the calculated distance

Serial.print(dist);

Serial.println(“ cm”);

}

测试

测试时,使用相同的校准设置。

poYBAGJGw_KAXNVoAAYoMK0h5Zw357.png

将最终代码上传到Arduino后,打开串口监视器。您将看到以厘米为单位的距离值。为了验证测试,将屏幕上的值与地面上的标尺进行匹配。如果数值接近正确,您就成功应用曲线拟合方法进行了逼近。现在,您的系统可以可靠地计算不同场景中相似障碍物的距离。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 测距传感器
    +关注

    关注

    0

    文章

    74

    浏览量

    20199
  • Arduino
    +关注

    关注

    187

    文章

    6462

    浏览量

    186611
收藏 人收藏

    评论

    相关推荐

    遇到障碍物自动返回?

    为什么有些东西,遇到障碍物会自动返回,是哪一种传感器吗?哪里有没有这类的电路图介绍下,非常感谢
    发表于 09-10 21:14

    设计完PCB后走线不能躲避障碍物时什么情况

    本帖最后由 gk320830 于 2015-3-8 20:36 编辑 设计完PCB后走线不能躲避障碍物时什么情况?已经设置了躲避障碍物还是不能躲避
    发表于 12-20 08:47

    求教 障碍物感应类开关

    本帖最后由 gk320830 于 2015-3-8 14:20 编辑 急需用到2米内障碍物感应器,带开关功能或者高手帮忙设计个辅助开关电路,24V电源供电,多谢
    发表于 03-07 21:58

    障碍物时 语音提示 前方危险,请注意。

    障碍物时语音提示前方危险,请注意。语音模块是isd1820单片机51 求帮忙
    发表于 02-24 21:43

    基于labview机器视觉的障碍物时别

    通过摄像头对周围环境信息的实时采集,如果当镜头前方出现障碍物时候,以一定的方式(声音或振动之类的)反馈出来。主要考虑的是实现盲人室内导盲作用,不需要太过于考虑实际使用,只要能实现判定到障碍物,自动提醒就行啦。怎么判定前方出现障碍物
    发表于 03-14 07:58

    新人求教AD中Pullback(障碍物)到底是一个什么概念或作用?

    ,即如果设置的障碍物值为20mil,那么在板的边框外面有20mil的覆铜,在边框的里面也有20mil的覆铜。”2、“Pullback”,是在内电层边缘设置的一个闭合的去铜边界,以保证内电层边界距离PCB
    发表于 11-04 11:27

    请问Infrared Proximity Sensor如何检测前方是否有障碍物

    Infrared Proximity Sensor如何检测前方是否有障碍物
    发表于 11-06 07:57

    能用单片机直接通过串口连接激光雷达测障碍物

    想用单片机直接通过串口连接激光雷达,测障碍物,该激光雷达波特率230400,是arduino的极限115200的两倍,所以要用STM32的芯片了。其数据手册说的还是不清楚,固连接电脑的串口根据测得
    发表于 02-24 06:31

    检测障碍物有什么什么传感器?

    检测障碍物有什么什么传感器,用红外反射还是超声波测距,或者还有其他传感器?
    发表于 11-08 06:33

    汇编语言程序设计案例—动态显示/障碍物检测/障碍物方位检测

    汇编语言程序设计案例1—动态显示/障碍物检测/障碍物方位检测 10-1.  LED数码管显示原理10-2.  案例分析1(2位学号显示)10-3.  案例分析2(简易按键抢答)10-4.
    发表于 03-23 12:15 38次下载

    障碍物检测实验

    障碍物检测实验 一、实验目的“旋风”小车在运动过程中要成功避开障碍物必须在一定距离外就探测到障碍物。在小车上探测障碍物
    发表于 03-23 10:47 2796次阅读
    <b class='flag-5'>障碍物</b>检测实验

    障碍物方位检测实验

    障碍物方位检测实验 一、实验目的小车在运动中要成功避开障碍物,除了要检测是否有障碍物外,还需要判断障碍物的方位,以便小
    发表于 03-23 10:48 1987次阅读
    <b class='flag-5'>障碍物</b>方位检测实验

    避免障碍物Arduino控制汽车设计方案

    避免障碍物(即墙壁或前方的物体)的Arduino控制汽车。         责任编辑:xj 原文标题:基于Arduino的避障车 文章出处:【微信公众号:电路设计技能】欢迎添加关注!文章转载请注明出处。  
    的头像 发表于 12-25 14:55 1599次阅读

    Arduino障碍物避免机器人汽车

    电子发烧友网站提供《Arduino障碍物避免机器人汽车.zip》资料免费下载
    发表于 10-31 09:30 0次下载
    <b class='flag-5'>Arduino</b><b class='flag-5'>障碍物</b>避免机器人汽车

    如何让Arduino使用雷达避开障碍物

    电子发烧友网站提供《如何让Arduino使用雷达避开障碍物.zip》资料免费下载
    发表于 06-26 14:58 1次下载
    如何让<b class='flag-5'>Arduino</b>使用雷达避开<b class='flag-5'>障碍物</b>