唐學文,郭曉梅
(湖南科技學院 信息工程學院,湖南 永州 425199)
隨著當今世界的飛速發展,人們對汽車的需求不再局限于代步,更期望汽車有自動駕駛、無人駕駛的功能,這就催生了新型汽車——智能汽車的發展,同時也催生了簡易版的智能小車的發展。現在智能化的技術發展得很快,在國際和國內都有關于智能小車的競賽,或是比速度,或是比功能[1];智能汽車,也是輪式智能機器人,隨著機器人的高速發展,智能小車也不再局限于在路上跑,更有很多關于智能電動機器人的創新發展,比如在醫院探查病房和送藥等[2]。對于一個國家而言,機器人發展的水平反映的是一個國家綜合技術能力的高低,也是國家科技能力的反映[3]。機器人的發展在國際和國內都受到了舉足輕重的關注[4]。
本文設計的簡易智能小車要求擁有一臺4個輪子的車,并且帶有電機。需要購買一個電機驅動模塊(L298N TB6612),用于調速轉向。另外,需要一個最小的51系統板,擁有一個小舵機和一個超聲波模塊的避障功能。智能小車通過紅外模塊實現循跡功能;通過PS2實現高級無線控制;通過機械臂即pca9685模塊來實現抓取功能;通過ds18b20濕度傳感器實現測溫、測濕度功能;通過ds1302實現定時停車功能。設計的智能小車框架如圖1所示。
圖1 總體框架
2.2.1 避障思路及傳感器的選擇
利用4路紅外循跡避障傳感器模塊實現避障,其中一路傳感器檢測左邊的障礙物,一路傳感器檢測右邊的障礙物,兩路傳感器檢測前方的障礙物。這種方法實現起來是最簡單的,障礙物檢測距離一般在20 cm左右,在車速不太快,而且在室內(也就是無陽光直射)時是可行的,也可以很好地實現避障。缺點是在室外(或者陽光直射時)傳感器受陽光干擾可能不能正常工作,檢測距離20 cm左右,車速過快時,在檢測到障礙物時,不能直接轉彎,需要往回倒一下,再轉彎。
2.2.2 利用4個漫反射光電傳感器模塊實現避障
可以讓一個傳感器檢測左邊的障礙物,一個傳感器檢測右邊的障礙物,兩路傳感器檢測前方的障礙物,就像上面的4路紅外循跡避障傳感器的擺放方向一樣。這種方法的避障思路跟利用4路紅外循跡避障傳感器模塊實現避障是相同的,只是換了傳感器類型而已,但是漫反射光電傳感器抗陽光干擾能力強,克服了4路紅外循跡避障傳感器模塊在室外(或者陽光直射時)傳感器受陽光干擾可能不能正常工作的缺點。缺點是檢測距離也在20 cm左右,依然沒能克服在車速過快并檢測到障礙物時,不能直接轉彎的不足,而且漫反射光電傳感器模塊體積、重量、價格較高。
2.2.3 利用超聲波模塊和舵機云臺實現避障
避障思路是正常情況下超聲波模塊檢測前方障礙物,當檢測到障礙物時,小車停止前行,舵機云臺轉動,讓超聲波模塊分別轉向小車的左右兩側,檢測左右兩側是否有障礙物,來決定下一步的轉向,超聲波模塊重新朝前,開始轉向。
這種方法利用超聲波模塊測距遠,一般常見的超聲波模塊測距最遠在4.5 m左右,完全不用擔心車速過快來不及反應的情況,而且基本不受陽光干擾(當環境溫度升高時,聲音的傳播速度會加快,對測距產生一定的誤差,但是誤差很小,對于超聲波模實現避障而言完全可以忽略)。缺點是這種避障思路不能連續運動,當遇到障礙物時,小車就會停下來判斷下一步該往哪個方向轉彎,除此之外,超聲波模塊用起來比前兩種難一些。
2.2.4 利用超聲波模塊和兩個漫反射光電傳感器實現避障
避障思路是利用超聲波模塊檢測前面的障礙物,兩個漫反射光電傳感器分別檢測左右兩側的障礙物。這種思路結合了這兩種傳感器的優點,互補了它們的不足,即同時克服陽光直射時傳感器不能正常工作、車速過快時不能直接轉彎、遇到障礙物需要停車判斷等缺點。這3種不足是一種比較理想的方案,唯一的缺點是超聲波模塊本身用起來難度要大一些。
2.3.1 概述
本文需要用到兩個定時器,而STC89C52單片機只有兩個定時器,設計時已把定時器0中斷用來控制電機的PWM輸出,所以可以把超聲波測距的啟動信號也合并到定時器0里面,讓定時器1來檢測超聲波模塊有無信號返回。
2.3.2 I/O口觸發測距的實現程序編寫
超聲波模塊工作的第一步是讓塊Trig 管腳所接的單片機I/O口置為高電平,而且需要持續10 μs以上。本文采用的是讓單片機P14 I/O口接在超聲波模塊的Trig 管腳上,讓單片機P15 I/O口接在超聲波模塊的Echo管腳上。這里可根據實際情況自己選擇,只要跟程序對應起來即可。此處有一點需要注意,為了避免下一次超聲波模塊發出的信號對上一次的返回信號產生影響,超聲波模塊發出信號的時間間隔要在60 ms以上。本文中配置的定時器0是每1 ms產生一次中斷,設置一個變量HC_SR04_time,定時器0每產生一次中斷,該變量累加1,每當加到250時,讓該變量清零,同時讓超聲波模塊發出檢測信號,即每250 ms 超聲波模塊發出一次檢測信號,數值可以自行調節。發出檢測信號只需要讓Trig為高電平并且持續10 μs以上 ,再讓Trig為低電平,這樣超聲波模塊就會自動發出一次檢測信號了,本文把這個過程寫在函數StartModule() 里,核心代碼如下。
sbit Trig=p1^4;
sbit Echo=p1^5;
void StartModule(){
Trig=1;
_nop_();……
Trig=0;
}
2.3.3 檢測有無障礙物的程序編寫以及檢測距離的調節方法
本文利用定時器0來通過 Trig口讓超聲波模塊每250 ms發出一次檢測信號,接下來需要用定時器1來檢測有沒有信號返回,即前方有沒有障礙物。本文通過Echo管腳為高電平返回信號,通過定時器1來測量高電平持續的時間。通過公式:測試距離=(高電平時間×聲速(340 M/s)/2) 可計算障礙物距離傳感器的距離。當Echo變為高電平時,讓定時器1清零,并打開定時器1,開始計數。當Echo變為0時,利用公式計算障礙物距離,計算完后令定時器1清零并關閉定時器1 ,即可返回信號。只要Echo被置為1, 定時器1就會被及時清零,也就不會觸發定時器1溢出中斷。若是沒有信號返回(即沒有障礙物或者障礙物超出了傳感器的測量范圍,本文用的傳感器測量最大值為4.5 m),Echo就不會被置1,定時器1也就不會被清零,從而產生溢出中斷,在溢出中斷里放一個變量flag 。若產生中斷則讓其置1,這樣可通過定時器是否產生溢出中斷,即flag是否為1來判斷是否檢測到障礙物。
本文設計的檢測是檢測距離傳感器最大檢測距離內有無障礙物。本文把它用來讓小車避障,但不能距離障礙物4.5 m就讓小車轉彎,這就需要通過程序調節檢測距離了,只需要增加一個判斷條件就行了。本文利用公式算出來障礙物的距離S ,將flag=1或者S>設定的檢測距離,都視為沒有障礙物處理就可以了,如 if(flag==1‖S>50) 就是把50 cm作為檢測距離,檢測的是50 cm內有無障礙物,50是暫定的,在后期調車的時候,根據實際情況進行調節。
本文用于避障的傳感器有檢測左右兩側障礙物的漫反射光電管,檢測前方障礙物的超聲波模塊。大體思路如下,當超聲波模塊沒有檢測到設定距離內的障礙物時,小車直行,當檢測到前方障礙物時,若此時左邊漫反射傳感器沒有檢測到障礙物,則左轉,當此時左邊有障礙物時,若右邊沒有障礙物則右轉,若右邊也有障礙物則后退。邏輯表如表1所示。
表1 自動避障方案
表格中的“有”代表有障礙物,“無”代表無障礙物,“X”代表可以有也可以沒有障礙物 若前方有障礙物則 M_sensor=0,沒有則 M_sensor=1,若左側有障礙物 ,則 L_sensor=0 ,沒有則 L_sensor=1,若右側有障礙物則 R_sensor=0 ,沒有則 R_sensor=1,核心代碼如下。
if(M_sensor==1){run();}
else
{
if(L_sensor==1)
{left();}
else if(R_sensor==1)
{right();}
else { back();}
}
在測試中當電池電量較低時,原來的轉彎方式(一側電機停轉,另一側電機前進)轉彎效率較低,因此把轉彎的函數修改為一側后退,另一側前進。經過測試后,這種方案因為超聲波模塊存在一些缺陷,比如偶然會產生誤判,前方什么障礙物都沒有,會在一瞬間突然檢測到障礙物或突然消失。這種缺陷是超聲波模塊固有的缺陷,是無法通過超聲波模塊本身去糾正,解決方法可在超聲波模塊的兩側分別再加一個朝前的檢測前方障礙物的漫反射光電傳感器,這樣可克服以上的缺陷。經過本文的實際測試,漫反射光電傳感器除了檢測距離有點短之外幾乎不會產生誤判,有較好的應用價值。因此以4路漫反射光電傳感器為主,超聲波模塊只是輔助檢測前方的較遠的障礙物,彌補漫反射傳感器檢測距離有限的缺陷。
本文主要基于STM32F407開發板對智能小車進行驅動,可用手機控制小車前進、后退、左轉、右轉、后左轉、后右轉、停止等方向,還可自動進行避障。當遇到障礙物時,小車會左轉或右轉繞開障礙物,離障礙物一定距離時蜂鳴器會報警。不同的距離,蜂鳴器響的頻率不一樣,同時OLED會實時顯示距離、小車行進方向及報警的狀態。該智能小車可進行后期二次開發,也可進行功能擴展。