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