雷道仲
(湖南信息職業(yè)技術(shù)學(xué)院,湖南長沙,410200)
機(jī)完成機(jī)器人導(dǎo)航功能,直流伺服電機(jī)是機(jī)器人的行走系統(tǒng),完成各種行走動作。
觸覺傳感器工作原理非常簡單,其的等效電路原理圖如圖2中虛線所示[2]。傳感器在撲捉或感知外界信息是靠其裝在傳感器外面的觸須來完成,圖中的“右觸須”、“左觸須”實(shí)際上就是兩個帶觸須的觸覺型開關(guān),當(dāng)它們平時沒有觸碰到實(shí)物時,它們處于常開狀態(tài);將它們一端連接到單片機(jī)的I/O控制端口上(圖中P3.2/P3.3),則對應(yīng)的端口呈現(xiàn)出高電平狀態(tài);當(dāng)胡須觸碰到物體時,與它聯(lián)動的開關(guān)因受力而閉合,從而拉低對應(yīng)的單片機(jī)端口引腳電平,單片機(jī)則通過判斷對應(yīng)引腳電平的高低來間接感知外部事件(觸須觸碰到障礙物)是否發(fā)生。
圖1 機(jī)器人觸覺導(dǎo)航系統(tǒng)構(gòu)成框圖
系統(tǒng)主要由單片機(jī)AT89C51、觸覺傳感器、直流伺服電機(jī)、供電電路等組成,其系構(gòu)成框圖如圖1所示。其中單片機(jī)是整個系統(tǒng)的控制核心,用來接收觸覺傳感器傳回來的外界信息,并根據(jù)信息情況作出相應(yīng)決策;控制伺服電機(jī)作出相應(yīng)動作,如:前進(jìn)、后退或左、右轉(zhuǎn)彎等。觸覺傳感器用來感知外界障礙物,配合單片
基金項(xiàng)目:湖南教育廳科學(xué)研究項(xiàng)目(No.12C1176)
如圖2所示的電路工作過程如下:電路通電后,單片機(jī)P2.0與P2.1輸出伺服電機(jī)的控制信號,從而引導(dǎo)機(jī)器人朝前行走,同時單片機(jī)P3.2、P3.3端口負(fù)責(zé)收集左、右觸覺傳感器采集到的信號,當(dāng)左、右傳感器沒有碰到障礙物時,P3.2=P3.3=1;當(dāng)某個時刻,左觸須碰到障礙物,P3.2=0;則進(jìn)入相應(yīng)左避障子程序,如:后退——右轉(zhuǎn)等,完成避障;右觸須工作過程跟左觸須類似。如同時檢測到P3.2=P3.3=0;則先后退——再掉頭往反方向走,完成避障和導(dǎo)航功能。
機(jī)器人觸覺導(dǎo)航系統(tǒng)程序設(shè)計(jì)思路如下,51單片機(jī)的兩個端口P3.2和P3.3分別負(fù)責(zé)對左、右觸覺傳感器觸須進(jìn)行監(jiān)控,當(dāng)機(jī)器人前進(jìn)過程中左前方有障礙物時,左邊的觸須碰到這個障礙物時,P3.2引腳電平會變成低電平,程序會立刻轉(zhuǎn)至左避障函數(shù)中去執(zhí)行,只要我們在左避障函數(shù)中合理設(shè)置相關(guān)避障函數(shù),如:后退——右轉(zhuǎn)——再前進(jìn)等,便可以成功避開障礙,完成機(jī)器人導(dǎo)航。右觸須程序設(shè)計(jì)思路與此類似,右觸須被端口P3.3所監(jiān)控,整個系統(tǒng)主程序流程圖如圖3所示。
圖2 機(jī)器人觸覺導(dǎo)航系統(tǒng)電路
根據(jù)圖2所示的系統(tǒng)硬件電路原理圖,焊接好電路控制板,并將觸覺傳感器的兩個觸須安裝在單片機(jī)P3.2與P3.3端口上。檢查供電正常后,開機(jī)運(yùn)行。將數(shù)字萬用表打至直流20V檔,黑表筆接地,紅表筆觸碰單片機(jī)P3.2引腳,如果此時觸覺傳感器的觸須沒有碰到障礙物時,萬用表在P3.2引腳應(yīng)該檢測到一個接近5V左右的高電平;觸須碰到障礙物則萬用表應(yīng)該檢測到接近0V的低電平;如果沒有檢測到相應(yīng)的電平,則說明觸覺傳感器未能正常工作。則應(yīng)逐步仔細(xì)排查電路,直至觸覺傳感器正常工作為止。
根據(jù)機(jī)器人觸覺導(dǎo)航系統(tǒng)程序設(shè)計(jì)思路,在KEIL C中編寫、編譯完成相應(yīng)程序代碼,將產(chǎn)生的可執(zhí)行文件燒寫到單片機(jī)程序存儲器,開機(jī)運(yùn)行機(jī)器人,我們發(fā)現(xiàn)機(jī)器人在觸覺傳感器的引導(dǎo)下能夠很好規(guī)避正前方障礙物,實(shí)現(xiàn)機(jī)器人導(dǎo)航功能。但如果機(jī)器人進(jìn)入到90度的墻角時,我們發(fā)現(xiàn)機(jī)器人總是左觸須觸墻,于是右轉(zhuǎn),向前行走,右觸須觸墻,于是左轉(zhuǎn),繼續(xù)前進(jìn),又碰到左墻,再次碰到右墻……,如果不是你把它從墻角拿出來,它將會一直困在墻角里而出不來。要解決這個問題,需要運(yùn)用一些編程策略對程序中作一些修改。
基本思路是先判斷前方障礙物是不是墻角,如果確認(rèn)是墻角,那么就讓小車作一個U形轉(zhuǎn)彎,即掉頭逃離墻角,如果不是墻角,則按一般避障功能便可以解決。
圖3 主程序流程圖
判斷機(jī)器人進(jìn)入90度墻角的方法[1]:如果函數(shù)P3_2state()返回0,函數(shù)P3_3state()返回1;當(dāng)觸須碰到右墻時,函數(shù)P3_2state()返回1,函數(shù)P3_3state()返回0;由此可推測,若前方障礙物是90度墻角,那么這兩個函數(shù)返回的值彼此不相等,而且各自前后兩次返回的值也不相等,我們可以在程序中設(shè)兩個變量用來記錄兩個觸須前一次觸動的舊狀態(tài),再與兩個觸須的當(dāng)前狀態(tài)進(jìn)行對比,如果前后兩次的狀態(tài)交替出現(xiàn),就用一個變量作為計(jì)數(shù)器記錄交替的次數(shù),若交替總數(shù)超過了程序中預(yù)先設(shè)定的閥值,就可以認(rèn)定前方的障礙物是墻角,那么就編程讓小車作一個U形轉(zhuǎn)彎,掉頭逃離墻角,同時將記錄交替次數(shù)的計(jì)數(shù)器變量復(fù)位,下面具體運(yùn)用這種思路修改的主函數(shù),使智能機(jī)器人能夠逃離墻角,修改后的主函數(shù)如下:
void main(void)
{
uchar counter=1; //觸須碰撞總次數(shù)
uchar old_R=1; //右觸須舊狀態(tài)
uchar old_L=0; //左觸須舊狀態(tài)
while(1)
{
if(P3_2state()!=P3_3state())
{
if((old_R!=P3_3state())&&(old_L!=P3_2state()))
{
counter=counter+1;
old_R=P3_2state();
old_L=P3_3state();
if(counter>4)
{
counter=1;
Backward();//向后
Left_Turn();//向左
Left_Turn();//向左
}
}
else
{按主程序流程圖避障}
實(shí)踐表明,運(yùn)用觸覺傳感器設(shè)計(jì)出的智能機(jī)器人導(dǎo)航系統(tǒng)能夠很好地規(guī)避正前方的障礙物,從而引導(dǎo)機(jī)器人完成導(dǎo)航功能;并且,觸覺傳感器具有價格低、易于控制等優(yōu)點(diǎn),因此,它是機(jī)器人或智能玩具中設(shè)計(jì)避障、導(dǎo)航功能的不二選擇。
參考文獻(xiàn)
[1] 秦志強(qiáng)等編著.C51單片機(jī)應(yīng)用與C語言程序設(shè)計(jì)[M].北京:電子工業(yè)出版社.,2007
[2] 譚立新,雷道仲等編著.單片機(jī)技術(shù)及應(yīng)用[M].長沙:中南大學(xué)出版社.2013
[3] 宋雪麗,王虎林,王毅.基于單片機(jī)的尋跡機(jī)器人的系統(tǒng)設(shè)計(jì)[J].儀表技術(shù).2009(04)
[4] 王東峰,王會良,董冠強(qiáng)編著.單片機(jī)C語言應(yīng)用100例[M].電子工業(yè)出版社2009年3月