在歷屆全國大學生電子設計競賽中多次出現了集光、機、電于一體的簡易智能小車題目。筆者通過論證、比較、實驗之后,制作出了簡易小車的尋跡電路系統。整個系統基于普通玩具小車的機械結構,并利用了小車的底盤、前后輪電機及其自動復原裝置,能夠平穩跟蹤路面黑色軌跡運行。 總體方案 整個電路系統分為檢測、控制、驅動三個模塊。首先利用光電對管對路面信號進行檢測,經過比較器處理之后,送給軟件控制模塊進行實時控制,輸出相應的信號給驅動芯片驅動電機轉動,從而控制整個小車的運動。
傳感檢測單元 小車循跡原理 該智能小車在畫有黑線的白紙“路面”上行駛,由于黑線和白紙對光線的反射系數不同,可根據接收到的反射光的強弱來判斷“道路”—黑線。筆者在該模塊中利用了簡單、應用也比較普遍的檢測方法——紅外探測法。 紅外探測法,即利用紅外線在不同顏色的物理表面具有不同的反射性質的特點。在小車行駛過程中不斷地向地面發射紅外光,當紅外光遇到白色地面時發生漫發射,反射光被裝在小車上的接收管接收;如果遇到黑線則紅外光被吸收,則小車上的接收管接收不到信號。 傳感器的選擇 市場上用于紅外探測法的器件較多,可以利用反射式傳感器外接簡單電路自制探頭,也可以使用結構簡單、工作性能可靠的集成式紅外探頭。ST系列集成紅外探頭價格便宜、體積小、使用方便、性能可靠、用途廣泛,所以該系統中最終選擇了ST168反射傳感器作為紅外光的發射和接收器件,其內部結構和外接電路均較為簡單。 ST168采用高發射功率紅外光、電二極管和高靈敏光電晶體管組成,采用非接觸式檢測方式。ST168的檢測距離很小,一般為8~15毫米,因為8毫米以下是它的檢測盲區,而大于15毫米則很容易受干擾。筆者經過多次測試、比較,發現把傳感器安裝在距離檢測物表面10毫米時,檢測效果最好。 R1限制發射二極管的電流,發射管的電流和發射功率成正比,但受其極限輸入正向電流50mA的影響,用R1=150的電阻作為限流電阻,Vcc=5V作為電源電壓,測試發現發射功率完全能滿足檢測需要;可變電阻R2可限制接收電路的電流,一方面保護接收紅外管;另一方面可調節檢測電路的靈敏度。因為傳感器輸出端得到的是模擬電壓信號,所以在輸出端增加了比較器,先將ST168輸出電壓與2.5V進行比較,再送給單片機處理和控制。 傳感器的安裝 正確選擇檢測方法和傳感器件是決定循跡效果的重要因素,而且正確的器件安裝方法也是循跡電路好壞的一個重要因素。從簡單、方便、可靠等角度出發,同時在底盤裝設4個紅外探測頭,進行兩級方向糾正控制,將大大提高其循跡的可靠性。 循跡傳感器全部在一條直線上。其中X1與Y1為第一級方向控制傳感器,X2與Y2為第二級方向控制傳感器,并且黑線同一邊的兩個傳感器之間的寬度不得大于黑線的寬度。小車前進時,始終保持(如圖3中所示的行走軌跡黑線)在X1和Y1這兩個第一級傳感器之間,當小車偏離黑線時,第一級傳感器就能檢測到黑線,把檢測的信號送給小車的處理、控制系統,控制系統發出信號對小車軌跡予以糾正。第二級方向探測器實際是第一級的后備保護,它的存在是考慮到小車由于慣性過大會依舊偏離軌道,再次對小車的運動進行糾正,從而提高了小車循跡的可靠性。 軟件控制單元 單片機選型及程序流程 此部分是整個小車運行的核心部件,起著控制小車所有運行狀態的作用。控制方法有很多,大部分都采用單片機控制。由于51單片機具有價格低廉是使用簡單的特點,這里選擇了ATMEL公司的AT89S51作為控制核心部件。 小車進入循跡模式后,即開始不停地掃描與探測器連接的單片機I/O口,一旦檢測到某個I/O口有信號變化,程序就進入判斷程序,把相應的信號發送給電動機從而糾正小車的狀態。 車速的控制 車速調節的方法有兩種:一是用步進電機代替小車上原有的直流電機;二是在原有直流電機的基礎上,采用pwm調速法進行調速。考慮到機械裝置不便于修改等因素,這里選擇后者,利用單片機輸出端輸出高電平的脈寬及其占空比的大小來控制電機的轉速,從而控制小車的速度。經過多次試驗,最終確定合適的脈寬和占空比,基本能保證小車在所需要的速度范圍內平穩前行。 電機驅動單元 從單片機輸出的信號功率很弱,即使在沒有其它外在負載時也無法帶動電機,所以在實際電路中我們加入了電機驅動芯片提高輸入電機信號的功率,從而能夠根據需要控制電機轉動。根據驅動功率大小以及連接電路的簡化要求選擇L298N,其外形、管腳分 布如圖5所示。
圖5 L298N管腳分布圖 從圖中可以知道,一塊L298N芯片能夠驅動兩個電機轉動,它的使能端可以外接高低電平,也可以利用單片機進行軟件控制,極大地滿足各種復雜電路需要。另外,L298N的驅動功率較大,能夠根據輸入電壓的大小輸出不同的電壓和功率,解決了負載能力不夠這個問題。 結語 此方案選擇的器件比較簡單,實際中也很容易實現。經過多次測試,結果表明在一定的弧度范圍內,小車能夠沿著黑線軌跡行進,達到了預期目標。不足之處,由于小車采用直流電機,其速度控制不夠精確和穩定,不能實現急轉和大弧度的拐彎。
程序 #include<reg51.h> #define uchar unsigned char #define uint unsigned int ucharpro_left,pro_right,i,j; //左右占空比標志
sbit left1=P2^0; sbit left2=P2^1; sbit right1=P2^2; sbit right2=P2^3; sbit en1=P1^0; sbit en2=P1^1; //循跡口 三個紅外傳感器 sbit left_red=P1^2; //白線位置 sbit mid_red=P1^3; //黑線位置 sbit right_red=P1^4; //白線位置 void delay(uint z) { uchar i; while(z--) {for(i=0;i<121;i++);} } void init() { left_red=0; //白線位置 mid_red=1; //黑線位置 right_red=0; TMOD=0X01; //定時器0選用方式1 TH0=(65536-100)/256; TL0=(65536-100)%256; EA=1; ET0=1; TR0=1; en1=1; en2=1; } void time0(void)interrupt 1 { i++; j++; if(i<=pro_right){en1=1;} else en1=0; if(i==40) {en1=~en1;i=0;} if(j<=pro_left) {en2=1;} else en2=0; if(j==40) {en2=~en2;j=0;} TH0=(65536-100)/256; TL0=(65536-100)%256; } void straight() //走直線函數 { pro_right=39; pro_left=39; left1=0; left2=1; right1=1; right2=0; } void turn_left() //左轉彎函數 { pro_right=5; pro_left=39; left1=0; left2=1; right1=1; right2=0; } void turn_right() //右轉彎函數 { pro_right=39; pro_left=5; left1=0; left2=1; right1=1; right2=0; } void turn_back() //后退(反轉)函數 { left1=1; left2=0; right1=0; right2=1; pro_right=39; pro_left=39; } void infrared() //循跡 { uchar flag; if(left_red==1) {flag=1;} else if(right_red==1) {flag=2;} else if((left_red==0)&(mid_red==0)&(right_red==0)) {flag=3;} else flag=0; switch (flag) { case 0: straight(); break; case 1: turn_left(); break; case 2: turn_right(); break; case 3: turn_back(); break;
default: break; }
} void main(void) { init(); delay(1); while(1) { infrared(); // straight(); }
} void int0(void)interrupt 0 {
}
|