Arduinoから簡単に音楽を鳴らすモジュールとして、DFPlayer miniがある。microSDとスピーカーを接続し、シリアル通信でAruduino等のマイコンから制御する事で簡単にmicroSDに保存したmp3ファイルをスピーカーから鳴らす事が出来る。
付いているLEDの色が赤や青のバリエーションがあるのは知っていたが、使われているICにも多くのバリエーションが存在する様だ。ICも24ピンタイプや16ピンタイプが存在するらしい。
これまではICのタイプを気にせずDFRobotが提供しているDFPlayerのライブラリを使えば動いたが(微妙な違いがあるのは感じていたが)、厄介な事に最近ライブラリが動かないタイプが出てきている様だ。
具体的には、モジュールにHW-247Aと書かれ、ICにGD3200Bと書かれたチップが使われているモジュールである。このモジュールはDFPlayerのbegin()関数で失敗する。
左がGD3200B。ICの足の数も違う。
従来のDFPlayerの仕様書は下記にある。
DFRobotのDFPlayerライブラリを使った場合、begin()関数内でreset()を行っている。GD3200BのICの場合、reset後の応答として
7E FF 6 40 0 0 3 FE B8 EF
が返ってくる。4バイト目の0x40がエラーを表しているが、7バイト目のエラー要因「3」は上記仕様書に記載がない。
FN-M16Pと言うタイプの仕様書には 40 / 3 のエラーの情報があり、これによると通信エラーの様だ。
下記フォーラムの情報を見ると、送信データのchecksumを省略すると動いた、との情報があるがDFRobotのライブラリにchecksumを省略する修正を入れてみたが改善しなかった。
https://discourse.voss.earth/t/dfplayer-verschiedene-versionen/681/174
しかし、応答エラーにはなるがbegin()の戻り値を無視して、volumeやplay、stopの関数を試した所ちゃんと動作はしているのでとりあえず動かす事は出来る様だ(フォルダー系の関数が正しく動作しないとの情報もある)。
リセット後1秒程初期化に時間がかかる様なので、begin()の後2秒程時間を空ける必要もある。
void setup() {
Serial.begin(9600);
dfserial.begin(9600);
delay(1000);
if (!dfplayer.begin(dfserial, false)) {
//エラーは無視する
}
delay(2000); //リセット後少し時間を置く
dfplayer.volume(15); //DFPlayerの出力音量 From 0 to 30
dfplayer.play(1);
delay(3000);
dfplayer.stop();
}
Googleで「gd3200b datasheet」で検索するとデータシートのPDFは入手できる(直接は応答がなかったのでGoogleキャッシュから)。内容は FN-M16P とほぼ同じ様だ。時間が経てば誰かが改良版ライブラリを公開してくれるかもしれない。
その他参考情報
https://github.com/ghmartin77/DFPlayerAnalyzer/issues/6
https://discourse.voss.earth/t/dfplayer-verschiedene-versionen/681/174