版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
智能小車設(shè)計(jì)所謂智能系統(tǒng),應(yīng)該是在沒有人為因素干預(yù)下,能夠完全的或者部分的對外部刺激因素做出適當(dāng)響應(yīng)的系統(tǒng)。通常這種系統(tǒng)無論復(fù)雜還是簡單,其硬件結(jié)構(gòu)都可以分為傳感、控制以及執(zhí)行三個(gè)部分,好比人的各種感官、大腦以及四肢。下面就從這三個(gè)方面進(jìn)行智能小車的設(shè)計(jì),該小車具備自動(dòng)循跡能力(非人為控制下按照指定路線行走),并且隨著不同傳感器的加入,能夠完成更多的功能,比如壁障、走迷宮、尋光、通過電腦及手機(jī)等上位機(jī)控制等等。一、控制部分:圖1單片機(jī)最小系統(tǒng)原理圖圖2控制信號輸入部分原理圖圖3控制部分電源輸入開關(guān)圖4顯示接口圖5DS18B20/1838一體化接口及ISP接口該智能小車整個(gè)控制部分電路原理如以上5個(gè)圖所示,可分為主控芯片最小系統(tǒng)、控制信號輸入、電源以及各類接口四個(gè)部分。1.主控芯片最小系統(tǒng):在本設(shè)計(jì)中所使用的主控芯片為51系列單片機(jī),為保證其正常工作所必需的外圍電路包括晶振電路、復(fù)位電路以及P0口上拉電阻。當(dāng)然以上三個(gè)部分只能保證單片機(jī)正常運(yùn)轉(zhuǎn),但若只是這樣基本沒有什么實(shí)際意義,根據(jù)不同的任務(wù)要求,需要讓單片機(jī)在適當(dāng)?shù)囊_上連接相應(yīng)的設(shè)備。這里結(jié)合智能小車所需的功能以及未來方便擴(kuò)展的需要,除了設(shè)置4個(gè)3頭插針連接紅外光電開關(guān)、舵機(jī)(距離探測時(shí)會(huì)用到)以及給其他傳感器供電外,還將單片機(jī)P0、P1、P2、P3口用排針引出,其中P1使用雙排針,一排與8個(gè)LED燈相連,可在日后測試時(shí)方便觀察信號變化。具體連接如圖1所示。2.控制信號輸入部分:51系列單片機(jī)接收外部信號無非通過兩個(gè)渠道,一個(gè)是其4個(gè)并行的I/O口,另一個(gè)就是其自帶的串口,相較之下,串行口的拓展能力更強(qiáng)一些。如圖2所示,在本設(shè)計(jì)中,利用單片機(jī)的I/O口設(shè)置了4個(gè)按鍵進(jìn)行人機(jī)交互,同時(shí)在其串口上連接了一塊USB/串口轉(zhuǎn)換芯片PL2303。PL2303:是Prolific公司生產(chǎn)的一種高度集成的RS232-USB接口轉(zhuǎn)換器,可提供一個(gè)RS232全雙工異步串行通信裝置與USB功能接口便利聯(lián)接的解決方案。該器件內(nèi)置USB功能控制器、USB收發(fā)器、振蕩器和帶有全部調(diào)制解調(diào)器控制信號的UART,只需外接幾只電容就可實(shí)現(xiàn)USB信號與RS232信號的轉(zhuǎn)換,能夠方便嵌入到各種設(shè)備,該器件作為USB/RS232雙向轉(zhuǎn)換器,一方面從主機(jī)接收USB數(shù)據(jù)并將其轉(zhuǎn)換為RS232信息流格式發(fā)送給外設(shè);另一方面從RS232外設(shè)接收數(shù)據(jù)轉(zhuǎn)換為USB數(shù)據(jù)格式傳送回主機(jī)。這些工作全部由器件自動(dòng)完成,開發(fā)者無需考慮固件設(shè)計(jì)。PL2303的高兼容驅(qū)動(dòng)可在大多操作系統(tǒng)上模擬成傳統(tǒng)COM端口,并允許基于COM端口應(yīng)用可方便地轉(zhuǎn)換成USB接口應(yīng)用,通訊波特率高達(dá)6Mb/s。該器件具有以下特征:完全兼容USB1.1協(xié)議;可調(diào)節(jié)的3~5V輸出電壓,滿足3V、3.3V和5V不同應(yīng)用需求;支持完整的RS232接口,可編程設(shè)置的波特率:75b/s~6Mb/s,并為外部串行接口提供電源;512字節(jié)可調(diào)的雙向數(shù)據(jù)緩存;支持默認(rèn)的ROM和外部EEPROM存儲(chǔ)設(shè)備配置信息,具有I2C總線接口,支持從外部MODEM信號遠(yuǎn)程喚醒;支持Windows98,Windows2000,WindowsXP等操作系統(tǒng);28引腳的SOIC封裝。PL2303引腳功能列表:引腳名字類型引腳描述1TXD輸出數(shù)據(jù)輸出到串口;2DTR_N輸出數(shù)據(jù)終端準(zhǔn)備好,低電平有效;3RST_N輸出發(fā)送請求,低電平有效;4VDD_325電源RS232的電源,為串行端口信號的電源引腳;當(dāng)串口為3.3V,這應(yīng)該是3.3;當(dāng)串行端口是2.5V,這應(yīng)該是2.5V;5RXD輸入串口數(shù)據(jù)輸入;6RI_N輸入/輸出串行端口(環(huán)指示器);7GND電源接地;8NC無連接9DSR_N輸入/輸出串行端口(數(shù)據(jù)集就緒)10DCD_N輸入/輸出串行端口(數(shù)據(jù)載波檢測)11CTS_N輸入/輸出串行端口(清除發(fā)送)12SHTD_N輸出控制RS232收發(fā)器關(guān)機(jī)13EE_CLK輸入/輸出串行EEPROM時(shí)鐘14EE_DATA輸入/輸出串行EEPROM數(shù)據(jù)15DP輸入/輸出USB端口D+信號16DM輸入/輸出USB端口D-信號17VO_33常規(guī)3.3V電源輸出18GND接地19NC無連接20VDD_5電源USB端口的5V電壓電源21GND接地22GP0輸入/輸出通用I/O引腳023GP1輸入/輸出通用I/O引腳124NC無連接25GND_A模擬地鎖相環(huán)26PLL_TEST輸入PLL鎖相環(huán)測試模式控制27OSC1輸入晶體振蕩器輸入28OSC2輸入/輸出晶體振蕩器輸出SSOP28封裝以上是PL2303芯片的基本介紹,通俗的講就是該芯片通過驅(qū)動(dòng)可以在PC機(jī)上虛擬出一個(gè)COM口,使USB接口模擬串口的功能,一般使用情況下主要關(guān)心1、5、15、16四個(gè)引腳,具體連接參看圖2。3.電源部分:電源部分設(shè)計(jì)為雙供電方式,從圖3中可以看到,當(dāng)切換開關(guān)上方閉合時(shí),控制板通過電源接頭供電,當(dāng)切換開關(guān)下方閉合時(shí),控制板通過USB接口供電。 4.各類接口部分: 這里所提供的接口分別為1602、12864LCD標(biāo)準(zhǔn)接口、DS18B20/1838一體化接口、ISP接口以及圖2中所示的由PL2303芯片擴(kuò)展的USB接口,保證了基本的輸出擴(kuò)展及傳感器信號源擴(kuò)展。由于已將單片機(jī)的I/O口引出,不必?fù)?dān)心接口是否夠用的問題,日后根據(jù)需要通過杜邦線可以隨時(shí)擴(kuò)展新的接口。二、執(zhí)行部分: 這里所說的執(zhí)行部分指的是智能小車上能夠表現(xiàn)出其對外部條件作出的反應(yīng)的部分,這種反應(yīng)可以是運(yùn)動(dòng),也可以是聲或者光。圖6LED數(shù)碼管顯示1.LED數(shù)碼管顯示:圖6所示為4位共陽極LED數(shù)碼管顯示電路,該部分可用于實(shí)時(shí)顯示有關(guān)智能小車當(dāng)前運(yùn)行狀態(tài),比如速度、前方障礙物距離等等。如果根據(jù)實(shí)際需要進(jìn)行相應(yīng)的擴(kuò)展,則可以用于顯示更多類型的信息,比如加入A\D轉(zhuǎn)換器可以顯示當(dāng)前電池的電壓情況,加入溫度傳感器可以顯示當(dāng)前的工作溫度等等。圖7蜂鳴器2.蜂鳴器圖7所示為簡單的蜂鳴器電路,該蜂鳴器可用于對智能小車運(yùn)行時(shí)的一些特定狀況進(jìn)行聲音提示,如距離某物太近、轉(zhuǎn)向、脫離軌道、電量過低等等,不同的狀況可以使用不同的聲音組合進(jìn)行區(qū)分。3.運(yùn)動(dòng)部分:該智能小車的運(yùn)動(dòng)執(zhí)行部分由減速直流電機(jī)、輪胎以及相應(yīng)的驅(qū)動(dòng)電路組成,具體如圖8、9所示。該部分負(fù)責(zé)實(shí)時(shí)的執(zhí)行小車所需的各種運(yùn)動(dòng)(左右轉(zhuǎn)、前進(jìn)、后退等),若將輪胎部分換成履帶或者其它專用輪胎,則可以執(zhí)行翻越等更為復(fù)雜的運(yùn)動(dòng)。下面就該部分原理做較為詳盡的介紹。圖8直流減速電機(jī)及輪胎圖9雙L298N驅(qū)動(dòng)電路直流減速電機(jī):直流減速電機(jī)相較于普通直流電機(jī)的最大區(qū)別就是加入了減速齒輪組,通過調(diào)整齒輪比可以在轉(zhuǎn)速與扭矩之間進(jìn)行權(quán)衡,降低轉(zhuǎn)速則可以獲得較大扭矩,帶動(dòng)更重的設(shè)備,反之扭矩則減少。本設(shè)計(jì)中整個(gè)小車質(zhì)量相對于普通5V直流電機(jī)來說比較重,若選用較大功率的電機(jī),則耗電量與驅(qū)動(dòng)電路的負(fù)載將會(huì)增加,況且并不需要太高的速度,所以選用減速電機(jī),在同樣的功率下通過降低轉(zhuǎn)速獲得足夠的扭矩。輪胎:最常見的輪胎如圖8中所示的圓形輪胎,也是本設(shè)計(jì)中所使用的輪胎,其對于一般硬質(zhì)平地來說非常適用,除此之外還有履帶,適用于較軟并且凹凸不平路面以及專門用于攀爬樓梯等特殊障礙物的異形輪胎等。驅(qū)動(dòng)電路:小車直流電機(jī)工作電流一般是200-400mA有些更大,該設(shè)計(jì)中是四個(gè)輪子,那么總的電流在800-1600mA左右,這些電機(jī)輪子都是要接受單片機(jī)指令執(zhí)行相應(yīng)的動(dòng)作,而單片機(jī)I/O口一般只能提供5mA到10mA的電流,直接驅(qū)動(dòng)不了電機(jī),所以需要一個(gè)驅(qū)動(dòng)模塊,該驅(qū)動(dòng)模塊的作用就是根據(jù)單片機(jī)的指令提供足夠的電流。對于工作電壓12V以下,功耗25W以內(nèi)的設(shè)備可以選用專業(yè)的L298N,L293D驅(qū)動(dòng)芯片。這里我們選用L298N驅(qū)動(dòng)芯片,該芯片可以同時(shí)驅(qū)動(dòng)兩個(gè)電機(jī),所以采用雙L298N方案。L298N:圖10LL298N是ST公司的L298系列的一款常見的15功能引腳Multiwatt15或PoweSO20封裝的產(chǎn)品,如圖11所示,內(nèi)部包含4通道邏輯驅(qū)動(dòng)電路,即內(nèi)含兩個(gè)H橋的高電壓大電流雙全橋式驅(qū)動(dòng)器,如圖10所示,可以方便的驅(qū)動(dòng)兩個(gè)直流電機(jī),或一個(gè)四相步進(jìn)電機(jī)。L298N可接受標(biāo)準(zhǔn)TTL邏輯電平信號,輸入電壓范圍為+2.5~46V,輸出電壓最高可達(dá)50V,可以直接通過電源來調(diào)節(jié)輸出電壓,輸出電流可達(dá)2.5A,可驅(qū)動(dòng)電感性負(fù)載,可接入電流采樣電阻形成電流傳感信號,可以直接用單片機(jī)的IO口提供信號,而且L298N引腳功能表:引腳(MW15)引腳(PSO20)名稱功能1;152;19SenseA;SenseB在該引腳與地之間連接一個(gè)用于電流采樣的電阻,形成電流傳感信號來控制負(fù)載電流。2;34;5Out1;Out2A橋的輸出,并且這兩端之間的負(fù)載電流受到1號管腳的監(jiān)測。46VS供電電壓輸入端口,該端口的輸入電壓與橋的輸出電壓一致,范圍為+2.5~+46V,使用時(shí)必須在其與地之間接上一個(gè)100nF的無感電容。5;77;9Input1;Input2A橋TTL邏輯電平輸入端,與對應(yīng)A橋輸出一致(邏輯高則輸出,低則停止輸出)。6;118;14EnableA;EnableB邏輯電平使能端,為高則對應(yīng)橋按照邏輯電平正常輸出,為低時(shí)則停止。81;10;11;20GND接地912VSS邏輯參考電平輸入端,使用時(shí)必須在其與地之間接上一個(gè)100nF的無感電容。10;1213;15Input3;Input4B橋TTL邏輯電平輸入端,與對應(yīng)A橋輸出一致(邏輯高則輸出,低則停止輸出)。13;1416;17Out3;Out4B橋的輸出,并且這兩端之間的負(fù)載電流受到15號管腳的監(jiān)測。3;18N.C.懸空圖11在該驅(qū)動(dòng)電路中,除了L298N驅(qū)動(dòng)芯片外還包括LM2596S降壓穩(wěn)壓芯片以及ULN2003L集成達(dá)林頓管,具體連接如圖9所示。其作用分別為:LM2596S降壓穩(wěn)壓芯片:該芯片可以穩(wěn)定輸出5V(可調(diào))電壓,用于給控制板以及傳感器等較小功率設(shè)備提供一個(gè)穩(wěn)定的電壓,保證其的正常工作。ULN2003L集成達(dá)林頓管:將其所有管腳用排針引出,為了日后方便擴(kuò)展更大功率器件。在圖9中的16只二極管起到穩(wěn)壓保護(hù)作用,當(dāng)輸出電壓過高或過低時(shí),可以將其穩(wěn)定在合理的范圍之內(nèi)。若在4個(gè)OUT之間加入發(fā)光二極管,則可以直觀的看出當(dāng)前驅(qū)動(dòng)器的輸出狀態(tài),即電機(jī)的工作狀態(tài),如圖12所示圖12驅(qū)動(dòng)狀態(tài)指示電路下面給出一路電機(jī)的控制邏輯表,其他三路電機(jī)邏輯類同。從表中可以更為直觀的看出L298N驅(qū)動(dòng)芯片幾個(gè)關(guān)鍵引腳的功能,IN1和IN2之間高低電平切換可控制電機(jī)正反轉(zhuǎn),EN端高低變換可控制L298N輸出端是否按照輸入信號執(zhí)行。用兩個(gè)L298N連接前后左右4個(gè)電機(jī),參照表中的邏輯給不同的IN輸入邏輯電平,就可使小車完成前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)等動(dòng)作,比如一塊L298N芯片的OUT1、OUT2、OUT3、OUT4分別連接左側(cè)前后電機(jī)的正極、負(fù)極、正極、負(fù)極,另一塊L298N芯片的OUT1、OUT2、OUT3、OUT4分別連接右側(cè)前后電機(jī)的正極、負(fù)極、正極、負(fù)極,此時(shí)兩塊L298N的IN端輸入邏輯電平1010、1010則所有電機(jī)正轉(zhuǎn),小城前進(jìn);輸入1010、0101則小車左側(cè)前進(jìn),右側(cè)后退實(shí)現(xiàn)右轉(zhuǎn)等。當(dāng)然此邏輯會(huì)隨著實(shí)際的連接而改變,但原理相同。這里可以看到L298N中的EN端負(fù)責(zé)控制OUT端是否執(zhí)行IN端的輸入,使其在0、1之間按一定周期切換則可以實(shí)現(xiàn)小車的PWM控制,若想使小車全速運(yùn)行,則需將EN端與邏輯高電位始終相連。電機(jī)控制邏輯表:IN1IN2ENA電機(jī)000不轉(zhuǎn)010不轉(zhuǎn)100不轉(zhuǎn)110不轉(zhuǎn)001不轉(zhuǎn)101正轉(zhuǎn)011反轉(zhuǎn)111不轉(zhuǎn)三、傳感器部分:若要使小車智能化,就必須使其能夠?qū)ν饨绛h(huán)境的變化自行做出適當(dāng)?shù)胤从?,在這個(gè)過程中最為關(guān)鍵的因素就是如何感知外界的環(huán)境,完成這一任務(wù)的就是傳感器。不同的傳感器可以感知不同的環(huán)境因素,傳感器越豐富,小車可獲取到的因素種類就越多,這里將介紹幾個(gè)常用的傳感器。1.四路紅外線探測系統(tǒng):如圖13所示該系統(tǒng)是為智能小車、機(jī)器人等自動(dòng)化機(jī)械裝置提供一種多用途的紅外線探測系統(tǒng)。使用紅外線發(fā)射和接收管等分立元器件組成探頭,并使用LM339電壓比較器(加入遲滯電路),防止臨界輸出抖動(dòng)做為核心器件構(gòu)成中控電路。此系統(tǒng)具有的多種探測功能能極大的滿足各種自動(dòng)化、智能化的小型系統(tǒng)的應(yīng)用。圖13四路紅外線探測系統(tǒng)應(yīng)用范圍:1.智能化輪式車和智能化履帶車循跡、避障、防跌落;2.智能化小型機(jī)械人和智能化小型機(jī)械手物料檢測、色相檢測灰度檢測。特性:1.易于安裝,使用簡便;2.四路分別獨(dú)立工作,工作時(shí)不受數(shù)量限制中控板與探頭分開;3.安裝位置不受限制模塊高度≤4厘米;4.安全工作電壓范圍在4伏特至6伏特之間4路全開工作電流30毫安至40毫安之間;5.帶校正調(diào)節(jié)功能,R17、R18、R19、R20對應(yīng)比較電壓調(diào)節(jié)輸出端為集電極開路,板載4.7千歐上拉電阻。端口:+5、GND:電源接線端IN(1—4);OUT:探頭與中控板連接端;OUT1、OUT2、OUT3、OUT4:對應(yīng)輸出端;LED3、LED4、LED6、LED7:對應(yīng)輸出指示;原理:圖14所示為四路紅外線探測系統(tǒng)中的一路原理圖,其他三路與其一致,圖中左半部份為發(fā)射,右半部份為接收,R17負(fù)責(zé)調(diào)整基準(zhǔn)電壓,加入遲滯電路,防止臨界輸出抖動(dòng)。測試方法:如圖15所示,左側(cè)為傳感器測試電路,右側(cè)為傳感器安裝位置。1.測試探頭:移開探頭前面的所有物體,且探頭不要指向陽光的方向。將探頭板接上電源后用萬用表測最輸出端電壓。此時(shí)的電壓應(yīng)當(dāng)在1伏特左右。用白紙擋在探頭前。用萬用表測輸出端電壓應(yīng)當(dāng)接近電源電壓。2.測試中探板:將測試好的探頭按板上所標(biāo)示的接入輸入端子,移開探頭前面的所有物體,且探頭不要指向陽光的方向,將中探板接上電源后用萬用表測輸出端子,此時(shí)輸出端輸出的電壓應(yīng)當(dāng)接近電源電壓,用白紙擋在探頭前,萬用表測輸出端電壓應(yīng)當(dāng)接近0伏特,調(diào)整所在通道的電位器可以改變探測的距離。圖14一路紅外線探測系統(tǒng)原理圖調(diào)試靈敏度:1.調(diào)節(jié)其四路尋跡的的電位器(調(diào)節(jié)其靈敏度以適合其環(huán)境)具體調(diào)試方法如下:先用手握住小車離地,左右晃動(dòng),從左到右第一對紅外對管離開黑線時(shí),中控板指示D3燈應(yīng)會(huì)亮。當(dāng)紅外對管進(jìn)入黑線時(shí),中控板指示D3紅燈應(yīng)會(huì)滅,調(diào)節(jié)中控板R17使其工作在上述狀態(tài)。同理,調(diào)節(jié)其它三對探頭,使其正常工作。2.對應(yīng)順序:第二對紅外對應(yīng)靈敏度對應(yīng)指示燈為中控板D4,調(diào)節(jié)靈敏度電位器R18;第三對紅外對應(yīng)靈敏度對應(yīng)指示燈為中控板D5,調(diào)節(jié)靈敏度電位器R19;第四對紅外對應(yīng)靈敏度對應(yīng)指示燈為中控板D6,調(diào)節(jié)靈敏度電位器R20。圖15探頭測試2.US-100超聲波測距模塊:US-100超聲波測距模塊可實(shí)現(xiàn)0~4.5m的非接觸測距功能,擁有2.4~5.5V的寬電壓輸入范圍,靜態(tài)功耗低于2mA,自帶溫度傳感器對測距結(jié)果進(jìn)行校正(溫度會(huì)影響超聲波的測距精度),同時(shí)具有GPIO,串口等多種通信方式,內(nèi)帶看門狗,工作穩(wěn)定可靠。外觀如圖16所示,左圖為正面,右圖為背面,模塊的尺寸為45mm*20mm*1.6mm。板上有兩個(gè)半徑為1mm的機(jī)械孔。圖16US-100超聲波測距模塊 主要技術(shù)參數(shù): 工作電壓:DC2.4V~5.5V; 靜態(tài)電流:2mA; 工作溫度:-20~+70度; 輸出方式:電平或UART(跳線帽選擇); 感應(yīng)角度:小于15度; 探測距離:2cm-450cm 探測精度:0.3cm+1%; UART模式下串口配置:波特率9600,起始位1位,停止位1位,數(shù)據(jù)位8位,無奇偶校驗(yàn),無流控制。 接口說明 本模塊共有兩個(gè)接口,即模式選擇跳線(背面與電路板面垂直的兩個(gè)引腳)和5Pin接口(正面圖中向下的5個(gè)引腳)。 模式選擇跳線接口: 間距為2.54mm,當(dāng)插上跳線帽時(shí)為UART(串口)模式,拔掉時(shí)為電平觸發(fā)模式。 5Pin接口: 正面圖中從左到右依次編號1、2、3、4、5,功能如下表所示:1號Pin接VCC電源(供電范圍2.4V~5.5V)2號Pin當(dāng)為UART模式時(shí),接外部電路UART的TX端;當(dāng)為電平觸發(fā)模式時(shí),接外部電路的Trig端。3號Pin當(dāng)為UART模式時(shí),接外部電路UART的RX端;當(dāng)為電平觸發(fā)模式時(shí),接外部電路的Echo端。4號Pin接外部電路的地。5號Pin接外部電路的地。電平觸發(fā)測距工作原理:在模塊上電前,首先去掉模式選擇跳線上的跳線帽,使模塊處于電平觸發(fā)模式。圖17表明:只需要在Trig/TX管腳輸入一個(gè)10US以上的高電平,系統(tǒng)便可發(fā)出8個(gè)40KHZ的超聲波脈沖,然后檢測回波信號。當(dāng)檢測到回波信號后,模塊還要進(jìn)行溫度值的測量,然后根據(jù)當(dāng)前溫度對測距結(jié)果進(jìn)行校正,將校正后的結(jié)果通過Echo/RX管腳輸出。在此模式下,模塊將距離值轉(zhuǎn)化為340m/s時(shí)的時(shí)間值的2倍,通過Echo端輸出一高電平,可根據(jù)此高電平的持續(xù)時(shí)間來計(jì)算距離值。即距離值為:(高電平時(shí)間*340m/s)/2。注:因?yàn)榫嚯x值已經(jīng)經(jīng)過溫度校正,此時(shí)無需再根據(jù)環(huán)境溫度對超聲波聲速進(jìn)行校正,即不管溫度多少,聲速選擇340m/s即可。圖17US-100電平觸發(fā)測距時(shí)序圖串口觸發(fā)測距工作原理:圖18US-100串口出發(fā)測距時(shí)序在模塊上電前,首先插上模式選擇跳線上的跳線帽,使模塊處于串口觸發(fā)模式。串口觸發(fā)測距的時(shí)序如圖18所示:在此模式下只需要在Trig/TX管腳輸入0X55(波特率9600),系統(tǒng)便可發(fā)出8個(gè)40KHZ的超聲波脈沖,然后檢測回波信號。當(dāng)檢測到回波信號后,模塊還要進(jìn)行溫度值的測量,然后根據(jù)當(dāng)前溫度對測距結(jié)果進(jìn)行校正,將校正后的結(jié)果通過Echo/RX管腳輸出。輸出的距離值共兩個(gè)字節(jié),第一個(gè)字節(jié)是距離的高8位(HDate),第二個(gè)字節(jié)為距離的低8位(LData),單位為毫米。即距離值為(HData*256+LData)mm。串口觸發(fā)測溫工作原理:圖19US-100串口測溫時(shí)序在模塊上電前,首先插上模式選擇跳線上的跳線帽,使模塊處于串口觸發(fā)模式。串口觸發(fā)測溫的時(shí)序如圖19所示:在此模式下只需要在Trig/TX管腳輸入0X50(波特率9600),系統(tǒng)便啟動(dòng)溫度傳感器對當(dāng)前溫度進(jìn)行測量,然后將溫度值通過Echo/RX管腳輸出。測量完成溫度后,本模塊會(huì)返回一個(gè)字節(jié)的溫度值(TData),實(shí)際的溫度值為TData-45。例如通過TX發(fā)送完0X50后,在RX端收到0X45,則此時(shí)的溫度值為(0X45的10進(jìn)制值)-45=24度。超聲波測距模塊主要用于實(shí)現(xiàn)智能小車及機(jī)器人壁障這一功能,其型號有很多,但從原理上和使用方法上來講大同小異,這我們的設(shè)計(jì)中采用US-100這個(gè)型號的超聲波測距模塊,主要是因?yàn)樵撃K本身具備溫度校正功能,在編寫程序時(shí)較為方便。為了充分發(fā)揮超聲波模塊的作用,可給其配上一臺(tái)舵機(jī),使其能夠?qū)崿F(xiàn)多個(gè)方向的距離感應(yīng)。舵機(jī):在機(jī)器人機(jī)電控制系統(tǒng)中,舵機(jī)控制效果是性能的重要影響因素。舵機(jī)可以在微機(jī)電系統(tǒng)和航模中作為基本的輸出執(zhí)行機(jī)構(gòu),其簡單的控制和輸出使得單片機(jī)系統(tǒng)非常容易與之接口。
舵機(jī)是一種位置(角度)伺服的驅(qū)動(dòng)器,適用于那些需要角度不斷變化并可以保持的控制系統(tǒng)。目前在高檔遙控玩具,如航模,包括飛機(jī)模型,潛艇模型;遙控機(jī)器人中已經(jīng)使用得比較普遍。舵機(jī)是一種俗稱,其實(shí)是一種伺服馬達(dá)。圖20舵機(jī)1)工作原理:控制信號由接收機(jī)的通道進(jìn)入信號調(diào)制芯片,獲得直流偏置電壓。它內(nèi)部有一個(gè)基準(zhǔn)電路,產(chǎn)生周期為20ms,寬度為1.5ms的基準(zhǔn)信號,將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。最后,電壓差的正負(fù)輸出到電機(jī)驅(qū)動(dòng)芯片決定電機(jī)的正反轉(zhuǎn)。當(dāng)電機(jī)轉(zhuǎn)速一定時(shí),通過級聯(lián)減速齒輪帶動(dòng)電位器旋轉(zhuǎn),使得電壓差為0,電機(jī)停止轉(zhuǎn)動(dòng)。2)舵機(jī)的控制:舵機(jī)的控制一般需要一個(gè)20ms左右的時(shí)基脈沖,該脈沖的高電平部分一般為0.5ms~2.5ms范圍內(nèi)的角度控制脈沖部分。以180度角度伺服為例,那么對應(yīng)的控制關(guān)系是這樣的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;3)用單片機(jī)作為舵機(jī)的控制單元:用單片機(jī)可以使PWM信號的脈沖寬度實(shí)現(xiàn)微秒級的變化,從而提高舵機(jī)的轉(zhuǎn)角精度。單片機(jī)完成控制算法,再將計(jì)算結(jié)果轉(zhuǎn)化為PWM信號輸出到舵機(jī),由于單片機(jī)系統(tǒng)是一個(gè)數(shù)字系統(tǒng),其控制信號的變化完全依靠硬件計(jì)數(shù),所以受外界干擾較小,整個(gè)系統(tǒng)工作可靠。單片機(jī)系統(tǒng)實(shí)現(xiàn)對舵機(jī)輸出轉(zhuǎn)角的控制,必須首先完成兩個(gè)任務(wù):首先是產(chǎn)生基本的PWM周期信號,本設(shè)計(jì)是產(chǎn)生20ms的周期信號;其次是脈寬的調(diào)整,即單片機(jī)模擬PWM信號的輸出,并且調(diào)整占空比。當(dāng)系統(tǒng)中只需要實(shí)現(xiàn)一個(gè)舵機(jī)的控制,采用的控制方式是改變單片機(jī)的一個(gè)定時(shí)器中斷的初值,將20ms分為兩次中斷執(zhí)行,一次短定時(shí)中斷和一次長定時(shí)中斷。這樣既節(jié)省了硬件電路,也減少了軟件開銷,控制系統(tǒng)工作效率和控制精度都很高。圖21單片機(jī)控制舵機(jī)基本流程具體的設(shè)計(jì)過程:例如想讓舵機(jī)轉(zhuǎn)向左極限的角度,它的正脈沖為2ms,則負(fù)脈沖為20ms-2ms=18ms,所以開始時(shí)在控制口發(fā)送高電平,然后設(shè)置定時(shí)器在2ms后發(fā)生中斷,中斷發(fā)生后,在中斷程序里將控制口改為低電平,并將中斷時(shí)間改為18ms,再過18ms進(jìn)入下一次定時(shí)中斷,再將控制口改為高電平,并將定時(shí)器初值改為2ms,等待下次中斷到來,如此往復(fù)實(shí)現(xiàn)PWM信號輸出到舵機(jī)。用修改定時(shí)器中斷初值的方法巧妙形成了脈沖信號,調(diào)整時(shí)間段的寬度便可使伺服機(jī)靈活運(yùn)動(dòng)。為保證軟件在定時(shí)中斷里采集其他信號,并且使發(fā)生PWM信號的程序不影響中斷程序的運(yùn)行(如果這些程序所占用時(shí)間過長,有可能會(huì)發(fā)生中斷程序還未結(jié)束,下次中斷又到來的后果),所以需要將采集信號的函數(shù)放在長定時(shí)中斷過程中執(zhí)行,也就是說每經(jīng)過兩次中斷執(zhí)行一次這些程序,執(zhí)行的周期還是20ms。具體流程如圖21所示。以上介紹的傳感器可以保證智能小車完成循跡、壁障、走迷宮等功能,若想完成更為復(fù)雜的功能,可以通過添加適當(dāng)?shù)膫鞲衅鱽韺?shí)現(xiàn),具體細(xì)節(jié)在未來系統(tǒng)擴(kuò)展的在做介紹。前面,我們從硬件結(jié)構(gòu)方面對智能小車做了一個(gè)較為全面的分析,但是以上所包括的所有器件電路只能算作一個(gè)運(yùn)行平臺(tái),其包含了要實(shí)現(xiàn)功能所需的所有物質(zhì)實(shí)體,卻缺少智能系統(tǒng)所需的一個(gè)必要要素—“思想”,沒有“思想”談何智能。這里所指的“思想”在電子方面指的就是程序,要想讓小車真正實(shí)現(xiàn)智能化,通過合理的程序來調(diào)動(dòng)其各個(gè)部分協(xié)調(diào)工作是必不可少的。下面我們就來談?wù)劤绦蚍矫娴脑O(shè)計(jì)。四、程序部分:對于51系列單片機(jī)來說,程序設(shè)計(jì)一般使用匯編和C兩種語言。匯編語言接近底層,在時(shí)序控制方面可以做到十分精確,但缺點(diǎn)是可讀性差,不容易實(shí)現(xiàn)模塊化;C語言雖然精確度上稍稍不及匯編,但在其他方面均優(yōu)于匯編語言,所以目前除了時(shí)序要求非常嚴(yán)格的接口驅(qū)動(dòng)喜歡用匯編語言編寫外,其余大部分越來越多的喜歡使用C語言。下面就以C語言作為程序編寫語言,用模塊化的思想設(shè)計(jì)智能小車各部分的程序。1.小車基本運(yùn)動(dòng)程序設(shè)計(jì):顧名思義,該部分程序負(fù)責(zé)讓主控部分協(xié)調(diào)小車各部分完成前進(jìn)、后退、左右轉(zhuǎn)向等基本動(dòng)作。這里要說明一下,一個(gè)模塊可以理解為一項(xiàng)任務(wù),大任務(wù)可以分解為若干個(gè)小任務(wù),也就是模塊可分模塊,一個(gè)任務(wù)包含若干功能,一個(gè)功能在C語言中我們習(xí)慣用一個(gè)子函數(shù)來描述,所以可以這樣理解,一個(gè)模塊就是由若干個(gè)子函數(shù)構(gòu)成的,整個(gè)系統(tǒng)也可以理解為一個(gè)項(xiàng)目中最大的模塊。硬件的連接方式會(huì)影響程序的編寫,一般這種影響只局限于I/O口的變動(dòng),也就是說改變硬件連接后一般只需要將程序中的I/O口變量做適當(dāng)?shù)恼{(diào)整就可以實(shí)現(xiàn)原先的功能。下面我們參照圖9,按照以下方式連接對小車基本運(yùn)動(dòng)程序進(jìn)行設(shè)計(jì),其他連接方式程序雷同。 根據(jù)前面描述,EN1EN2為驅(qū)動(dòng)使能端,若給其PWM輸入,則可以通過一起一停,調(diào)整起停所占時(shí)間比例的方式控制小車的運(yùn)動(dòng)速度。若要全速運(yùn)行,只需直將使能端通過跳線帽接在+5V上即可。下面的程序只是基本運(yùn)動(dòng),所以采用全速方式。然后P1_0P1_1接IN1IN2P1_2P1_3接IN3IN4P1_4P1_5接P1_6P1_7接IN7IN8IN5IN6;左上電機(jī)接驅(qū)動(dòng)板子輸出端(藍(lán)色端子OUT1OUT2)、左下電機(jī)接驅(qū)動(dòng)板子輸出端(藍(lán)色端子OUT3OUT4)、右上電機(jī)接驅(qū)動(dòng)板子輸出端(藍(lán)色端子OUT5OUT6)、單片機(jī)I/O口輸出電機(jī)運(yùn)行狀態(tài)P1_0=1,P1_1=0左上電機(jī)正轉(zhuǎn)P1_0=0,P1_1=1左上電機(jī)反轉(zhuǎn)P1_0=0,P1_1=0左上電機(jī)停轉(zhuǎn)P1_0=1,P1_1=1左上電機(jī)剎停P1_2=1,P1_3=0左下電機(jī)正轉(zhuǎn)P1_2=0,P1_3=1左下電機(jī)反轉(zhuǎn)P1_2=0,P1_3=0左下電機(jī)停轉(zhuǎn)P1_2=1,P1_3=1左下電機(jī)剎停P1_4=1,P1_5=0右上電機(jī)正轉(zhuǎn)P1_4=0,P1_5=1右上電機(jī)反轉(zhuǎn)P1_4=0,P1_5=0右上電機(jī)停轉(zhuǎn)P1_4=1,P1_5=1右上電機(jī)剎停P1_6=1,P1_7=0右下電機(jī)正轉(zhuǎn)P1_6=0,P1_7=1右下電機(jī)反轉(zhuǎn)P1_6=0,P1_7=0右下電機(jī)停轉(zhuǎn)P1_6=1,P1_7=1右下電機(jī)剎停根據(jù)上表,做以下宏定義,方便后面程序的編寫,具體如下表所示:宏命令功能#defineLeft_moto_go{P1_0=1,P1_1=0,P1_2=1,P1_3=0;}左邊兩個(gè)電機(jī)正轉(zhuǎn)(智能小車左半部分前進(jìn))#defineLeft_moto_back{P1_0=0,P1_1=1,P1_2=0,P1_3=1;}左邊兩個(gè)電機(jī)反轉(zhuǎn)(智能小車左半部分后退)#defineLeft_moto_Stop{P1_0=0,P1_1=0,P1_2=0,P1_3=0;}左邊兩個(gè)電機(jī)停轉(zhuǎn)(智能小車左半部分停止)#defineRight_moto_go{P1_4=1,P1_5=0,P1_6=1,P1_7=0;}右邊兩個(gè)電機(jī)正轉(zhuǎn)(智能小車右半部分前進(jìn))#defineRight_moto_back{P1_4=0,P1_5=1,P1_6=0,P1_7=1;}右邊兩個(gè)電機(jī)反轉(zhuǎn)(智能小車右半部分后退)#defineRight_moto_Stop{P1_4=0,P1_5=0,P1_6=0,P1_7=0;}右邊兩個(gè)電機(jī)停轉(zhuǎn)(智能小車右半部分停止)如此一來就不難給出智能小車的4個(gè)基本運(yùn)動(dòng)函數(shù)的流程及代碼:1)流程:圖22小車基本運(yùn)動(dòng)流程圖2)代碼:全速前進(jìn):voidrun(void){ Left_moto_go; Right_moto_go;}全速后退:voidbackrun(void){ Left_moto_back; Right_moto_back;}左轉(zhuǎn):voidleftrun(void){ Left_moto_back; Right_moto_go;}右轉(zhuǎn):voidrightrun(void){ Left_moto_go; Right_moto_back;}若要讓小車完成某個(gè)動(dòng)作,只需在主函數(shù)MAIN中循環(huán)調(diào)用相應(yīng)的運(yùn)動(dòng)子函數(shù)即可,比如讓小車全速前進(jìn)可實(shí)現(xiàn)如下: voidmain(void){ while(1) { run(); }}2.小車PWM運(yùn)行程序設(shè)計(jì):PWM運(yùn)行,簡而言之就是通過讓電機(jī)一轉(zhuǎn)一停,調(diào)整轉(zhuǎn)停比來控制小車速度的運(yùn)行方式。通過前面的介紹可以知道可以通過向L298N芯片的ENA、ENB端輸入PWM信號來實(shí)現(xiàn),缺點(diǎn)是會(huì)占用單片機(jī)的I/O口。另一種方法是直接向IN端輸出PWM的方法,比如結(jié)合前面的單片機(jī)I/O輸出與電機(jī)運(yùn)行狀態(tài)關(guān)系表,驅(qū)動(dòng)端IN1=1IN2=0時(shí)全速前進(jìn)IN1=1,IN2=1時(shí)電機(jī)剎停,由此可以看出先使小車處于某個(gè)運(yùn)行狀態(tài),然后給4個(gè)電機(jī)的其中一端輸入一個(gè)PWM信號,小車就會(huì)按照占空比由于左右轉(zhuǎn)向無需以PMW方式運(yùn)行,與之前基本運(yùn)動(dòng)程序一樣,所以該部分程序主要針對小車的前進(jìn)與后退進(jìn)行設(shè)計(jì),其均可分為三個(gè)部分:前進(jìn)/后退函數(shù);左右電機(jī)調(diào)速函數(shù);定時(shí)器0中斷函數(shù),具體如下:前進(jìn)/后退函數(shù):1)流程:圖23小車PWM運(yùn)行中前進(jìn)/后退函數(shù)流程2)代碼:前進(jìn):voidrun(void){push_val_left=7; //占空比調(diào)節(jié)變量0-9。。。9最小,0最大 push_val_right=7; Left_moto_go; Right_moto_go;}后退:voidbackrun(void){push_val_left=3; //占空比調(diào)節(jié)變量0-9。。。0最小,9最大 push_val_right=3; Left_moto_back; Right_moto_back;}該函數(shù)的功能主要是確定小車的當(dāng)前運(yùn)行進(jìn)本狀態(tài),類似于初始化函數(shù),不循環(huán)調(diào)用,旨在給后面的PWM運(yùn)行函數(shù)做運(yùn)行前準(zhǔn)備工作。左右電機(jī)調(diào)速函數(shù):1)流程:圖24左右電機(jī)調(diào)速函數(shù)流程2)代碼:左電機(jī)調(diào)速: voidpwm_out_left_moto(void){if(Left_moto_stop)//左側(cè)電機(jī)起停變量{if(pwm_val_left<=push_val_left) { Left_moto_pwm=1;//左前電機(jī)PWM輸入變量,等同于P1.1 Left_moto_pwm1=1;//左后電機(jī)PWM輸入變量,等同于P1.3 } else { Left_moto_pwm=0; Left_moto_pwm1=0; } if(pwm_val_left>=10) pwm_val_left=0;}else{Left_moto_pwm=0;Left_moto_pwm1=0; }}右電機(jī)調(diào)速:voidpwm_out_right_moto(void){if(Right_moto_stop)//右側(cè)電機(jī)起停變量{if(pwm_val_right<=push_val_right) { Right_moto_pwm=1;//右前電機(jī)PWM輸入變量,等同于P1.5 Right_moto_pwm1=1;//右后電機(jī)PWM輸入變量,等同于P1.7 } else { Right_moto_pwm=0; Right_moto_pwm1=0; } if(pwm_val_right>=10) pwm_val_right=0;}else{Right_moto_pwm=0;Right_moto_pwm1=0; }}該函數(shù)負(fù)責(zé)給4個(gè)電機(jī)一端按照預(yù)設(shè)占空比進(jìn)行PWM信號輸出。定時(shí)器0中斷函數(shù):1)流程:圖25定時(shí)器0中斷函數(shù)流程 2)代碼: voidtimer0()interrupt1using2{TH0=0XFc; //1Ms定時(shí) TL0=0X18; time++; pwm_val_left++; pwm_val_right++; pwm_out_left_moto(); pwm_out_right_moto();} 該中斷函數(shù)負(fù)責(zé)PWM信號輸出所需的時(shí)間控制。使用以上3個(gè)子函數(shù)便可完成小車前進(jìn)與后退的PWM運(yùn)行,通過占空比變量的不同取值可以調(diào)整小車的運(yùn)行速度。這里需要注意的是,在本設(shè)計(jì)中,前進(jìn)時(shí)占空比變量越大,則小車向前跑的越慢,后退時(shí)則相反;運(yùn)行停止變量在小車前進(jìn)時(shí)只能起到預(yù)備停止的作用,若要使小車完全停止需在一開始調(diào)用停止函數(shù),而在后退時(shí)則可以僅通過停止變量使小車停止。下面以小車PWM前進(jìn)為例看看以上幾個(gè)子程序是如何協(xié)調(diào)工作的。 voidmain(void){ TMOD=0X01; TH0=0XFc; //1ms定時(shí) TL0=0X18; TR0=1; ET0=1; EA=1;run(); //PWM,調(diào)速前進(jìn) while(1) /*無限循環(huán)*/ { }}3.小車循跡程序設(shè)計(jì):所謂小車循跡,就是讓小車自行順著預(yù)先設(shè)置好運(yùn)動(dòng)軌跡前進(jìn),效果好像小車自己跟人一樣能夠看到預(yù)設(shè)路線似的,但實(shí)際上有一部分小車是和人一樣用“眼”看,而另一部分小車則是像蝙蝠一樣用其它感官去“看”。上面提到的“眼”實(shí)際就是攝像頭,俗稱電子眼,通常使用的是CCD光學(xué)傳感器件;其它感官則如我們前面提到的四路紅外探測系統(tǒng)。電子眼的優(yōu)點(diǎn)是定位精確,但后續(xù)數(shù)據(jù)處理工作量較為龐大,為保持實(shí)時(shí)性,需要配套類似于DSP等高速運(yùn)算型MCU,整體成本較高,所以只應(yīng)用于對精度有特殊要求的領(lǐng)域;四路紅外探測系統(tǒng)在精度上無法和電子眼相提并論,但貴在其后續(xù)數(shù)據(jù)處理簡單,51系列單片機(jī)就可以輕松勝任,整體成本低,能夠勝任于一般精度要求的系統(tǒng)。在本設(shè)計(jì)中循跡過程中的“眼”采用的就是四路紅外探測系統(tǒng),有關(guān)該系統(tǒng)的原理前面已經(jīng)做了詳細(xì)介紹,下面主要進(jìn)行小車循跡部分的程序設(shè)計(jì)。按照慣例,在做程序設(shè)計(jì)之前首先要將硬件部分連接確定下來。完成循跡功能首先要使小車具備運(yùn)動(dòng)能力,這部分仍按照之前的接法,不用PWM運(yùn)行方式,除此之外就是四路紅外探測系統(tǒng)了,這部分的接法如下(參照圖1、9、13、14):四路尋跡傳感器電源+5VGND取自于單片機(jī)板靠近液晶調(diào)節(jié)對比度的電源輸出接口;P3_2接四路尋跡模塊接口第一路輸出信號即中控板上面標(biāo)記為OUT1;P3_3接四路尋跡模塊接口第二路輸出信號即中控板上面標(biāo)記為OUT2;P3_4接四路尋跡模塊接口第三路輸出信號即中控板上面標(biāo)記為OUT3;P3_5接四路尋跡模塊接口第四路輸出信號即中控板上面標(biāo)記為OUT4。按照前面對四路紅外探測系統(tǒng)原理的分析,當(dāng)某個(gè)探頭遇白線時(shí)輸出信號為0,遇黑線時(shí)輸出信號為1。下面對關(guān)鍵的幾個(gè)接口做如下宏定義,方便程序編寫,四個(gè)探頭至左向右分別命名為Left_1_led、Left_2_led、Right_1_led、Right_2_led。宏定義描述#defineLeft_1_ledP3_4P3_4接四路尋跡模塊接口第一路輸出信號即中控板上面標(biāo)記為OUT1#defineLeft_2_ledP3_5P3_5接四路尋跡模塊接口第二路輸出信號即中控板上面標(biāo)記為OUT2#defineRight_1_ledP3_6P3_6接四路尋跡模塊接口第三路輸出信號即中控板上面標(biāo)記為OUT3#defineRight_2_ledP3_7P3_7接四路尋跡模塊接口第四路輸出信號即中控板上面標(biāo)記為OUT4這里需要說明的是,一般完成循跡只需要兩個(gè)與小車中軸線左右對稱的探頭即可,若軌跡線的寬度較小則選擇使用內(nèi)側(cè)兩個(gè)探頭,反之選擇外側(cè)兩個(gè)探頭,軌跡線的最大寬度應(yīng)限制在最外側(cè)兩個(gè)探頭之間,否則無法完成循跡。不管使用那兩個(gè)探頭,剩下的兩個(gè)探頭均可換成向前突出型的,可用于避障,不過目前還是采用超聲波避障更為方便,所以在這里不就此作過多的介紹。1)流程:圖26小車循跡子函數(shù)流程2)代碼:voidTracking(void){ if(Left_2_led==0&&Right_1_led==0) run(); else { if(Right_1_led==1&&Left_2_led==0) //右邊檢測到黑線 { Rightrun() } if(Left_2_led==1&&Right_1_led==0) //左邊檢測到黑線 { Leftrun(); } }}以上便是幾個(gè)小車循跡的關(guān)鍵函數(shù),若要真正實(shí)現(xiàn)功能,需包含頭文件、宏定義、全局變量定義等形成完整可編譯程序。小車循跡完整代碼:#include<AT89x51.H>#defineLeft_1_ledP3_4 //P3_4接四路尋跡模塊接口第一路輸出信號即中控板上面標(biāo)記為OUT1#defineLeft_2_ledP3_5 //P3_5接四路尋跡模塊接口第二路輸出信號即中控板上面標(biāo)記為OUT2 #defineRight_1_ledP3_6 //P3_6接四路尋跡模塊接口第三路輸出信號即中控板上面標(biāo)記為OUT3#defineRight_2_ledP3_7 //P3_7接四路尋跡模塊接口第四路輸出信號即中控板上面標(biāo)記為OUT4#defineLeft_moto_go{P1_0=1,P1_1=0,P1_2=1,P1_3=0;}//左邊兩個(gè)電機(jī)向前走#defineLeft_moto_back{P1_0=0,P1_1=1,P1_2=0,P1_3=1;} //左邊兩個(gè)電機(jī)向后轉(zhuǎn)#defineLeft_moto_Stop{P1_0=0,P1_1=0,P1_2=0,P1_3=0;}//左邊兩個(gè)電機(jī)停轉(zhuǎn)#defineRight_moto_go{P1_4=1,P1_5=0,P1_6=1,P1_7=0;} //右邊兩個(gè)電機(jī)向前走#defineRight_moto_back{P1_4=0,P1_5=1,P1_6=0,P1_7=1;} //右邊兩個(gè)電機(jī)向前走#defineRight_moto_Stop{P1_4=0,P1_5=0,P1_6=0,P1_7=0;} //右邊兩個(gè)電機(jī)停轉(zhuǎn)unsignedcharpwm_val_left=0;unsignedcharpush_val_left=1;//左電機(jī)占空比10/40unsignedcharpwm_val_right=0;unsignedcharpush_val_right=1;//右電機(jī)占空比10/40bitRight_moto_stop=1;bitLeft_moto_stop=1;/************************************************************************/ //延時(shí)函數(shù) voiddelay(unsignedintk){ unsignedintx,y; for(x=0;x<k;x++) for(y=0;y<2000;y++);}/************************************************************************///前速前進(jìn)voidrun(void){ Left_moto_go; Right_moto_go;}/************************************************************************///左轉(zhuǎn)voidLeftrun(void){ Left_moto_back;//左電機(jī)往前走 Right_moto_go;//右電機(jī)往前走}/************************************************************************///右轉(zhuǎn)voidRightrun(void){ Left_moto_go;//左電機(jī)往前走 Right_moto_back;//右電機(jī)往前走}/************************************************************************///循跡函數(shù)voidTracking(void){ if(Left_2_led==0&&Right_1_led==0) run(); else { if(Right_1_led==1&&Left_2_led==0) //右邊檢測到黑線 { Rightrun(); } if(Left_2_led==1&&Right_1_led==0) //左邊檢測到黑線 { Leftrun(); } }}/*********************************************************************/ /*--主函數(shù)--*/voidmain(void){ delay(100); //延時(shí)一段時(shí)間 run(); while(1) /*無限循環(huán)*/ { Tracking(); }}4.小車避障程序設(shè)計(jì):所謂小車壁障,是指小車在有些許障礙無的區(qū)域內(nèi)行進(jìn)時(shí)時(shí)能夠自行避開障礙,選擇合適路線前進(jìn)。若想實(shí)現(xiàn)此功能,用于測量距離的傳感器必不可少,這里我們選用前面介紹的US-100型超聲波測距模塊。在安裝方式上有以下兩種:1)將此模塊直接固定在小車車身上。這種安裝方式只能使小車檢測到相對于小車車身某個(gè)固定方向(取決于測距模塊的朝向)的障礙物,小車可以據(jù)此調(diào)整行進(jìn)方向,但是對于下一方向上是否仍有障礙物預(yù)先是不知道的,若區(qū)域障礙物布局較為復(fù)雜,則小車容易陷入原地循環(huán)轉(zhuǎn)向的狀態(tài),使前進(jìn)效率減低甚至無法前進(jìn),為避免此情況的發(fā)生,必須在程序運(yùn)行過程中記錄小車的運(yùn)行軌跡,然后據(jù)此估算出沒有障礙物的方向,所以程序設(shè)計(jì)較為復(fù)雜,無法根本解決效率低的問題,同時(shí)整個(gè)避障過程看起來比較“傻”。2)將此模塊通過舵機(jī)固定在小車車身上。這種安裝方式最大的好處就是在小車自身不改變方向的前提下,可以檢測到以小車車身為圓心某個(gè)角度扇形范圍(根據(jù)舵機(jī)型號的不同,一般為180度到360度)內(nèi)的所有障礙物,小車可據(jù)此直接選擇轉(zhuǎn)向到無障礙物的方向繼續(xù)前進(jìn),程序設(shè)計(jì)起來也較為方便,小車前進(jìn)效率高,整個(gè)避障過程顯得比較“智能”。由此,我們按照第二種安裝方式進(jìn)行程序設(shè)計(jì)。這里我們只取正前、正左、正右三個(gè)方向的檢測結(jié)果。舵機(jī)控制程序設(shè)計(jì):關(guān)于舵機(jī)的控制及工作原理前面已經(jīng)做過詳細(xì)介紹,連接上由單片機(jī)的P2.7口連接舵機(jī)的PWM控制信號輸入端。程序方面可分為舵機(jī)控制,用于控制舵機(jī)旋轉(zhuǎn)到設(shè)定角度;定時(shí)器中斷部分,用于提供控制舵機(jī)所需的精確單位時(shí)間參考兩個(gè)部分。舵機(jī)控制函數(shù):1)流程:圖27舵機(jī)控制函數(shù)流程2)代碼:voidpwm_Servomoto(void){if(pwm_val_left<=push_val_left) Sevro_moto_pwm=1; else Sevro_moto_pwm=0; if(pwm_val_left>=200) pwm_val_left=0;}其中push_val_left為全局變量,用于設(shè)定舵機(jī)旋轉(zhuǎn)角度,在本設(shè)計(jì)中一個(gè)時(shí)間單位為100us,所以5為0度(右轉(zhuǎn)滿),14為90度(歸中),23為180度(左轉(zhuǎn)滿);pwm_val_left為單位時(shí)間計(jì)數(shù)變量;Sevro_moto_pwm為單片機(jī)P2.7關(guān)鍵新命名。定時(shí)器中斷函數(shù):1)流程:圖28定時(shí)器中斷函數(shù)流程這里的單位時(shí)間計(jì)數(shù)變量除了用于舵機(jī)角度控制的以外,還包括其他設(shè)備所需的變量,并不是唯一的,該函數(shù)的主要目的是提供一個(gè)100US的時(shí)間單位。2)代碼:voidtime1()interrupt3using2{ TH1=(65536-100)/256; //100US定時(shí) TL1=(65536-100)%256; //定時(shí)器100US為準(zhǔn)。在這個(gè)基礎(chǔ)上延時(shí) pwm_val_left++;//此處加入其它所需計(jì)數(shù)變量 pwm_Servomoto();}若要實(shí)現(xiàn)舵機(jī)控制,除了用到以上兩個(gè)函數(shù)外,還需要預(yù)先設(shè)定角度變量push_val_left,初始化定時(shí)器,打開中斷等。下面以舵機(jī)歸中為例來解釋其具體用法,其他角度只是push_val_left變量賦值不同,具體數(shù)值與角度對應(yīng)關(guān)系參看前面關(guān)于舵機(jī)介紹部分。舵機(jī)歸中:voidmain(void){ TMOD=0X11; TH1=(65536-100)/256; //100US定時(shí) TL1=(65536-100)%256; TH0=0; TL0=0; TR1=1; ET1=1; ET0=1; EA=1;push_val_left=14; //舵機(jī)歸中while(timer<=4000); timer=0;}注意程序中加粗的部分:1)歸中所需計(jì)數(shù)值14;2)timer是新加入的全局變量,添加到前面定時(shí)器中斷函數(shù)中加粗部分,和pwm_val_left一起計(jì)數(shù),作用是延遲足夠的時(shí)間使舵機(jī)轉(zhuǎn)到位;3)4000這個(gè)數(shù)值可延遲400MS,可根據(jù)實(shí)際情況進(jìn)行增減。超聲波測距程序設(shè)計(jì):參考前面關(guān)于US-100型超聲波測距模塊的介紹,并將模塊的ECHO端與單片機(jī)P2.4相連、TRIG端與單片機(jī)P2.5相連,則該部分流程及代碼如下:1)流程:圖29超聲波測距流程2)代碼:voidStartModule_Conut(void) { //啟動(dòng)測距信號TRIG=1; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); TRIG=0;//計(jì)算距離 while(!ECHO); //當(dāng)RX為零時(shí)等待 TR0=1; //開啟計(jì)數(shù) while(ECHO); //當(dāng)RX為1計(jì)數(shù)并等待 TR0=0; //關(guān)閉計(jì)數(shù) time=TH0*256+TL0; //讀取脈寬長度 TH0=0; TL0=0; S=(time*1.7)/100;//算出來是CM disbuff[0]=S%1000/100;//更新顯示 disbuff[1]=S%1000%100/10; disbuff[2]=S%1000%10%10;}其中S為全局變量,用來存儲(chǔ)當(dāng)前測得前方障礙物距離;disbuff[]為全局?jǐn)?shù)組,用來存放用于顯示距離的數(shù)據(jù)。小車避障函數(shù)設(shè)計(jì):有了舵機(jī)以及超聲波測距模塊的程序,再結(jié)合前面小車基本運(yùn)動(dòng)程序就可以實(shí)現(xiàn)小城避障了,具體流程及代碼如下:1)流程:圖30小車避障程序流程2)代碼:voidObs_Avoidance(void){ if(timer>=1000) //100MS檢測啟動(dòng)檢測一次 { timer=0; StartModule_Conut();//啟動(dòng)檢測,計(jì)算距離 if(S<20) //距離小于20CM { stoprun(); //小車停止 push_val_left=5; //舵機(jī)向左轉(zhuǎn)90度 timer=0; while(timer<=4000);//延時(shí)400MS讓舵機(jī)轉(zhuǎn)到其位置 StartModule_Conut();//啟動(dòng)檢測,計(jì)算距離 S2=S; push_val_left=23; //舵機(jī)向右轉(zhuǎn)90度 timer=0; while(timer<=4000);//延時(shí)400MS讓舵機(jī)轉(zhuǎn)到其位置 StartModule_Conut();//啟動(dòng)檢測,計(jì)算距離 S4=S; push_val_left=14; //舵機(jī)歸中 timer=0; while(timer<=4000);//延時(shí)400MS讓舵機(jī)轉(zhuǎn)到其位置 if((S2<20)||(S4<20))//只要左右各有距離小于,20CM小車后退 { backrun(); //后退 timer=0; while(timer<=4000); } if(S2>S4) { rightrun(); //車的左邊比車的右邊距離小 右轉(zhuǎn) timer=0; while(timer<=4000); } else { leftrun(); //車的左邊比車的右邊距離大 左轉(zhuǎn) timer=0; while(timer<=4000); } } else if(S>30) //距離大于,30CM往前走 run(); }}以上便是幾個(gè)小車避障的關(guān)鍵函數(shù),若要真正實(shí)現(xiàn)功能,需包含頭文件、宏定義、全局變量定義等形成完整可編譯程序。下面的代碼包含實(shí)時(shí)測距結(jié)果數(shù)碼管顯示功能。小車避障完整程序代碼:#include<AT89x51.H>#include<intrins.h>#defineSevro_moto_pwmP2_7 //接舵機(jī)信號端輸入PWM信號調(diào)節(jié)速度#defineECHOP2_4 //超聲波接口定義#defineTRIGP2_5 //超聲波接口定義#defineLeft_moto_go{P1_0=1,P1_1=0,P1_2=1,P1_3=0;}//左邊兩個(gè)電機(jī)向前走#defineLeft_moto_back{P1_0=0,P1_1=1,P1_2=0,P1_3=1;} //左邊兩個(gè)電機(jī)向后轉(zhuǎn)#defineLeft_moto_Stop{P1_0=0,P1_1=0,P1_2=0,P1_3=0;}//左邊兩個(gè)電機(jī)停轉(zhuǎn)#defineRight_moto_go{P1_4=1,P1_5=0,P1_6=1,P1_7=0;} //右邊兩個(gè)電機(jī)向前走#defineRight_moto_back{P1_4=0,P1_5=1,P1_6=0,P1_7=1;} //右邊兩個(gè)電機(jī)向前走#defineRight_moto_Stop{P1_4=0,P1_5=0,P1_6=0,P1_7=0;} //右邊兩個(gè)電機(jī)停轉(zhuǎn)unsignedcharconstdiscode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};unsignedcharconstpositon[3]={0xfe,0xfd,0xfb};unsignedchardisbuff[4] ={0,0,0,0,};unsignedcharposit=0;unsignedcharpwm_val_left=0;//變量定義unsignedcharpush_val_left=14;//舵機(jī)歸中,產(chǎn)生約,1.5MS信號unsignedlongS=0;unsignedlongS1=0;unsignedlongS2=0;unsignedlongS3=0;unsignedlongS4=0;unsignedinttime=0; //時(shí)間變量unsignedinttimer=0; //延時(shí)基準(zhǔn)變量unsignedchartimer1=0; //掃描時(shí)間變量 /************************************************************************/voiddelay(unsignedintk) //延時(shí)函數(shù){ unsignedintx,y; for(x=0;x<k;x++) for(y=0;y<2000;y++);}/************************************************************************/voidDisplay(void) //掃描數(shù)碼管{ if(posit==0) {P0=(discode[disbuff[posit]])&0x7f;}//產(chǎn)生點(diǎn) else {P0=discode[disbuff[posit]];} if(posit==0) {P2_1=0;P2_2=1;P2_3=1;} if(posit==1) {P2_1=1;P2_2=0;P2_3=1;} if(posit==2) {P2_1=1;P2_2=1;P2_3=0;} if(++posit>=3) posit=0; }/************************************************************************/voidStartModule_Conut(void) { //啟動(dòng)測距信號 TRIG=1; _nop_();_nop_();_nop_(); _nop_();_nop_();_nop_(); _nop_();_nop_();_nop_(); _nop_();_nop_();_nop_(); _nop_();_nop_();_nop_(); _nop_();_nop_();_nop_(); _nop_();_nop_();_nop_(); TRIG=0; //計(jì)算距離 while(!ECHO); //當(dāng)RX為零時(shí)等待 TR0=1; //開啟計(jì)數(shù) while(ECHO); //當(dāng)RX為1計(jì)數(shù)并等待 TR0=0; //關(guān)閉計(jì)數(shù) time=TH0*256+TL0; //讀取脈寬長度 TH0=0; TL0=0; S=(time*1.7)/100;//算出來是CM disbuff[0]=S%1000/100;//更新顯示 disbuff[1]=S%1000%100/10; disbuff[2]=S%1000%10%10;}/************************************************************************///前速前進(jìn)voidrun(void){ Left_moto_go;//左電機(jī)往前走
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五電影制作保密合同范本6篇
- 二零二五版木材行業(yè)碳排放權(quán)交易合同范本8篇
- 2025年個(gè)人住宅房產(chǎn)抵押擔(dān)保合同范本
- 課題申報(bào)參考:內(nèi)感受干預(yù)促進(jìn)青少年情緒能力的神經(jīng)基礎(chǔ)
- 課題申報(bào)參考:民事訴訟法的基礎(chǔ)理論和基本制度研究
- 2025年度住宅小區(qū)停車位共有產(chǎn)權(quán)轉(zhuǎn)讓合同范本
- 2025年個(gè)人房產(chǎn)繼承權(quán)轉(zhuǎn)讓合同范本2篇
- 2025版農(nóng)機(jī)具租賃與智能灌溉系統(tǒng)合同4篇
- 二零二五版美容美發(fā)院加盟店會(huì)員管理與服務(wù)合同4篇
- 2025年度高端建筑用熱鍍鋅鋼管采購合同3篇
- DB43-T 3022-2024黃柏栽培技術(shù)規(guī)程
- 成人失禁相關(guān)性皮炎的預(yù)防與護(hù)理
- 九宮數(shù)獨(dú)200題(附答案全)
- 人員密集場所消防安全管理培訓(xùn)
- 《聚焦客戶創(chuàng)造價(jià)值》課件
- PTW-UNIDOS-E-放射劑量儀中文說明書
- JCT587-2012 玻璃纖維纏繞增強(qiáng)熱固性樹脂耐腐蝕立式貯罐
- 保險(xiǎn)學(xué)(第五版)課件全套 魏華林 第0-18章 緒論、風(fēng)險(xiǎn)與保險(xiǎn)- 保險(xiǎn)市場監(jiān)管、附章:社會(huì)保險(xiǎn)
- 典范英語2b課文電子書
- 員工信息登記表(標(biāo)準(zhǔn)版)
- 春節(jié)工地停工復(fù)工計(jì)劃安排( 共10篇)
評論
0/150
提交評論