DFPlayerを使う-ハードウェア編

DFPlayerを使ってみます。今回は、ハードウェア編です。
DFPlayerは、切手ほどの大きさの小さなMP3プレーヤーです。これに、電源といくつかのスイッチをつなげば、マイクロSDに格納された、MP3ファイルを再生してくれます。しかも、アンプを内蔵していますので、スピーカーを鳴らすこともできます。しかし、電源を切ってしまうと、再生位置やイコライザー設定などは消えてしまいます。これは、音楽プレーヤーとして使うには、少し不便です。そこで、Adruino互換機と組み合わせて、簡単な音楽プレイヤーを作ってみようと思います。
DFPlayerとは



本家DFPlayerは、DFRobotという中国の企業が、製造と販売を行っています。しかし、今回使用するのは、DFPlayerのコピー品の”MP3-TF-16P”というものです。
コピー品ではありますが、DFPlayerとピン配列も、操作コマンドも同一です。おそらく、DFPlayerと同じMP3再生チップを使用しているのでしょう。コピー品ではありますが、以降DFPlayerとして取り扱います。
心臓部となるMP3再生チップとして、深圳市晨兵电子有限公司のAB24CR8N1Dが搭載されています。このチップは派生品が多く存在しています。安価な中国製デジタルアンプやMP3デコーダーには、かなりの確率で兄弟チップが使用されています。
DFPlayerには、マイクロSDスロットが設置されており、FAT16とFAT32フォーマットに対応しています。コネクタを増設すれば、USBメモリに格納されたファイルを取り扱うことが出来ます。また、対応ファイルフォーマットは、MP3、WMA、WAVとなっています。



DFPlayerの操作は、二つの方法で行うことが出来ます。一つはADキー端子に直接スイッチを接続する方法です。そして、もう一つは、シリアル信号を使って操作する方法です。



なぜ面倒なシリアル信号を使うのか
簡単に使うのなら、直接スイッチを接続して使用する方法が適当でしょう。しかし、これには問題点があります。それは、再生位置やイコライザー設定、音量設定が、電源OFFとともに揮発してしまうことです。音効装置として、都度指定した短い音声ファイルを再生するなら、問題にはならないでしょう。しかし、音楽再生デバイスとして使用するなら、電源を入れるたびに、再生位置がリセットされるのは不便です。
そこで、Arduino NANOの互換機と組み合わせることを思いつきました。再生位置やイコライザ設定は、ArduinoのEEPROMに保管することが出来ます。そして、電源ONと同時にDFPlayerに送り込めば、問題は解決です。
再生/停止や曲送り、イコライザー切り替えは、Arduinoに接続したスイッチで行うことにします。スイッチ操作は、一旦Arduinoで受け取り、DFPlayerにシリアル伝送することにします。
なぜDFPlayerのライブラリを使用しないのか?
Arduino用のDFPlayerには、専用のライブラリが用意されています。これを使用すれば簡単にDFPlayerをコントロールできます。しかし、今回はDFPlayerライブラリの使用を断念しました。その理由は、DFPlayerライブラリが、ソフトウェアシリアルの使用を前提としているためです。ソフトウェアシリアルを使用すると、ピン割り込みが使用できなくなります。(ISR重複登録により、コンパイルエラーが発生してしまう。)
今回制作する、音楽プレイヤーのスケッチでは、ピン割り込みを使用します。その理由は、ノイズ低減のためスイッチ操作時以外は、ArduinoのMCUをスリープさせたいからです。これは、電池駆動を見据えた、省電力化のためでもあります。
スリープ状態では、ポーリングによる操作スイッチの状態検出はできません。しかし、割り込みでMCUをウェイクアップさせることができます。つまり、スイッチが操作されたときにだけ、MCUを動かせます。つまり、MCUがウェイクアップしたら、真っ先にボタンの押下状況を取得することになります。また、DFPlayerからは、状態変化があったときに、BUSY信号が出ます。この信号を、Arduinoのピンに入力すれば、再生終了と同時にMCUを起動し、終了時処理を行えます。
今回作る音楽プレイヤーのコンセプト
DFPlayerを使用した、音楽プレイヤーの基本コンセプトを考えてみました。
- 小型で電池駆動できること
- 音楽再生機として実用レベルの音質であること
- 操作が簡単であること
- 自作ヘッドホンアンプと組み合わせて使用するので、内蔵アンプは使用しない
- 音量調節はヘッドホンアンプ側で行うので、出力レベルは-10dBに固定する
- 当初はデバッグのためディスプレイを装着するが、最終的にはディスプレイレスにする
- 開発作業効率を考慮し、Arduino NANOを使用するが、最終的にはArduino Pro miniに移行する
ざっと、コンセプトをまとめてみました。目指すところは、個人的に最高のポータブルプレイヤーだと思っている、Zishan Z1です。
DFPlayerのノイズ対策
まずは、DFPlayerとArduinoを接続し、鳴らしてみました。しかし、困ったことにノイズが乗っていました。安価で小さなDFPlayerは、ノイズへの配慮が欠けているようです。しかし、250円のMP3プレーヤーに完ぺきを求めてはいけません。
試しに、10μFの積層セラミックコンデンサーでデカップリングしてみました。その結果、完ぺきとは言えませんが、無音部分で若干ノイズを感じるレベルにまで抑えることが出来ました。しかし、デカップリングコンデンサーを極端に大きくすると、Arduino側のレギュレーターを破壊する可能性が有ります。そのため、コンデンサ容量を大きくする場合、逆流防止用のダイオードが必要でしょう。



電源に関しては、スケッチ完成後に、もう一度検討したいと思います。
ブレッドボード上で結線
コンセプトにしたがって、部品選定をしてみました。操作ボタンは、再生/停止、曲戻し(PREV.)、曲送り(NEXT)、EQ選択の四つとしました。ディスプレイはI2C接続の128x32OLEDディスプレイを選定しました。



仮組ですので、見た目はよくありません。しかし、スケッチの動作確認には、これで十分でしょう。なお、DFPlayerとのやり取りには、ArduinoのUART0(D0とD1ピン)を使用します。UART0はスケッチ書き込みにも使用されます。したがって、スケッチ書き込み時はD0とD1ピンの信号線は取り外す必要があります。スケッチ書き込みの度に、ジャンパー線を抜き差しするのは面倒ですが、仕方ありません。
配線は下図のとおりです。



以下が結線表です。
Arduino NANO | DFPlayer | OLED DISPLAY | 押しボタンスイッチ |
+5V | VCC | VCC | |
GND | GND | GND | 全押しボタンスイッチ |
TXO(D0) | RX | ||
RXI(D1) | TX | ||
D8 | Previous | ||
D9 | Play/Pause | ||
D10 | Next | ||
D11 | EQ | ||
D12 | BUSY | ||
A4 | SDA | ||
A5 | SCK | ||
DAC_R(右ライン出力) | |||
DAC_l(左ライン出力) |
ブレッドボードを使っての仮組ではありますが、開発用の回路は出来上がりました。これを使ってスケッチを作っていきます。