エントリー

ESP32で音出しとMP3を再生したまとめ

ESP32ではメモリ不足で「ESP32-audioI2S」ライブラリは動作不可であったが「ESP8266Audio」というライブラリがありESP32でも使えることが判ったので音出しを実験

まずはネットで情報収集した結果ESP32で音出しする際の構成をまとめてみた

20260412_Fig01.png

ESP32の音出しには2つの方法がある(I2S

①内蔵DACを使って,I2SとDACドライバを経由で音を出力

②内蔵DACを使用しないで直接I2S信号をGPIOで出力させ外付けDACで音を出力

注)②の場合直接I2Sへデーターを送出する方法とライブラリを利用する方法がある

①の方法で出力

サイン波を生成して出力させるスケッチを試したが今一つだったので以下からスケッチを拝借

https://kghr.blog.fc2.com/blog-entry-126.html

I2S_1bit_output.png

注)直接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ってことかな

I2S_1bit_output.png

スケッチ(音源は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で出力

I2S_output.png

スケッチ(音源はSPIFFS)

//#define NODAC 1    ← コメントアウト

以下,上記のスケッチと同じ

(再生)

ESP32C3 super miniでMP3を再生

ESP32で音出しが出来たので,低価格でコンパクトなESP32C3 Super miniでのMP3再生を実験smc3-k2-pin-2.jpg

(相違や懸案点)

  • 使用したのは「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)
■ 簡易的なモノラル出力

IMG_20260412_164740.jpg

アンプ付きスピーカーとの接続は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で出力

esp32c3_output.png

スケッチ(音源はLittleFS)

//#define NODAC 1 ← コメントアウト

以下,上記のスケッチと同じ

(再生)

  • 電源の問題なのかフェージングが発生

ページ移動

コメント

  • コメントはまだありません。

コメント登録

  • コメントを入力してください。
登録フォーム
名前(ニックネーム)
メールアドレス(必須ではありません)
URL(必須ではありません)
コメント
閲覧制限
投稿キー(スパム対策に、投稿キー を半角で入力してください。)

ユーティリティ

検索

エントリー検索フォーム
キーワード

新着コメント

Re:ArduinoIDEでFTDIチップでの書き込みエラー
2026/01/16 from 権限がありません
Re:ArduinoIDEでFTDIチップでの書き込みエラー
2026/01/15 from admin
Re:ArduinoIDEでFTDIチップでの書き込みエラー
2026/01/14 from 権限がありません
Re:NOAA受信システム復旧
2025/06/11 from admin
Re:NOAA受信システム復旧
2025/06/11 from とおりすがり

過去ログ

Feed