コピペテックで技術書典Vol8向けに書いた「ESP32 と obnizOS で作る IoT 電子工作」で使ったMP3プレーヤーモジュールのDFPlayer Miniの使い方についてまとめてみました。
ピンアサインの確認
こちらは、DFPlayerのデータシートに記載されているピンのラベル付きの写真です。
本記事で使用するピンは以下の通りです。
ピン | 用途 | 備考 |
---|---|---|
VCC | 電源電圧 | 動作電圧は3.2から5.0Vに対応 |
RX | UARTの入力信号端子 | |
TX | UARTの出力信号端子 | |
SPK_1 | スピーカー端子+ | 3W以下 |
GND | グランド | |
SPK_2 | スピーカー端子- | 3W以下 |
IO1 | トリガーポート1 | 短く押すと前の曲、長く押すとボリュームを下げる |
IO2 | トリガーポート2 | 短く押すと次の曲、長く押すとボリュームを上げる |
BUSY | 再生ステータス | LOWのときに再生中 |
DFPlayer単体で動かす
DFPlayerは、Arduinoなどマイコンに繋げなくても単体で利用できます。
まずはSDカードにmp3ファイルを入れる必要がありますが、DFPlayer単体で使用する場合は、ファイルを追加した順番に再生するモードとなります。
例えば、SDカードにmp3ファイルを「チャイコフスキー.mp3」、「シューベルト.mp3」、「パッヘルベル.mp3」と順番に追加した場合、最初に再生されるのは「チャイコフスキー.mp3」であとは追加順に再生されていきます。
SFカードにmp3ファイルを入れたらDFPlayerに挿して周辺パーツを繋ぎます。
以下は必要最小限の構成です。
こちらは、以下のWikiに載っている回路図のADKEY1, ADKEY2の接続を省略したものになります。
操作は、以下のとおりです。
- 左のボタンはIO1につながっているので、前の曲と長押しでボリュームダウン
- 右のボタンはIO2につながっているので、次の曲と長押しでボリュームアップ
またDFPLayerのlEDは音楽が流れている間光ります。
電源を入れた後は、最初にボタンを押したら再生が始まります。連続では再生されないので、1曲再生が終わると止まります。
ADKEYピンを使うと再生・停止ボタンなどの操作も作り込めますが、基本的な動作確認をしてみました。
シリアル通信でArduinoから制御する
ArudionoなどマイコンからUARTのシリアル通信を介してコマンドを送信し、DFPlayerを操作する方法について解説していきます。
UARTコマンドを生成して個別に送るのは大変なので、DFRobotが公式のArduino用ライブラリ DFRobot / DFRobotDFPlayerMiniを使用します。
ライブラリマネージャを開いて、DFRobotDFPlayerMiniをインストールします。
また、DFRobotDFPlayerMiniはSoftwareSerialライブラリを使用するのでこちらもインストールしておきます。
ライブラリマネージャを開き「AltSoftSerial」で絞り込んでインストールします。
配線は以下のように、IO11をRX, IO10をTXをつなぎます。
スケッチは、examples/GetStarted/GetStarted.inoをそのまま動かしてみます。
以下、メインの処理にコメントで解説を入れています。
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SoftwareSerial mySoftwareSerial(10, 11); // IO10をRX, IO11をTXとしてアサイン
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
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)"));
if (!myDFPlayer.begin(mySoftwareSerial)) { // DFPlayerを初期化します。USBピンを使ってなければ、デバイスはSD(TF)カードが選択されます
// 2秒以内に初期化できなかった場合はエラーメッセージを表示
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."));
myDFPlayer.volume(10); // ボリュームをセット、 ボリュームは0から30の値で指定可能
myDFPlayer.play(1); // 先頭のmp3ファイルを再生
}
void loop()
{
static unsigned long timer = millis();
if (millis() - timer > 3000) {
timer = millis();
myDFPlayer.next(); // 3秒ごとに次の曲を再生
}
if (myDFPlayer.available()) {
// 受信したデータから解析された状態とコマンドのパラメータを出力します
printDetail(myDFPlayer.readType(), myDFPlayer.read());
}
}
void printDetail(uint8_t type, int value){
...
}
Arduinoにスケッチを書き込むとSDカードに入っている曲を3秒ずつ再生します。