自制藍芽音箱的手冊
綜述
本文是藍芽音箱的手冊。
藍芽音箱作為禮物,面向的是使用者,但是這位使用者同時又是開發者,因此音箱的設計原則是實現一定的功能,並提供足夠的擴充套件介面、開放設計文件。
資料下載:提取碼0910。
硬體
音箱由外殼、3塊PCB、揚聲器、麵包板、若干連線線和電源介面卡組成。
-
外殼包括亞克力材質的底板、面板和側板。底板和麵板之間用不鏽鋼合頁連線,可調整至側板上有缺口的角度處固定,可用的角度有60、65、70、75和90度。
-
3塊PCB中,底板包含電源與控制部分,2塊面板中下側的一塊為外設,右上的為音訊。
16*8點陣屏為主要輸出裝置,4個按鍵(標號為0到3)的功能在下一節中介紹。
3個旋鈕中,右上調節低頻增益,左上調節低頻範圍,下面的調節音量,逆時針旋到底可靜音。
控制板上的綠燈指示藍芽連線,斷開
J5
以禁用;音訊板上的紅燈指示輸出開啟,把R19
移到旁邊的焊盤上以禁用。控制板和外設板、音訊板之間分別用8、4針排線連線,標“1”的位置對應;控制板和音訊板之間還需2根電源線,“+”“-”對應。
-
電源介面卡為市售的12V/1A直流電源,5.5-2.1插頭,內正外負。
控制板接12V電源,LDO降壓到5V給板載裝置,不分數字模擬。12V有過流保護,5V有過壓保護。外設板通過排針從控制板上取5V,音訊板通過端子從控制板上取12V,並用LDO降壓到10V用於音訊訊號放大。
藍芽模組JDY-67輸出左右聲道音訊訊號,左、右與混合為3個訊號源;6.35mm輔助輸入的左聲道為訊號源,增益可通過控制板左下方的電位器調整;另一訊號源為分壓後的微控制器定時器輸出。以上訊號源經CD4051選擇一路(SRC
AUD
)。此訊號通過截止頻率可調的低通濾波器、放大倍數為0到大約3可調的共射放大電路(反相),進入帶恆流源的、放大倍數為1的雙端輸入、單端輸出差分放大電路,另一路為AUD
。差分放大電路輸出用射極跟隨器緩衝,進入D類功放晶片PAM8320,增益26dB。
AUD
在控制板上經低通濾波器進入全波整流電路,訊號幅度ENV
輸出給微控制器ADC。AUD
串聯10kΩ電阻後接ADC。ADC還接有光敏電阻和熱敏電阻,後者在音訊板上,靠近PAM8320底部焊盤。
微控制器採用ATmega328P,頻率20MHz。UART的RX直接引出,TX用CD4053複用為2路引出,TXDS
SS
訊號驅動CD4053切換通道。
擴充套件介面共4組。控制板與外設板右側可插MEDS模組,也可連線其他I²C裝置;麵包板右上方為UART區域,M
和B
分別表示微控制器和藍芽模組,ETX
為TXDS
高電平時微控制器串列埠輸出;右下方為微控制器GPIO與5V電源,PC
可接ADC,PD
可接定時器0;下方為模擬區域,從左到右分別為藍芽左、右、放大後的輔助輸入、2.5V電源、CD4051通道6、7,2.5V電源在音訊域中輸出100mA時波紋小於50mV。
已知問題與解決方案:
-
面板固定不牢固,建議在插槽處安裝螺絲,把面板卡在側板的缺口處。
-
側板上有45度缺口,但調整至該角度時杜邦線會受擠壓,因此不可用。
-
SS
應連線CD4053的11號引腳,TXDS
應連線9號,PCB設計錯誤,已經魔改解決。 -
藍芽模組已改為直連5V並連線MLCC,AMS1117-5.0輸出增加470Ω電阻以滿足10mA最小電流要求,但仍不能徹底消除噪音。
-
TF卡無法使用,可能是因為
CLK
沒有上拉。 -
音訊板上
L1
和L2
不焊,短接,因為貼片磁珠額定電流不夠。 -
D1
應改為1206封裝,TM1629引腳超出焊盤,6.35mm插座的封裝中缺口位置錯誤,但這些都不影響裝配。
介面
可切換的有5個介面:時鐘、鬧鐘、通道選擇、頻譜和動畫。還有一個鬧鐘響起的介面。按鍵0用於切換至下一介面。
-
時鐘介面
顯示時間。按下按鍵2,依次顯示年份、日期、星期幾與小時。使用按鍵3在分秒和時分之間切換。
按下按鍵1後可用按鍵2、3調整分鐘,再按按鍵1調整秒鐘,再按儲存。
-
鬧鐘介面
與上面類似,依次調整小時、分鐘的十位和分鐘的個位,最後按下按鍵1儲存。
如果已經設定鬧鐘,會顯示目標時間。按下按鍵1取消。
-
鬧鐘響起介面
閃爍顯示時間。按任意按鍵返回鬧鐘響起前的介面。
-
通道選擇
可選擇的通道有0、1、2、3和5,分別為靜音、藍芽左、藍芽右、藍芽左右混合和放大後的輔助輸入。按鍵3切換,按鍵1選擇。
按鍵2可關閉點陣屏。
-
頻譜
顯示頻譜。按鍵無用。
-
動畫
與低頻訊號響度有關的動畫。按鍵無用。
已知問題與解決方案:
-
點陣屏顯示的內容越多噪音越大,也許和亮度也有關係,建議享受音樂時關閉點陣屏。
-
切換至通道0會爆音。建議用旋鈕來靜音。拔電源時也會爆音,建議一直插著。
軟體
開發環境Atmel Studio 7.0。BluetoothSpeaker
包含driver
和program
等多個專案,driver
為各裝置API,program
為可執行程式,其餘都是開發單個功能時的程式碼。
driver
中的各API就對照著實現顧名思義吧。注意TM1629和DS1302相關的數字都是BCD表示的。除了UART以外,所有操作都是阻塞的。
程式使用一種有點像作業系統的任務管理方式。每個介面稱為一個“page”(“process”或“thread”更合適),每個page包含cdtor
、listener
和thread
三個函式指標欄位:
-
cdtor
為page的構造和解構函式,進入和退出時呼叫。函式switch_page
封裝了這一過程。 -
listener
為監聽器,按鍵按下時呼叫。按鍵響應有兩種方式,一種是在listener
內部處理,另一種是呼叫button_forward
把事件儲存在flag中,在thread
中呼叫button_read
讀取。 -
thread
為主執行緒,介面控制在此執行。函式不得返回。
main
函式先初始化,然後進入第一個頁面。在定時器中斷中,程式讀取按鍵,在有按鍵動作時呼叫當前頁面的listener
。listener
內部呼叫switch_page
,其中依次關全域性中斷、呼叫dtor、配置頁面、呼叫ctor,把棧指標SP
寫為記憶體最高地址以防止記憶體溢位、開全域性中斷,最後呼叫新頁面的thread
。
independent_listener
是獨立於頁面的監聽器,負責鬧鐘的計時。
頻譜頁面使用了Arduino FHT庫,規模256,計算線性幅度,取前64個分組累加,最後對數對映輸出。
動畫頁面根據ENV
訊號的電壓檢測峰值,按照訊號是否超過最大值的3/4分兩種情況。螢幕上一個點在對角線方向上移動,碰到邊緣反彈,電壓高時點變大且移動加快。
已知問題與解決方案:
-
UART接收的ISR中,如果有操作會開啟中斷,一定要確保
UDR
已經讀取,否則會遞迴進ISR。 -
ADC注意精度問題,有時8位不夠。
-
如果SPI的
SS
為輸入,低電平時MSTR
位會清零,置位前無法作為主機發起通訊,所以要在初始化SPI暫存器之前開上拉電阻或配置輸出。 -
DS1302在寫入RTC暫存器時會重新開始計秒。
-
程式碼第604行對
i == 15
會復位,不知道是哪裡出問題了。
設計提示
硬體:
-
連線MEDS模組(I²C自己寫哦)。
-
側板上加燈條。
-
*改用電池供電。
-
魔改外設板供電。
-
藍芽音訊與輔助輸入混合。
軟體:
-
重構。
-
與藍芽模組通訊,實現暫停、下一曲等功能。
-
讓微控制器像藍芽模組那樣,允許使用者通過串列埠控制裝置。
-
*智慧校正時間。
-
根據光強調整點陣屏亮度。
-
顯示溫度、過溫保護。
-
*節奏檢測。