之前发过一贴:
esp32 下蓝牙播放音乐歌词的获得_esp32 蓝牙音频-CSDN博客
说的是esp32 蓝牙接收音频流同步获得歌词的方案,但是有个很核心的内容由于硬件原因没有谈及,就是播放音乐。
这几天被抖音上各种水桶卡顿刺激了,经过一番折腾,终于成功,顺便来分享一下经验。
其实使用A2DP 通过蓝牙接收数据进行播放相对简单:
硬件清单:esp32 ,喇叭和MAX98357 ,MAX98357 很便宜,包邮也才5.5
之前不想加这个MAX98357, 尝试过esp32 直接输出的方案,音量极低,不知道是不是接触不良,代码简单如下:
#include <Arduino.h>
#include "a2dp/BluetoothA2DPSink.h"
BluetoothA2DPSink a2dp_sink;
void setup(){
i2s_pin_config_t my_pin_config = {
.bck_io_num = 26,//输入 bck
.ws_io_num = 25,//输入
.data_out_num = 22,//输出
.data_in_num = I2S_PIN_NO_CHANGE
};
a2dp_sink.set_pin_config(my_pin_config);
a2dp_sink.start("my music");
}
void loop(){
}
需要特别说明的是:
i2s_pin_config_t my_pin_config = {
.bck_io_num = 26,//输入 bck
.ws_io_num = 25,//输入
.data_out_num = 22,//输出
.data_in_num = I2S_PIN_NO_CHANGE
};
这个GPIO可以任意指定,下面的配置也是可以正常运行的。
i2s_pin_config_t my_pin_config = {
.bck_io_num = 32,//输入
.ws_io_num = 33,//输入
.data_out_num = 23,//输出
.data_in_num = I2S_PIN_NO_CHANGE
};
需要特别指明一下这个配置对应MAX98357 上的引脚:
.bck_io_num // BCLK
.ws_io_num //LRC
.data_out_num // DIN
我在这里花时间比较多的原因是,因为原先使用A2DP 是注册了多个数据的回调:
// a2dp_sink.set_rssi_active(true);
// a2dp_sink.set_rssi_callback(rssi);
// a2dp_sink.set_on_data_received(data_receive_callback);
// a2dp_sink.set_stream_reader(read_data_stream, false);
这导致了花了太多时间查找原因,上面的回调导致不能正常输出音频,没有明确确认是那个回调,但是估计是: a2dp_sink.set_stream_reader(read_data_stream, false);
因此,如果你尝试ESP32 通过I2S 链接硬件放大器进行蓝牙下的音乐播放请先使用最简单的代码,如果没有音频请查找硬件连接线。
MAX98357 链接喇叭的时候莫名的正反接线都可以。
建议别尝试不通过放大器的方案了,最简单的原因就是哪怕你折腾通了,但是单片机能够引脚能够输出的电流是极小的,好像是30ma,这很难带动喇叭,说实话这个MAX98357 的总功率太小,才3W。