[ESP8266][ESP32] Df player miniでmp3・wavの音を鳴らす


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。

ちなみに初期化後、たまにTimeOutが出るのでDelay入れてます。3秒も入れる必要があるかは微妙ですので、短くしてもいいと思います。

音質の方は再生されてるときは気にならないんですが無音時に「ジージー」って音が鳴ってます。ESP8266の負荷具合に併せてなっているようです。


ノイズ問題

さて、ライブラリがらみのトラブルはなんとかなりました。今度はノイズです。こいつは結構しつこいようです。解決策として提案されているのは

  1. 5v電源から電源をとる(4.2vがベストとか?)
  2. GNDをDf player miniの二か所につなげる(内部でつながっているような…)
  3. TX,RXに抵抗を挟む(ロジックレベルが違うから?LLCのほうがいいのでは…)
  4. 乾電池を使う(安定電源)

4はやってませんが、1-3はやってみましたが全くと言っていいほど変化なかったです。

とりあえず、内臓アンプを使う分には解決できないと踏んでます(アンプには詳しくないのでw)。というわけで、先ほど紹介したダイソーの300円スピーカーに入っているアンプとスピーカーを使います。

先人によって、分解され解説サイトも多数あります。アンプをいじるのは目的としていないので素直にDf player miniと接続していきます。

DAC_RとDAC_Lが右・左のラインアウトのようなので、それぞれをダイソーの300円スピーカーのアンプに接続します。また、VCC=5vとGNDを接続しておきます。スピーカーはそのままでOKです。スピーカーコードの長さは適宜調整します。

左の青・オレンジ・白がDAC_LRとGNDをつなぐところです。右下は電源、あとはスピーカーをつなぐところです。シルク印刷を見るとわかると思います。

ボリューム調整付きなのでコード上で最大音量(下参考)にして、アンプ側の回転つまみで調整するといい感じですね。スピーカー直でつなげる場合は30だと大音量すぎるようです。

ユーチューブに動画を上げときました。ダイソーアンプを使ってるムービーの音量が少し小さいですが結構なボリュームで鳴りますよ。

Df player の内臓アンプ

ダイソースピーカーアンプ

まぁ、このくらい鳴っていれば格安で上等でしょう。


ESP32 WROOM-32とWrover-EでDfPlayerを使う(追記)

ESP8266ではSoftwareSerialを使ってましたが、ESP32にはUART(HardwareSerial)を使います。ESP32は3つのハードウエアシリアルが搭載されています。WROOM-32の情報は結構あり

を参考に

てな感じで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で×のところは使えないのですのでご注意を