Df player miniを使う理由
強震モニタを作る上で音声再生するのにDf player miniを利用したいと思ってます。まずはDf player miniを使ったことがないのでmp3ファイルを再生するところまでを記事にしてみました。
アマゾンやAliExpressで探せば大量に見つかるmp3やwavを再生するコレです。単品でもmicro sdに入ったファイルを再生することができます。この製品はコピー品もたくさんあり、互換性がよくわからない状態です。
ちなみに僕が買ったのは「Df mini player」とAliExpressでありましたが基板のシルク印刷が「mp3-tf-16p」の怪しげな10個セットの安いやつです。SSより、もーちょい安かったです
ESP8266で再生しようと思います。下のブログを参考にしました。が…まぁ一筋縄ではいきませんでした。こんなのも慣れてきましたね。
Df player miniの電源と接続
3.3vつないでみても動きましたが、USBの5Vからレギュレーターを使い3.3Vにしておりノイズの問題も考えられるので5Vで接続しました。ESP8266とはソフトウエアシリアルで通信します。ボーレートは9600bps固定らしいです。今回はIO0とIO16で接続します(癖のあるピンですが他のPINはSPIで使う為)。
ちなみに、TXとRXには(電圧調整?ノイズ対策?のため)1kΩの抵抗を挟んでいます。ちなみにノイズに対しては無力でした(笑)。あとはVcc=5V、GND(2カ所[2つの間は0Ωでしたが…])を接続します。あと、スピーカーをSPK1とSPK2につなぎます。
スピーカーは下のを使いましたが、ダイソーで売ってる300円スピーカーをバラした方が2つ入ってて下のよりも立派なのでお買い得です。しかも後で使いますがアンプが内蔵されていますので、是非300円スピーカーを買いましょう。
DFRobotDFPlayerMiniのサンプルが動かない
Df player miniの公式発売元のDFRobotがライブラリとサンプルコードを公開していますので利用します。
いつもどおりArduinoIDEのライブラリ管理から
上のライブラリをインストールします。スケッチ例からGetStartedを実行します。するとシリアルには下のログが永遠と出力されます。
Unable to begin:
1.Please recheck the connection!
2.Please insert the SD card!
うーん。Df player miniが初期化できてません… 😯
あるある間違いでTxとRxが逆かなと思いましたが、正しいようで何度やっても初期化に失敗します。SDカードもFAT32でフォーマットしファイル名も0001.mp3とか単純なものにしていますし…なんででしょ?初期不良も考えて3個試しましたが全部だめでしたw。
不良品ゲットだぜー(棒
このパチモンには相当不良品も交じってるらしいので…でも捨てる前に単品動作させてみたところ再生されたので、どうやらパチモノが故に、純正ライブラリが使えないという可能性も捨てきれません。
ちなみに単品動作とは、下のブログの「DFPlayer単体で動かす」のところにあります
ネットの海で色々調べてみることにしました。そこで気になったのがAmazonのとあるレビュー(英語)です
まぁ要約すると
商品(DFPlayer Miniのシルク印刷)と届いた品(mp3-tf-16pとシルク印刷)が違うくて動かすのに苦労した。mp3-tf-16pの方は初期化時間に問題あってbegin呼び出した後にbeginもう一度呼ばないとダメだった。ちゃんと写真改めて機能説明もいれとおけ!!
怒ってますねぇw。自分のをみると、基板にmp3-tf-16pとシルク印刷されていますね…
というわけで、GetStartedのmyDFplayerの初期化部分をwhileで回すことにしました(下コード)。そしたら無事に初期化されるようになりました。出力を見ると「.」が2個ほど出るので1-1.5秒ほどかかるのかな。上にMay take 3-5 secondsと書いているけど何のことやらですw。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
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)")); //反応が返るまでループさせる while(!myDFPlayer.begin(mySoftwareSerial)){ Serial.print("."); delay(500); } /* 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){ delay(0); // Code to compatible with ESP8266 watch dog. } } */ Serial.println(F("DFPlayer Mini online.")); //TimeOut防止の為、delay delay(3000); myDFPlayer.volume(20); //Set volume value. From 0 to 30 myDFPlayer.play(1); //Play the first mp3 } |
ちなみに初期化後、たまにTimeOutが出るのでDelay入れてます。3秒も入れる必要があるかは微妙ですので、短くしてもいいと思います。
音質の方は再生されてるときは気にならないんですが無音時に「ジージー」って音が鳴ってます。ESP8266の負荷具合に併せてなっているようです。
ノイズ問題
さて、ライブラリがらみのトラブルはなんとかなりました。今度はノイズです。こいつは結構しつこいようです。解決策として提案されているのは
- 5v電源から電源をとる(4.2vがベストとか?)
- GNDをDf player miniの二か所につなげる(内部でつながっているような…)
- TX,RXに抵抗を挟む(ロジックレベルが違うから?LLCのほうがいいのでは…)
- 乾電池を使う(安定電源)
4はやってませんが、1-3はやってみましたが全くと言っていいほど変化なかったです。
とりあえず、内臓アンプを使う分には解決できないと踏んでます(アンプには詳しくないのでw)。というわけで、先ほど紹介したダイソーの300円スピーカーに入っているアンプとスピーカーを使います。
先人によって、分解され解説サイトも多数あります。アンプをいじるのは目的としていないので素直にDf player miniと接続していきます。
DAC_RとDAC_Lが右・左のラインアウトのようなので、それぞれをダイソーの300円スピーカーのアンプに接続します。また、VCC=5vとGNDを接続しておきます。スピーカーはそのままでOKです。スピーカーコードの長さは適宜調整します。
左の青・オレンジ・白がDAC_LRとGNDをつなぐところです。右下は電源、あとはスピーカーをつなぐところです。シルク印刷を見るとわかると思います。
ボリューム調整付きなのでコード上で最大音量(下参考)にして、アンプ側の回転つまみで調整するといい感じですね。スピーカー直でつなげる場合は30だと大音量すぎるようです。
1 |
myDFPlayer.volume(30); //Set volume value. From 0 to 30 |
ユーチューブに動画を上げときました。ダイソーアンプを使ってるムービーの音量が少し小さいですが結構なボリュームで鳴りますよ。
Df player の内臓アンプ
ダイソースピーカーアンプ
まぁ、このくらい鳴っていれば格安で上等でしょう。
ESP32 WROOM-32とWrover-EでDfPlayerを使う(追記)
ESP8266ではSoftwareSerialを使ってましたが、ESP32にはUART(HardwareSerial)を使います。ESP32は3つのハードウエアシリアルが搭載されています。WROOM-32の情報は結構あり
を参考に
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include "Arduino.h" //#include "SoftwareSerial.h" #include "DFRobotDFPlayerMini.h" //SoftwareSerial mySoftwareSerial(0, 16); // RX, TX HardwareSerial mySerial(2); - 略 - void setup() { //mySoftwareSerial.begin(9600); mySerial.begin(9600); //RX GPIO16 , TX GPIO17 - 略 - } |
てな感じでUART2(RX=IO16,TX=IO17)で使えば問題なく動きました。しかし、同じ構成・接続でWrover-Eで動かしてみても一向に動きません。
調べてみると…
なんかUART0はTx(Pin35)、Rx(Pin34)に設定されているみたいだけど、Wrover-EではUART1と2は定義されていない(未接続)のよう…なんで?
とりあえず、uart_set_pinを使ってIO0、IO4に設定すると動くみたいですので、初期化のbegin時に使用するピンを決定するようにします
mySerial.begin(9600, SERIAL_8N1, 4, 0); //RX , TX
にしてみたら動きました。WroverシリーズはちゃんとPin指定してあげないとダメ見たいです。
ちなみにWROOM-32のUART2のデフォルトピンであるRX=IO16(Pin27),TX=IO17(Pin28)はWrover-Eでは動かないようです。上のPinで×のところは使えないのですのでご注意を