您当前的位置: 首页 >  ar

不脱发的程序猿

暂无认证

  • 1浏览

    0关注

    492博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

不脱发的程序猿 发布时间:2022-06-06 23:58:57 ,浏览量:1

目录

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 
#include 

   
        
// 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            
关注
打赏
1664101891
查看更多评论
0.0411s