音声再生モジュール「DFPlayerMini」の動作確認を行いました。

内蔵メモリは無く、microSDカードに入っているファイルを再生するタイプのものです。

互換品の「MP3-TF-16P」というものがありましたので、今回はこちらを使って確認していきました。

結論から言うと、問題無く動作しました。

 

 

 

 

これを使って、2種類の動作確認を行います。

  1. このモジュール単体で動作させてみる
  2. Arduinoを使って動かしてみる

 

参考にさせて頂いた記事はこちら。

オフィシャルのwikiの情報が充実しているのは助かります。

 

 

音声ファイルはmicroSDカードにコピーします。

microSDカードは、最大32GBまで対応しており、100フォルダ255ファイルまで読み込めるようです。

今回、ファイル名は分かりやすく数字にしましたが、文字列のファイル名でも再生できることは確認しました

 

 

単体での動作確認

 

単体で動作させる場合の配線は下記のようにしました。

IO1,2をLow(0V)にすると、対応する動作が行われます。

今回は手動でGND端子から配線を出して、IO1,2に接触させてみました。

 

実際の配線の様子。

 

IO1,2は、接触時間により動作が異なるようです。

  • IO1(短時間):1つ前 or 今のファイルを再生
  • IO1(長時間):ボリュームを下げる
  • IO2(短時間):次の曲を再生。最後まで行ったら初めの曲に戻る。
  • IO2(長時間):ボリュームを上げる

ボリュームの調整がADKEYではなくIO端子で行うというのは面白いですね。

 

 

動作確認の様子はこちら。

動画後半にArduinoでの動作確認の様子も繋げています。

 

 

単体動作の場合、初期値ではボリュームが最大になっているので、ビックリすると思います。

Arduinoで動かす場合はボリュームの設定ができるので問題無いのですが、単体動作の場合は起動時に毎回調整が必要です。

 

 

Arduinoを使った場合

 

Arduinoで動かす場合の配線はこちら。

VCCはArduinoから5Vを取っています。

ArduinoとはUART通信を行います。

注意点としては、DFPlayerMiniのRX端子には1kの抵抗を接続することです。

 

 

実際の配線の様子はこちら。

 

 

Arduinoで動かす場合、「DFRobotDFPlayerMini」ライブラリを使います。

Arduino IDEで検索しても出てくるので、そちらから追加しても大丈夫です。

 

GitHubからDLする場合はこちら。

https://github.com/DFRobot/DFRobotDFPlayerMini/

 

サンプルプログラムのGetStartedを修正して使いました。

サンプルではArduino UnoかESP8266で動かすことを想定しているプログラムになっており、いくつかコメントアウトすることでArduino Nanoでも無事動作させることができました。

具体的には、25,29,30,31行目をコメントアウトしました(シリアル通信の定義のところ)。

下記に、コメントアウトした箇所を青色にしたものを記載します。

 

#include "Arduino.h"
#include "DFRobotDFPlayerMini.h"

//#if (defined(ARDUINO_AVR_UNO) || defined(ESP8266))   // Using a soft serial port
#include <SoftwareSerial.h>
SoftwareSerial softSerial(/*rx =*/4, /*tx =*/5);
#define FPSerial softSerial
//#else
//#define FPSerial Serial1
//#endif


DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
#if (defined ESP32)
  FPSerial.begin(9600, SERIAL_8N1, /*rx =*/D3, /*tx =*/D2);
#else
  FPSerial.begin(9600);
#endif

  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(FPSerial, /*isACK = */true, /*doReset = */true)) {  //Use serial to communicate with mp3.
    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(30);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
}

void loop()
{
  static unsigned long timer = millis();
  
  if (millis() - timer > 3000) {
    timer = millis();
    myDFPlayer.next();  //Play next mp3 every 3 second.
  }
  
  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
  }
}

void printDetail(uint8_t type, int value){
  switch (type) {
    case TimeOut:
      Serial.println(F("Time Out!"));
      break;
    case WrongStack:
      Serial.println(F("Stack Wrong!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Card Inserted!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Card Removed!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Card Online!"));
      break;
    case DFPlayerUSBInserted:
      Serial.println("USB Inserted!");
      break;
    case DFPlayerUSBRemoved:
      Serial.println("USB Removed!");
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:
          Serial.println(F("Card not found"));
          break;
        case Sleeping:
          Serial.println(F("Sleeping"));
          break;
        case SerialWrongStack:
          Serial.println(F("Get Wrong Stack"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Check Sum Not Match"));
          break;
        case FileIndexOut:
          Serial.println(F("File Index Out of Bound"));
          break;
        case FileMismatch:
          Serial.println(F("Cannot Find File"));
          break;
        case Advertise:
          Serial.println(F("In Advertise"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
  
}

 

 

上と同じ動画ですが、動作確認の様子をもう一度貼っておきます。

 

 

DFPlayerMiniは、microSDカードを使っているので大量のデータを扱えるのが良いですね。

また、SDカードを入れ替えるだけで音声データを簡単に差し替えられるのもGood。

 

 

他にも内部メモリが128MBあるDFPlayer Proも使い勝手が良いのでオススメです。

DFPlayer Proを動かしたときの記事はこちら。

 

 

その他の音声再生モジュールの実験結果を比較した記事はこちら。