本文是藍牙音箱的手冊。函數
藍牙音箱做爲禮物,面向的是用戶,可是這位用戶同時又是開發者,所以音箱的設計原則是實現必定的功能,並提供足夠的擴展接口、開放設計文檔。動畫
資料下載:提取碼0910。ui
音箱由外殼、3塊PCB、揚聲器、麪包板、若干鏈接線和電源適配器組成。操作系統
外殼包括亞克力材質的底板、面板和側板。底板和麪板之間用不鏽鋼合頁鏈接,可調整至側板上有缺口的角度處固定,可用的角度有60、6五、70、75和90度。線程
3塊PCB中,底板包含電源與控制部分,2塊面板中下側的一塊爲外設,右上的爲音頻。設計
16*8點陣屏爲主要輸出設備,4個按鍵(標號爲0到3)的功能在下一節中介紹。3d
3個旋鈕中,右上調節低頻增益,左上調節低頻範圍,下面的調節音量,逆時針旋到底可靜音。指針
控制板上的綠燈指示藍牙鏈接,斷開J5
以禁用;音頻板上的紅燈指示輸出開啓,把R19
移到旁邊的焊盤上以禁用。code
控制板和外設板、音頻板之間分別用八、4針排線鏈接,標「1」的位置對應;控制板和音頻板之間還需2根電源線,「+」「-」對應。blog
電源適配器爲市售的12V/1A直流電源,5.5-2.1插頭,內正外負。
控制板接12V電源,LDO降壓到5V給板載設備,不分數字模擬。12V有過流保護,5V有過壓保護。外設板經過排針從控制板上取5V,音頻板經過端子從控制板上取12V,並用LDO降壓到10V用於音頻信號放大。
藍牙模塊JDY-67輸出左右聲道音頻信號,左、右與混合爲3個信號源;6.35mm輔助輸入的左聲道爲信號源,增益可經過控制板左下方的電位器調整;另外一信號源爲分壓後的單片機定時器輸出。以上信號源經CD4051選擇一路(SRC
)送到音頻板上,10倍放大並調整直流電位到2.5V後送回(AUD
)。此信號經過截止頻率可調的低通濾波器、放大倍數爲0到大約3可調的共射放大電路(反相),進入帶恆流源的、放大倍數爲1的雙端輸入、單端輸出差分放大電路,另外一路爲AUD
。差分放大電路輸出用射極跟隨器緩衝,進入D類功放芯片PAM8320,增益26dB。
AUD
在控制板上經低通濾波器進入全波整流電路,信號幅度ENV
輸出給單片機ADC。AUD
串聯10kΩ電阻後接ADC。ADC還接有光敏電阻和熱敏電阻,後者在音頻板上,靠近PAM8320底部焊盤。
單片機採用ATmega328P,頻率20MHz。UART的RX直接引出,TX用CD4053複用爲2路引出,TXDS
信號選擇通道,可用跳線鏈接藍牙模塊。SPI鏈接LED驅動與按鍵掃描芯片TM1629與時鐘芯片DS1302,前者在外設板上。兩芯片均爲半雙工IO設計,用SS
信號驅動CD4053切換通道。
擴展接口共4組。控制板與外設板右側可插MEDS模塊,也可鏈接其餘I²C設備;麪包板右上方爲UART區域,M
和B
分別表示單片機和藍牙模塊,ETX
爲TXDS
高電平時單片機串口輸出;右下方爲單片機GPIO與5V電源,PC
可接ADC,PD
可接定時器0;下方爲模擬區域,從左到右分別爲藍牙左、右、放大後的輔助輸入、2.5V電源、CD4051通道六、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後可用按鍵二、3調整分鐘,再按按鍵1調整秒鐘,再按保存。
鬧鐘界面
與上面相似,依次調整小時、分鐘的十位和分鐘的個位,最後按下按鍵1保存。
若是已經設定鬧鐘,會顯示目標時間。按下按鍵1取消。
鬧鐘響起界面
閃爍顯示時間。按任意按鍵返回鬧鐘響起前的界面。
通道選擇
可選擇的通道有0、一、二、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本身寫哦)。
側板上加燈條。
*改用電池供電。
魔改外設板供電。
藍牙音頻與輔助輸入混合。
軟件:
重構。
與藍牙模塊通訊,實現暫停、下一曲等功能。
讓單片機像藍牙模塊那樣,容許用戶經過串口控制設備。
*智能校訂時間。
根據光強調整點陣屏亮度。
顯示溫度、過溫保護。
*節奏檢測。