小型のMP3プレーヤーモジュールDFPLayerの使い方

コピペテックで技術書典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秒ずつ再生します。

参考リンク