嵌入式Linux下的戶外報(bào)警對(duì)講系統(tǒng)設(shè)計(jì)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
引 言
當(dāng)社區(qū)公民在戶外遇到突發(fā)情況時(shí),快速與有關(guān)部門取得聯(lián)系非常重要。針對(duì)這種社會(huì)需求,本設(shè)計(jì)提出并實(shí)現(xiàn)了一種戶外報(bào)警對(duì)講系統(tǒng)。當(dāng)社區(qū)內(nèi)發(fā)生突發(fā)事件時(shí),市民能夠通過此設(shè)備第一時(shí)間通知社區(qū)控制室,并與工作人員對(duì)講以尋求幫助 [1-2]。此報(bào)警對(duì)講系統(tǒng)使用 Cortex-A8 架構(gòu)的 S5PV210 ARM 處理器作為 CPU,硬件包括音頻模塊、網(wǎng)絡(luò)模塊、SD 卡模塊、USB 模塊、按鍵報(bào)警模塊、顯示模塊等。
1 系統(tǒng)硬件
系統(tǒng)采用 S5PV210核心板作為主控單元,使用 WM8960 音頻芯片 CODEC進(jìn)行編碼與解碼,使用LM4871音頻功率放大芯片放大聲音信號(hào)后傳送到 4Ω/3W的喇叭輸出。系統(tǒng)選用 DM9000網(wǎng)絡(luò)芯片,通過百兆網(wǎng)口與后臺(tái)服務(wù)器通信,由I/O口控制 LED 的顯示以及檢測(cè)按鍵報(bào)警,由 RS232接口控制LED顯示屏顯示的內(nèi)容。系統(tǒng)預(yù)留了SD卡接口和USB接口, 使得系統(tǒng)可以方便地進(jìn)行內(nèi)核燒寫與日后的維護(hù)升級(jí)。
系統(tǒng)硬件框圖如圖 1 所示。
圖1 系統(tǒng)硬件框圖
1.1 音頻處理模塊
S5PV210 支持 I2S/PCM/AC97 等音頻接口。 本開發(fā)板采用 I2S0 接口, 外接有 WM8960 作為 CODEC 解碼芯片。WM8960 內(nèi)置有 D 類功放,可以直接驅(qū)動(dòng) 8 Ω/1 W 的喇叭, 本設(shè)計(jì)使用 LM4871 功放芯片對(duì)信號(hào)進(jìn)行放大處理。LM4871 是一個(gè)具有關(guān)斷功能的音頻功率放大器,其具有單位增益穩(wěn)定,外部電路簡(jiǎn)單等特點(diǎn),輸出可以驅(qū)動(dòng) 4 Ω/3 W 的喇叭,經(jīng)測(cè)試,音量基本達(dá)到了設(shè)計(jì)要求。
音頻功放模塊電路如圖 2 所示。
1.2 網(wǎng)絡(luò)模塊
網(wǎng)絡(luò)部分采用 DM9000 網(wǎng)卡芯片。DM9000 是一款集成了 10/100PHY 的以太網(wǎng)MAC 控制器,它可自適應(yīng) 10/100 M 網(wǎng)絡(luò),具有支持介質(zhì)無關(guān)接口,支持背壓模式半雙工流量控制模式等特點(diǎn),同時(shí)還支持超低功耗模式,兼容 3.3 V 和 5.0 V 輸入輸出電壓。網(wǎng)口使用內(nèi)部已經(jīng)包含耦合線圈的 RJ45 連接頭,因此不必在電路中另接網(wǎng)絡(luò)變壓器。
1.3 固件升級(jí)模塊
傳統(tǒng)的嵌入式產(chǎn)品在設(shè)備安裝完成后,對(duì)于內(nèi)核驅(qū)動(dòng)層的升級(jí)較為不便,一般需回廠升級(jí)或者更換 ROM。這種方式不僅效率低下,更大大增加了維修成本。本設(shè)計(jì)預(yù)留了 SD 卡接口和 USB 接口,系統(tǒng)可以通過 SD 卡上的 Boot Loader 啟動(dòng)并通過 USB 接口燒寫內(nèi)核。維修人員只需攜帶一張 SD 卡和一臺(tái)筆記本電腦即可完成固件升級(jí)工作。
2 系統(tǒng)軟件
系統(tǒng)軟件主要由應(yīng)用層軟件以及相應(yīng)的驅(qū)動(dòng)模塊組成。應(yīng)用層主要包括網(wǎng)絡(luò)模塊、音頻模塊、回聲消除模塊、按鍵控制模塊等。系統(tǒng)軟件模塊組成如圖 3所示。
文中分別詳細(xì)介紹了與音頻處理有關(guān)的 ALSA 框架,與回聲消除有關(guān)的 Speex框架及網(wǎng)絡(luò)通信部分。
2.1 ALSA
S5PV210 支持 I2S/PCM/AC97 等音頻接口。本設(shè)計(jì)采用I2S 接口進(jìn)行音頻數(shù)據(jù)的傳輸,采用 I2C 接口對(duì) CODEC 芯片的寄存器進(jìn)行設(shè)置。整個(gè)音頻驅(qū)動(dòng)基于 ALSA 音頻架構(gòu) [3-6]。
ALSA 是 Linux上一種應(yīng)用比較廣泛的音頻驅(qū)動(dòng)框架,ALSA 包含與音頻編程有關(guān)的 API 庫 [2],及其他方便開發(fā)的工具,如 alsamixer 可以調(diào)節(jié)音頻混聲器參數(shù),arecord 指令可以測(cè)試錄音功能,aplay 指令可以測(cè)試播放功能。
ALSA 的軟件體系結(jié)構(gòu)如圖 4 所示。
圖 4 ALSA 的軟件體系結(jié)構(gòu)圖
ALSA 的 API 可以分解成控制接口、PCM 接口、Raw MIDI 接口等。其中 PCM 接口是管理數(shù)字音頻回放(playback) 和錄音(capture)的接口。本文后續(xù)重點(diǎn)將放在該接口上,它是開發(fā)數(shù)字音頻程序最常用的接口。
要使用 ALSA,首先調(diào)用以下語句打開 PCM 設(shè)備 :
snd_pcm_open(&handle_cap,"hw :0,0",SND_PCM_STREAM_CAPTURE,0);
設(shè)置語音的硬件參數(shù)??紤]到緊急報(bào)警的通話要求僅為清晰,故選用的參數(shù)為 :采樣率 8 k,單通道,16 位。ALSA首先聲明一個(gè)結(jié)構(gòu)體 snd_pcm_hw_params_t,用來保存句柄的硬件參數(shù),然后調(diào)用參數(shù)設(shè)置語句填充結(jié)構(gòu)體,最后調(diào)用函數(shù) snd_pcm_hw_params 進(jìn)行參數(shù)設(shè)置。
音頻部分代碼運(yùn)用 Linux 多線程編程技術(shù),其中一個(gè)線程負(fù)責(zé)通過 UDP 接收音頻流并播放,調(diào)用 snd_pcm_writei函數(shù)完成寫數(shù)據(jù) ;另一個(gè)線程負(fù)責(zé)采集音頻信號(hào)并發(fā)送到服務(wù)器,調(diào)用 snd_pcm_readi 函數(shù)完成讀數(shù)據(jù)操作。音頻的采集和播放分別維護(hù)一個(gè) buffer,由信號(hào)量控制各線程對(duì)其的使用權(quán),每個(gè) buffer 有兩個(gè)指針,分別表示數(shù)據(jù)的壓入和取出,保證程序有序運(yùn)行。
2.2 Speex
由于音頻設(shè)備會(huì)出現(xiàn)回聲的現(xiàn)象(遠(yuǎn)端喇叭播放的聲音被麥克風(fēng)采集后又傳回近端),情況嚴(yán)重時(shí)對(duì)語音質(zhì)量影響極大。本設(shè)計(jì)主要采用 Speex 音頻庫的 API,結(jié)合 ALSA 框架進(jìn)行回聲消除的研究 [7]。
應(yīng)用 Speex 庫進(jìn)行回聲消除的主要步驟如下:
(1)首先設(shè)置音頻基本參數(shù),需要調(diào)用以下函數(shù) :
_speex_preprocess=speex_preprocess_state_init(FRAMESIZE,8000);
在使用其他功能之前首先調(diào)用 Speex 的預(yù)處理函數(shù)初始化音頻參數(shù),函數(shù)第一個(gè)參數(shù)是每幀的大小,第二個(gè)參數(shù)是采樣率。在語音通話中一般采用的幀長(zhǎng)為 20 ms,假如是 16 k的語音數(shù)據(jù),幀長(zhǎng) 20 ms 等于 320 個(gè)采樣點(diǎn)。
(2)創(chuàng)建回聲消除 AEC,設(shè)置相關(guān)參數(shù)。調(diào)用 speex_echo_state_init(m_nFrameSize,m_nFilterLen) 創(chuàng)建一個(gè)AEC(Acoustic Echo Chancellor,AEC),該函數(shù)的第二個(gè)參數(shù)是尾音長(zhǎng)度,即喇叭到麥克風(fēng)的延遲時(shí)間,該參數(shù)直接影響了回聲消除的效果。
調(diào) 用 speex_echo_ctl(st,SPEEX_ECHO_SET_SAMPLING_RATE,&sampleRate)來設(shè)置相關(guān)參數(shù)。 (3)最后在線程中循環(huán)調(diào)用函數(shù)消除回聲。調(diào)用 speex_echo_cancellation(st,ref_buf,echo_buf,e_buf)函數(shù)將數(shù)據(jù)傳遞給 AEC,第二個(gè)參數(shù)是喇叭播放數(shù)據(jù),第三個(gè)參數(shù)是麥克風(fēng)采集數(shù)據(jù),第四個(gè)參數(shù)是回聲消除后的數(shù)據(jù)。
調(diào)用 speex_preprocess_run(_speex_preprocess,outbuf)啟動(dòng) Speex 的音頻處理進(jìn)行回聲消除。Outbuf 即為處理后的數(shù)據(jù)。
2.3 網(wǎng)絡(luò)通信
系統(tǒng)使用 TCP 協(xié)議控制信號(hào)的傳輸,使用 UDP 協(xié)議進(jìn)行音頻流的傳輸 [8]。
下位機(jī)作為 TCP 客戶端主動(dòng)向服務(wù)器發(fā)起連接,并且每隔 30 s 向服務(wù)器發(fā)送一個(gè)心跳包,服務(wù)器可以通過判斷接收間隔以判斷下位機(jī)的在線狀態(tài)。下位機(jī)和服務(wù)器通過 Modbus協(xié)議進(jìn)行應(yīng)用層數(shù)據(jù)交互,其基本格式為 :幀頭 + 幀長(zhǎng) + 數(shù)據(jù)區(qū)+ 校驗(yàn)碼 + 幀尾,通過自定義協(xié)議完成上位機(jī)對(duì)下位機(jī)的查詢和控制,以及下位機(jī)報(bào)警信號(hào)的上傳。
網(wǎng)絡(luò)編程部分應(yīng)用了 Libevent 事件通知庫,其內(nèi)部使用select,epoll,kqueue,IOCP 等系統(tǒng)調(diào)用管理事件機(jī)制。相對(duì)于 Raw Socket 編程,應(yīng)用 Libevent 事件庫大大提升了網(wǎng)絡(luò)通信的性能與穩(wěn)定性。
3 結(jié) 語
本系統(tǒng)在設(shè)計(jì)完成后進(jìn)行了完整有效的系統(tǒng)測(cè)試,電路板安裝在定制的機(jī)箱殼體內(nèi),并設(shè)計(jì)有 ESD 防護(hù)。本設(shè)備可以安裝在電線桿上或者臨街的墻壁上方便市民使用。
圖 5 終端控制板實(shí)物圖最終的測(cè)試結(jié)果表明,報(bào)警信號(hào)可及時(shí)上傳,對(duì)講語音清晰有效,各類接口功能正常,均滿足了設(shè)計(jì)要求,達(dá)到了預(yù)期目標(biāo)。