設備與材料
個人電腦 × 1
ESP12F × 1
MAX98357A 模組 × 1
麵包板 × 1
連接線 若干
實體接線圖
MAX98357A
ESP8266 系列的處理器內部沒有 DAC(Digital to Analog Converter) 數位類比轉換器功能,因此選擇了MAX98357A 模組來處理數位類比轉換,因為 MAX98357A 是使用 I2S 協定來傳送資料,因此只要3支控制腳就能控制它。
MAX98357A 是一款 I2S 單聲道串列數位轉類比D類放大器模組,最大輸出功率3.2W(4Ω喇叭,工作電壓5V時),工作電壓2.5V ~ 5.5V,I2S 取樣頻率 8kHz ~ 96kHz。
模組接腳 | 說明 |
LRC | 左右聲道時脈 |
BCLK | 時脈輸入 |
DIN | 數位串列輸入 |
GAIN | 放大增益設定 |
SD | 接地 ⟹ 關閉模組 空腳( 0.16V~0.77V ) ⟹ (左聲+右聲/2) 輸出 0.77V ~ 1.4V ⟹ 右聲道輸出 >1.4V ⟹ 左聲道輸出 |
GND | 接地 |
VIN | 電源 2.5V~5.5V |
MAX 98357A GAIN 放大增益設定
放大增益(Gain) | Gain 接腳 |
---|---|
15 dB | 經由 100kΩ 電阻接地 |
12 dB | 直接接地 |
9 dB | 空接(內定) |
6 dB | 直接接到Vin |
3 dB | 經由 100kΩ 電阻接到 Vin |
I2S
I2S 是一種音訊資料傳輸協定,由 philips 制定。該協定由至少三條資料線組成:
1、BCLK(bit clock):位元時脈,作用傳輸同步使用,時脈頻率 = 採樣率 * 每通道位數 * 通道數。
2、WS(word select):字元選擇、FS(frame Sync):框同步或 LRCLK(left-right clock,LRCLK):欄位(聲道)選擇。用來切換左右聲道資料,0 表示左聲道,1表示右聲道。
3、SD(Serial data):串列資料,但也可稱為SDATA, SDIN, SDOUT,DACDAT, ADCDAT..等
開發環境
使用 Arduino IDE 安裝 ESP8266開發板,如果不知道如何安裝ESP8266開發板,可以參考 “準備你的 ESP12E/F 開發工具” ,安裝開發板之後,記得開發板選擇 “NodeMCU 1.0(ESP-12E Module)” ,CPU Frequency 記得調到 160MHz ,如下圖
安裝ESP8266Audio 程式庫,選擇 Arduino IDE 中的 “草稿碼” ->”匯入程式庫” ->”管理程式庫” 輸入 ESP8266Audio 會出現如下圖,按 “安裝” 即可
範例程式
/*
* ESP-12F 網路電台收音機 I2S
* 開發工具 Arduino IDE 必需自行加入ESP12F 開發板
* 開發板 ESP12F(ESP8266)+MAX98357A
* 連接 wifi 後會連上網路電台的網址,進行收音
* 只支援 mp3 格式的網路電台
* MAX98357A ESP12F
* Vin 5V
* GND G
* SD 空腳
* GAIN G
* DIN RX
* BCLK D8
* LRC D4
* https://www.block.tw/blog
*/
#include <ESP8266WiFi.h>
#include "AudioFileSourceICYStream.h" //MP3 網路串流處理
#include "AudioFileSourceBuffer.h" //暫存處理
#include "AudioGeneratorMP3.h" //MP3解碼
#include "AudioOutputI2S.h" //I2S 音樂輸出
// 請將 ESP12F CPU 設定 為 160MHz
// WIFI SSID 與 密碼
const char *SSID = "yourSSID";
const char *PASSWORD = "你的wifi密碼";
/******************************************************************
* 網路電台網址
******************************************************************/
//const char *URL = "http://vis.media-ice.musicradio.com/CapitalMP3";
//const char *URL="http://jazz.streamr.ru/jazz-64.mp3";
const char *URL="http://fm971.cityfm.tw:8080/971.mp3"; //台南知音
//const char *URL="http://fm929.cityfm.tw:8080/929.mp3"; //城市廣播
//const char *URL="http://fm983.cityfm.tw:8080/983.mp3"; //大苗栗廣播
//const char *URL="http://fm901.cityfm.tw:8080/901.mp3"; //台北健康
AudioGeneratorMP3 *mp3; //MP3解碼
AudioFileSourceICYStream *file; //MP3網路串流
AudioFileSourceBuffer *buff; //暫存空間
AudioOutputI2S *out; //I2S 音樂輸出
void setup()
{
Serial.begin(115200);
delay(1000);
Serial.println("WiFi連線中");
WiFi.disconnect();
WiFi.softAPdisconnect(true);
WiFi.mode(WIFI_STA);
WiFi.begin(SSID, PASSWORD);
//連上 wifi
while (WiFi.status() != WL_CONNECTED) {
Serial.println("...WiFi 連線中");
delay(1000);
}
Serial.println("WiFi 已連線");
startPlay(); //開始收音
}
void loop(){
static int lastms = 0;
if (mp3->isRunning()) {
if (millis() - lastms > 10000) {
lastms = millis();
Serial.printf("已執行 %d 秒...\n", lastms/1000);
Serial.flush();
}
if (!mp3->loop()) mp3->stop();
} else {
Serial.printf("電台通訊中斷,重新連接中\n");
stopPlay();
startPlay();
}
}
void stopPlay(){
if (mp3) {
mp3->stop();
delete mp3;
mp3 = NULL;
}
if (buff) {
buff->close();
delete buff;
buff = NULL;
}
if (file) {
file->close();
delete file;
file = NULL;
}
}
void startPlay(){
file = new AudioFileSourceICYStream(URL); //網路電台串流檔案
//暫存空間 8k 暫存時間相當短,只要網路不順聲音就斷斷續續
buff = new AudioFileSourceBuffer(file, 1024*8);
out = new AudioOutputI2S(); //I2S 串流音樂輸出
//怕吵到人 測試用0.05 音量調整 0~4.0 喇叭 4Ω 板子的增益 6dB
out->SetGain(0.05);
mp3 = new AudioGeneratorMP3(); //mp3解碼
mp3->begin(buff, out);
}
功能
1、請你加入按鈕功能作為音量調整
2、請你加入按鈕功能作為電台選擇
Arduino 輸出實習(單燈閃爍)
Arduino 輸出實習(跑馬燈-愚公移山)
Arduino 輸出實習(跑馬燈-for迴圈)
Arduino 數位輸入實習
Arduino 數位輸入實習(INPUT_PULLUP)
Arduino 類比輸入實習
Arduino PWM 實習 (呼吸燈)
Arduino PWM 實習 (光感應調光燈)
Arduino 8×8 LED Matrix MAX7219 實習
Arduino 紅綠燈小綠人 實習
Arduino 計時器 實習
Arduino 音樂盒
Arduino 電子琴(鍵盤掃描)
Arduino DHT11 溫濕度感應器
Arduino OLED 顯示
Arduino 超音波測距模組 HC-SR04
Arduino 執行時間實習
Arduino 電容測試器
Arduino 紅外線接收實習
Arduino 紅外線發射實習 EPSON 投影機控制
ESP-12F 網路智慧開關(MQTT)
ESP-12F 雲端記錄型 K-Type 溫度計(MQTT ThingSpeak)
ESP-12F 手機雲端紅外線控制
ESP-12F 網路電台收音機
ESP-12F 電子鼓