めーぷるのおもちゃばこ

- アイドルになりたいエンジニア女子の制作日記 -

【Arduino】DFPlayer Miniをつかってmp3の音ファイルを再生する

Arduinoでmp3の音を再生したい!ってなったときに、
良い方法があったのでご紹介します!

こんな感じで鳴らしました↓
youtu.be


わかりにくいですが、最初の音楽をループさせています。
途中でスイッチを押すと別の音(トランペットのやつ)が再生されます。

DFPlayer Mini

こちらの音声モジュールを使っています。


電子工作でmp3ファイルを再生するためのモジュールです。
Arduinoから制御できますが、単体でも使えるみたいです。
Amazonでプライムついててしかも結構安い!

ライブラリを使って簡単に音を再生したり、音量やループ再生などができます。
ライブラリは以下から入手できます。
https://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299#Sample_Code


配線

配線はこんな感じです。
f:id:maplesyrup-cs6:20190210034405p:plain



アンプが内蔵されているので、コーンをつなぐだけで良いのですが、
スピーカーをつなげるときはこっちにつなげてみたらいけました。使用するピンが変わっています。
少し図が雑ですが、3.5mmのモノラルジャックに配線してからスピーカーのオーディオジャックをそこにつなげています。
f:id:maplesyrup-cs6:20190210035533p:plain



mp3ファイルについて

再生したいmp3ファイルをマイクロSDカードに入れる必要があります。


マイクロSDカードの中に、新規フォルダを作成し、名前を01から10までの名前をつけ、そのなかにmp3ファイルを入れます。
mp3ファイルの名前は、1から1000の間でつけます。1000までなのですが、1のときに0001だとうまくいかなかった気がします。
最終的に001にしてうまくいきました。(気のせいかも)
f:id:maplesyrup-cs6:20190201200514p:plain


また、Setup関数で001の音源をループさせ、スイッチをおして002を流したのですが、001を01フォルダの中に入れるとなぜか002がループしたので、
01フォルダのそとにSetup関数でループさせたいmp3ファイルをおくとうまくいきました。

f:id:maplesyrup-cs6:20190201195213p:plain



コードの例

#include "DFRobotDFPlayerMini.h"
#include "SoftwareSerial.h"


SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

void setup() {
  // put your setup code here, to run once:

  mySoftwareSerial.begin(9600);    //シリアルポートを開き、転送速度を9600bpsに設定  mp3_set_serial (Serial);      //set Serial for DFPlayer-mini mp3 module 
 // Serial.begin(115200);

  pinMode(6,INPUT);

  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
  
  if (!myDFPlayer.begin(mySoftwareSerial)) {      //Use softwareSerial 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);
  }
  Serial.println(F("DFPlayer Mini online."));
  myDFPlayer.volume(15);
  myDFPlayer.loop(1);
}

void loop() {

  if(digitalRead(6) == HIGH){
  myDFPlayer.playFolder(1, 2);
  }
}

コードの解説


ライブラリの読み込み

#include "DFRobotDFPlayerMini.h"


RX,TXのピンを10番、11番ピンに接続

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX


SoftwareSerialとDFPlayerの初期化

mySoftwareSerial.begin(9600);   


SDカードがセットされていないとエラーが出ます。

if (!myDFPlayer.begin(mySoftwareSerial)) {     //Use softwareSerial 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);
}
  Serial.println(F("DFPlayer Mini online."));


音量を変更

myDFPlayer.volume(15);


一番目のmp3ファイルをループ再生

myDFPlayer.loop(1);


1のフォルダの中にある002.mp3を再生。一つ目の引数がフォルダ番号、二つ目の引数がその中のmp3の番号です。

myDFPlayer.playFolder(1, 2);

チュートリアルからのコード例

他にもいろいろ再生の仕方や止めたりする方法があります。
ライブラリをインストールしたところのチュートリアルにいろいろのっています。
https://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299#Sample_Code


以下、チュートリアルから抜粋。簡単にいろいろできてしまう!わかりやすくてよいですね。

myDFPlayer.next();  //Play next mp3
  delay(1000);
  myDFPlayer.previous();  //Play previous mp3
  delay(1000);
  myDFPlayer.play(1);  //Play the first mp3
  delay(1000);
  myDFPlayer.loop(1);  //Loop the first mp3
  delay(1000);
  myDFPlayer.pause();  //pause the mp3
  delay(1000);
  myDFPlayer.start();  //start the mp3 from the pause
  delay(1000);
  myDFPlayer.playFolder(15, 4);  //play specific mp3 in SD:/15/004.mp3; Folder Name(1~99); File Name(1~255)
  delay(1000);
  myDFPlayer.enableLoopAll(); //loop all mp3 files.
  delay(1000);
  myDFPlayer.disableLoopAll(); //stop loop all mp3 files.
  delay(1000);
  myDFPlayer.playMp3Folder(4); //play specific mp3 in SD:/MP3/0004.mp3; File Name(0~65535)
  delay(1000);
  myDFPlayer.advertise(3); //advertise specific mp3 in SD:/ADVERT/0003.mp3; File Name(0~65535)
  delay(1000);
  myDFPlayer.stopAdvertise(); //stop advertise
  delay(1000);
  myDFPlayer.playLargeFolder(2, 999); //play specific mp3 in SD:/02/004.mp3; Folder Name(1~10); File Name(1~1000)
  delay(1000);
  myDFPlayer.loopFolder(5); //loop all mp3 files in folder SD:/05.
  delay(1000);
  myDFPlayer.randomAll(); //Random play all the mp3.
  delay(1000);
  myDFPlayer.enableLoop(); //enable loop.
  delay(1000);
  myDFPlayer.disableLoop(); //disable loop.
  delay(1000);

  //----Read imformation----
  Serial.println(myDFPlayer.readState()); //read mp3 state
  Serial.println(myDFPlayer.readVolume()); //read current volume
  Serial.println(myDFPlayer.readEQ()); //read EQ setting
  Serial.println(myDFPlayer.readFileCounts()); //read all file counts in SD card
  Serial.println(myDFPlayer.readCurrentFileNumber()); //read current play file number
  Serial.println(myDFPlayer.readFileCountsInFolder(3)); //read fill counts in folder SD:/03

以上です。