實驗說明:
在這篇將示範打造一個ESP32 MP3 Player 藍牙無線音樂播放器。假若使用ESP32自帶的DAC腳位輸出音頻訊號,你會發現聲音明顯失真,所以我們必須要外掛一個MAX98357 I2S 音訊放大器模組,將音頻數據轉碼為立體聲並輸出。
ESP32藍牙無線音樂播放器,通過藍牙立體聲音訊傳輸規範(A2DP)通訊協定,即可經由手機、平板、電腦等完成播放指定的音樂與調節音量,以及如何播放音樂等功能,無需繁瑣的底層作業,使用簡單方便,穩定可靠。
材料:
- ESP32-E DevKit
- USB 傳輸線
- MAX98357 I2S 音訊放大器模組
- 小喇叭
- 杜邦線
▼ 購買MAX98357 I2S 音訊放大器模組:
▼ 購買MAX98357 I2S 音訊放大器模組:
相關知識:
訊號轉換
藍牙設備從移動設備接收音樂數據時,是無法通過耳機和揚聲器直接播放。需要輸出DAC訊號,藍牙設備需要通過I2S解碼晶片對這些數據進行解碼。這些音頻訊號的功率非常小,只能驅動耳機等小功率音樂收聽設備。必須使用功放晶片放大這些DAC訊號的功率,才能夠驅動功率相對較大的音樂播放設備,如揚聲器。
MAX98357 與ESP32連接如下表所示:
程式:
下載ESP32完整測試程序:程式碼下載
在編譯程式碼之前,請按照以下步驟進行設置:
- “Tools” >> 工具/開發板 >>ESP32 Wrover Module
- “Tools” >> “Partition Scheme” >> ”Huge APP (3MB No OTA/1MB SPIFFS)”;
- “Tools” >> “Flash Mode” >> ”DOUT”;
- “Tools” >> “Flash Frequency” >> ”80MHz”;
▼可以參考下圖進行配置
#include "BluetoothSerial.h"
#include "driver/i2s.h"
#include "nvs.h"
#include "nvs_flash.h"
#include "esp_bt.h"
#include "bt_app_core.h"
#include "bt_app_av.h"
#include "esp_bt_main.h"
#include "esp_bt_device.h"
#include "esp_gap_bt_api.h"
#include "esp_a2dp_api.h"
#include "esp_avrc_api.h"
//MAX98357腳位定義
#define CONFIG_I2S_LRCK_PIN 26
#define CONFIG_I2S_BCK_PIN 27
#define CONFIG_I2S_DATA_PIN 25
BluetoothSerial SerialBT;
void setup() {
Serial.begin(115200);
SerialBT.begin("ESP32");
Serial.println("Init seccess!");
esp_err_t err = nvs_flash_init();
if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase());
err = nvs_flash_init();
}
i2s_config_t i2s_config;
i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX);
i2s_config.bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT;
i2s_config.sample_rate = 44100;
i2s_config.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT;
i2s_config.communication_format = I2S_COMM_FORMAT_STAND_MSB;
i2s_config.intr_alloc_flags = 0;
i2s_config.dma_buf_count = 6;
i2s_config.dma_buf_len = 60;
i2s_config.tx_desc_auto_clear = true;
i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL);
i2s_pin_config_t pin_config;
pin_config.bck_io_num = CONFIG_I2S_BCK_PIN;
pin_config.ws_io_num = CONFIG_I2S_LRCK_PIN;
pin_config.data_out_num = CONFIG_I2S_DATA_PIN;
pin_config.data_in_num = -1;
i2s_set_pin(I2S_NUM_0, &pin_config);
bt_app_task_start_up();
/* 初始化 A2DP sink */
esp_a2d_register_callback(&bt_app_a2d_cb);
esp_a2d_sink_register_data_callback(bt_app_a2d_data_cb);
esp_a2d_sink_init();
/* 初始化 AVRCP controller */
esp_avrc_ct_init();
esp_avrc_ct_register_callback(bt_app_rc_ct_cb);
/* 設定 discoverable and connectable 模式, 等待被連線 */
esp_bt_gap_set_scan_mode(ESP_BT_CONNECTABLE, ESP_BT_GENERAL_DISCOVERABLE);
Serial.println("ok");
}
void loop(){
;
}
程式說明:
編譯並上傳程式碼到ESP32後並打開串口監視器。ESP32需要幾秒鐘來初始化程序。接著您就可以使用手機搜索並連接名為“ESP32”的藍牙設備。連接成功後,您可以使用ESP32播放手機中的音樂文件。