首先使用ESP32板和MAX98357晶片進行了簡單的接線,下載了ArduinoI2S的庫,然後用Arduino IDE並編寫了一些簡單的程式碼來實現音樂播放。
當我們啟動程式並播放這首歌時,我們聽到了一個令人驚歎的立體聲效果,彷彿我們身臨其境,整個音樂環繞著我們。這歸功於MAX98357晶片的高品質音訊放大和ESP32的先進處理能力。
總之,使用ESP32和MAX98357晶片播放音樂的實驗效果令人驚歎。這不僅是科技和音樂的完美結合,也是一個有趣而充滿創意的實驗。無論您是音樂愛好者還是科技迷,都一定要嘗試一下!
元件說明
MAX98357是一款高品質、低功耗的立體聲音訊放大器晶片,由Maxim Integrated生產。該晶片具有內建的數字音訊介面(I2S),可與各種數字音訊裝置配合使用。MAX98357能夠提供高達3.2W的輸出功率,並具有優秀的失真和噪聲效能。此外,該晶片還支援多種電源電壓,包括3.3V、5V和+/-5V等。該晶片適用於行動式音訊裝置、智慧音響、車載音訊系統和其他需要高品質音訊放大器的應用。其小尺寸和低功耗使其非常適合在空間受限或需要長時間使用的應用中。如果您正在尋找一款高效能、低功耗的立體聲音訊放大器晶片,那麼MAX98357將是您的不二之選。
ESP32和MAX98357的應用
ESP32和MAX98357這兩款晶片可以結合起來實現很多有趣的應用,下面是一些例子舉例:
- 智慧音響:使用ESP32作為控制中心,接入網際網路,可以與人工智慧語音助手如Alexa、Google Home等配合使用,同時使用MAX98357作為音訊輸出裝置,可以實現高品質的音訊播放效果。
- 藍芽音響:ESP32可以配合藍芽模組實現無線連線,將音訊資料傳輸到MAX98357晶片進行音訊放大和播放,實現一個行動式的藍芽音響。
- 錄音回放裝置:將麥克風接入ESP32,利用其內建的ADC模組將模擬訊號轉換為數字訊號,並使用MAX98357晶片進行數字音訊輸出,可以實現錄音回放功能。
- 遊戲機:ESP32可以連線到遊戲控制器,接收遊戲資料並控制MAX98357晶片進行音訊輸出,實現一個簡單的遊戲機。
- IoT音樂應用:ESP32可以連線到各種感測器,收集環境資料,並控制MAX98357晶片進行音訊輸出,實現一個智慧音樂應用。
這些只是ESP32和MAX98357可以實現的一些應用,您也可以發揮自己的創意和想象力,開發出更多有趣的應用。
MAX98357的特點
- 輸出功率: 4歐時為3.2W,THD為10% 8歐時為 1.8W,THD為10%
- I2S取樣率:8KHz-96kHZ
- D類放大器 增益可選:3dB/6dB/9dB/12d B/15dl
- 無需主控時鐘 ( MCLK)
- 即插即用:只需單電源供電,即可自動配置35種不 同的時鐘和128種數字音訊格式。
- 適用於Raspberry Pi, Arduino以及ESP32等具 有I2S音訊輸出的微控制器或開發板系統
引腳說明
MAX98357A的引腳圖:
MAX98357A模組引腳 | 引腳說明 |
---|---|
VIN | 電源正(2.5V-5.5V) |
GND | 電源地 |
SD | 關機和頻道選擇。SD MODE拉低以將器件處於關斷狀態。 |
GAIN | 增益和頻道選擇。在TDM模式系啊,增益固定為12dB |
DIN | 數字訊號輸入 |
BCLK | 位時鐘輸入 |
LRC | I2S與LJ模式的左/右時鐘。同步時鐘用於TDM模式 |
BOM表
名稱 | 數量 |
---|---|
ESP32 開發板 | x1 |
MAX98357A I2S 音訊放大器模組 | x1 |
喇叭 | x1 |
跳線(杜邦線) | 若干 |
接線圖
ESP32與MAX98357的接線圖:
庫安裝
1,首先到GITHUB下載「ESP32-audioI2S」
倉庫地址:https://github.com/schreibfaul1/ESP32-audioI2S/
2,解壓。
3,把解壓的檔案放進Arduino IDE的libraries資料夾
程式碼提點
1,載入庫
#include "Arduino.h"
#include "WiFiMulti.h" // Wifi庫
#include "Audio.h" // I2S的音樂庫
2,定義MAX98375A的引腳
// Digital I/O used
#define I2S_DOUT 25
#define I2S_BCLK 27
#define I2S_LRC 26
3,建立例項
Audio audio; // 建立 播放音樂的 Audio 例項
WiFiMulti wifiMulti; // ESP32 的 WIFI 例項
4,初始化音樂Audio例項
audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT); // 初始化,配置所用引腳
audio.setVolume(12); // 設定音量大小 0...21
5,播放音樂
可以播放網路上的mp3檔案
audio.connecttohost("http://mp3.ffh.de/radioffh/hqlivestream.mp3"); // 128k mp3
6, 持續執行
需要在loop()中放置audio.loop();
void loop() {
...
audio.loop();
...
}
7,從串列埠中獲取mp3連線
if (Serial.available()){ // put streamURL in serial monitor
audio.stopSong();
String r=Serial.readString(); r.trim();
if (r.length()>5) audio.connecttohost(r.c_str());
log_i("free heap=%i", ESP.getFreeHeap());
}
完整程式碼
// Welcome to www.LingShunLAB.com
#include "Arduino.h"
#include "WiFiMulti.h"
#include "Audio.h"
// Digital I/O used
#define I2S_DOUT 25
#define I2S_BCLK 27
#define I2S_LRC 26
Audio audio;
WiFiMulti wifiMulti;
// config your wifi
String ssid = "xxxxx";
String password = "xxxxx";
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
wifiMulti.addAP(ssid.c_str(), password.c_str());
wifiMulti.run();
if(WiFi.status() != WL_CONNECTED){
WiFi.disconnect(true);
wifiMulti.run();
}
audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
audio.setVolume(12); // 0...21
audio.connecttohost("http://mp3.ffh.de/radioffh/hqlivestream.mp3"); // 128k mp3
}
void loop()
{
audio.loop();
if(Serial.available()){ // put streamURL in serial monitor
audio.stopSong();
String r=Serial.readString(); r.trim();
if(r.length()>5) audio.connecttohost(r.c_str());
log_i("free heap=%i", ESP.getFreeHeap());
}
}
// optional
void audio_info(const char *info){
Serial.print("info "); Serial.println(info);
}
void audio_id3data(const char *info){ //id3 metadata
Serial.print("id3data ");Serial.println(info);
}
void audio_eof_mp3(const char *info){ //end of file
Serial.print("eof_mp3 ");Serial.println(info);
}
void audio_showstation(const char *info){
Serial.print("station ");Serial.println(info);
}
void audio_showstreamtitle(const char *info){
Serial.print("streamtitle ");Serial.println(info);
}
void audio_bitrate(const char *info){
Serial.print("bitrate ");Serial.println(info);
}
void audio_commercial(const char *info){ //duration in sec
Serial.print("commercial ");Serial.println(info);
}
void audio_icyurl(const char *info){ //homepage
Serial.print("icyurl ");Serial.println(info);
}
void audio_lasthost(const char *info){ //stream URL played
Serial.print("lasthost ");Serial.println(info);
}
上傳程式碼後,程式會自動播放一首歌曲,然後可以在串列埠中傳送MP3連線,即可線上播放。