畢如俊,曹成茂,鄭泉,石鑫焱,葛俊
(安徽農業大學工學院,合肥 230036)
電子信息與數字圖像處理技術目前已被廣泛地應用在各個領域,車載系統的信息化已成為現代汽車業的重要標志。現在的倒車雷達系統可以為駕駛者提供許多幫助,多數采用超聲波測距技術[1-2],可以直接顯示出車尾與障礙物之間的距離。但由于超聲波的散射特性,如果地面有尖銳的突起或存在橫在半空的棱角狀物體,系統就不能有效地“察覺”。假如能為現有的倒車系統增加一個可視功能[3-4],那么駕駛員在倒車時不必回頭就可清楚車后的情況。本文設計了一種可視化安全倒車系統,該系統采用嵌入式Linux操作系統內核驅動USB攝像頭實現車后狀況實時監控,通過判斷超聲波測距是否達到閾值來啟動語音報警功能。
如圖1所示,系統由主控模塊、超聲波收發模塊、USB攝像頭圖像采集模塊、語音報警模塊與LCD顯示模塊等。主控模塊采用三星公司基于ARM9內核的S3C2440微處理器,主頻最高可達533 MHz,處理速度快。采用軟件編程技術實現對其外圍電路的控制,并提供外圍電路所需的各種信號,簡化了外圍電路的設計難度。

圖1 系統總體結構框圖
以S3C2440為核心的主控模塊硬件平臺的組成如圖2所示。

圖2 主控模塊硬件平臺簡圖
超聲波發射電路原理圖如圖3所示。發射電路主要由反相器74LS04和超聲波發射換能器T1構成,使用CPU內部的PWM定時計數器輸出的40 kHz方波信號。一路經一級反相器(U1C與U1E并聯組成一級)后送到超聲波換能器的一個電極(T1的1腳);另一路經兩級反相器(U1D為第一級,U1B和U1A組成第二級)后送到超聲波換能器的另一個電極(T1的2腳)。用這種推換形式將方波信號加到超聲波換能器的兩端,可以提高超聲波的發射強度。輸出端采兩個反相器并聯,以提高驅動能力。上位電阻 R1、R2一方面可以提高反相器74LS04輸出高電平的驅動能力,另一方面可以增強超聲波換能器的阻尼效果。

圖3 超聲波發射電路原理圖
超聲波接收電路原理圖如圖4所示。[5-6]CX20106A是一款紅外線檢波接收的專用芯片,常用于電視機紅外遙控接收器。其優點是簡單易用,電路連接簡單,且減少了生產調試的麻煩。當CX20106A接收到40 kHz的信號時,會在第7腳產生一個低電平下降脈沖,這個信號可以接到ARM的外部中斷引腳作為中斷信號輸入。

圖4 超聲波接收電路原理圖
采用中星微電子ZC0301芯片組的USB數字攝像頭。與模擬攝像頭相比,其優勢在于:CMOS圖像傳感器能直接產生圖像原始數據;硬件支持標準的JPEG壓縮;具有主流高速的USB總線設備接口等。對攝像頭而言,USB總線的上的信息傳輸類型通常采用的是實時傳輸。USB設備端提供若干通信端口,主機與端口間建立起邏輯上的通信管道,進行數據傳輸。在攝像頭的設備初始化階段,主機與0號端口通信,驅動程序檢測攝像頭型號和所有端口信息。進入數據傳輸階段,主機與探測到的實時輸入端口建立通信管道,實時回傳攝像頭拍攝到的圖像數據。
語音報警模塊采用的是安徽中科大訊飛信息科技有限公司生產的XF-S3011中文語音合成芯片。它是一款針對嵌入式應用領域而設計的單芯片處理器,具有合成任意中文文本的能力。XF-S3011通過串口(UART)接收上位機發送的命令和數據,命令和數據是以幀的方式進行封裝與發送,允許發送的數據最大長度為200個字節。其驅動電路是用三極管驅動方式設計的。當超聲波測得的距離小于所設置的閾值時,由S3C2440發送控制命令給XFS3011,啟動語音報警提醒駕駛員注意。顯示模塊使用的是東華3.5寸TFT LCD(分辨率是320×240),采用嵌入式Linux下的Frame Buffer設備來驅動LCD。
本文選擇嵌入式Linux操作系統。它具有可裁剪、內核穩定、功能強大、支持多種硬件平臺等特點。首先,在一臺裝有Linux操作系統的PC機(宿主機)上建立一個交叉編譯開發環境,把S3C2440控制模塊作為目標板。然后,采用移植性較好的C語言在PC機上編寫本設計所需的底層驅動程序及頂層的應用程序,再利用交叉編譯調試工具編譯、鏈接生成可執行代碼,最后向目標板移植。
第1步,采用動態加載ZC0301組芯片的USB攝像頭驅動程序spca5xx。此驅動程序源代碼由4個部分組成:設備模塊的初始化模塊、卸載模塊、上層軟件接口模塊和數據傳輸模塊。把它放在kernel/driver/usb下解壓,打補丁。在編譯系統內核時,在arm linux的kernel目錄下進行make menuconfig;在<*>下選擇 Multimedia device下的Video for linux,加載Video4linux模塊,為視頻采集設備提供編程接口函數和相關數據結構;(M)選中SPCA5XX這一項。

圖5 視頻圖像采集流程
第2步,使用 Linux的Video4linux來訪問USB攝像頭設備,進行視頻圖像采集,捕獲實時的數據流。程序流程如圖5所示。
為程序定義數據結構:

打開視頻:


本設計是通過MiniGui加載jpeg來實現LCD實時顯示USB攝像頭采集到圖像的。在編譯程序時,加上了jpeg庫的支持。編程的思路就是不斷地從攝像頭采集圖像并存儲在/tmp/1.jpg中。在Linux圖形用戶界面支持系統MiniGUI中,通過loadbitmap函數來加載圖像,而圖像加載后不會自動更新,不能根據1.jpg的改變自動變化。因此,在程序中要設定一個定時器,每隔100 ms刷新屏幕,基本上實現了實時更新。
超聲波發生程序[7]的作用是由PWM定時計數器產生一個超聲波信號頻率約40 kHz的方波。采用Timer0,同時把Timer1打開進行計時。超聲波測距器主程序利用外部中斷檢測返回的超聲波信號,一旦發現立即進入中斷程序。進入該中斷后立即關閉Timer1停止計時,并將測距成功標志字賦值1。各程序流程如圖6~圖8所示。

圖6 主程序流程

圖7 定時中斷子程序流程

圖8 外部中斷子程序流程
當主程序檢測到接收成功的標志位后,按下式計算即可得到車尾與障礙物之間的距離(設計時取20℃時的聲速C為344 m/s):

其中,T1為計數器Timer1的計數值。
該部分程序可設計為Linux下字符設備驅動程序。要使用Linux系統提供一個設備驅動接口函數struct file_operations的數據結構[8-9],來實現超聲波傳感器設備的打開、讀寫、釋放和控制。定時器和外部中斷相關寄存器的初始化和參數的設定都是在open()接口函數中完成的。在此設備驅動程序中定義的file_operations的數據結構為:

s3c2440_sonar_open()函數用于打開的設備。s3c2440_sonar_read()和s3c2440_sonar_write()函數用于讀寫設備。s3c2440_sonar_release()函數完成中斷的釋放。s3c2440_sonar_ioctl()函數用于控制設備中定時中斷和測距值,由copy_to_user()函數和put_user()函數來實現數據傳遞,在應用程序下打開設備,實現內核態與用戶態之間的數據傳遞。模塊初始化函數s3c2440_sonar_init()實現設備的初始化、中斷初始化及處理、設備注冊等。static void s3c2440_sonar_exit()用于模塊卸載時中斷停止、資源的釋放等。
當所測距離值小于閾值時,由 S3C2440發控制命令給XF-S3011,啟動語音模塊。組成一個語音合成命令幀[10]的部分代碼如下:

命令合成完畢后,就可以發送給XF-S3011模塊了。在嵌入式Linux系統中先打開XF-S3011設備文件,然后將此命令幀寫入該文件,最后關閉設備文件。
本文采用嵌入式 Linux操作系統和三星公司S3C2440微處理器設計的可視與語音報警為一體的安全倒車系統,具有較高的實用價值。在顯示視頻圖像處理的過程中,能夠通過超聲波對車尾與障礙物之間進行測距,當測距值小于預設定的距離時會有語音對駕駛員進行報警提示。經實驗驗證,該系統運行穩定,能讓駕駛員準確地把握車后路況,提高了倒車安全性。
[1]楊帆,劉暢,馬俊,等.超聲波測距儀研究[J].電子器件,2009,32(2):476-478.
[2]林偉,梁家寧,李才安.便攜式多功能超聲波測距儀的設計與實現[J].電子測量技術,2008,31(1):165.
[3]尹克,高明煜,陳吉鋒.車載可視倒車裝置的設計與實現[J].杭州電子科技大學學報,2007,4(27):1-4.
[4]易革,胡金亮.倒車多媒體測距終端的設計與實現[J].電子設計應用,2006,4(12):99-100.
[5]阮成功,藍兆輝,陳碩.基于單片機的超聲波測距系統[J].應用科技,2004(7):22-24.
[6]張珂,劉剛海.提高超聲波測距精度方法的研究[J].現代電子技術,2007,30(15):139-141.
[7]基于超聲波傳感器的測距報警系統設計[J].科技信息,2009(7):58-59.
[8]杜剛,劉建一.基于ARM 的超聲波測距系統設計[J].福建電腦 ,2009(3):138-139.
[9]單承剛,戴學豐,劉樹東,等.嵌入式Linux下多路超聲波測距系統設計[J].微計算機信息,2007,23(6-2):248-250.
[10]張輝,黃永強,夏愛華.中文語音合成模塊XF-S4240在導航終端中的應用[J].單片機與嵌入式系統應用,2008(1):43-44.