ArduinoにDFPlayerMiniを繋いでmp3音楽再生をする

Arduinoを用いて音楽再生を行いたい場合があります。この場合、後述するDFPlayerMiniを使用すると格安でMP3音楽再生ができましたので手順を記載します。

# 準備
・[Arduino UNO R3 互換品](https://www.amazon.co.jp/スイッチサイエンス-SSCI-GettingStartedArduinoKit-Arduinoをはじめようキット/dp/B0025Y6C5G/ref=sr_1_4?s=toys&ie=UTF8&qid=1548518133&sr=1-4&keywords=Arduino+正規品)
・[DFPlayerMini](https://www.amazon.co.jp/gp/product/B01D1D0E7Q/ref=ppx_yo_dt_b_asin_title_o06__o00_s01?ie=UTF8&psc=1)
・[マイクロSDカード](https://www.amazon.co.jp/gp/product/B004TA0AUW/ref=ppx_yo_dt_b_asin_title_o05__o00_s00?ie=UTF8&psc=1)
・ジャンパワイヤ
・スピーカ（１００均のものでOK）

DFPlayerMini届きました
![dfplayer001.png](https://qiita-image-store.s3.amazonaws.com/0/344880/ac507bb4-417a-a0e5-bb2a-2fc997bf37b4.png)

# 音楽ファイルの準備
step1.mp3ファイルを用意する。
step2.用意したmp3ファイルを、0001_*.mp3,0002_*.mp3,0003_*.mp3,,,とリネームする。
step3.マイクロSDのルートディレクトリに、"mp3"という名前のフォルダを作成し、リネームしたmp3ファイルをコピーする。

※注意
MACの場合はMP3ファイルをSDへコピーした際に".0001_*"のような隠れファイルが作られ、MP3ファイル再生に影響するようです。この問題を解決するにはdot_cleanコマンドで隠れファイルの削除が要るようです。（はまりました）
![003.png](https://qiita-image-store.s3.amazonaws.com/0/344880/2a670b2c-e281-fff9-6b38-b5ca942a209c.png)


# 回路図
Arduino、DFPlayerMini、スピーカを下記の通り接続します。
マイクロSDカードはDFPlayerMiniに挿入します。
![dfplayermini002.png](https://qiita-image-store.s3.amazonaws.com/0/344880/81f8083e-c289-2cb2-68bf-7e83a4d81414.png)
DFPlayerMiniの回路図は下記です。
![Miniplayer_pin_map.png](https://qiita-image-store.s3.amazonaws.com/0/344880/578f38aa-f460-b3c2-ed80-2d3a92b1a070.png)
BUSYピンはファイル再生中かどうかを判断するために必要です。

# コード
setup関数：初期化を行います
PLAYBACK_MP3_MUSIC関数：DFPlayerが再生可能な場合に音楽再生を行います
loop関数：500msec毎に音楽再生を試みます

```
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#define BUSY_PINNO 7

SoftwareSerial mySoftwareSerial(10, 11); // (TX, RX)
//SoftwareSerial mySoftwareSerial(3, 2); // (TX, RX)
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
  Serial.begin(115200);  

  // software serial init
  mySoftwareSerial.begin(9600);
  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);
  }

  // BUSY_PINNO init
  pinMode(BUSY_PINNO, INPUT);

  // DFPlayer Init
  myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms  
  myDFPlayer.volume(25);  //Set volume value (0~30).
  // myDFPlayer.volumeUp(); //Volume Up
  // myDFPlayer.volumeDown(); //Volume Down  
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);    
  myDFPlayer.play(1);  //Play the first mp3
}

void PLAYBACK_MP3_MUSIC(void) {
  int isBusy = digitalRead(BUSY_PINNO); // 0:playing, 1:not playing (refer website)
  Serial.println(isBusy);
  if (isBusy == 1) {
    myDFPlayer.next();  //Play next mp3 every 3 second.
  }
}

void loop()
{
  PLAYBACK_MP3_MUSIC();
  delay(500);
}
```

もしPIN10,11が他モジュールで使用されている場合は、PIN2,3をソフトウェアシリアルとして使用すればOKです。（例えばSPI通信を行う場合にPIN10,11を使うことがあると思います）

# テスト
電源ON後にSDカードに保存したMP3ファイルの音楽再生を行えればOKです。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="de" dir="ltr">play dfplayer mini <a href="https://t.co/fI6r6A98Gy">pic.twitter.com/fI6r6A98Gy</a></p>&mdash; st (@st17890027) <a href="https://twitter.com/st17890027/status/1094963268479664130?ref_src=twsrc%5Etfw">2019年2月11日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

# 参考
・[組み込みエンジニアでなくても週末にArduinoを使って遊ぶ](https://qiita.com/seigot/items/958d3f2817a4bdac8754)
・[MUDAなことをしよう](https://make-muda.net/2016/09/4585/)
・[DFPlayer Mini SKU:DFR0299](https://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299)