Raspberry Pi Pico で mp3 ファイルの再生ができないかを試してみました。とりあえずはスピーカーから鳴ったので目標は達成できました。
使用するもの
Arduino IDE 関連
今回は Raspberry Pi Pico を Arduino のようにして使うものとして設定しました。そのため Arduino IDE 1.8.19 にRaspberry Pi Pico/RP2040 を追加登録して使用しました。
ボードマネージャーでこれを出現させるためには、設定から「追加のボードマネージャーのURL」にて以下の URL を設定します。
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
また、再生するデータをLittleFS Data 領域に配置して書き込む都合、 Arduino IDE に外部ツールを追加することも必要でした。これが、現在の Arduino IDE 2.x バージョンでは使用不可能なため、 Arduino IDE は 1.8.x のバージョンを使用しています。この外部ツールは次のページで公開されているものです。スケッチを配置したフォルダに “data” フォルダを作成して、その中に配置したいデータを置きます。
ハードウェア関連
Raspberry Pico の他に、I2S データを再生するための DAC が必要です。以前に使用していたMAX98357A 搭載 D 級アンプを今回も使用しています。具体的には Adafruit のものを使っていますが、他のものでも同様に使えるのではと思います。
ライブラリなど
ライブラリは、 ESP8266Audio を使用します。こちらは現時点で Raspberry Pi Pico (RP2040) に対応した状態となっているので、そのまま使います。
実装・ソースコード
今回実装したソースコードを以下に示します。 以前の ESP32 版と違うところは、 ファイルシステムとして LittleFS を使用している点です。以前は SPIFFS を使用していましたが、 RP2040 版では LittleFS を使うようにとのことです。それ以外は、ほぼ同じソースコードとなっています。
#include <Arduino.h>
#include "AudioFileSourceLittleFS.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2S.h"
AudioGeneratorMP3 *pMp3;
AudioFileSourceLittleFS *file;
AudioOutput *pOutput;
void setup() {
Serial.begin(115200);
delay(1000);
LittleFS.begin();
file = new AudioFileSourceLittleFS("/sample.mp3");
pOutput = new AudioOutputI2S();
pMp3 = new AudioGeneratorMP3();
delay(3000);
if(!pMp3->begin(file, pOutput)) {
Serial.println("begin failed.");
}
}
void loop() {
if (pMp3->isRunning()) {
if(!pMp3->loop()) {
pMp3->stop();
Serial.println("MP3 end");
}
} else {
delay(1000);
}
}
ファイルシステム用のサイズ割り当て
スケッチとファイルシステム用のサイズの割合を決めておきます。以下に示すように Flash Size の項目から、スケッチとファイルシステム (FS) の容量を選択します。
データの転送について
スケッチを配置したフォルダで data フォルダを作成し、その中に sample.mp3 というファイルを配置しておきます。その状態を書き込むには、ツールメニューから Pico LittleFS Data Upload のメニューを選択します。このメニューが出現していない場合、先に述べたツールのセットアップを完了させてください。
配線情報
Raspberry Pico と I2S DAC の接続方法について説明します。ピンごとの配線は以下の表のとおりです。
Raspberry Pi Pico | I2S DAC (アンプ) |
---|---|
GP28 | Din |
GP26 | LRC |
GP27 | BCLK |
3V3 | Vin |
GND | GND |
まとめ
この状態で適当な mp3 を再生してみたところ、とりあえず鳴るには鳴りました。ですが、品質はイマイチで再生速度も若干遅いような感じでした。モノラルの音声、可変ビットレート(Windows のプロパティで見たところ 69kbps) という、割と軽量なものだったのですが、もっとシンプルにする必要があるのかもしれません。
部品点数が少なく、なるべくPICO 単体で再生したいという要件であればこの実装をベースとして試行錯誤していってもよいのかなと思いました。
参考
- ESP32でmp3単純再生
- https://github.com/earlephilhower/ESP8266Audio/issues/389
- https://desktopstation.net/blog/2021/12/16/rp2040%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89/
その他
まともな mp3 再生をしたいのであれば DFPlayer MP3 などのモジュールを使い、 Raspberry Pi Pico からは再生などの支持を行う、というようにするのが安全・安定した動作になるのではないかと思いました。
コメント
鳴るには鳴る程度の品質ということでしたが、こちらでcpu速度を150Mhzにオーバークロックし、オーディオソースを動作速度40Mhzのsdカードに変更したところ十分に聴くことのできる品質になりました。(ステレオ、ビットレート128kbps)
コメント頂きありがとうございます!
そのような方法で、十分に鳴るようになるんですね。良い情報を共有いただきましたこと感謝です。