LabVIEW控制Arduino实现超声波测距(进阶篇—5)
目录
1、项目概述
2、项目架构
3、硬件环境
4、Arduino功能设计
5、LabVIEW功能设计
5.1、前面板设计
5.2、程序框图设计
1、项目概述
超声波测距是一种传统而实用的非接触测量方法,与激光、涡流和无线电测距方法相比,具有不受外界光及电磁场等因素影响的优点,在比较恶劣的环境中也具有一定的适应能力,且结构简单、成本低,因此在工业控制、建筑测量、机器人定位方面有广泛的应用。
本节将介绍使用HC-SR04超声波传感器、DS18B20数字温度传感器、Arduino Uno和LabVIEW组成带有温度补偿的超声波测距系统,可用于机器人避障等场合的距离测量。
超声波测距的原理:从超声波发射器发出的超声波(假设传播介质为气体),经气体介质的传播,遇到障碍物之后反射的超声波被超声波接收器所接收。将超声波发射与接收之间的时间与气体介质中的声速相乘,就是声波传输的距离,声波传输距离的一半便是所测距离。
拓展学习:LabVIEW控制Arduino采集多路DS18B20温度数值(进阶篇—3)
2、项目架构
超声波测距系统总体框图如下图所示:
在整个系统中,Arduino Uno作为下位机,负责读写HC-SR04超声波传感器、读取DS18B20温度传感器以及上传数据,LabVIEW软件作为上位机,负责接收超声波时间、空气温度和计算超声波所测量的距离值并显示,上下位机利用USB-TTL接口实现通信。
项目详情请参见:LabVIEW控制Arduino实现超声波测距-单片机文档类资源
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 librarysensors.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 temperaturesSerial.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控制Arduino实现超声波测距-单片机文档类资源
LabVIEW控制Arduino实现超声波测距(进阶篇—5)相关推荐
- LabVIEW控制Arduino实现示波器(基础篇—7)
目录 1.实验目的 2.实验环境 3.程序设计 4.实验演示 1.实验目的 利用LIAT中的模拟采样函数库,通过Arduino Uno控制板上的模拟输入端口采集模拟信号,并上传至LabVIEW界面上显 ...
- LabVIEW控制Arduino流水灯(基础篇—3)
目录 1.实验目的 2.实验环境 3.程序设计 4.实验演示 1.实验目的 利用LIAT中的数字I/O函数库,通过LabVIEW控制Arduino Uno控制板上多个管脚上LED灯,实现依次点亮,依次 ...
- LabVIEW控制Arduino采集DHT11温湿度数值(进阶篇—4)
目录 1.项目概述 2.项目架构 3.硬件环境 4.Arduino功能设计 5.LabVIEW功能设计 5.1.前面板设计 5.2.程序框图设计 1.项目概述 在多数情况下,测量温度的同时需要测量湿度 ...
- LabVIEW控制Arduino采集多路DS18B20温度数值(进阶篇—3)
目录 1.项目概述 2.项目架构 3.硬件环境 4.Arduino功能设计 5.LabVIEW功能设计 5.1.前面板设计 5.2.程序框图设计 1.项目概述 DS18B20是美国DALLAS半导体公 ...
- LabVIEW控制Arduino实现舵机联控(基础篇—9)
目录 1.控制单个舵机 1.1.实验目的 1.2.实验环境 1.3.程序设计 1.4.实验演示 2.控制多个舵机 2.1.实验目的 2.2.实验环境 2.3.程序设计 2.4.实验演示 本篇博文将通过 ...
- LabVIEW控制Arduino实现RGB调色灯(基础篇—6)
目录 1.实验目的 2.实验环境 3.程序设计 4.实验演示 1.实验目的 利用LIAT中的RGB函数库,通过LabVIEW控制Arduino Uno控制板实现RGB调色. 2.实验环境 将共阳RGB ...
- LabVIEW控制Arduino采集光敏电阻数值(基础篇—14)
目录 1.实验目的 2.实验环境 3.程序设计 4.实验演示 1.实验目的 利用光敏电阻和LIAT中的光敏函数库,通过Arduino Uno控制板的模拟端口采集与光敏电阻串联电阻的分压值上传给LabV ...
- LabVIEW控制Arduino驱动数码管(基础篇—11)
目录 1.实验目的 2.实验环境 3.程序设计 4.实验演示 1.实验目的 利用LIAT中的数码管显示函数库,通过LabVIEW软件控制Arduino Uno控制板,将特定的数据显示在单个数码管上,实 ...
- LabVIEW控制Arduino采集电位器电压(基础篇—4)
目录 1.实验目的 2.实验环境 3.程序设计 4.实验演示 1.实验目的 利用LIAT函数库中模拟IO的功能,通过Arduino Uno控制板上模拟输入端口实现对电压的测量,并显示在LabVIEW前 ...
最新文章
- 【SLAM】卡尔曼滤波:究竟滤了谁?
- [NOI2015]品酒大会
- MavenMybatis可能会遇到的问题
- 项目: 打字母游戏【c++/c】
- Java中类、方法声明为静态的含义
- tp论坛 分页(三)
- wireshark-win64-3.4.0安装_万达讲堂轴承安装后易损坏的原因,点进来,告诉你!
- HDU3400(计算几何中的三分法利用)
- 让人迷糊的 socket udp 连接问题
- 设计模式6大原则简述
- LeetCode 1072. 按列翻转得到最大值等行数(查找相同的模式,哈希计数)
- @Autowired注解能用在static属性吗?autowired注入static属性上为null
- 统计学习方法笔记(李航)———第三章(k近邻法)
- java 蓝桥杯算法训练 特殊的数字四十
- 关于Microsoft Enterprise Library的介绍
- Halcon教程十三:图像预处理
- 中国各省份中英文,Json格式
- Android Notification使用
- python-分分钟入门—idea配置开发环境
- linux python3安装包_在 Linux 中安装 Python3
热门文章
- Java Agent 探针技术
- python怎么输出数组全部数据_Python打印输出数组中全部元素
- CSAPP缓冲区溢出攻击实验(上)
- Android中opensl架构,Android OpenSL ES详解
- uniapp 生命周期(onLoad跟onLoadonShow的区别)
- JavaScript 的三种书写位置,注释形式,变量的使用叙述
- 微信小游戏、three.js、真机调试,出现锯齿的解决办法
- python列表添加字典,在python中添加数据到字典
- flink的timeWindowAll流无法输出数据
- 如何实现弹性伸缩:实践指南及最佳实践