【編者按】本文的作者是宜昌城老張,轉載于他的個人博客。在這篇文章里面,他向我們介紹如何通過LabVIEW和Arduino、超聲波傳感器等設備來制作一款可以智能躲避障礙的小車。 實驗使用上位機軟件LabVIEW對以Arduino作為下位機的MakeBlock智能小車進行實時監(jiān)控。采用URM37V3.2超聲波測距傳感器實時測量小車在行駛的過程中與前方障礙物的距離,Arduino將檢測到的測距信息轉換為實際的距離值。在Arduino中實現(xiàn)避障算法,當MakeBlock小車與障礙物的距離小于設定值時,小車實施避障方案,從而躲避障礙物。同時,Arduino將檢測到的距離信息發(fā)送給上位機LabVIEW。 這次實驗的避障算法是在下位機Arduino中完成,而不是在遠端的PC機完成避障算法。上位機的LabVIEW界面只是對小車的運行狀態(tài)進行實時監(jiān)視。如果想了解如何用遠端的上位PC機來實現(xiàn)對智能車的無線避障遙控,可參見文章《基于LabVIEW測控的MakeBlock智能車避障控制》。 MakeBlock金屬智能車避障視頻: 在本文的實驗中,XBee模塊與Arduino之間通過串行接口(即Tx和Rx引腳)進行通信。本文使用點對點無線傳輸方式,通過串行接口向XBee模塊寫入命令數(shù)據(jù),實現(xiàn)數(shù)據(jù)的發(fā)送;當XBee模塊接收到數(shù)據(jù)時,通過讀串行接口獲得這些數(shù)據(jù),實現(xiàn)數(shù)據(jù)的讀取。對于Xbee模塊的使用方法,可詳見博客文章《美國DIGI公司的XBee模塊無線通訊實驗》。 一、 硬件設計 實驗采用URM37V3.2超聲波傳感器作為外界環(huán)境信息的采集工具。下面,簡要介紹一下與本次實驗有關的URM37V3.2超聲波傳感器的一些知識。 URM37V3.2超聲波傳感器是一種多功能的智能傳感器,它可以測量4~500 cm的距離,并且有1cm的分辨率。能夠測量較遠的距離并且性能穩(wěn)定??赏ㄟ^脈寬輸出的方式來測量數(shù)據(jù),也可以使用R232串口通訊,有較好的可靠性。下面兩個圖分別是URM37V3.2超聲波傳感器的引腳定義、URM37V3.2超聲波傳感器與Arduino的連線圖。 作為一種智能傳感器,該傳感器可以將信號采集、數(shù)字處理和信息傳送融為一體。用戶只需要使用單片機的TTL電平串口,向傳感器發(fā)出四個字節(jié)的信息讀取命令:0x22, 0x00, 0x00, 0x22。傳感器接收命令后,會向單片機回送四個字節(jié)的測距信息:0x22, highbyte, lowbyte, sum。這四個字節(jié)里有兩個字節(jié)就是16位被測距離信息。如果高位字節(jié)和低位字節(jié)都是 0xFF,這意味著測量無效,超出測量范圍。反之,被測距離就等于高位字節(jié)乘以256再加上低位字節(jié),實際距離的單位是厘米。 二、下位機程序設計 為了獲得距離信息,Arduino需要向URM37 V3.2測距傳感器發(fā)送四個字節(jié)的測距指令,等待超聲波測距傳感器完成測距任務后,再接受它返回的四個字節(jié)的距離信息。并按上文的方法轉換為實際的距離值。如果實測距離大于40cm,小車繼續(xù)前進;反之,小車實施避障策略,及時左轉,從而躲避障礙物。同時,Arduino控制器將距離信息通過無線傳輸模塊Xbee發(fā)送給遠程監(jiān)控的上位機LabVIEW處理。這里發(fā)送給上位機處理的有關距離信息的數(shù)據(jù)前面帶上了標識字符“10”,用于上位機判斷哪個字節(jié)是有效字符串信息的第一個字節(jié)。發(fā)送給上位機的數(shù)據(jù)(字符串)格式是:10+距離數(shù)據(jù)高8位+距離數(shù)據(jù)低8位。下位機Arduino程序的流程圖如圖所示。 Arduino程序:
三、上位機LabVIEW程序設計 編寫LabVIEW程序,通過串口讀取下位機發(fā)送的距離信息,將提取的信息實時顯示在LabVIEW的前面板上,就可以實時觀察小車的運行狀態(tài)。LabVIEW只需要根據(jù)上文Arduino發(fā)送是信息數(shù)據(jù)格式提取相關的字符串信息即可。下面是LabVIEW程序的程序框圖。(點擊圖片可以看到大圖) LabVIEW程序先讀取一個標識字符,如果讀取的是標識字符“10”,程序會繼續(xù)讀取2個字節(jié)的字符串。通過“字符串值字節(jié)數(shù)組函數(shù)”將其轉換為一維數(shù)組后,通過“索引數(shù)組”得到距離數(shù)據(jù)高8位和距離數(shù)據(jù)低8位。LabVIEW將字節(jié)數(shù)據(jù)轉換為十進制的實際距離值。16位的二進制距離信息到十進制實際距離的轉換公式是:實際距離=256*距離數(shù)據(jù)高8位+距離數(shù)據(jù)低8位。 下圖是LabVIEW程序的前面板。在前面板上,可以實時觀察到小車運行時是否遇到障礙物。由于超聲波測距傳感器相對實驗的場地來說,有較大的測距范圍。因此,在這里顯示了小車運行時與前方障礙物的實測距離,并通過一定的微分取導算法,得出了小車運行時的近似速度值,以供參考。 LabVIEW和Arduino程序源文件請下載:http:///QGn6HWbKMUSjp。 四、系統(tǒng)調試 在LabVIEW的前面板選擇COM4(在實驗中,XBee模塊添加到計算機后,所獲得的串口號COM4),并設置波特率為9600bps。接通智能小車電機及控制器供電電源。運行上位機LabVIEW程序,通過前面板來觀察小車的運行狀態(tài),與小車實際避障情況比較。實驗結果表明,LabVIEW前面板讀到的信息與小車實際運行狀況相符,并且裝備超聲波測距傳感器的智能小車可以很好地躲避前方障礙物。 五、總結 本文采用超聲波測距傳感器檢測小車與前方障礙物的實際距離,通過與預先設定的小車轉向時機的值進行比較,在遇到障礙物時左轉一定的角度,實現(xiàn)避障。實驗中Arduino采集數(shù)據(jù),實現(xiàn)避障算法,LabVIEW作為上位機監(jiān)視小車的運行狀態(tài)。 相關文章: 全球創(chuàng)客馬拉松上海站:15個項目展示創(chuàng)客的“一本正經(jīng)”和“不務正業(yè)” |
|