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