在機器人小車循線中,用于循線的數(shù)/模傳感器被稱做“眼睛”。本文對機器人小車單眼循線提出了三種方法,從理論上分析闡述實現(xiàn)三種單眼循線的原理思路。單眼循線具有設備簡單、程序代碼短、邏輯編程靈活等特點。單眼循線能有效的鍛煉的程序設計者的編程能力,是有效合理利用資源的典型編程案例。同時,輔助其它傳感器能有效的提高智能小車的平順和穩(wěn)定性,具有良好的實際應用價值。
【關鍵詞】機器人小車 數(shù)/模傳感器 眼睛 單眼循線
本文探討機器人小車循線時使用單眼(一個模擬或數(shù)字傳感器)完成小車的循線操作。為了將問題抽象出來,本文不對機器人路口轉向展開討論,以小車沿線直走或走圈說明單眼循線的方法。
現(xiàn)在學習用機器人很多,本文采用亮寧機器人循線,也可用其它單片機。為了提高測試可靠性,采用模擬傳感器測試。
亮寧機器人使用anduino編程環(huán)境,函數(shù)在頭文件LNDZ.h中,包含有如下幾個主要函數(shù):
voidinit()是void setup()函數(shù)別名,只執(zhí)行一次;
void repeat()是void loop()函數(shù)別名,反復執(zhí)行函數(shù);
void motor(long,long) 定義左右輪的速度和轉向(正向前,負向后),形參long類型;如:motor(20,30); 小車是往前慢速大角度左轉,快速右轉可用motor(70,-70);速度范圍-100至100。
intAR()是analogRead()的別名,讀取模擬傳感器獲取返回值。接傳感器的模擬1號口,AR(1)表示從模擬1口接收讀取數(shù)據(jù)。
代碼中讀取數(shù)字,“0”、“1”分別代表眼睛讀取到白色、黑色區(qū)域的值;
直線循線一般采用兩眼,左右眼睛檢測叛斷,編程簡單。單眼循線設備簡單,偏左偏右調整需一只眼睛完成識別完成,如圖1所示,單眼循線。循線編程實現(xiàn)看似無法完成,只有一只眼睛,如何準確、有效完成循線呢?
首先循線時先要求固定小車走向,如左向走后,傳感器識別到變化后右向走,后面接著交替進行使小車走之字,完成循線過程。
這里列出了三種方法進行單眼循線。第一種也是最容易想到的單眼之字循線;第二種黑白交界線循線;第三種自動調整循線。
1 單眼之字循線
單眼之字循線原理圖如圖2中左圖a所示。小車左右行走路徑是之字型,眼睛識別黑線走,遇白色則掉頭往相反方向走。小車的速度量值低值、高值如用整型變量tnL,tnH保存,左轉:motor(tnL,tnH); 右轉:motor(tnH,tnL);
所以,程序代碼簡單為:
intad,dms=20,tnL=0,tnH=25;
void repeat()
{
do { motor(tnL,tnH);delay(dms); ad=( AR(1)>250?1:0); }while(ad==1);
do { motor(tnH,tnL); delay(dms); ad=(AR(1)>250?1:0); }while(ad==1);
}
程序中發(fā)現(xiàn)兩個代碼是一致的,只是左右輪數(shù)值相反。所以,寫一函數(shù)完成。
#include
inttnL=0,tnH=25;
void repeat() {turnLR(tnL,tnH); turnLR(tnH,tnL); }
voidturnLR(intturnL,intturnR)
{do { motor(turnL,turnR); delay(dms); ad=( AR(1)>250?1:0); }while(ad==1);}
實際上由于慣性,會如圖2中右圖b所示,沖出黑線區(qū)域,使小車不走動。程序還可以采用遇白色反向循環(huán)回到黑色區(qū)域。程序代碼如下:
#include
inttnL=20,tnH=40; //車速值
intdms=20; //延時20毫秒
bool ad; //存讀取的數(shù)據(jù),為布爾型(只能存0或1數(shù)字值)
void init() { }
void repeat()
{
turnLR(tnL,tnH); turnQLR (tnH,0);turnLR(tnH,tnL); turnQLR(0,tnH);
}
void turnLR(intturnL,intturnR)
{
do
{ motor(turnL,turnR);delay(dms);
ad=( AR(1)>250?1:0);
}while(ad==1);
}
void turnQLR(intturnL,intturnR)
{
do{ motor(turnL,turnR); ad=(AR(1)>250?1:0);}while(ad==0) ; //遇白色反向急轉回
}
以上分析和實際操作可以看到,小車能左右搖晃的循寬線前行,單眼循線是可行的。
2 交界線循線
交界線循線是以黑線的兩條邊線存在有黑白的不同選定其中一條邊線完成循線的循線方法。如圖3所示,循線采用的也是之字型。由于如圖選取為右邊線,所以,開始的小車單眼放置黑線上,行進方向要保證為右轉進入右邊白色區(qū)域。達到之字型循線目的,可利用左右輪的一只輪子變速完成。
馬達的左輪速度值turnL不變,而語句turnR+=sign*(sg?10:6);使turnR總是低于、高于turnL保存的值,交替變化。用語句sign=-sign;在repeat循環(huán)里面,每輪循環(huán)都改變符號?!?”,“-1”交替變化。用語句sg=!sg;在repeat循環(huán)里面,每輪循環(huán)都會取反一次,“1”,“0”交替變化。
下列程序代碼左輪速度不變,右輪變速。
程序代碼如下:
#include
#define SPEED 20
bool s,sg=1;//s,sg布爾型,s存讀取數(shù)字值;sg存黑白的判別值,開始為“1”后為“0”。
intdms=3,sign=-1;
intturnL,turnR;//左右輪如果轉速不同,可視具體情況調整
voidinit(){ B_start(); turnL=turnR=SPEED;}
void repeat()
{
turnR+=sign*(sg?10:6); //10:6 表示加速量相對少,也可用turnR+=sign*SPEED
do{motor(turnL,turnR); delay(dms);}while(readData()==sg);// sg先黑后白
delay(4*dms); //到了交界線了,再繼續(xù)走一段。
turnR=SPEED;
sign=-sign; //sign第1次為“-1”,第2次為“1”,代表速度的加減
sg=!sg; //sg第1次為“1”,第2次為“0”,分別代表黑白區(qū)域的值
}
boolreadData(){ return s=AR(1)>250?1:0; }
從循寬線到循黑白交界線,其實基本的思維方式都是一樣。即圍繞著線調整后,總的方向還是循線走。
3 自動調整循線
前面兩種情況主要是以之字型向前行走的方式進行,左右搖擺行進。如果循線的線寬較窄,循線時易走偏??刹捎米詣诱{整循線法。
自動調整循線法指循線時如果走偏,不管是左偏還是右偏,在一定次數(shù)檢測中,都未檢測到黑線,則小車改為往相反方向行走,直至循到黑邊。
#include
#define SPEED 20
lclcd;
bool sg=1;
intmts=0,smts=5,dms=15,signL=-1,signR=1,error=0;
intturnL,turnR;
voidinit()
{
B_start();
lcd.begin(16,2);lcd.bg(1);
turnL=turnR=SPEED;
while(btns()==1){ s=readData();displayData(0,0,s); }
lcd.clear();
}
void repeat(){ goLine(turnL,turnR);displayData(0,0,error); }
boolreadData()
{
int s0=0,s1=0;
unsigned long temp=millis();
for(inti=0;i<2;i++) // 提高讀數(shù)可靠性,讀兩次
{
if((AR(1)>320?1:0)==1) s0++;if((AR(1)>320?1:0)==0) s1++;
}
displayData(0,1,1000*(millis()-temp));if(s0==2) return 1;if(s1==2) return 0;
error++; return 2;
}
voidgoLine(intleft,int right)
{ //直線往前走,走出黑線,退出循環(huán)
do{ motor(left,right);delay(dms); }while(readData()==sg);
delay(dms/2);// 調整更多一點,避免太靠近黑線
sg=!sg;//sg取反
do
{ //signL與signR符號總是相反
motor(signL*left*2/3,signR*right*2/3);mts++;//delay(dms/2);
if(mts>smts) { signL=-signL; signR=-signR; mts=-1000*smts; }
}while(readData()==sg); mts=0;sg=!sg;
}
voiddisplayData(intcol,introw,int di)
{
lcd.clear(); lcd.setCursor(col,row);lcd.print(di);
}
4 總結
單眼循線設備簡單、程序編寫容易實現(xiàn),可根據(jù)實際情況選擇合理的循線方法。單眼循線對學習者提高編程能力有極大的幫助,是合理使用資源的典型編程案例。同時,輔助其它傳感器能有效的提高智能小車的平順和穩(wěn)定性,具有很好的實用價值。
(通訊作者:魏麗君)
參考文獻
[1]張男,毛瓊.PID模糊控制器的設計及在智能車轉向控制上的應用[J].科技風,2012,49(05):66-67.
[2]周南.基于圖像識別的智能小車路徑跟隨系統(tǒng)設計[D].湖南大學(碩士學位論文),2016.
[3]汪明磊.智能車輛自主導航中避障路徑規(guī)劃與跟蹤控制研究[D].合肥工業(yè)大學博士學位論文,2013:52-64.
[4]劉巍.自動導引小車_AGV_控制系統(tǒng)研究[D].吉林大學(碩士學位論文),2015.
作者簡介
袁開鴻(1965-),男,畢業(yè)于湖南師范大學,大學本科學歷。副教授。主要研究方向為計算機算法、電子技術。
魏麗君(1983-),男,畢業(yè)于中南大學,碩士,講師。主要研究方向為電子技術、傳感器技術應用。
作者單位
湖南鐵道職業(yè)技術學院 湖南省株洲市 412001