LabVIEW控制Arduino實(shí)現紅外測距(進(jìn)階篇—6)
1
項目概述
紅外測距是一種非直接接觸的測量方式,由于其結構簡(jiǎn)單、抗干擾性強、成本低等優(yōu)點(diǎn),在測量測繪上得到廣泛的運用。
紅外線(xiàn)在通過(guò)云霧等充滿(mǎn)懸浮離子的物質(zhì)時(shí)不易發(fā)生散射,有較強的穿透能力,還具有抗干擾能力強、易于產(chǎn)生、對環(huán)境影響小、不會(huì )干擾臨近的無(wú)線(xiàn)電設備的特點(diǎn),同時(shí),紅外光具有反射、折射、散射、干涉、吸收等特性,因而被廣泛應用。
本篇博文將介紹使用夏普公司的GP2D12紅外傳感器、Arduino Uno和LabVIEW組成紅外測距系統,可用于機器人避障等場(chǎng)合的距離測量。
2
項目架構
紅外測距系統框圖如下圖所示:
在整個(gè)系統中,Arduino Uno作為下位機,負責讀取GP2D12紅外傳感器的輸出值以及上傳數據,LabVIEW軟件作為上位機,負責將測量的電壓轉換為距離值并顯示出來(lái),上下位機利用USB-TTL接口實(shí)現通信。
3
硬件環(huán)境
將GP2D12紅外傳感器的VCC、GND、Vo分別接至Arduino Uno控制板上的+5V、GND、模擬端口A(yíng)0。最好在VCC與GND之間并聯(lián)100uF的電解電容,以穩定GP2D12的供電電壓,從而使輸出電壓更加穩定。紅外測距系統硬件連接如下圖所示:

4
Arduino功能設計
在基于A(yíng)rduino與LabVIEW的上下位機紅外測距系統中,Arduino Uno控制板需要完成以下功能:接收和判斷命令、采集和傳輸GP2D12傳感器輸出的電壓。ArduinoUno控制板通過(guò)串口接收上位機發(fā)來(lái)的命令,分析得到有效命令,多次采集GP2D12傳感器的電壓輸出值,并將GP2D12電壓輸出的平均值上傳至LabVIEW軟件。
Arduino Uno控制器負責讀取LabVIEW上位機發(fā)來(lái)的距離測量命令,并通過(guò)GP2D12紅外傳感器獲取距離數據,通過(guò)串口發(fā)送回上位機LabVIEW軟件。Arduino Uno控制器的程序代碼如下所示:
#define Infrared_COMMAND 0x10 //采集命令字 byte comdata[3]={0}; //定義數組數據,存放串口接收數據 void receive_data(void); //接受串口數據void test_do_data(void); //測試串口數據是否正確,并更新數據 float SensorSum = 0; int SensorPin = A0; // select the input pin for the potentiometer void setup(){ Serial.begin(9600); }void loop(){ while (Serial.available() > 0) //不斷檢測串口是否有數據 { receive_data(); //接受串口數據 test_do_data(); //測試數據是否正確并更新標志位 }}void receive_data(void) { int i ; for(i=0;i<3;i++) { comdata[i] =Serial.read(); //延時(shí)一會(huì ),讓串口緩存準備好下一個(gè)字節,不延時(shí)可能會(huì )導致數據丟失, delay(2); }} void test_do_data(void){ if(comdata[0] == 0x55) //0x55和0xAA均為判斷是否為有效命令 { if(comdata[1] == 0xAA) { if(comdata[2] == Infrared_COMMAND) { for (int i = 0; i < 10; i++){ SensorSum += analogRead(SensorPin); delay(5); } Serial.println(SensorSum*5.00/1023/10,2); SensorSum=0; } } }}
5
LabVIEW功能設計
LabVIEW上位機部分需要完成以下功能:
1、向下位機Arduino控制器發(fā)送紅外數據采集命令,Arduino控制器通過(guò)串口接收上位機命令,完成紅外數據采集之后并將采集的紅外數據回傳,LabVIEW軟件將回傳的紅外數據轉換為距離值并顯示在前面板上。
2、通過(guò)紅外傳感器的電壓與距離特性關(guān)系,擬合出電壓與測量距離的擬合曲線(xiàn),用于將電壓更好地轉換為測量距離值,而且由于LabVIEW的運算能力遠遠強于A(yíng)rduino控制器的計算能力,將電壓與距離的換算放在LabVIEW軟件可以提高測量精度,并可以擴展其他的紅外測距傳感器,只需要其電壓與距離的數值關(guān)系。
5.1、前面板設計
LabVIEW上位機前面板分為擬合和測量?jì)蓚€(gè)部分,擬合部分提供8個(gè)電壓-距離的擬合點(diǎn),以通過(guò)廣義多項式擬合出最佳的曲線(xiàn)方程,提高系統的測量精度;測量部分提供多次測量顯示,并通過(guò)多次測量計算平均值,以盡可能準確地獲取距離數據。紅外測距系統的LabVIEW上位機前面板,如下圖所示:

5.2、程序框圖設計
為了LabVIEW上位機程序結構更加清晰明了,更方便地進(jìn)行程序設計,此處將LabVIEW與Arduino串口通信的LabVIEW上位機部分設計成測量子程序,在主程序中進(jìn)行調用,其主要是向Arduino Uno控制器發(fā)送命令碼,并獲取Arduino Uno控制器返回的測量數據,實(shí)現測量功能。
測量子程序的前面板和程序框圖,如下圖所示:


LabVIEW上位機主程序的結構為順序結構+While循環(huán)+事件結構。首先,在順序結構中的第一幀中,對所使用的數組、中間變量和顯示控件進(jìn)行初始化,在順序結構的第2幀中,通過(guò)設置的串口號來(lái)初始化串口通信。然后,程序進(jìn)入While循環(huán)和事件結構,不斷地檢測是否有事件得到響應并執行,事件結構有“測距_測量”、“測距_計算平均值”、和"曲線(xiàn)擬合”。最后,關(guān)閉串口通信。初始化程序框圖如下圖所示:

在“測距_測量"事件結構中,通過(guò)“測量子程序"讀取Arduino Uno控制器返回的數據,并利用公式節點(diǎn)和5階擬合系數計算得到所測量的距離,同時(shí)利用計數器將距離數據循環(huán)顯示在測量數據中?!皽y距_測量"值改變事件程序框圖(部分)如下圖所示:

在"測距_計算平均值"事件結構中,通過(guò)對測量數據數組的5個(gè)元素相加并除以5,得到所測量距離的均值,這種通過(guò)多次測量的方法可以提高測距精度,滿(mǎn)足較高精度的測距需求?!皽y距_計算平均值”值改變事件程序框圖(部分)如下圖所示:

在“曲線(xiàn)擬合"事件結構中,通過(guò)將距離數組和電壓數組利用5階廣義多項式擬合方式,計算出擬合系數并顯示在標定系數上。"曲線(xiàn)擬合”值改變事件程序框圖如下圖所示:

由于本節所采用的是普通紅外測距傳感器,通過(guò)廣義多項式擬合方式可以較為精確地擬合出電壓與距離之間的關(guān)系,使得測量精度有所提高。
*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。
藍牙技術(shù)相關(guān)文章:藍牙技術(shù)原理 熱電偶相關(guān)文章:熱電偶原理