往期相关文章:
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的电池实测充满电可以用一到两个小时左右,需要用更久一些可以自行更换大容量的其它电池。