文江蘇省錫東高級中學(xué)高一(3)班諸裴語涵
地圖“會唱歌”
——基于Arduino 開發(fā)板的語音交互和民歌播放的地圖板
文江蘇省錫東高級中學(xué)高一(3)班諸裴語涵
在學(xué)習(xí)地理和音樂的知識時,我的腦海里突然冒出一個想法:能不能制作這樣一塊地圖板,在說出其區(qū)域名稱后,該區(qū)域的LED燈立即閃爍,并播放該區(qū)域的代表民歌?在家人的支持下,我開始了有關(guān)語音交互和民歌播放地圖板的制作實踐。
語音芯片使用LD3320 Board,開發(fā)平臺使用入門級的雙核開源平臺Fireduino IDE,存儲器用Micro SD Card(TF-Card)模塊,再加上一個音頻輸出模塊和小喇叭。結(jié)構(gòu)如圖1所示。
圖1結(jié)構(gòu)圖
軟件流程的構(gòu)思如下:對著語音模塊說出一個省級地區(qū)的名稱,然后播放該地區(qū)的代表民歌,與此同時,地圖板上對應(yīng)的省份區(qū)域內(nèi)的LED燈開始閃爍。當(dāng)使用者說出“暫?!焙?,停止播放當(dāng)前歌曲并等待下次語音播放。
硬件設(shè)計中的主控板選擇了Fireduino控制板。這塊控制板擁有雙核Cortex-M3處理器,集成高質(zhì)量音頻Codec和Wi-Fi模組,具備良好的IOT擴展性能,能完美兼容Arduino IDE和Arduino標(biāo)準(zhǔn)接口,并支持FireBlock圖形化編程軟件。
一塊Fireduino控制板=2×Arduino UNO+Wi-Fi模塊+音頻模塊+RTC模塊+Flash模塊。
主芯片采用Rockchip雙核Cortex-M3主控芯片RKNanoD,它擁有超高的運行頻率,并且板載8M字節(jié)的大容量SPI Flash。
硬件設(shè)計中的語音識別部分采用LD3320 Board模塊。該模塊采用SPI通信方式,其芯片具有非特定人語音識別技術(shù),不需要用戶進(jìn)行錄音訓(xùn)練,只需把識別的關(guān)鍵詞以字符串的形式傳送進(jìn)芯片,即可在下次識別中生效。
比如,用戶在51等MCU的編程中簡單地通過設(shè)置芯片的寄存器,把諸如“你好”的識別關(guān)鍵詞的內(nèi)容動態(tài)地傳入芯片,芯片就可以識別設(shè)定的關(guān)鍵詞語了。同時,可在用戶自由編輯的50條關(guān)鍵詞語中進(jìn)行識別,終端用戶可根據(jù)場景需要,隨時編輯和更新這50條關(guān)鍵詞語的內(nèi)容。
以上兩大模塊只需使用9根杜邦線連接,再將SPI控制線的3根線一一對應(yīng)接上,SS芯片選擇線接9號引腳,IRQ外部中斷引腳接2號引腳,WR串并口選擇線接地選擇SPI方式控制即可。
以江蘇省為例。對著語音模塊說出“江蘇”,此時開始播放歌曲《茉莉花》,播放過程中說出“暫停”,暫停當(dāng)前歌曲,再說出“繼續(xù)”,繼續(xù)播放歌曲,說出“停止”,終止播放當(dāng)前歌曲。終止播放歌曲后,說出其他省份才開始播放當(dāng)?shù)卮砀枨?/p>
1.偽指令
需要初始化的內(nèi)容包括:串口、TF卡功能、Audio功能、LD3320模塊。
添加識別語句:如“江蘇”等各省份的名字。
死循環(huán)處理:如果說出“程序開始”,那么跳出死循環(huán),否則繼續(xù)等待。
2.主程序
判斷選擇(識別語句)→判斷省份→播放民歌并驅(qū)動閃爍顯示→若暫停,停止解碼→若繼續(xù),恢復(fù)解碼→播放結(jié)束退出循環(huán)。
Fireduino關(guān)于Audio的例程中有針對查詢解碼的例程,且暫停、恢復(fù)、停止的解碼都有相關(guān)的函數(shù),只需按照偽程序的思路編寫就可以完成。
Fireduino控制板與電腦的USB連接,根據(jù)官方維基百科的提示來安裝驅(qū)動,上位機Arduino IDE選擇端口后下載Blink例程,可以看到板上的LED燈開始閃爍,說明程序下載正確。再插上TF卡和小喇叭,根據(jù)官方的播放音樂驅(qū)動進(jìn)行循環(huán)播放。
1.調(diào)試TF卡和小喇叭
先在TF卡中下載一個名為test.mp3的音頻文件,然后模仿官網(wǎng)例程操作。
void setup(){
Serial.begin(115200);
Serial.print(" arduino setup... ");
if(!SD.begin()){
Serial.println("sd init err ");
while(1);}
Audio.begin(AUDIO_SD);
if(Audio){
Audio.playFile("\test.MP3");}}
以上程序的說明為:
(1)初始化串口,以便后續(xù)打印調(diào)試信息。
(2)初始化TF卡,后續(xù)需從TF卡讀取音樂文件用于解碼。
(3)初始化Audio,并且采用AUDIO_SD方式。
(4)如果初始化Audio成功,播放MP3文件。
短暫調(diào)試過后,如果聽到聲音,說明TF卡和小喇叭已調(diào)試成功,然后開始調(diào)試LD3320芯片模塊。
2.使用Arduino UNO板對LD3320進(jìn)行開發(fā)
接好線后,下載語音模塊的官方例程,再接一個LED燈在8號腳上,編譯程序并下載好后,對著模塊說出“開燈”,LED燈點亮,說明例程沒有問題。說出“關(guān)燈”,LED燈熄滅。
在Arduino UNO調(diào)試成功后,再將LD3320與Fireduino連接并調(diào)試。
3.再次調(diào)試
在詳細(xì)檢查官方的驅(qū)動文件后,發(fā)現(xiàn)官方的Arduino驅(qū)動采用模擬SPI的方式進(jìn)行,且函數(shù)名字也相同,與Fireduino的SPI函數(shù)有沖突。為解決這個問題,將LD3320.h和LD3320.cpp的驅(qū)動文件中關(guān)于SPI部分的文件采用硬件SPI的方式后,才將程序燒錄進(jìn)去。之后多次調(diào)試還是沒有成功。
經(jīng)過反復(fù)實驗后發(fā)現(xiàn),F(xiàn)ireduino是ARM內(nèi)核,且運算頻率高達(dá)200MHz,delay()函數(shù)過于短暫,LD3320對不上Fireduino的SPI握手協(xié)議。為解決這個問題,需增加驅(qū)動中需要延時的地方的時長,并反復(fù)調(diào)試直至成功。
至此,F(xiàn)ireduino的TF、Audio與LD3320全部調(diào)試成功。