超音波測距 自動轉彎車 生機三 老師讓我 PA 隊 B90611010 B90611024 B90611036 B90611045 許友嘉黃思博廖珮妤周靖棠 2004/6/18
摘要 利用超音波測量距離, 使自走車能感測前方障礙物的距離, 自動轉彎達到閃避效果 前言 經過這學期的微處理機課程後, 我們學習了如何使用微處理晶片來控制和數學運算的機制, 在這次的計畫裡, 我們準備運用 89C51 這個功能強大的晶片來執行測距 控制轉彎的功能 整個計畫中用到感測原理和微處理器原理, 讓我們獲得一次將課堂理論用來實做的機會 背景資料 1. 使用現成的遙控車, 拆掉遙控電路, 只用外殼 輪子跟馬達 2. 用超音波發射器 接收器, 及其匹配 89C51 的電路作為感測器 3. 使用 89C51 作為計算機 4. 使用 Keil C 寫程式 模擬 準備工作 1. 閱讀 89C51 的書, 了解 89C51 的基礎知識及使用方法 2. 了解超音波電路的運作方法 3. 大略了解如何用 Keil C 模擬程式執行 研究方法 1. 先利用麵包板 電源供應器 示波器, 測試超音波電路是否能運作 2. 熟悉 89C51 的使用方法 Keil C 使用方法, 熟悉燒錄方法, 3. 寫程式 4. 將程式燒入 89C51, 測試是否能依據我們的設計正常運作 5. 將電路移植到一般的電路板上, 並測試是否正確 6. 連接馬達與電路板, 並修改原本遙控車的電池裝置 7. 做最後的校正及外部包裝
結果 測試超音波發射與接收電路, 參照圖 1 圖 2: 這部分的電路大致上是參考眾益科技股份有限公司的超音波測距的套件裡的電路, 我們有將電阻 R5 由 12K 改為 2K 歐姆, 將 IC5 由 1010 改為 PC817, 其餘大致相同 我們先將超音波發射接收電路接在麵包板上, 調整可變電阻 VR1, 使其發射的超音波為 40K Hz, 利用示波器來測試結果 圖 1 發射端電路
圖 2 接收端電路 接上 89C51 電路 : 我們將超音波電路完成後, 再接上 89C51 的 P3.6(WR, active low) 及 P3.7(RD,active low), 由 89C51 來控制震盪電路作動, 使送波器發出超音波 如圖 3 收波器則是處於持續作動的狀態, 不停地偵測是否有訊號傳入 這部分的電路較不複雜, 主要工作是確定 pin 腳是否有控制訊號出入, 我們在測試這部分時, 是以外接一個 LED 的方式, 並利用程式設定當有訊號輸入時 LED 燈亮與否來判定 ( 有訊號時 LED 亮 )
圖 3 89C51 接腳圖 撰寫 Keil C 程式 : 由於之前有學長用 Keil C 寫過關於超音波測距的程式, 我們就參考學長的程式再予以修改, 圖 4 為程式流程及原理 Keil C 跟組合語言的差異是語法簡單, 且容易除錯, 在數學運算及訊號控制的使用上都方便許多, 是一種高階語言 撰寫程式完成後, 我們將程式以電子是燒錄方式來寫入 89C51 晶片, 並再次測試到目前為止的電路的正確性
主程式 SET_IO SET_TIMER DELAY( 延遲時間 ) TEST_DISCOUNT( 測距迴圈 ) OSC_ON( 震盪器 ON) TR0=1( 打開計時器 ) DELAY( 延遲時間 ) OSC_OFF( 震盪器 OFF) LABLE ( 判斷是否接收到訊號 ) SIGNAL_IN=0 SIGNAL_IN=1 TF0=0 TR0=0( 關掉 TIMER) 判斷溢位旗標是否溢位 (TF0) DIS<=50( 距離小於 50cm) YES OUTLED=1 MORTORR=0 BUZZER=1 NO OUTLED=1 MORTORR=0 BUZZER=1 TF0=1 OUTLED=0 MORTORR=1 BUZZER=0 溢位旗標設回初值 (TF0=0) TR0=0( 關掉 TIMER) 圖 4 程式方塊流程圖 加入馬達控制電路 : 以上步驟完成後, 我們再加入兩顆繼電器連接兩顆直流馬達, 繼電器由 89C51 控制切換, 當電路偵測到距離小於 50cm 時,89C51 會切斷 ON 的訊號控制右輪馬達停止轉動, 使車子往右轉 由於馬達為直流, 車子是以等速前進 將電路焊接在 IC 板上 : 以上電路部份全部完成後, 我們獎所有元件組裝
排列, 並焊接在 IC 板上, 並重新確認焊接是否有短路問題 修改車體電源 : 經由先前測試過程, 我們發現若使用同一電源來驅動 89C51 和馬達, 馬達會產稱電磁感應而干擾控制訊號, 所以我們稍微將車體的電池座作修改, 將原本的電源分為一個 3V( 兩個 1.5V 串聯 ) 驅動馬達, 和一個 9V(4 個 1.5V 串聯 ) 驅動 89C51 我們為了不讓馬達轉速過高, 因此以較小的電壓來驅動馬達, 而 89C51 具有一個 5V 穩壓器, 我們提供高一點的電壓, 經穩壓器後產生一個相當穩定的電源來驅動晶片 穩壓器會產生大量熱能, 需外加一片散熱片 外部包裝 : 將電路板放進車體後, 我們將車蓋加上去 ( 車體是戰車 ), 並將 LED 拉線致車體外部 我們將車前燈蓋拔除, 將送收波器震動子接線致車前燈前方 所有硬體和軟體部分到此全部完成 結論 1. 由實驗結果, 發現超音波接收端的接收仍有死點, 當行進方向與障礙物面成 30 度到 45 度時, 發射出的超音波容易因反射而無法接收, 理論上, 可以裝設多個不同角度的接收端 ( 與原接收端成 30 度到 45 度 ), 以接收大角度反射回來的音波 2. 由於時間較短, 此專案為了簡化電路, 只設計遇到障礙物時向固定之方向 ( 右邊 ) 轉彎, 改進方法可安裝 SWITCH 以切換轉換方向 3. 原本要加裝蜂鳴器, 但因為 CPU 供應之功率太小, 導致聲響極小, 幾乎聽不到, 故將之拆除 改進方法為將 CPU 之訊號視為蜂鳴器電路之 SWITCH, 另外供給蜂鳴器功率即可順利驅動, 如 RELAY 電路 4. 8051 及其他各個 IC 的最適供應電壓為 5V, 但由電池和提供之電壓為 4.5V 6V 或 7.5V, 故裝設 7805 穩壓電路, 將電壓固定在 5V, 且不亦隨其他元件而漂變, 以穩定 IC 之電源 參考文獻 1. 益眾公司, 超音波模組設計電路,http://www.icci.com.tw 2. 博士班胡建威學長,RELAY 電路 3. 學士班郭志彬學長, 超音波程式
4. 7805 datasheet,http://www.eckhard-gosch.de/download/7805.pdf 5. TLC555datasheet http://neptune.lisa.univparis12.fr/electronik/datasheets/tlc-555.pdf 6. 鄧錦城 1995 8051 單晶片實作寶典 附錄 超音波原理 :: 超音波在氣體 液體中為縱波, 在固體則為橫波, 在行進時遇到不同性質的物質就會引起反射 其波常特性可歸納如下 : 由於波長短, 指向性強, 能量集中, 能增加方向分解能 震動速高, 可得巨大加速度 大部分音響功率碰到音響阻抗不同的物質介面將被反射 ------ 利用此性質可進行物質探知和距離量測 超音波元件 : 空中超音波送受波器是用來量測距離的一組配件, 其使用頻率一般為 20~40K Hz, 適用距離為 2~5m 形式多為高音用揚聲器 圓形筒 瓷質振動子等, 但我們這裡使用的是感度高且便宜的雙型態瓷質振動子和單一型態振動子的 超音波發射及接收電路 : 我們利用一個適用 40K Hz 的震盪電路來產生超音波, 再由送波器將波發射出 ; 和一組濾波放大電路來接收由受波器接收反射回來的波所產生的訊號, 如下圖所示 : 89C51 電路 : 我們所使用的 Microprocessor 為 89C51, 利用其運算功能和輸出入埠的應用來計算距離和控制 on,off 訊號 //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 超音波量測 1cm 的時間 : 58 us // // 震盪器為 11.0592 KHZ // // 脈波週期為 12/11.0592kHz=1.085 us // // MODE1 最長計時時間 : 1.085*65536=71106.56 us // // 最長量測距離 :71106.56/58 = 1225cm // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include<at89x51.h> sbit OUTLED = P1^0; sbit MOTORL = P1^1; sbit MOTORR = P1^2; sbit BUZZER = P1^3; sbit OSC_CONT = P3^6; // 控制 LED 燈 // 控制左馬達 // 控制右馬達 // 控制蜂鳴器 // 控制震盪器
sbit SIGNAL_IN = P3^7; unsigned char data TH_BUF; unsigned char data TL_BUF; unsigned long DIS; //---------------------------------------------------- // delay 迴圈 ( delay time= i * 20 us ) //---------------------------------------------------- void delay(int i) TH1=(256-17); TL1=(256-17); TR1=1; // 超音波訊號從這裡進入 while(i!=0) while(tf1!=1); TF1=0; i--; TR1=0; //---------------------------------------------------- // 設定 T0 為 MODE1 //---------------------------------------------------- void SET_T0() TMOD=0x21; TH0=0x00; TL0=0x00; //TIMER0 是 MODE1,TIMER1 是 MODE2 //---------------------------------------------------- // 555 輸出 40KHZ 方波
//---------------------------------------------------- void OSC_ON() OSC_CONT=1; // 開啟 555 震盪器 // 555 輸出 OFF void OSC_OFF() OSC_CONT=0; // 關掉 555 震盪器 // I/O PORT 初值設定 void SET_IO() OSC_OFF(); SIGNAL_IN=1; OUTLED=0 ; MOTORR=1 ; MOTORL=1 ; BUZZER=0 ; //--------------------------------------------------- // 計算距離 //--------------------------------------------------- void CONV_TO_RAM() TH_BUF=TH0; TL_BUF=TL0; DIS= TH_BUF*256+TL_BUF; DIS=DIS*1.085/58;
if ( DIS <= 50 ) OUTLED = 1 ; MOTORR = 0 ; BUZZER = 1 ; else OUTLED = 0 ; MOTORR = 1 ; BUZZER = 0 ; // 若距離小於 50cm // 超音波測距 void TEST_DISCONT() OSC_ON(); TR0=1; //Timer0 啟動, 用來算距離 delay(12); OSC_OFF(); delay(120); label1: if(signal_in==0) TR0=0 ; CONV_TO_RAM(); //SINGAL_IN==0 表示接收到訊號 // 算出距離, 決定馬達動作 else if(tf0==0) //TF==1 超過暫存器容量
goto label1; MOTORR = 1 ; OUTLED = 0 ; BUZZER = 0 ; TF0=0; TR0=0; // 關掉 Timer0 delay(40); TH0=0x00; // 計時器歸零 TL0=0x00; // 主程式 void main() SET_IO(); SET_T0(); while(1) delay(20000); TEST_DISCONT();
Click below to find more Mipaper at www.lcis.com.tw Mipaper at www.lcis.com.tw