ESP32で音出しとMP3を再生したまとめ
ESP32ではメモリ不足で「ESP32-audioI2S」ライブラリは動作不可であったが「ESP8266Audio」というライブラリがありESP32でも使えることが判ったので音出しを実験
まずはネットで情報収集した結果ESP32で音出しする際の構成をまとめてみた

ESP32の音出しには2つの方法がある(I2S)
①内蔵DACを使って,I2SとDACドライバを経由で音を出力
②内蔵DACを使用しないで直接I2S信号をGPIOで出力させ外付けDACで音を出力
注)②の場合直接I2Sへデーターを送出する方法とライブラリを利用する方法がある
①の方法で出力
サイン波を生成して出力させるスケッチを試したが今一つだったので以下からスケッチを拝借
https://kghr.blog.fc2.com/blog-entry-126.html

注)直接SPを接続すると音量最大時が3.3Vとなるので大電流がGPIOに流れないよう注意
(再生)
②の方法で出力
(テスト用音源の準備)
②の方法で「ESP8266Audio」を使って音を再生するための音源データ(MP3)を準備
当初はWeb経由で行おうとして正常に動作しないので以下を参考にしてESP32のフラッシュに置いた
https://hatakekara.com/spiffs/(SPIFFS)
https://qiita.com/kumakumao/items/be51f174bfeb0e4a6a06 (LittleFS)
音源データが1MB少々でも1.5MBでは不足となるので「NO OTA(2MB APP/2MB SPIFFS)」で対応
■ 簡易的なモノラル出力
「ESP8266Audio」でDACがなくてもDOUTからPWMで再生する方法がある
サンプリング周波数は低いのだろうが,1bitのパルス波形の密度(ON/OFF)で表現するDSDってことかな

スケッチ(音源はSPIFFS)
#define NODAC 1
#include <Arduino.h>
#include "AudioFileSourceSPIFFS.h"
#include "AudioGeneratorMP3.h"
#ifdef NODAC
#include "AudioOutputI2SNoDAC.h"
#else
#include "AudioOutputI2S.h"
#endif
AudioGeneratorMP3 *mp3;
AudioFileSourceSPIFFS *file;
#ifdef NODAC
AudioOutputI2SNoDAC *out;
#else
AudioOutputI2S *out;
#endif
void setup() {
Serial.begin(115200);
delay(1000);
Serial.printf("MP3 Play Start\n");
SPIFFS.begin();
file = new AudioFileSourceSPIFFS("/hoshi45s.mp3");
#ifdef NODAC
out = new AudioOutputI2SNoDAC();
#else
out = new AudioOutputI2S();
#endif
out->SetPinout(26, 25, 22); //BCK=26, WCLK=25, DOUT=22
out->SetGain((float)30/100.0); //音量
mp3 = new AudioGeneratorMP3();
mp3->begin(file, out);
}
void loop() {
if(mp3->isRunning()) {
if(!mp3->loop()) mp3->stop();
} else {
Serial.printf("MP3 done\n");
delay(10000);
}
}
(再生)
■ MAX98357Aで出力

スケッチ(音源はSPIFFS)
//#define NODAC 1 ← コメントアウト
以下,上記のスケッチと同じ
(再生)
ESP32C3 super miniでMP3を再生
ESP32で音出しが出来たので,低価格でコンパクトなESP32C3 Super miniでのMP3再生を実験
(相違や懸案点)
- 使用したのは「ESP32 C3 Super Mini(K2)」((K1)以外はPIN互換だったかな)
- ESP32C3 Super miniは内蔵DACが省かれているので出力は②の方法のみとなる
- PIN数が異なるのでGPIOを1~5へ変更
- SPIFFSを作成してファイルを設置できるのだが何故か読めないのでLittleFSを使用
- arduinoIDE V1ではビルドできても動作が不安定で動作しないためV2でビルド
- デバッグで利用するSerial出力がIDEの設定で出力PINが変わるので注意(USB CDC On Boot)
■ 簡易的なモノラル出力

アンプ付きスピーカーとの接続はGPIO1
スケッチ(音源はLittleFS)
#define NODAC 1
#include <Arduino.h>
#include "AudioFileSourceLittleFS.h"
#include "AudioGeneratorMP3.h"
#ifdef NODAC
#include "AudioOutputI2SNoDAC.h"
#else
#include "AudioOutputI2S.h"
#endif
AudioGeneratorMP3 *mp3;
AudioFileSourceLittleFS *file;
#ifdef NODAC
AudioOutputI2SNoDAC *out;
#else
AudioOutputI2S *out;
#endif
void setup() {
Serial.begin(115200);
delay(1000);
Serial.printf("MP3 Play Start\n");
LittleFS.begin();
file = new AudioFileSourceLittleFS("/hoshi45s.mp3");
#ifdef NODAC
out = new AudioOutputI2SNoDAC();
#else
out = new AudioOutputI2S();
#endif
out->SetPinout(3, 2, 1); //BCK=3, WCLK=2, DOUT=1
out->SetGain((float)30/100.0); //音量
mp3 = new AudioGeneratorMP3();
mp3->begin(file, out);
}
void loop() {
if(mp3->isRunning()) {
if(!mp3->loop()) mp3->stop();
} else {
Serial.printf("MP3 done\n");
delay(10000);
}
}
(再生)
■ MAX98357Aで出力

スケッチ(音源はLittleFS)
//#define NODAC 1 ← コメントアウト
以下,上記のスケッチと同じ
(再生)
- 電源の問題なのかフェージングが発生

