往期相關文章:
ESP32 I2S音頻總線學習筆記(一):初識I2S通信與配置基礎
ESP32 I2S音頻總線學習筆記(二):I2S讀取INMP441音頻數據
ESP32 I2S音頻總線學習筆記(三):I2S音頻輸出
ESP32 I2S音頻總線學習筆記(四):INMP441采集音頻并實時播放
ESP32 I2S音頻總線學習筆記(五):將inmp441采集到的音頻發送至網絡
簡介
使用ESP32的藍牙A2DP協議和前面我們介紹的I2S協議,兩者配合我們可以自制一個藍牙音箱。代碼也非常簡單,本篇我們不作深入了解,主要以實現功能為主。主要實現原理是ESP32支持藍牙 A2DP 協議的 API,可以從手機等設備接收音頻數據,并通過回調函數將數據輸出。輸出的數據是從 SBC 格式解碼后的 PCM 音頻流,我們將接收到的音頻數據再通過I2S輸出就可以在喇叭上聽到從藍牙傳輸過來的音頻了。
使用到的主要器件包括:
接線
首先先接好ESP32和I2S模塊線,可以使用面包板,也可以直接用普通的洞洞板去焊接,這里我選擇后者。
ESP32和PCM5102A:
ESP32 | PCM5102A |
---|---|
- | VCC |
3.3V | 3.3V |
GND | GND |
GND | FLT、DMP、SCL (這里SCL懸空可能會有干擾,所以接地) |
D32 | BCK |
D33 | DIN |
D25 | LCK |
GND | FMT |
3.3V | XMT |
接線圖:
然后將功放板連接到I2S模塊的音頻輸出端,這里只用一個聲道,左聲道。
功放板、PCM5102A模塊和喇叭的接線:
功放板 | PCM5102A | 喇叭 |
---|---|---|
L | L | - |
G | G | - |
lout+ | - | 喇叭 + |
lout- | - | 喇叭- |
接線圖:
接好上述線后,接下來接的就都是電源線了。我們需要將鋰電池通過保護板升壓后輸出的電壓給這些模塊進行供電,其中包括5V,和3.3V電源,3.3V只用在PCM5102A模塊上,其它兩個模塊都是5V供電。
電源接線:
電池 | 保護板 | ESP32 | 功放板 | PCM5102A |
---|---|---|---|---|
BAT+ | BAT | - | - | - |
BAT- | GND | - | - | - |
- | OUT | VIN | power + | - |
- | GND | GND | power - | - |
- | - | 3V3 | - | 3.3V |
- | - | GND | - | GND |
接線圖:
模塊布局這個看大家自己喜歡,不過建議把功放板放到側邊位置方便后續調節音量操作。
OK,接好線后我們開始上傳代碼;
#include "AudioTools.h"
#include "BluetoothA2DPSink.h"I2SStream i2s;
BluetoothA2DPSink a2dp_sink(i2s);void setup() {auto cfg = i2s.defaultConfig();cfg.pin_bck = 32;cfg.pin_ws = 25;cfg.pin_data = 33;i2s.begin(cfg);a2dp_sink.start("MyMusic");
}void loop() {
}
然后用手機連接名為MyMusic的藍牙,連接上后就可以播放音樂了。單擊鋰電池保護板上的按鈕可以開啟“音箱”,雙擊關機。如果沒有PCM5102A模塊的話,也可以用下面的代碼,使用ESP32的內部DAC輸出I2S音頻:
#include "AudioTools.h"
#include "BluetoothA2DPSink.h"AnalogAudioStream out;
BluetoothA2DPSink a2dp_sink(out);void setup() {a2dp_sink.start("MyMusic3");
}void loop() {
}
但是不建議這樣接,因為使用內部DAC輸出的話音質其實不是很好,但也能聽個“響”,所以這里就不過多介紹,接線的話就是直接將ESP32的GPIO25或者GPIO26引腳連接功放板的輸入即可,如果還是不清楚接線,可以參考之前這篇文章
ESP32 I2S音頻總線學習筆記(三):I2S音頻輸出 里面 “使用片上DAC進行I2S音頻輸出” 的相關內容。
到這一步,我們已經實現了“藍牙音箱”中的“藍牙音”, 是不是還差個“箱”,環顧我周圍的東西,之前打PCB板的JLC盒子赫然出現眼前,🆗就他了,用它做的“音箱”還自帶高級感(bushi)。為了方便控制和使用,我們需要外接電源按鍵和充電轉接板,這樣就可以方便控制開關機和進行充電。另外添加的兩個器件:
使用無鎖開關控制電源
現在遇到的問題是:怎么外接一個按鈕去控制“藍牙音箱”的電源通斷 ,用帶鎖的還是不帶鎖的,使用不帶鎖的話也很簡單,直接在保護板上的自帶按鍵,外接不帶鎖的按鈕即可,上面的接線也一樣照常接,缺點是給“音箱”斷電,需要快速雙擊按鈕才行。
接線:
實物如下圖,我用的線比較短,所以連接處纏上絕緣膠帶避免短路
使用自鎖開關控制電源
使用這鐘方法注意需要更換模塊或芯片,或者一開始就選擇好帶ck版本的保護板。
保護板上用的IP5306芯片不是ck版本,無法使用自鎖按鈕通過外部按鍵觸發后來控制輸出,即使在輸出接自鎖按鈕,還要在板子上再按下按鈕才有輸出,不能只通過一個自鎖開關去控制輸出。
解決方法就是換成ck版本的保護板,由于這個板子是我之前就做好的了,就不想更換保護板模塊了,所以我選擇了將原先保護板上的芯片換成ck版本的,這里如果大家想用自鎖開關去控制電源的話,一開始就要選擇好常開版本的保護板,可以更換其它帶常開的保護板。比如這款:
如果選用上面這款,電源接線 按下圖接:
如果選用這款(需自行更換ck版本芯片):
電源接線 :
充電轉接板接線:
制作“音箱”
-
使用圓規在紙盒上畫出?,用來放喇叭,注意圓圈直徑要略小于喇叭直徑。
-
使用美工刀先切出大概輪廓
-
切到一定程度就可以挖空
-
用同樣方法,挖空電源按鈕、充電轉接板、音量旋鈕位置。注意這里要挖兩層,因為我們要合上盒子。
5.這里側面挖空一下可以方便觀看“電量”,沒電的時候可進行充電。
組裝音箱
音箱制作好后我們就可以把板子裝進去盒子,這里注意因為喇叭要從上往下裝,所以板子要穿過孔去安裝(從下往上裝喇叭的話就裝不了了,因為我們畫的是圓形的尺寸)。這里如果板子穿不過去那個洞也可以把板子先放下面,然后再把喇叭往下裝(喇叭線先不焊接),然后焊接喇叭線。這里固定的話大家可以使用熱熔膠進行固定。當前你的喇叭也可以固定,不過固定后如果有什么問題要修復的話可能會比較麻煩。這里我之前焊接功放板的時候擺放的位置不對,導致調節音量的電位器旋鈕比較短了,這里大家注意把功放板往外放一點,這樣調節音量的時候就比較方便。
組裝完成實物:
注意事項
- 因為功放板輸出功率是3W,而喇叭是5W,所以實際上只能輸出3W的功率。如果你手上有3W的就接3W的喇叭。
- 如果需要使用自鎖開關控制電源,保護板芯片需是CK版本的。
- 使用自鎖開關,ck版本的保護板芯片,會一直輸出5V,就算電源開關斷開也會,可能會導致有微小的靜態電流消耗,但對電池影響不大。
- 800mAh的電池實測充滿電可以用一到兩個小時左右,需要用更久一些可以自行更換大容量的其它電池。