博客专栏

EEPW首页 > 博客 > LabVIEW控制Arduino实现超声波测距(进阶篇—5)

LabVIEW控制Arduino实现超声波测距(进阶篇—5)

发布人:美男子玩编程 时间:2022-07-18 来源:工程师 发布文章

1


项目概述


超声波测距是一种传统而实用的非接触测量方法,与激光、涡流和无线电测距方法相比,具有不受外界光及电磁场等因素影响的优点,在比较恶劣的环境中也具有一定的适应能力,且结构简单、成本低,因此在工业控制、建筑测量、机器人定位方面有广泛的应用。


本节将介绍使用HC-SR04超声波传感器、DS18B20数字温度传感器、ArduinoUno和LabVIEW组成带有温度补偿的超声波测距系统,可用于机器人避障等场合的距离测量。


超声波测距的原理:从超声波****发出的超声波(假设传播介质为气体),经气体介质的传播,遇到障碍物之后反射的超声波被超声波接收器所接收。将超声波****与接收之间的时间与气体介质中的声速相乘,就是声波传输的距离,声波传输距离的一半便是所测距离。


拓展学习:LabVIEW控制Arduino采集多路DS18B20温度数值(进阶篇—3)



2


项目架构


超声波测距系统总体框图如下图所示:


图片


在整个系统中,Arduino Uno作为下位机,负责读写HC-SR04超声波传感器、读取DS18B20温度传感器以及上传数据,LabVIEW软件作为上位机,负责接收超声波时间、空气温度和计算超声波所测量的距离值并显示,上下位机利用USB-TTL接口实现通信。


3


硬件环境


本项目将HC-SR04超声波模块的VCC、GND、Trig、Echo分别连接到ACCrduinoUno控制板的+5V、GND、数字端口D2和D3上。然后,将DS18B20温度传感器VCC、GND、DQ分别连接至Arduino Uno控制板的3.3V、GND和数字端口D4上,且在DQ与3.3V之间连接一个1KΩ的上拉电阻。超声波测距系统硬件连接示意图如下图所示:


图片

4


Arduino功能设计


在基于Arduino与LabVIEW的上下位机超声波测距系统中,Arduino Uno控制板需要完成以下功能:接收和判断命令、采集和传输温度与超声波往返时间。Arduino Uno控制板通过串口接收上位机发来的命令,分析得到有效命令,读取DS18B20数字温度传感器,将气温数据上传给LabVIEW软件或控制超声波传感器****超声波,并测量出超声波往返的时间,将超声波往返的时间上传至LabVIEW软件。


Arduino Uno控制器负责读取LabVIEW上位机发来的距离测量和温度采集命令,并通过HC-SR04超声波传感器和DS18B20传感器获取超声波往返时间和温度数据,通过串口发送回上位机LabVIEW软件。Arduino Uno控制器的程序代码如下所示:



















































































#include <OneWire.h>#include <DallasTemperature.h>       ‍ ‍‍‍// Data wire is plugged into port 2 on the Arduino#define ONE_WIRE_BUS 2
 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire);byte comdata[3]={0};      //定义数组数据,存放串口命令数据
int LED = 13;                 //定义LED连接的管脚const int TrigPin = 2;const int EchoPin = 3;float distance;
void receive_data(void);      //接受串口数据void test_do_data(void);         //测试串口数据是否正确,并更新数据

void setup(){  Serial.begin(9600);        pinMode(LED, OUTPUT);  // Start up the library  sensors.begin(); } void loop(){  while (Serial.available() > 0)   //不断检测串口是否有数据   {        receive_data();            //接受串口数据        test_do_data();               //测试数据是否正确并更新数据   }}void distance_time(void){  digitalWrite(TrigPin, LOW);  delayMicroseconds(2);  digitalWrite(TrigPin, HIGH);//发送10μS的高电平触发信号  delayMicroseconds(10);  digitalWrite(TrigPin, LOW);  distance = pulseIn(EchoPin, HIGH); // 检测脉冲宽度,即为超声波往返时间}
void receive_data(void)       {   int i ;   for(i=0;i<3;i++)   {      comdata[i] =Serial.read();      //延时一会,让串口缓存准备好下一个字节,不延时可能会导致数据丢失,       delay(2);   }}
void test_do_data(void){  if(comdata[0] == 0x55)            //0x55和0xAA均为判断是否为有效命令   {     if(comdata[1] == 0xAA)     {          switch (comdata[2])          {            case 0x01:             sensors.requestTemperatures(); // Send the command to get temperatures            Serial.print(sensors.getTempCByIndex(0));              break;            case 0x02:              distance_time();            Serial.print(distance) ;              break ;          }      }   }}



5


LabVIEW功能设计


LabVIEW上位机部分需要完成以下功能:

1、向下位机Arduino控制器发送采集温度的命令,Arduino控制器通过串口接收上位机命令,完成温度的采集之后并将数据回传,LabVIEW软件将回传的温度数据显示在前面板上。

2、向下位机Arduino控制器发送测量距离的命令,Arduino控制器通过串口接收上位机命令,完成距离的测量之后并将超声波往返时回传,LabVIEW软件将回传的超声波往返时间、温度与音速公式:u=331.3+(0.606 x t)m/s (t为摄氏温度)计算得到所测量的距离,显示在前面板上。

3、当处于自动测温模式时,且LabVIEW软件超时1秒时,向下位机Arduino控制器发送采集温度的命令,并将回传的温度数据显示在前面板上,实时更新温度,以保证测距尽可能精确。


5.1、前面板设计


LabVIEW上位机前面板主要有当前温度值和测量距离的显示表盘,以及自动测量选框和手动测温的按钮,如下图所示:


图片


5.2、程序框图设计


LabVIEW程序首先通过选择的Arduino Uno控制器的串口号来初始化串口通信,然后进入内嵌事件结构的While循环中,当"温度测量"按钮被按下时,则向Arduino Uno控制器发送温度测量的命令码,等待1秒之后读取Arduino Uno控制器返回的温度数据并显示出来。


当“距离测量"按钮被按下时,则向Arduino Uno控制器发送距离测量的命令码,等待1秒之后读取Arduino Uno控制器返回的超声波往返时间,并通过温度与音速公式u=331.3+(0.606 x t) m/s (t为摄氏温度),计算得到所测量的距离数据显示出来。


当“温度测量"和“距离测量"按钮在1秒内都没被按下时,LabVIEW程序进入“超时”",且当自动测量选项被使能后,则向Arduino Uno控制器发送温度测量的命令码,等待1秒之后读取Arduino Uno控制器返回的温度数据并显示出来,以实时更新当前的温度。最后关闭串口通信。


LabVIEW上位机软件中的“温度测量”、“距离测量"和“超时"的程序框图如下所示:


图片


图片


图片


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

数字滤波器相关文章:数字滤波器原理


关键词: LabVIEW

相关推荐

技术专区

关闭