先日の WebRadio のプログラムを使って、 ESP-WROOM-32 で mp3 データが再生できることは確認しました。しかし単に mp3 だけを再生するにはどうしたらよいかが気になりました。今回はこれを確認したいと思って、色々と試してみることにしました。
WebRadio のほうは ISP-IDF の開発環境を必要としていたのですが、 Arduino の環境で出来たら手軽に使えるなと思うので、こちらで出来ないかから試してみました。結論としては、運良く Arduino のフレームワークで使えるものがあったのでこれを紹介します。
前提条件
Arduino IDE のバージョンは 1.8.7 (Windows10 環境) を使用しています。そして、使用しているボードは ESP32-DevKitC です。
Arduino IDE から、 ESP32 の環境が整っていることを前提条件としています。
ライブラリのセットアップ
mp3 を含む音楽ファイルを再生するためのライブラリとして、 ESP8266Audio(https://github.com/earlephilhower/ESP8266Audio) というものがあったので、これを利用します。 ESP8266 とありますが ESP32 の環境でも使用できました。
ライブラリとして Arduino IDE から簡単に追加できる状態ではないため、次のようにしてセットアップします。
ドキュメントフォルダ以下に Arduino というフォルダがあると思います。この中に libraries というフォルダがあるので(無ければ作成)、このフォルダで次のリポジトリを2つほど取得します。
- https://github.com/earlephilhower/ESP8266Audio
- https://github.com/Gianbacchio/ESP8266_Spiram
mp3再生プログラム(I2S)
I2S DAC を使う場合のコードは次のようになります。mp3 のファイルは SPIFFS 領域に既に転送済みとしておきます。
#include#include "AudioFileSourceSPIFFS.h" #include "AudioGeneratorMP3.h" #include "AudioOutputI2S.h" AudioGeneratorMP3* pMp3; AudioFileSourceSPIFFS* pFile; AudioOutput* pOutput; void setup() { Serial.begin(115200); SPIFFS.begin(); pFile = new AudioFileSourceSPIFFS("/sound.mp3" ); pOutput = new AudioOutputI2S(); pMp3 = new AudioGeneratorMP3(); pMp3->begin(pFile, pOutput); } void loop() { if( pMp3->isRunning() ) { if( !pMp3->loop() ) { pMp3->stop(); Serial.println("MP3 end"); } } else { delay(100); } }
接続
I2S DAC として MAX98357A 搭載 D 級アンプを使用しています。ESP32-DevKitC と MAX98357A 搭載 D 級アンプの接続については、以下のようになります。
DevKitC | D 級アンプ |
---|---|
IO22 | Din |
IO25 | LRC |
IO26 | BCLK |
3v3 | Vin |
GND | GND |
実行すると mp3 が再生されると思います。
mp3再生プログラム(No DAC)
I2S DAC を使わずに再生する方法が、ESP8266Audio の Readme に記載がありました。これも試してみました。
プログラムコードを次のように変更します。
#include "AudioOutputI2SNoDAC.h" // 追加 // 旧: pOutput = new AudioOutputI2S(); // ↓ pOutput = new AudioOutputI2SNoDAC();
この場合の回路のほうは次のようになります。Readme では、 2N3904 を使うようになっていましたが、手元にあった 2SC1815 を用いてみました。この図の I2S の信号線は、 IO22 と接続します。
まとめ
ESP32 の Arudino 環境で、 mp3 を再生する方法を説明しました。
スピーカーを駆動する部分で消費電力の方が気になったので再生時に軽く調べてみたら D級アンプのほうで時 3~5mAほど、 NoDAC のほうで 230mA ほどとなり、予想外な結果となりました。待機時は D級アンプが 2mA, NoDAC は 0mA でした。また、音の品質としてはアンプありのほうがクリアな音声が出せました。
正直部品のコスト以外はアンプの圧勝という感じです。
USB による給電で確認していますが、 Flash Frequency を 40MHz にしても、 128kbps ほどのファイルで問題なく再生できている感じです。これなら乾電池による駆動もいけそうな気がしてきます。