ESP32, IOT物聯網

【IOT物聯網應用-ESP32】第三十三篇:專題ESP32 MP3 藍牙無線音樂播放器 MAX98357音訊放大器

實驗說明:

在這篇將示範打造一個ESP32 MP3 Player 藍牙無線音樂播放器。假若使用ESP32自帶的DAC腳位輸出音頻訊號,你會發現聲音明顯失真,所以我們必須要外掛一個MAX98357 I2S 音訊放大器模組,將音頻數據轉碼為立體聲並輸出。

ESP32藍牙無線音樂播放器,通過藍牙立體聲音訊傳輸規範(A2DP)通訊協定,即可經由手機、平板、電腦等完成播放指定的音樂與調節音量,以及如何播放音樂等功能,無需繁瑣的底層作業,使用簡單方便,穩定可靠。

 

材料:

  • ESP32-E DevKit
  • USB 傳輸線
  • MAX98357 I2S 音訊放大器模組
  • 小喇叭
  • 杜邦線

▼ 購買MAX98357 I2S 音訊放大器模組:

MAX98357 I2S 音訊放大器模組 音訊功放模組 支援ESP32 樹莓派

▼ 購買MAX98357 I2S 音訊放大器模組:

小喇叭 8歐姆 1瓦 | 8歐姆 0.5瓦 實驗小喇叭 揚聲器 薄型內磁喇叭

 

相關知識:

訊號轉換

藍牙設備從移動設備接收音樂數據時,是無法通過耳機和揚聲器直接播放。需要輸出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播放手機中的音樂文件。

 

 

相關文章