※旧スタッフブログからの移設転記記事となります。
DFPlayer miniというMP3/WAV形式の音楽ファイルを再生できるブレイクアウトボードがあります。2WのモノラルアンプとマイクロSDカードスロットとMP3およびWAV形式ファイルのデコードも1ボードで完結でき、数百円で購入できるという魅力があります。
さて、このモジュールをおもちゃ修理に利用できないかと思案していたのですが、先のブログ記事であるおやすみホームシアター再生化計画というおもちゃの再生に利用しており、一応の環境は構築できておりました。
しかし、おもちゃ修理に利用するには、さらなるコストダウンとダウンサイズが求められます。
スヌーピーのジオラマの修理では、ATtiny85というマイコンをソースコードの流用性から適用しましたが、機能自体は、ATtiny13aというマイコンでも十分実装可能で、購入コストも1/3にできる利点があります。
また、当修理で見送った振動による曲スキップの機能も今回合わせて実装をおこなったので、その詳細について紹介をさせていただきます。
DFPlayer mini自体は、この基板にて外付け分圧の抵抗とプッシュスイッチにて再生環境は完結できるのですが、以下のデメリットがあります。
- 音量がデフォルトの最大値で再生される
- 利用できるイコライザーや音響の設定ができない
- ランダム再生やトラックを指定した再生ができない
そのためデータシートにも記載があるように、シリアルのコマンドが多種用意されており、外付けのMCUにてコマンド送出することで多彩な再生ができるようになります。
単純なシリアルのコマンドですので、ATtiny13aのような低価格のマイコンでも十分にその機能を実装できます。
さて、前述のトラックのスキップ機能を実装するにあたり、以下のような考察を行いました。
スヌーピーのジオラマの修理にて、回路解析した振動によるトラックのスキップ機能は、記載の回路図のとおり、圧電スピーカーによる振動をダーリントン構成のトランジスタで増幅し検知するという内容です。
当該の修理でも、その回路を用いてトラックのスキップ機能の検証を行ったのですが、DFPlayerからの再生音をモロに圧電スピーカーが拾ってしまって、感度を最低にしても再生音楽を振動としてとらえてしまい機能の実装を断念しました。
そこで、今回は、SW-420という振動センサーモジュールを搭載しました。
平時は、sleepでMCUには眠っていただき、少しですがマイコン分の消費電力をいくらか低減しようと試み、信号の検知は、ATtiny13aの外部ピンの割り込み処理でWake upすることにしました。
SW-420の仕様を整理すると、振動センサーの検知信号をLM393にて増幅します。
検知感度は、可変抵抗にて作動側に印加し閾値を持つようにしております。動作電圧は、3.3V~5VとArduinoやATtinyと共用可能です。
さて、SW-420は、アクティブハイで感度に応じたパルスを出力するのですが、ATtiny13aのINT0割り込みですが、パワーダウンモードからの起動割り込みは、レベル検知での割込みのみと制約があります。データシート Table 7-1 参照。
また、その際、Level 0 つまりLOWレベル検知というのも制約になります。データシート 9.2章、9.3章 参照。
そのため、回路図中にてSW-420 が出力するHiパルスを反転するため2SC1815にて反転回路を挿入しております。センサーからのバッファー的な役目も担っておりますので、この回路構成の方が、安定して検知できていると思います。プログラムの処理としては、
- PORTB TXピンの設定
- イコライザー設定→音量設定→リピート再生コマンドの送出
- 割り込み許可
- スリープ
割り込みにて起きたら、指定ベクターにて、
- 割り込み不許可
- トラックスキップコマンドの発行
となります。
振動を検知すると、LOWパルスを発行しATtiny13aをsleepから起こしトラックのスキップコマンドを発行し、またすぐsleep します。
DFPlayerは、そのまま再生を続けるため、回路的には分離して考えることができます。
■ブレッドボード & 安定化電源版 8Ω 0.5W スピーカー (※音量 小さめなので音量を上げてお聞きください。)
■ユニバーサル基板 & 乾電池(4.5V)版 8Ω 8W スピーカー
一応、自作のライブラリもあるのですが、流れを紹介するため、ソースコードは以下のような感じです。
まだ改良の余地は、残っておりますが、Flashの領域を既に90%程を消費しておりますので、ここらあたりが落とし所かと思います。
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#include <DFPlayer_Mini_ATtiny13a> #include <avr/interrupt> #include <avr/sleep> // DFPlayer parameter #define VAL_LEVEL_0 0 #define VAL_LEVEL_10 10 #define VAL_LEVEL_15 15 #define VAL_LEVEL_20 20 #define VAL_LEVEL_25 25 #define VAL_LEVEL_30 30 #define NORMAL_EQ 0 #define POP_EQ 1 #define ROCK_EQ 2 #define JAZZ_EQ 3 #define CLASSIC_EQ 4 #define BASE_EQ 5 void setup () { OSCCAL = 65; // 1.2MHz, 5.00V DDRB = B11101; PORTB = B00010; TIMSK0 = 0; delay(100); mp3_set_EQ (ROCK_EQ); // ROCK EQ mp3_set_volume (VAL_LEVEL_20); // Volume level 20 mp3_play_repeat_all (); // Repeat all } // 割り込み時の処理 void wakeUp() { mp3_next(); } void sleep() { set_sleep_mode(SLEEP_MODE_PWR_DOWN); attachInterrupt(0, wakeUp, LOW); sleep_mode(); // sleep detachInterrupt(0); } void loop () { //digitalWrite(4, LOW); //delay(100); sleep(); //digitalWrite(4, HIGH); //delay(100); } // The end of file. |
さて、最後にですが、他のブログ等で拝見すると、動作中に”ビー”っと鳴ってしまい、動作できないなどの症状を目にします。
どんな機器でもそうですが、DFPLayerも、起動時やトラックの再生開始時に電圧降下を起します。
使用電源や電源回路が、それに耐えうるよう設計されていなければなりません。
回路設計の実務経験があればご存知かと思います。
実回路へのインプリ時に消費電力から、適切な電源の選定やパスコンの容量を決定し適宜挿入ください。 ※特に電源仕様の下限ぎりぎり&パスコン無しでは、曲の性質にもよるのでしょうが、だいたい動作しませんので、”ビー”っとなって困っているようでしたら、電源周りを確認したほうがいいです。 DFPlayer miniは、こちらで購入できます。
SW-420は、こちらで購入できます。
ソースコード中で使用されているライブラリをスタッフブログで公開しておりますので参照ください。