マイコンで音声ファイルを再生するのに、 SDカード等にいれたデータをストリーミングして再生かなと考えていたのですが、 mp3 のファイルを直接再生するモジュールボードを発見しました。
amazon で眺めていたら発見したのが以下のものです。これを書いている現在で2つで 800 円ほどとなっており、ネットの情報からすると少し高くなっているのかもしれません。
このモジュールボードのチュートリアルとしては以下の Wiki に記載がありました。
https://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299#Tutorial
実ボードでは “MP3-TF-16P” と刻印がありますが、まあなんとか動いている感じです(※)。
また、より詳細な仕様書的なものとしては、以下の pdf を参照して試してみています。
http://www.flyrontech.com/uploadfile/download/2016441645109830.pdf
※ もしかすると別に本家があるコピー品なのかもしれません。
早速試してみる
手っ取り早く動作を試してみるために、制御のことを考えず単体で動作させることを試してみます。
これはチュートリアルの第5.3章にある、 “I/O Mode” を見て作成しました。
準備として FAT32 フォーマットされた microSD カードに mp3 フォルダを作成します。そして、この中に1つだけ、 0001.mp3 なるファイルを書き込んでおきます。
ブレッドボード上に配線は以下のような感じにしました。図では電池1本で表現していますが、 電源は 3.3 V で供給しています。
これで電源を入れて、適当にボリュームダウンのボタンを押したら再生が始まりました。
しかし、この状態では大ボリュームで再生がはじまり、驚きました。ボリュームの初期値は最大値のようです。
Arduino Uno と繋いでみる
大音量のままで困ったので Arduino Uno と接続して、ボリュームの制御などできるようにしてみました。
接続については以下のよう感じになっています。注意点として、 Arduino のシリアル出力が 5V のため、直接接続するとノイズの原因となるようです。そのため、送受信の線には抵抗 (1k) を追加するようにしています。
接続した後は、Arduino IDE からスケッチを作成します。
チュートリアルのページにあるように、 DFRobotDFPlayerMini のライブラリを取得して、これを追加します。その後以下のようなスケッチを書き込んで再生を行います。ほぼチュートリアルで公開されていたままのものです。これだと1曲再生を行います。
#include #include SoftwareSerial mySoftwareSerial(10, 11); // RX, TX DFRobotDFPlayerMini myDFPlayer; void printDetail(uint8_t type, int value); void setup() { mySoftwareSerial.begin(9600); Serial.begin(115200); Serial.println(); Serial.println(F("DFRobot DFPlayer Mini Demo")); Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)")); if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3. Serial.println(F("Unable to begin:")); Serial.println(F("1.Please recheck the connection!")); Serial.println(F("2.Please insert the SD card!")); while(true); } Serial.println(F("DFPlayer Mini online.")); myDFPlayer.volume(5); //Set volume value. From 0 to 30 myDFPlayer.play(1); //Play the first mp3 } void loop() { if (myDFPlayer.available()) { printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states. } } void printDetail(uint8_t type, int value){ switch (type) { case TimeOut: Serial.println(F("Time Out!")); break; case WrongStack: Serial.println(F("Stack Wrong!")); break; case DFPlayerCardInserted: Serial.println(F("Card Inserted!")); break; case DFPlayerCardRemoved: Serial.println(F("Card Removed!")); break; case DFPlayerCardOnline: Serial.println(F("Card Online!")); break; case DFPlayerPlayFinished: Serial.print(F("Number:")); Serial.print(value); Serial.println(F(" Play Finished!")); break; case DFPlayerError: Serial.print(F("DFPlayerError:")); switch (value) { case Busy: Serial.println(F("Card not found")); break; case Sleeping: Serial.println(F("Sleeping")); break; case SerialWrongStack: Serial.println(F("Get Wrong Stack")); break; case CheckSumNotMatch: Serial.println(F("Check Sum Not Match")); break; case FileIndexOut: Serial.println(F("File Index Out of Bound")); break; case FileMismatch: Serial.println(F("Cannot Find File")); break; case Advertise: Serial.println(F("In Advertise")); break; default: break; } break; default: break; } }
まとめ
ネットの情報を見ると電源は ArduinoUNO から取らず、別系統とした方がいいとありましたが、自分の環境では上記のままでも大丈夫なようでした。
また他にも電源電圧は 4.2V なら安定動作とか記載があって心配していましたが、 3.3V の電源電圧でも今のところ問題なく動いているようです。
ひとつ残念な点があるのは、電源投入時のスピーカーから雑音が出てしまうことです。これが割と大きめの音がするので気になります。
昔 mp3 のプレイヤーキットを作ったことがありましたが、このくらいの小型なサイズで mp3 を再生できてしまうことに驚きがあります。癖はありますが面白いモジュールだと思います。