司開波 黃 健 呂林濤
(西京學(xué)院信息工程學(xué)院,陜西西安 710123)
在智能車設(shè)計(jì)中,通常要實(shí)現(xiàn)自動(dòng)循跡功能,因此人們研究了多種方法。文獻(xiàn)[1]采用光電傳感器TCRT5000,以STC12C5A60S2為控制核心,實(shí)現(xiàn)了對(duì)黑白線的自動(dòng)循跡。文獻(xiàn)[2]采用新型數(shù)字式電感傳感器LDC1000實(shí)現(xiàn)了對(duì)細(xì)鐵絲構(gòu)成的跑道的自動(dòng)循跡。
文獻(xiàn)[1]采用的方法,也是常用的一種循跡方法。采用光電傳感器,根據(jù)白線反射光強(qiáng),黑線反射光弱的原理識(shí)別黑白線,達(dá)到自動(dòng)巡線的功能。但該方法對(duì)黑線的寬度和當(dāng)前光照強(qiáng)度有要求,如果當(dāng)前自然光照強(qiáng)度大,很難識(shí)別黑白線;如果黑線寬度較細(xì),也較難識(shí)別;如果是彎道,由于角度變化,識(shí)別也比較困難。而本文提出的CCD線陣傳感器,包含128個(gè)光電二極管的線性陣列,構(gòu)成128個(gè)像素,每個(gè)像素的光敏面積是3 524.3μm2,像素之間的間隔是8μm。每個(gè)像素點(diǎn)具有256(8bit)級(jí)灰度輸出。相比于單個(gè)或多個(gè)光電傳感器TCRT5000,輸出精度更高,采集的信息點(diǎn)更多,采集范圍更寬。因此,實(shí)現(xiàn)的自動(dòng)循跡功能更強(qiáng)。
該傳感器是包含128個(gè)光電二極管的線陣,光電二極管在光的照射下產(chǎn)生光電流。如圖1所示構(gòu)成了光電二極管積分電路,二極管上累積的電荷量與光強(qiáng)度和光照時(shí)間成正比。當(dāng)開關(guān)S1在1上時(shí),積分電容上流過的電流和光電流相等,對(duì)光電流進(jìn)行積分。當(dāng)S1切換到2時(shí),釋放積分電容上累積的電荷。S2采樣輸出,當(dāng)S2切換到1上時(shí),使得采樣電容電壓等于運(yùn)放輸出電壓,切換到3時(shí),輸出電壓,在2時(shí),其它光電二極管輸出電壓[3-5]。CCD內(nèi)部有移位寄存器和邏輯控制器,可依次輸出128個(gè)像素點(diǎn)的電壓。
圖1 光電二極管積分原理圖Fig.1 Photodiode Integration Principle Diagram
系統(tǒng)設(shè)計(jì)框圖如圖2所示,主控采用高性能微處理器STM32F103ZET6,主頻72MHz,具有豐富的資源和I/O接口。采用3.3V供電,CCD線陣首先采集黑線的信息,通過A/D接口送給主控STM32,主控對(duì)數(shù)據(jù)進(jìn)行處理,用中值算法尋找黑線中心位置,并與小車中心點(diǎn)位置比較。當(dāng)車身偏左時(shí),控制小車右轉(zhuǎn);當(dāng)車身偏右時(shí),控制小車左轉(zhuǎn);當(dāng)正在黑線的正上方時(shí),小車直行。電機(jī)驅(qū)動(dòng)采用TB6612,用編碼器測(cè)速,用速度PID控制PWM波輸出,使得小車行進(jìn)穩(wěn)定、可靠。并增加藍(lán)牙串口模塊,可將小車行進(jìn)的相關(guān)數(shù)據(jù)發(fā)送給上位機(jī),便于調(diào)試。
圖2 系統(tǒng)框圖Fig.2 System block diagram
CCD與STM32的連接圖如圖3所示。STM32的PA4引腳控制數(shù)據(jù)的起始位,PA2提供讀寫的時(shí)鐘信號(hào),PA3作為模擬A/D輸入引腳,可連續(xù)讀取128個(gè)像素點(diǎn)的輸出電壓,作為軟件處理中的原始數(shù)據(jù)[4-7]。
圖3 CCD與STM32連接圖Fig.3 Connection Chart of CCD and STM32
TB6612電機(jī)驅(qū)動(dòng)電路圖如圖4所示,TB6612適合驅(qū)動(dòng)小型直流電機(jī),可同時(shí)驅(qū)動(dòng)2路直流電機(jī),峰值電流可達(dá)到2A,相比于L298具有體積小、性能高等優(yōu)點(diǎn)。圖中PF13,PF14,PC6控制1路電機(jī),PF13,PF14控制電機(jī)的轉(zhuǎn)向,PC6輸出PWM波,控制電機(jī)的轉(zhuǎn)速。對(duì)應(yīng)的輸出為OUT1和OUT2。PF15,PG0,PC7控制另外1路電機(jī),PF15,PG0控制電機(jī)的轉(zhuǎn)向,PC7輸出PWM波,控制電機(jī)的轉(zhuǎn)速。對(duì)應(yīng)的輸出為OUT3和OUT4。VM為電機(jī)驅(qū)動(dòng)所需電壓,要高于6V,設(shè)計(jì)中采用7V[8]。VCC為芯片工作電壓,是5V。
圖4 TB6612電機(jī)驅(qū)動(dòng)硬件原理圖Fig.4 Hardware schematic diagram of TB6612 motor drive
對(duì)電機(jī)測(cè)速時(shí),采用編碼器,每旋轉(zhuǎn)1圈,輸出390個(gè)脈沖,將其接入STM32F103ZET6的定時(shí)器2,測(cè)量每秒鐘脈沖的個(gè)數(shù)實(shí)現(xiàn)測(cè)速。
圖5 藍(lán)牙接口電路設(shè)計(jì)Fig.5 Bluetooth interface circuit design
串口藍(lán)牙電路圖如圖5所示,圖中藍(lán)牙連接到STM32F103ZET6的串口2上,要實(shí)現(xiàn)藍(lán)牙通信,必須是一對(duì)。上位機(jī)的連接方法與圖5所示相同。通信之前,首先用串口調(diào)試助手對(duì)2個(gè)藍(lán)牙模塊進(jìn)行設(shè)置,設(shè)置好后2個(gè)藍(lán)牙模塊會(huì)自動(dòng)配對(duì)。通過串口2的PD5(RXD)和PD6(TXD)實(shí)現(xiàn)數(shù)據(jù)的收發(fā)??蓪CD數(shù)據(jù),電機(jī)測(cè)速數(shù)據(jù)等發(fā)送給上位機(jī),方便調(diào)試。
在KEIL MDK5.0下用C語言編程,軟件流程圖如圖6所示。
圖6 軟件流程圖Fig.6 Software flow chart
軟件編程時(shí),首先對(duì)定時(shí)器、串口等進(jìn)行初始化,然后通過A/D循環(huán)采集128個(gè)像素點(diǎn)的數(shù)據(jù)。通過顏色識(shí)別找到黑線的2個(gè)邊緣,記下此時(shí)像素點(diǎn)的位置I和J(I K=I+(J-I)/2 (1) PWM+=Kp[e(k)-e(k-1)]+Ki×e(k) +Kd[e(k)-2e(k-1)+e(k-2)] (2) 式中:Kp——比例系數(shù);Ki——積分系數(shù);Kd——微分系數(shù);e(k)——當(dāng)前位置誤差;e(k-1)——上一次位置誤差;PWM——脈沖寬度。 以下是找到黑線并計(jì)算中心代碼,該段代碼在定時(shí)器Timer1中每隔100ms調(diào)用一次。對(duì)小車的控制采用動(dòng)態(tài)閾值智能控制方法,當(dāng)?shù)竭_(dá)閾值范圍內(nèi),控制小車直行,否則控制小車左轉(zhuǎn)或者右轉(zhuǎn),按流程圖所示進(jìn)行。這樣可以避免小車左右搖擺,這樣就能在幾秒內(nèi)將小車調(diào)整到中心位置。 void Find_CCD_Zhongzhi(void) {static u8 i,j,Left,Right,Last_CCD_Zhongzhi;static u16 value1_max,value1_min;value1_max=ADV[0];//動(dòng)態(tài)閾值算法,讀取最大和最小值 for(i=5;i<123;i++)//兩邊各去掉5個(gè)點(diǎn) {if(value1_max<=ADV[i]) value1_max=ADV[i];} value1_min=ADV[0];//最小值 for(i=5;i<123;i++) {if(value1_min>=ADV[i]) value1_min=ADV[i];} CCD_Yuzhi=(value1_max+value1_min)/2;//計(jì)算出本次中線提取的閾值 for(i = 5;i<118; i++)//尋找左邊跳變沿 {if(ADV[i]>CCD_Yuzhi&&ADV[i+1]>CCD_Yuzhi&&ADV[i+2]>CCD_Yuzhi&&ADV[i+3] {Left=i; break;} } for(j = 118;j>5; j--)//尋找右邊跳變沿 {if(ADV[j] {Right=j; break;} } CCD_Zhongzhi=(Right+Left)/2;//計(jì)算中線位置if(myabs1(CCD_Zhongzhi-Last_CCD_Zhongzhi)>70)//計(jì)算中線的偏差,如果太大 CCD_Zhongzhi=Last_CCD_Zhongzhi;//則取上一次的值 Last_CCD_Zhongzhi=CCD_Zhongzhi;//保存上一次的偏差 } 設(shè)計(jì)并調(diào)試好硬件電路和軟件程序后,就可以進(jìn)行測(cè)試了。測(cè)試時(shí),首先對(duì)鏡頭進(jìn)行調(diào)焦,調(diào)焦如式(3)或式(4)所示 f=v×D/V (3) f=h×D/H (4) 式中:f——鏡頭的焦距長度;v——拍攝對(duì)象成像后的縱向尺寸;V——拍攝對(duì)象實(shí)際的縱向尺寸;D——鏡頭和拍攝對(duì)象之間的距離;h——拍攝對(duì)象成像后的橫向尺寸;H——拍攝對(duì)象實(shí)際的橫向尺寸。 測(cè)試時(shí),所選用的鏡頭的成像區(qū)域?yàn)?.128mm×0.063 5mm,焦距可調(diào)。 測(cè)試時(shí)跑道如圖7所示。相距最遠(yuǎn)的2條黑線的外邊沿間距是25cm,即橫向尺寸H為25cm。鏡頭與目標(biāo)距離D為80cm,鏡頭焦距f為6mm,經(jīng)過式(4)計(jì)算,可得到成像后的橫向尺寸h如式(5)所示 h=f×H/D=6mm×25cm/80cm=1.875mm 圖7 測(cè)試用跑道示意圖Fig.7 Test Runway 而鏡頭的成像區(qū)域?yàn)?.128mm×0.0635mm,橫向長度為8.128mm,對(duì)應(yīng)128個(gè)像素點(diǎn),則1.875mm對(duì)應(yīng)像素點(diǎn)是29.5,接近于30個(gè)。 通過藍(lán)牙發(fā)送數(shù)據(jù)給上位機(jī),可以得到如圖8所示的測(cè)試數(shù)據(jù)。 圖8 測(cè)試數(shù)據(jù)1Fig.8 Test data 1 圖8顯示了經(jīng)過軟件處理后的數(shù)據(jù),最小值是18,最大值是86,中間值是52,并顯示了灰度圖和二值化圖。 圖9顯示了當(dāng)焦距為8mm時(shí)測(cè)量數(shù)據(jù),鏡頭與目標(biāo)距離D為30cm時(shí)測(cè)得的數(shù)據(jù)。從圖中可得到最小值是20,最大值是127,中間值是73,并顯示了灰度圖和二值化圖。 在實(shí)際測(cè)量中,由于環(huán)境亮度有所不同,測(cè)量值會(huì)有所不同.因?yàn)橄袼氐牧炼扰c曝光時(shí)間(積分時(shí)間)和環(huán)境亮度成正比,所以當(dāng)光線比較暗時(shí),增加曝光時(shí)間;當(dāng)光線比較亮?xí)r,減少曝光時(shí)間。曝光時(shí)間可用軟件調(diào)整。 圖9 測(cè)試數(shù)據(jù)2Fig.9 Test data 2 對(duì)圖9所示數(shù)據(jù)提高曝光時(shí)間,焦距保持8mm,鏡頭與目標(biāo)距離D不變,仍為30cm。得到測(cè)試數(shù)據(jù)如圖10所示。 圖10 測(cè)試數(shù)據(jù)3Fig.10 Test data 3 從圖中可以看到,增大曝光時(shí)間后,最大值、最小值、中間值明顯增大,中間值變?yōu)?35。因此,當(dāng)光線較暗時(shí),可增加曝光時(shí)間,增強(qiáng)識(shí)別能力。 文中仔細(xì)研究了CCD識(shí)別顏色的基本工作原理。設(shè)計(jì)了硬件電路,在MDK下編寫了C程序,采用中值算法得到了黑線的中線位置,通過PID算法控制了小車的行駛,實(shí)現(xiàn)了用攝像頭循跡,為智能小車的自動(dòng)循跡提供了一種新方法。測(cè)試結(jié)果表明:該方法相比于普通光電傳感器,具有性能可靠、穩(wěn)定、速度快等優(yōu)點(diǎn)。4.2 關(guān)鍵代碼
5 測(cè)試結(jié)果處理
6 結(jié)束語