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