博客專欄

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

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

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

        1


        項目概述


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


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

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


        圖片



        2


        項目架構


        紅外測距系統框圖如下圖所示:


        圖片


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



        3


        硬件環境


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


        圖片



        4


        Arduino功能設計


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


        Arduino Uno控制器負責讀取LabVIEW上位機發來的距離測量命令,并通過GP2D12紅外傳感器獲取距離數據,通過串口發送回上位機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();      //延時一會,讓串口緩存準備好下一個字節,不延時可能會導致數據丟失,       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控制器發送紅外數據采集命令,Arduino控制器通過串口接收上位機命令,完成紅外數據采集之后并將采集的紅外數據回傳,LabVIEW軟件將回傳的紅外數據轉換為距離值并顯示在前面板上。

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


        5.1、前面板設計


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


        圖片


        5.2、程序框圖設計


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


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


        圖片圖片


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


        圖片


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


        圖片


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


        圖片


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


        圖片


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


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。

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


        關鍵詞: LabVIEW

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 晋宁县| 谢通门县| 吉安市| 遵义县| 延安市| 宿迁市| 斗六市| 乡宁县| 响水县| 上高县| 莎车县| 温宿县| 合水县| 宁强县| 静海县| 柯坪县| 绥德县| 玉林市| 治县。| 平昌县| 邵武市| 迁西县| 大理市| 赣州市| 综艺| 迭部县| 宁海县| 云龙县| 林甸县| 炉霍县| 浦城县| 筠连县| 平谷区| 肇东市| 常宁市| 永顺县| 华蓥市| 天峨县| 平昌县| 南川市| 五指山市|