SDカード内の複数の音楽ファイルを連続再生させる例が、今のところネット上で見つからなかったのでやってみました。とても簡潔にできました。環境/構成は以下です。
1.Windows 11 Pro
2.Arduino IDE 2.3.6
3.ESP32 Dev Module(Arduino IDE 内でのボード名)
4.SPI接続 microSDカードスロットモジュール
5.PCM5102A使用 32bit/384kHz DAC モジュールhttps://store.shopping.yahoo.co.jp/nfj/h135.html
実行ファイルサイズが大きくなるのでコンパイル前に、ツールで「Huge App」を選択します。
あらかじめ、MP3ファイル名を
track001.mp3
track002.mp3
・・・
とリネームし、SDカードに保存しておきます。ルートで構いません。
次の点に注意が必要です。ESP32のボードマネージャ
esp32 by Espressif Systems version 3.2.0
に問題があるようです。以前はコンパイル自体出来ませんでした。今回できましたが動作は不安定でした。なので
esp32 by Espressif Systems version 3.0.1
に巻き戻しています。ピンの接続はスケッチ内の通りです。DACから、ダイソーの300円スピーカーを通して音を聴いてます。十分良い音と思います。初めてsprintf
を使ってloop
内で、動的に(?)文字列生成してみました。
//**********************************************************************************************************
//* audioI2S-- I2S audiodecoder for ESP32, *
//**********************************************************************************************************
#include "Audio.h"
#include "SD.h"
#define SPI_MOSI 23
#define SPI_MISO 19
#define SPI_SCK 18
#define SD_CS 5
#define I2S_DOUT 25
#define I2S_BCLK 27
#define I2S_LRC 26
Audio audio;
void setup() {
Serial.begin(115200);
SD.begin(SD_CS, SPI, 24000000, "/sd");
audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
audio.setVolume(6); // 0...21
}
char song[14];
int n=0;
int err=0;
void loop()
{
if(err<10){// 10回のファイルエラーで空白ループに移行
audio.loop();
if(!audio.isRunning()){
n++;
sprintf(song,"track%03d.mp3",n);
if(!audio.connecttoFS(SD, song)){
err++;// 無限ループ回避
};
}
}
}
// optional
void audio_info(const char *info){
Serial.print("info "); Serial.println(info);
}
void audio_eof_mp3(const char *info){ //end of file
Serial.print("eof_mp3 "); Serial.println(info);
}
最後までお読みいただきありがとうございました。