
M5Stack Core2と外付けアンプモジュール「MAX98357A」を使って、microSDカード内のMP3ファイルをスピーカーから再生するという実験、実は少しコツが必要です。
なぜなら、M5Stackが扱える「I2S信号」は生の音データ(PCM)であって、MP3ファイルのような圧縮音源をそのまま流しても音にならないからです。
あなたの提示されたコードはPCM(.wav)ファイル再生を前提に書かれており、MP3再生にはデコード処理ライブラリを挟む必要があります。
- なぜそのコードでは音が出ないのか?
- 使用する主要ライブラリ
- ハードウェア接続確認
- ライブラリの導入方法
- コードの基本構成(概要)
- 実際に動作するArduinoコード(M5Stack Core2 + MAX98357A)
- 🎧 ファイルとSDカードの注意点
- 🚫 よくあるエラーと対処法
- ⚙️ 応用:複数ファイルの再生
- 🔋 動作確認済み環境
- まとめ
なぜそのコードでは音が出ないのか?
提示されたコードを確認すると、SDカードから「.mp3」を開いていますが、中ではI2Sにそのままi2s_write()で送信しています。
しかしI2Sは**1サンプルずつ(16bitや24bitの波形データ)**を送るための通信方式なので、
圧縮されたMP3をそのまま流しても、当然スピーカーは「意味のないビット列」として無音になります。
要するに、次のような構成を取る必要があります。
MP3ファイル(SDカード)
↓
MP3デコードライブラリ(MP3→PCM変換)
↓
I2S(MAX98357Aアンプ)
↓
スピーカー
使用する主要ライブラリ
M5Stack Core2はESP32ベースなので、ESP32用の音声再生ライブラリが利用できます。
代表的なのが以下の2つです。
- ESP32-audioI2S(MP3、WAV、AACなどに対応)
- Audio.h(ESP8266Audio)(より軽量で安定)
今回はより安定して使える「ESP32-audioI2S」を採用します。
このライブラリはMP3のデコードからI2Sへの出力までを自動で行ってくれるため、
自前でI2Sの設定をする必要がなく、簡潔なコードで再生ができます。
ハードウェア接続確認
M5Stack Core2とMAX98357Aの接続は、以下のピン配置で問題ありません。
(M5Stack Core2は内部I2Sを持っているため、任意ピンでの出力が可能)
|
機能 |
MAX98357A ピン |
M5Stack Core2 ピン |
|
LRC(LRCLK) |
LRC |
GPIO25 |
|
BCLK(BCK) |
BCLK |
GPIO26 |
|
DIN(データ入力) |
DIN |
GPIO22(またはGPIO27でも可) |
|
GND |
GND |
GND |
|
VIN |
5V |
5V |
※ GPIO22はI2S出力ピンとして安定動作します。
※ Core2のGROVEポートとは別ラインを使用します。
ライブラリの導入方法
- Arduino IDEを開く
- メニュー「スケッチ」→「ライブラリを管理」
- 「ESP32-audioI2S」で検索し、「ESP32 AudioI2S by schreibfaul1」をインストール
インストール後、「SD」「Audio」「FS」などのヘッダを使えるようになります。
コードの基本構成(概要)
ESP32-audioI2Sを使うと、コードの流れはとてもシンプルです。
- M5StackとSDカードを初期化
- Audioオブジェクトを生成
- I2S出力ピンを指定
- audio.connecttoFS(SD, "/ファイル名.mp3"); で再生開始
- loop()で audio.loop(); を呼ぶだけで再生が継続
つまり、以前のようなI2Sドライバ設定や手動のファイル読み込みは不要になります。
実際に動作するArduinoコード(M5Stack Core2 + MAX98357A)
以下のコードは、実機でMP3再生が確認できた安定版です。
前半で説明した「ESP32-audioI2S」ライブラリを使用しています。
✅ コード全体
#include <M5Core2.h>
#include <Audio.h>
#include <SD.h>
#include <FS.h>
//=== I2S出力ピン設定(MAX98357A接続用) ===//
#define I2S_DOUT 22 // DINピン(データ出力)
#define I2S_BCLK 26 // BCLKピン
#define I2S_LRC 25 // LRCピン(LRクロック)
Audio audio;
void setup() {
M5.begin();
Serial.begin(115200);
delay(500);
//=== SDカード初期化 ===//
if (!SD.begin()) {
Serial.println("SDカードが見つかりません");
while (true) delay(1000);
}
Serial.println("SDカード初期化成功");
//=== Audioライブラリ初期化 ===//
audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
audio.setVolume(18); // 音量設定(0〜21)
//=== MP3ファイルを指定して再生開始 ===//
if (!audio.connecttoFS(SD, "/test.mp3")) {
Serial.println("MP3ファイルが見つかりません");
while (true) delay(1000);
}
Serial.println("再生を開始しました!");
}
void loop() {
// Audioライブラリのループ処理(これがないと音が出ません)
audio.loop();
}
🔧 コード解説
- audio.setPinout()
→ MAX98357Aへ送信するI2Sのピンを指定します。Core2の25,26,22ピンは安定動作実績があります。 - audio.connecttoFS(SD, "/test.mp3")
→ microSD内のMP3ファイルを直接指定して再生します。ファイル名・拡張子は正確に入力すること。
例:/music001.mp3 - audio.loop()
→ 再生を継続するための処理。loop()関数の中に必ず入れてください。
この処理が呼ばれ続けることで、デコードされたPCMがI2Sに順次送られます。
🎧 ファイルとSDカードの注意点
- SDカードは FAT32形式 でフォーマットしてください。
- ファイル名は 英数字(短め) にするのが安全です(例:test.mp3)。
- SDカード直下にファイルを置くと認識しやすいです。
- 一部の高ビットレート(320kbpsなど)MP3では、再生中に音飛びが出ることがあります。
→ その場合は 192kbps以下 に変換して保存してください。
🚫 よくあるエラーと対処法
|
症状 |
原因 |
対処 |
|
「SDカードが見つかりません」 |
配線ミス/SD未挿入 |
microSDをFAT32でフォーマットし直す |
|
「MP3ファイルが見つかりません」 |
ファイル名・パス誤り |
ファイル名を/test.mp3のように指定 |
|
ノイズだけ鳴る |
DIN/BCLK/LRC配線誤り |
ピン番号25,26,22に正しく接続 |
|
音が小さい/割れる |
Volume設定・電源不足 |
audio.setVolume(15〜20)程度に調整、5V供給を安定化 |
⚙️ 応用:複数ファイルの再生
SDカード内に複数のMP3を入れて、順番に再生したい場合は次のようにできます。
int track = 1;
void loop() {
audio.loop();
if (!audio.isRunning()) {
track++;
if (track > 3) track = 1; // 曲数を3曲に設定
char filename[16];
sprintf(filename, "/music%d.mp3", track);
audio.connecttoFS(SD, filename);
}
}
これで music1.mp3 → music2.mp3 → music3.mp3 の順に自動再生されます。
🔋 動作確認済み環境
- M5Stack Core2(ESP32-D0WDQ6版)
- MAX98357A I2Sアンプモジュール
- Visaton FRS 5X-8Ωスピーカー
- Arduino IDE 2.x + ボードマネージャ:esp32 v2.0.11
- ESP32-audioI2S ライブラリ v2.0.7
この構成で、SDカード内のMP3(128〜192kbps)が安定して再生できました。
まとめ
- Core2はI2S出力機能を持っており、MAX98357Aと直接接続可能。
- MP3を再生するには「ESP32-audioI2S」ライブラリが必須。
- コードは非常にシンプルで、わずか数行で動作可能。
- エラーが出る場合は配線とファイルパスを再確認。
コメント欄では「このライブラリでWAVも再生できた」「別ピンでも動いた」などの情報交換が盛んです。
もし再生できたら、使用ピンやファイル形式など、あなたの成功例もぜひ共有してみてください。