去年買了兩個八音盒玩,上好發條,就能演奏一小段音樂。可惜翻來覆去就是一首(其實是半首不到,幾十秒),聽幾遍也就膩了。

某次看到VS1003居然支持MIDI格式,於是考慮用它做個播放器,把存在FLASH里的MIDI放出來。MIDI文件一般也就是幾十kb,2M的SPIFLASH就夠存幾十首了。

原理圖如下:

最方便的把MIDI導入FLASH的方式肯定是U盤,所以MCU選了STM32F103,FLASH選了最常用的W25Q16。STM32F103的72M主頻用一個定時器6分頻得到12M,作為VS1003的主時鐘,這樣能省下一個晶振,缺點是12M/256=46.875k,這樣沒法支持48k採樣率的音頻文件。變通辦法是在非USB狀態把主頻切到64M,然後5分頻得到12.8M,需要USB時再切回72M,就是有點折騰。

兩個USB口,其中一個用CH330N轉串口用於調試。其實沒必要,一個就夠了。

VS1003的輸出級可以直接驅動32歐耳機,所以不需要加功放IC了,兩路各串10歐電阻然後並聯,直連8歐喇叭。作為八音盒,這點音量也足夠了。

開關J402的位置焊一個水銀開關,調整它的方向讓水銀珠不要同時接觸兩電極,程序里用PA2的外部中斷來喚醒MCU、進入播放狀態,就實現了搖搖播放。如果要再複雜的手勢控制之類,需要加個ADXL345之類的加速度感測器。

供電用一個一兩百mAh的鋰聚合物電池即可,簡單配置了一下STM32F103的低功耗模式,進入低功耗模式前拉低VS1003的XRESET腳,可以把工作電流降到0.6mA左右,這樣用200mAh的鋰電池可以待機十幾天。進一步優化應該可以把工作電流降到幾十uA,實現幾個月的待機時間。

實測播放MIDI的效果實在不怎麼樣……看來對VS1003的期望值不能太高。而且這東西原來只支持格式0的MIDI文件,其他格式需要轉換;找了幾個轉換軟體,要麼不好用,要麼得收費。那麼還是用MP3文件吧,2M容量的W25Q16頓時不夠用了。換成16M的W25Q128,再把MP3的碼率壓低些,這樣也能放下十幾首歌了。再試聽,感覺音質好多了。

另一個麻煩在於往裡面拷歌的速度實在太慢了,只有30~60KB/s。檢查了一遍程序,發現原因是W25的4K扇區擦寫周期要幾十ms,大部分時間耗在這裡了。如果改成32K扇區擦寫顯然會快很多,然而48腳的STM32F103C8隻有20K的RAM,所以沒辦法了。下次再做還是得考慮用64K RAM的STM32F103RE之類。

源碼鏈接如下,USB喚醒功能還沒有做,有空再補上。

tomzbj/diy?

github.com圖標
推薦閱讀:

相关文章