DFPlayerMini互換品の扱いかた(DFPlayer hw247a,MP3-TF-16P)

## DFPlayerMiniの互換品を購入する人たちに向けて

![IMG20231115213211~2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142016/b6bcf0dd-2cd5-8443-1e16-df3eb4c3588c.jpeg)


DFPlayerは純正品で1000円ちょっとするのもあれば、互換品として300円くらいで出回っているものがある（それがパチものかわからないが、とりあえず互換品とする）。

Amazonの購入者レビューを見ると、これに関して多くの問題を目にする。

ちょっとした夏休みの工作などを考えたりするパパママの気持ちなると解決策が欲しい。

今回は、純正品でなく、互換品をどう使ったら良いかという話。

すでにDFplayerを使い方は調べていて、「あれなんか動かないぞ？」という人向けの記事。

DFplayerに下記のシルク印刷がされている製品などが対象。
・DFplayer Mini hw247a --- 互換品
・MP3-TF-16P--- 互換品

### 確認作業1: IOピン動作しますか？
最初に上記の互換品を使う場合は、IO1、IO2ピンで動作するかは確認したほうが良い。
互換品でもまともに動作する。動かない場合は、販売者に返送するなり、あきらめてゴミ箱に入れたほうが良い。

### 確認作業2: シリアル通信できますか？
シリアル通信になると話は別になる。純正品同様に互換品を使おうとしたら動かない。
「シリアル通信ができない！」というパパママはきっとArudino IDE経由でライブラリマネージャから「DFRobotDFPlayerMini」を選択して
インストールしたライブラリを使用したりしているのではないか。
それは純正品をベースに作成しているライブラリであって、先に挙げた互換品は想定されていないと思う。

### じゃあどうするの？
互換品については、先人たちも多くの問題を認識している。
そのため、彼等が互換品向けに作成しているDFplayerのライブラリもある。
悩む時間を気にするなら素直にこれらをありがたく使わせてもらおう。

https://github.com/enjoyneering/DFPlayer

これらのサンプルコードはESP32/ESP8266でも使えるようだが、Arduino Unoでも動く。
ExampleのサンプルはESPベースなので、サンプルコードを少し書き換えると動作する。
（Arduino UnoのTxにつける抵抗は1kΩを指すのを忘れないように。）

注意：ESP系列で使いたい場合は、下記のライブラリをダウンロードしておこう。
   ESP8266 Core      -  https://github.com/esp8266/Arduino
   EspSoftwareSerial -  https://github.com/plerup/espsoftwareserial

今回はArduino Unoを使うので、サンプルコードをベースに使用する。

サンプルコードにあるようなEspSoftwareSerialは使わないで大丈夫。

```
#include "SoftwareSerial.h"
#include <DFPlayer.h>


#define MP3_RX_PIN              2     //GPIO4/D2 to DFPlayer Mini TX
#define MP3_TX_PIN              4     //GPIO5/D1 to DFPlayer Mini RX
#define MP3_SERIAL_SPEED        9600  //DFPlayer Mini suport only 9600-baud
#define MP3_SERIAL_BUFFER_SIZE  32    //software serial buffer size in bytes, to send 8-bytes you need 11-bytes buffer (start byte+8-data bytes+parity-byte+stop-byte=11-bytes)
#define MP3_SERIAL_TIMEOUT      350   //average DFPlayer response timeout for GD3200B chip 350msec..500msec

SoftwareSerial mp3Serial(2, 4); 
DFPlayer       mp3;

void setup()
{
  Serial.begin(115200);
  mp3Serial.begin(9600);
  
  mp3.begin(mp3Serial, MP3_SERIAL_TIMEOUT, DFPLAYER_HW_247A, false); //"DFPLAYER_HW_247A" see NOTE, false=no feedback from module after the command

  mp3.setVolume(10);                      //0..30, module persists volume on power failure
                     
Serial.println(mp3.getStatus());        //0=stop, 1=playing, 2=pause, 3=sleep or standby, 4=communication error, 5=unknown state
  
}
                     
void loop()
{
  mp3.playTrack(1);     //play track #1, don’t copy 0003.mp3 and then 0001.mp3, because 0003.mp3 will be played firts
//mp3.playMP3Folder(1); //1=track, folder name must be "mp3" or "MP3" & files in folder must start with 4 decimal digits with leading zeros
//mp3.playFolder(1, 2); //1=folder/2=track, folder name must be 01..99 & files in folder must start with 3 decimal digits with leading zeros

  delay(60000);         //play for 60 seconds

  mp3.pause();
  delay(3000);         //pause for 10 seconds

}
```


:::note info
余談(グチ)：

AmazonやAliexpressで１個200円～300円で購入できるものは、すべてが互換品と考えてよい。
そして、単純にハンダの不良であったりして、動作しないものも良く混ざっている。
自分も5個互換品を購入し、すべて同じ環境で動作確認したところ、2個は動作しなかった。
そうやって悩む時間をコストとして考えるのであれば、素直に純正品を買ったほうが精神衛生上も良い。
（そんな人は秋月電子や電子工作ステーションで買うべきだ。）

それと不良品を混ざるの覚悟で送り付けて販売するaliexpress並行輸入サプライヤは、どうにかしたほうが良い。
返金前提で販売するのではなくて、まともに動作確認ぐらいしてから売ってほしい。単品購入して動かなかった時のショックは大きかった。
そもそも写真に乗っているDFplayerの基盤のシルク印刷（写真ではDFplayer Mini)と、異なるもの売っている自覚はあるのにも関わらず売るってどうなのかと？
:::