【創(chuàng)客學堂】88MD酷炫音樂顯示器(88dot Music Displayer)
編輯:Jack-Bei2013-12-31 390378261@qq.com 瀏覽次數(shù):1606
一次偶然的機會在淘寶淘到10多塊二手的8x8dot的紅綠雙色點陣屏,但這是一次低價格帶來的沖動的消費,這些點陣屏買來一直擱著,慢慢的它就被淪為我小倉庫中的壓箱貨了,拿它做點啥呢?廣告顯示屏?沒創(chuàng)意,而且我也沒這個需求;小的數(shù)字時鐘?好老的制作,以前用液晶屏做過,感覺走時不準,只能是個擺設(shè),沒有實際需求;涂鴉板?感覺也是用處不大。于是想能否設(shè)計在點陣屏的基礎(chǔ)上加上簡單的外圍電路的作品呢?縱觀一下,感覺小時候家里用的音響功放上那一個個隨音符跳動小燈比較迷人,于是查閱了一下它的原理,發(fā)現(xiàn)用單片機來實現(xiàn)這一過程也非難事,于是乎,我開始了??!
磨刀不誤砍柴工
在開始制作前,咱們還是來談?wù)勥@個音樂顯示器的具體的原理吧。說是音樂顯示器,其實更具象的說,應該是聲音信號頻譜顯示器,首先來普及幾個小知識:聲音信號,其有三大特性,分別是響度、音調(diào)、音色,響度是聲音的波形振幅(就是我們所說的音量),當我們采集聲音信號時所得到的是波形的幅值,音調(diào)是聲音的頻率,頻率越高音調(diào)越高,而音色是聲音的波形的類型,在咱們這個制作中,沒有特別多的聯(lián)系,不做深入探討。當我們通過單片機AD模塊采集由數(shù)碼播放機(如:PC聲卡、MP3播放器)輸出端的模擬電壓信號時,將其轉(zhuǎn)化成一串數(shù)字信號,然后通過FFT(快速傅氏變換)運算,得出聲音信號的頻率分布關(guān)系,這個也就是我們常說的頻譜圖,我通過一臺虛擬示波器采集了一首歌某個時刻的聲音信號,通過模塊自帶的線性頻譜顯示功能,得到(如圖1),圖中的橫軸是這組音頻信號中的頻率分布,縱軸是由傅里葉變換后,換算成不同頻率的正弦信號后的幅值。在這里又看見一個比較專業(yè)的名詞——FFT,即為快速傅里葉變換,是離散傅里葉變換的快速算法,它是根據(jù)離散傅氏變換的奇、偶、虛、實等特性,對離散傅立葉變換的算法進行改進獲得的。根據(jù)傅里葉變換認為任何連續(xù)周期信號都可以由一組適當?shù)恼仪€組合而成。在實際工程實踐中,頻譜圖用于機械故障診斷系統(tǒng),用于回答故障的部位、類型、程度等問題,是分析振動參數(shù)的主要工具,僅需觀察相關(guān)的被檢測設(shè)備的聲音震動情況,根據(jù)歷史數(shù)據(jù)作比對,就能找到某個問題產(chǎn)生的原因所在(說到這,想起以前做過一個軸系扭震試驗臺,在線監(jiān)測軸系軸的扭轉(zhuǎn)震動噪聲,分析噪聲,實時預測軸系運行狀態(tài),在必要時更換軸,避免損失,也就是說頻譜分析是有著良好的實踐應用的),這個有些像有些老修車師傅,只要讓發(fā)動機轉(zhuǎn)兩下就能聽出是那塊出問題了,雖然他們可能不懂FFT,不懂頻域分析,但他們的大腦中存了一張巨大的數(shù)據(jù)表,能夠迅速的搜索出問題的原因。在咱們的設(shè)計中,其實就是需要將一個音頻信號進行FFT變換后,得到的那張頻譜圖,然后用我們的點陣屏上的小燈來顯示出音頻信號的頻率分布與幅值的關(guān)系,在橫軸上的小燈用于顯示幾個頻率段,而縱軸的小燈用于顯示該頻段信號幅值。
圖1 線性頻譜分析
躬行硬件篇
有了前面的鋪墊,我們大概了解了音樂顯示器的原理,接下來是構(gòu)建其硬件基礎(chǔ)了,首先還是來看看我所淘到的點陣屏吧(如圖2),其型號為LDM-2388SRGA,88紅綠雙色,5mm點陣屏,內(nèi)部原理圖(如圖3)。對于本制作的核心——單片機選型,分析一下系統(tǒng)的功能需求,2路模擬信號采集(ADC),用于采集音頻信號,將其轉(zhuǎn)化成一串數(shù)字信號24個及以上的通用輸出輸入端口(I/O),用于直接連上點陣屏的LED,驅(qū)動其顯示稍大點的RAM空間和ROM空間,因為進行FFT變換會消耗大量的RAM,便于緩存數(shù)據(jù)幀,同時也有必要選取大點ROM,為多種動畫的酷炫效果升級提供堅實的硬件基礎(chǔ)較高的執(zhí)行指令和運算速率。于是乎,我一覽我現(xiàn)在學習過的芯片,剛開始想選一片32位的如STM32F103,但思前想后,感覺用32位的去完成如此制作,還是有些大材小用,于是選擇了一片STC系列的1T單片機12C5A60S2,有60K-bit的flash(現(xiàn)在的ROM一般都被閃存芯片替代了),1280Byte的SRAM(根據(jù)一些網(wǎng)友的作品,取64個點做變換,已經(jīng)足夠了),8路10位精度的(實在是太夠了),同時還帶2路PWM,為此我在設(shè)計中還添加了一個全彩呼吸燈,用來指示動畫切換后的狀態(tài)。(如圖4)是我最后定稿的圖紙,(如圖5)是其PCB效果圖,元器件清單見(表1)在電路圖中大家可以看見整個原理圖中非常簡潔。
圖2 點陣屏實物 圖3內(nèi)部電路實物
圖4 電路原理圖
???? 軟件調(diào)試篇
在完成整體的硬件架構(gòu)后,開始對音樂顯示器的軟件部分進行構(gòu)想,首先對整個小系統(tǒng)的軟件框架做個簡析,(如圖6)使用一個單片機,免不了對單片機硬件模塊的初始化操作,下面我就初始化的幾個部分做個簡述,I/O狀態(tài)的初始化:由于是使用單片機I/O直接驅(qū)動LED點陣,所以為了保證點陣屏的亮度和驅(qū)動能力,將單片機的I/O設(shè)置是強推挽輸出,PxM1=0x00, PxM0=0xff;ADC初始化:在這里只涉及對ADC_CONTR(ADC控制寄存器)這個寄存器初始化,設(shè)置開啟電源,以及轉(zhuǎn)換速度為70個時鐘周期/次;PWM初始化:主要設(shè)置CMOD(PCA模式寄存器)以及(CCAPM1(PCA模塊1模式寄存器),同時對相應的定時計數(shù)器清零(我將所有的代碼公布在我的博客上,供下載參考)。
圖6 軟件框架
在完成對單片機初始化后接下了就是程序算法的活了,從原理框圖中可以看出程序主要分作兩大塊,一塊是主循環(huán)里邊的數(shù)據(jù)處理,還有一塊是中斷服務(wù)函數(shù)中的LED刷新操作。 主循環(huán)中,通過ADC采集65個當前音頻數(shù)據(jù)(由于做FFT變換時需要有個上次參考值,所以多添加一個數(shù),用于替代參考值),為了獲得立體聲的頻譜,分別采集兩個左右聲道聲道的數(shù)據(jù),求和做均值運算;接下來就要對數(shù)據(jù)進行增益計算,由于咱們的播放音樂時會調(diào)節(jié)播放的音量的大小,即會改變波形的幅值,這樣一來會是縱軸的顯示在非合適的音量下出現(xiàn)空屏或者滿屏的現(xiàn)象,所以我們需要實時對采集來的數(shù)據(jù)進行軟件上的增益調(diào)節(jié),即對本次采集數(shù)據(jù)根據(jù)上次采集的音量大小計算所得的增益系數(shù)對數(shù)據(jù)進行適當縮小放大;完成上述任務(wù)后,需要進行本設(shè)計的最重點的FFT做個介紹了,我在設(shè)計之初也感覺對這編程挺傷腦筋的,后來學習魯迅先生所說的“拿來主義”,找了幾位網(wǎng)友分享的算法實例,將其移植過來,用時只要對好相關(guān)參數(shù),就能直接得出結(jié)果;通過以上幾步的操作我們可以得出上述64個頻段的縱軸值,這個就是下一步用來顯示縱軸小燈閃爍的參考值,為下面做多種動畫效果做鋪墊;講到這里,對于計算的部分已經(jīng)差不多了,接下來就是一些細節(jié)和收尾的活,為了方便對顯示動畫效果和彩燈顏色的切換,我設(shè)計通過一個按鍵來觸發(fā),同時為了保持對增益進行自動調(diào)節(jié),所以需要每一次采集運算數(shù)據(jù)后,計算一次增益系數(shù),由于我們要求的精度不是很高,可以將某個頻段作為觀察點,設(shè)置幾個閾值,在不同的閾值范圍內(nèi),使用不同的增益系數(shù)。
在文章的標題中大家看到“酷炫”二字,為了對得起這個稱呼,于是乎,我設(shè)計了多種動畫顯示,我將就動畫做出編程說明??扉W雙色16頻段,即前8頻段用綠色點陣顯示,后8頻段用紅色點陣顯示,通過前面的數(shù)據(jù)處理,可以獲得64個頻段的值,由于本制作中縱軸上只能顯示8個點,參考(圖1)的頻譜分析,通常音樂的頻譜的動態(tài)性較好的區(qū)間分布在前半段頻段區(qū),所以為了使顯示的動畫能夠飽滿并且動態(tài)性較好,所以舍棄了64個頻段后面的32個,只取前32個點,實際顯示時采取間隔一個頻段顯示,得到最終的16個點用于顯示(相應的得到8頻段或3頻段都是一個道理),由于FFT變換后得到值的范圍0~255,所以需要對其進行比例換算,接下來就是對顯示的緩沖區(qū)進行刷新,然后在中斷服務(wù)函數(shù)中顯示刷新,用于更新顯示的緩存,此時就能看見小燈隨著音樂的閃爍。
外形結(jié)構(gòu)設(shè)計
為了讓88MD更加完美,在原有電路硬件的基礎(chǔ)上我設(shè)計了一個透明的亞克力外殼,保護電路,起到防塵、防潮的作用,整個外殼不需要螺釘,通過卡扣就能拼接,如果對拼接后的強度不滿意,可以在拼接處加502膠水,做適當?shù)恼辰?。?8MD的背面,需要注意的是在呼吸燈處必須開一個圓孔,這樣能保證燈光通過圓孔的截面處,折射進整個有機玻璃面,在夜晚觀賞時有比較炫的效果。
結(jié)語
至此,這個制作告一段落,在此感謝各位網(wǎng)友的分享的相關(guān)資料,同樣我將所有的設(shè)計文件分享給大家,大家可以上我的新浪博客下載學習,給88MD賦予新的概念。通過一次又一次的DIY旅程,讓我明白,其最大的樂趣是將我們的創(chuàng)意轉(zhuǎn)化為我們的設(shè)計,呈現(xiàn)給你一次奇妙的體驗。
本文刊登在《無線電》雜志2013年7月刊
用戶評價
暫時還沒有任何用戶評論