LabVIEW控制Arduino實(shí)現(xiàn)超聲波測(cè)距(進(jìn)階篇—5)
1
項(xiàng)目概述
超聲波測(cè)距是一種傳統(tǒng)而實(shí)用的非接觸測(cè)量方法,與激光、渦流和無(wú)線電測(cè)距方法相比,具有不受外界光及電磁場(chǎng)等因素影響的優(yōu)點(diǎn),在比較惡劣的環(huán)境中也具有一定的適應(yīng)能力,且結(jié)構(gòu)簡(jiǎn)單、成本低,因此在工業(yè)控制、建筑測(cè)量、機(jī)器人定位方面有廣泛的應(yīng)用。
本節(jié)將介紹使用HC-SR04超聲波傳感器、DS18B20數(shù)字溫度傳感器、ArduinoUno和LabVIEW組成帶有溫度補(bǔ)償?shù)某暡y(cè)距系統(tǒng),可用于機(jī)器人避障等場(chǎng)合的距離測(cè)量。
超聲波測(cè)距的原理:從超聲波****發(fā)出的超聲波(假設(shè)傳播介質(zhì)為氣體),經(jīng)氣體介質(zhì)的傳播,遇到障礙物之后反射的超聲波被超聲波接收器所接收。將超聲波****與接收之間的時(shí)間與氣體介質(zhì)中的聲速相乘,就是聲波傳輸?shù)木嚯x,聲波傳輸距離的一半便是所測(cè)距離。
拓展學(xué)習(xí):LabVIEW控制Arduino采集多路DS18B20溫度數(shù)值(進(jìn)階篇—3)
2
項(xiàng)目架構(gòu)
超聲波測(cè)距系統(tǒng)總體框圖如下圖所示:
在整個(gè)系統(tǒng)中,Arduino Uno作為下位機(jī),負(fù)責(zé)讀寫(xiě)HC-SR04超聲波傳感器、讀取DS18B20溫度傳感器以及上傳數(shù)據(jù),LabVIEW軟件作為上位機(jī),負(fù)責(zé)接收超聲波時(shí)間、空氣溫度和計(jì)算超聲波所測(cè)量的距離值并顯示,上下位機(jī)利用USB-TTL接口實(shí)現(xiàn)通信。
3
硬件環(huán)境
本項(xiàng)目將HC-SR04超聲波模塊的VCC、GND、Trig、Echo分別連接到ACCrduinoUno控制板的+5V、GND、數(shù)字端口D2和D3上。然后,將DS18B20溫度傳感器VCC、GND、DQ分別連接至Arduino Uno控制板的3.3V、GND和數(shù)字端口D4上,且在DQ與3.3V之間連接一個(gè)1KΩ的上拉電阻。超聲波測(cè)距系統(tǒng)硬件連接示意圖如下圖所示:
4
Arduino功能設(shè)計(jì)
在基于Arduino與LabVIEW的上下位機(jī)超聲波測(cè)距系統(tǒng)中,Arduino Uno控制板需要完成以下功能:接收和判斷命令、采集和傳輸溫度與超聲波往返時(shí)間。Arduino Uno控制板通過(guò)串口接收上位機(jī)發(fā)來(lái)的命令,分析得到有效命令,讀取DS18B20數(shù)字溫度傳感器,將氣溫?cái)?shù)據(jù)上傳給LabVIEW軟件或控制超聲波傳感器****超聲波,并測(cè)量出超聲波往返的時(shí)間,將超聲波往返的時(shí)間上傳至LabVIEW軟件。
Arduino Uno控制器負(fù)責(zé)讀取LabVIEW上位機(jī)發(fā)來(lái)的距離測(cè)量和溫度采集命令,并通過(guò)HC-SR04超聲波傳感器和DS18B20傳感器獲取超聲波往返時(shí)間和溫度數(shù)據(jù),通過(guò)串口發(fā)送回上位機(jī)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}; //定義數(shù)組數(shù)據(jù),存放串口命令數(shù)據(jù) int LED = 13; //定義LED連接的管腳const int TrigPin = 2;const int EchoPin = 3;float distance; void receive_data(void); //接受串口數(shù)據(jù)void test_do_data(void); //測(cè)試串口數(shù)據(jù)是否正確,并更新數(shù)據(jù) void setup(){ Serial.begin(9600); pinMode(LED, OUTPUT); // Start up the library sensors.begin(); } void loop(){ while (Serial.available() > 0) //不斷檢測(cè)串口是否有數(shù)據(jù) { receive_data(); //接受串口數(shù)據(jù) test_do_data(); //測(cè)試數(shù)據(jù)是否正確并更新數(shù)據(jù) }}void distance_time(void){ digitalWrite(TrigPin, LOW); delayMicroseconds(2); digitalWrite(TrigPin, HIGH);//發(fā)送10μS的高電平觸發(fā)信號(hào) delayMicroseconds(10); digitalWrite(TrigPin, LOW); distance = pulseIn(EchoPin, HIGH); // 檢測(cè)脈沖寬度,即為超聲波往返時(shí)間} void receive_data(void) { int i ; for(i=0;i<3;i++) { comdata[i] =Serial.read(); //延時(shí)一會(huì),讓串口緩存準(zhǔn)備好下一個(gè)字節(jié),不延時(shí)可能會(huì)導(dǎo)致數(shù)據(jù)丟失, 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功能設(shè)計(jì)
LabVIEW上位機(jī)部分需要完成以下功能:
1、向下位機(jī)Arduino控制器發(fā)送采集溫度的命令,Arduino控制器通過(guò)串口接收上位機(jī)命令,完成溫度的采集之后并將數(shù)據(jù)回傳,LabVIEW軟件將回傳的溫度數(shù)據(jù)顯示在前面板上。
2、向下位機(jī)Arduino控制器發(fā)送測(cè)量距離的命令,Arduino控制器通過(guò)串口接收上位機(jī)命令,完成距離的測(cè)量之后并將超聲波往返時(shí)回傳,LabVIEW軟件將回傳的超聲波往返時(shí)間、溫度與音速公式:u=331.3+(0.606 x t)m/s (t為攝氏溫度)計(jì)算得到所測(cè)量的距離,顯示在前面板上。
3、當(dāng)處于自動(dòng)測(cè)溫模式時(shí),且LabVIEW軟件超時(shí)1秒時(shí),向下位機(jī)Arduino控制器發(fā)送采集溫度的命令,并將回傳的溫度數(shù)據(jù)顯示在前面板上,實(shí)時(shí)更新溫度,以保證測(cè)距盡可能精確。
5.1、前面板設(shè)計(jì)
LabVIEW上位機(jī)前面板主要有當(dāng)前溫度值和測(cè)量距離的顯示表盤(pán),以及自動(dòng)測(cè)量選框和手動(dòng)測(cè)溫的按鈕,如下圖所示:
5.2、程序框圖設(shè)計(jì)
LabVIEW程序首先通過(guò)選擇的Arduino Uno控制器的串口號(hào)來(lái)初始化串口通信,然后進(jìn)入內(nèi)嵌事件結(jié)構(gòu)的While循環(huán)中,當(dāng)"溫度測(cè)量"按鈕被按下時(shí),則向Arduino Uno控制器發(fā)送溫度測(cè)量的命令碼,等待1秒之后讀取Arduino Uno控制器返回的溫度數(shù)據(jù)并顯示出來(lái)。
當(dāng)“距離測(cè)量"按鈕被按下時(shí),則向Arduino Uno控制器發(fā)送距離測(cè)量的命令碼,等待1秒之后讀取Arduino Uno控制器返回的超聲波往返時(shí)間,并通過(guò)溫度與音速公式u=331.3+(0.606 x t) m/s (t為攝氏溫度),計(jì)算得到所測(cè)量的距離數(shù)據(jù)顯示出來(lái)。
當(dāng)“溫度測(cè)量"和“距離測(cè)量"按鈕在1秒內(nèi)都沒(méi)被按下時(shí),LabVIEW程序進(jìn)入“超時(shí)”",且當(dāng)自動(dòng)測(cè)量選項(xiàng)被使能后,則向Arduino Uno控制器發(fā)送溫度測(cè)量的命令碼,等待1秒之后讀取Arduino Uno控制器返回的溫度數(shù)據(jù)并顯示出來(lái),以實(shí)時(shí)更新當(dāng)前的溫度。最后關(guān)閉串口通信。
LabVIEW上位機(jī)軟件中的“溫度測(cè)量”、“距離測(cè)量"和“超時(shí)"的程序框圖如下所示:
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。
數(shù)字濾波器相關(guān)文章:數(shù)字濾波器原理