这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 电源与模拟 » 如何使用Arduino测量距离

共6条 1/1 1 跳转至

如何使用Arduino测量距离

工程师
2022-07-19 19:38:38     打赏

这篇文章来源于DevicePlus.com英语网站的翻译稿。


前言

有没有想过停车传感器是如何工作的,您的车怎么知道离撞墙有多远?肯定见过机器人避开障碍物吧,想知道它们是如何发现障碍物的吗?这些问题的答案都涉及到短程测距。在这个项目中,我们将使用Arduino UNO结合ROHM测距传感器,测量15cm以内的木制目标的距离。
虽然这个项目看起来很简单,但是传感器并不能直接给出与目标之间的距离。这时,我们要用到光电晶体管,它根据与目标之间的距离输出一定的电压,需要将这个电压转换成距离。由于光电晶体管产生的电压变化与距离不呈线性关系,这个方法的复杂程度增加了。这涉及一种称为曲线拟合的方法,以从实验数据中获得尽可能最接近的方程。通过本项目可学习以下知识:

如何正确给LED供电:

  • 如何从光电晶体管读取传感器输入

  • 如何收集校准数据

  • 如何使用MATLAB进行曲线拟合

  • 如何对基于Arduino的校准进行编程

  • 使用Arduino UNO测量距离

Arduino Map Function

概述

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

所需元器件:

  • 电路原理图

  • 设置Arduino IDE

  • 校准编程

  • 使用MATLAB进行曲线拟合

  • 最终编程

  • 测试

所需元器件

 

元器件链接/图片
ROHM测距传感器
RPR-220PC30N
https://www.digikey.com/products/en?keywords=RPR-220PC30N
请注意,我在本文中使用的是****红光的RPR-220UC30N,而链接中是****蓝光的替代件RPR-220PC30N,功能是相同的,后者目前更容易买到ROHM sensor
Arduino UNO R3https://www.aliexpress.com/item/32981776049.html
Arduino UNO
USB B数据线
(通常随Arduino UNO R3一起提供)
USB B cable
56kΩ和220Ω的电阻器wiring
400孔无焊面包板https://www.aliexpress.com/item/32711841420.htmlbreadboard
10根跳线https://www.aliexpress.com/item/32951945552.html
电路原理图

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

sensor layout

连接示意图如下所示:

schematics

实际接线如下所示:

attached arduino

arduino wiring

设置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端口。这时,您已经完成设置,可以开始编程了。

校准编程

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


 

123456789101112131415161718192021222324#define IR_INPUT_PIN A0 //Pin to read values from phototransistor#define IR_LED_PIN 8 //Pin to light LEDvoid 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的距离处,标尺放在下面):

calibration setup

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

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

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

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

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

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

calibration data points

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

使用MATLAB进行曲线拟合

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

MATLAB command window

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

MATLAB curve fitting

拟合类型选择幂函数。

MATLAB equations

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

最终编程

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


 

123456789101112131415161718192021222324252627282930313233#define IR_INPUT_PIN A0 //Pin to read values from phototransistor#define IR_LED_PIN 8 //Pin to light LEDdouble a= 73.11;  //Constants obtained from MATLAB Curve fittingdouble 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);}


测试

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

calibration setup

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





关键词: 如何     使用     Arduino     测量     距离    

工程师
2022-07-19 19:41:19     打赏
2楼

谢谢分享


工程师
2022-07-19 19:43:54     打赏
3楼

感谢分享


院士
2022-07-19 21:52:16     打赏
4楼

学习


专家
2022-07-19 22:05:43     打赏
5楼

看看


专家
2022-07-20 09:11:37     打赏
6楼

学习,谢谢分享!


共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]