博客專欄

EEPW首頁 > 博客 > LabVIEW控制Arduino實現(xiàn)紅外測距(進階篇—6)

LabVIEW控制Arduino實現(xiàn)紅外測距(進階篇—6)

發(fā)布人:美男子玩編程 時間:2022-07-18 來源:工程師 發(fā)布文章

1


項目概述


紅外測距是一種非直接接觸的測量方式,由于其結構簡單、抗干擾性強、成本低等優(yōu)點,在測量測繪上得到廣泛的運用。


紅外線在通過云霧等充滿懸浮離子的物質(zhì)時不易發(fā)生散射,有較強的穿透能力,還具有抗干擾能力強、易于產(chǎn)生、對環(huán)境影響小、不會干擾臨近的無線電設備的特點,同時,紅外光具有反射、折射、散射、干涉、吸收等特性,因而被廣泛應用。

本篇博文將介紹使用夏普公司的GP2D12紅外傳感器、Arduino Uno和LabVIEW組成紅外測距系統(tǒng),可用于機器人避障等場合的距離測量。


圖片



2


項目架構


紅外測距系統(tǒng)框圖如下圖所示:


圖片


在整個系統(tǒng)中,Arduino Uno作為下位機,負責讀取GP2D12紅外傳感器的輸出值以及上傳數(shù)據(jù),LabVIEW軟件作為上位機,負責將測量的電壓轉(zhuǎn)換為距離值并顯示出來,上下位機利用USB-TTL接口實現(xiàn)通信。



3


硬件環(huán)境


將GP2D12紅外傳感器的VCC、GND、Vo分別接至Arduino Uno控制板上的+5V、GND、模擬端口A0。最好在VCC與GND之間并聯(lián)100uF的電解電容,以穩(wěn)定GP2D12的供電電壓,從而使輸出電壓更加穩(wěn)定。紅外測距系統(tǒng)硬件連接如下圖所示:


圖片



4


Arduino功能設計


在基于Arduino與LabVIEW的上下位機紅外測距系統(tǒng)中,Arduino Uno控制板需要完成以下功能:接收和判斷命令、采集和傳輸GP2D12傳感器輸出的電壓。ArduinoUno控制板通過串口接收上位機發(fā)來的命令,分析得到有效命令,多次采集GP2D12傳感器的電壓輸出值,并將GP2D12電壓輸出的平均值上傳至LabVIEW軟件。


Arduino Uno控制器負責讀取LabVIEW上位機發(fā)來的距離測量命令,并通過GP2D12紅外傳感器獲取距離數(shù)據(jù),通過串口發(fā)送回上位機LabVIEW軟件。Arduino Uno控制器的程序代碼如下所示:






















































#define Infrared_COMMAND  0x10   //采集命令字
byte comdata[3]={0};      //定義數(shù)組數(shù)據(jù),存放串口接收數(shù)據(jù) void receive_data(void);      //接受串口數(shù)據(jù)void test_do_data(void);         //測試串口數(shù)據(jù)是否正確,并更新數(shù)據(jù)
float SensorSum = 0; int SensorPin = A0;    // select the input pin for the potentiometer
void setup(){  Serial.begin(9600);      
}void loop(){  while (Serial.available() > 0)   //不斷檢測串口是否有數(shù)據(jù)   {        receive_data();            //接受串口數(shù)據(jù)        test_do_data();               //測試數(shù)據(jù)是否正確并更新標志位   }}void receive_data(void)       {   int i ;   for(i=0;i<3;i++)   {      comdata[i] =Serial.read();      //延時一會,讓串口緩存準備好下一個字節(jié),不延時可能會導致數(shù)據(jù)丟失,       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ā)送紅外數(shù)據(jù)采集命令,Arduino控制器通過串口接收上位機命令,完成紅外數(shù)據(jù)采集之后并將采集的紅外數(shù)據(jù)回傳,LabVIEW軟件將回傳的紅外數(shù)據(jù)轉(zhuǎn)換為距離值并顯示在前面板上。

2、通過紅外傳感器的電壓與距離特性關系,擬合出電壓與測量距離的擬合曲線,用于將電壓更好地轉(zhuǎn)換為測量距離值,而且由于LabVIEW的運算能力遠遠強于Arduino控制器的計算能力,將電壓與距離的換算放在LabVIEW軟件可以提高測量精度,并可以擴展其他的紅外測距傳感器,只需要其電壓與距離的數(shù)值關系。


5.1、前面板設計


LabVIEW上位機前面板分為擬合和測量兩個部分,擬合部分提供8個電壓-距離的擬合點,以通過廣義多項式擬合出最佳的曲線方程,提高系統(tǒng)的測量精度;測量部分提供多次測量顯示,并通過多次測量計算平均值,以盡可能準確地獲取距離數(shù)據(jù)。紅外測距系統(tǒng)的LabVIEW上位機前面板,如下圖所示:


圖片


5.2、程序框圖設計


為了LabVIEW上位機程序結構更加清晰明了,更方便地進行程序設計,此處將LabVIEW與Arduino串口通信的LabVIEW上位機部分設計成測量子程序,在主程序中進行調(diào)用,其主要是向Arduino Uno控制器發(fā)送命令碼,并獲取Arduino Uno控制器返回的測量數(shù)據(jù),實現(xiàn)測量功能。


測量子程序的前面板和程序框圖,如下圖所示:


圖片圖片


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


圖片


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


圖片


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


圖片


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


圖片


由于本節(jié)所采用的是普通紅外測距傳感器,通過廣義多項式擬合方式可以較為精確地擬合出電壓與距離之間的關系,使得測量精度有所提高。


*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權請聯(lián)系工作人員刪除。

藍牙技術相關文章:藍牙技術原理
熱電偶相關文章:熱電偶原理


關鍵詞: LabVIEW

相關推薦

技術專區(qū)

關閉