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

有没有想过停车传感器是如何工作的,您的车怎么知道离撞墙有多远?肯定见过机器人避开障碍物吧,想知道它们是如何发现障碍物的吗?这些问题的答案都涉及到短程测距。在这个项目中,我们将使用arduino uno结合rohm测距传感器,测量15cm以内的木制目标的距离。
虽然这个项目看起来很简单,但是传感器并不能直接给出与目标之间的距离。这时,我们要用到光电晶体管,它根据与目标之间的距离输出一定的电压,需要将这个电压转换成距离。由于光电晶体管产生的电压变化与距离不呈线性关系,这个方法的复杂程度增加了。这涉及一种称为曲线拟合的方法,以从实验数据中获得尽可能最接近的方程。
概述
在这个diy项目中,我们将开发一个电路,使用arduino的数字引脚为测距传感器的led供电。led发出的光将从木制目标反射,并被光电晶体管接收,光电晶体管将产生电压信号,由arduino中的模拟引脚读取。由于电压变化相对于距离变化不呈线性关系,在与目标不同距离处收集的数据将用于使用matlab生成控制方程。然后,将通过arduino在代码中使用该方程来测量距离。将按照以下顺序介绍这个项目:
所需元器件:
电路原理图
设置arduino ide
校准编程
使用matlab进行曲线拟合
最终编程
测试
所需元器件
电路原理图
所有元器件都采购齐全后,第一步是把所有东西都连接起来。这个项目不需要很多元器件;只需要通过正确的电阻器将arduino与rohm rpr-220传感器正确连接即可。实际上,为了使其成为便携式系统,我们使用双面胶带将arduino贴在面包板的背面,将rohm传感器贴在面包板的正面。rohm传感器引脚的定义如下所示:
连接示意图如下所示:
实际接线如下所示:
设置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的距离处,标尺放在下面):
现在,在arduino ide中,打开“工具”》“串口监视器”。执行以下操作:
当目标放在15cm处时,检查传感器值。
当目标放在10cm处时,检查传感器值。
当目标放在5cm处时,检查传感器值。
当目标放在2cm处时,检查传感器值。
如上所述,由于目标的颜色、环境光和环境不同,这些值可能会有所不同。在本例中,距离为15、10、5和2cm处对应的值分别为15、30、97和487。
很明显,这种关系不是线性的,我们需要一个方程来计算距离。这个方程将使用下面介绍的曲线拟合方法获得。
使用matlab进行曲线拟合
打开matlab,如下所示写入x和y坐标数据:
现在转到应用程序中的曲线拟合。
拟合类型选择幂函数。
记下方程和常数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”);
}
测试
测试时,使用相同的校准设置。
将最终代码上传到arduino后,打开串口监视器。您将看到以厘米为单位的距离值。为了验证测试,将屏幕上的值与地面上的标尺进行匹配。如果数值接近正确,您就成功应用曲线拟合方法进行了逼近。现在,您的系统可以可靠地计算不同场景中相似障碍物的距离。

示波器的基础知识
小米10手机价格已降至3599元
特微电子顺利通过安全生产标准化三级单位
基于区块链技术的下一代的内容分发平台CVN介绍
浅谈未来几年“Android开发“的前景
如何使用Arduino测量障碍物的距离
警惕邪恶版GPT!
全光谱半导体LED显示模组项目落户马鞍山 总投资2亿
西门子PLC硬件和编程过程中常见问题以及解决方法
Deca携手日月光和西门子推出APDK™设计解决方案
PCB电路抑制干扰源的常用措施介绍
手机充电时,先插手机还是电源?
一个用C++ 开发的可用于管理插件的开源架构 Pluma
中汽中心正式发布C-ICAP《中国智能网联汽车技术规程》
核酸适配体检测原理 可生成具有所需结合亲和力的适配体
光纤收发器TR-962D932D指示灯说明
非洲猪瘟检测设备的各项参数是怎样的
常见的语音芯片控制模式有哪几个?
PIGEON:借助OpenAI的CLIP神经网络,精准预测图像地理位置
大疆、派诺特、零度智控等无人机品牌盘点TOP10