M5Stackを使ってmp3ファイルを鳴らす

M5Stack で mp3 を鳴らしたいので、Arduino 対応の mp3 再生モジュールDFPlayer Miniを買いました。

もちろんそのまま使用できるわけでもなくて、M5Stack 用に?調整して動作するところまで持っていけたのでまとめです。

目次

DFPlayer Mini を買った

M5Stack で RFID を読み込むで書いた時と同じで、
同じモジュールなのに、やはり値段幅があるので気を付ける必要があるようです。

以下のページを参考にさせていただきました。
500 円以下の Arduino 用 mp3 プレーヤー”DFPlayer Mini”で適当なもの作ってみた
DFPlayer Mini を使って Arduino で音声(MP3)を再生する
簡単にスピーカ再生機能を追加!  DFPlayer Mini で MP3 音源再生!

配線

DFPlayer Mini SKU:DFR0299を参考にして配線します。
DFPlayer Mini本体
配線真上
配線斜め

各結線の対応は以下のようになった

M5Stack 抵抗 DFPlayer Mini スピーカー
3V3 - VCC -
G - GND -
16 - RX -
17 1KΩ TX -
2 - BUSY -
- - SPK_1 スピーカー(+)
- - SPK_2 スピーカー(-)

ライブラリ追加

ArduinoIDE の[スケッチ]->[ライブラリをインクルード]->[ライブラリを管理]で、
「DFPlayer Mini Mp3 by Makuna」と検索してインストールする。(画像はインストール済み)

「DFPlayer Mini Mp3 by Makuna」の GitHub はこちら
こちらで見ると、サンプルには未使用の関数も準備されてるのがわかります。

コードは、ArduinoIDE の[ファイル]->[スケッチ例]->[カスタムライブラリのスケッチ例]->[DFPlayer Mini Mp3 by Makuna]->[PlayMp3]をベースに書き換えた。

主なやったことは、

  • M5Stack のライブラリインクルード
  • SoftwareSerial から HardwareSerial にシリアルの使用クラスを変更
PlayMp3-M5Stack.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116

#include <M5Stack.h>
#include <DFMiniMp3.h>

//サンプルコードそのまま:通知クラス実装
class Mp3Notify
{
public:
static void OnError(uint16_t errorCode)
{
// see DfMp3_Error for code meaning
Serial.println();
Serial.print("Com Error ");
Serial.println(errorCode);
}

static void OnPlayFinished(uint16_t globalTrack)
{
Serial.println();
Serial.print("Play finished for #");
Serial.println(globalTrack);
}

static void OnCardOnline(uint16_t code)
{
Serial.println();
Serial.print("Card online ");
Serial.println(code);
}

static void OnCardInserted(uint16_t code)
{
Serial.println();
Serial.print("Card inserted ");
Serial.println(code);
}

static void OnCardRemoved(uint16_t code)
{
Serial.println();
Serial.print("Card removed ");
Serial.println(code);
}
};

HardwareSerial mySerial2(2);
DFMiniMp3<HardwareSerial, Mp3Notify> mp3(mySerial2);

void setup()
{
//M5Stack初期化
M5.begin();
M5.Lcd.setTextSize(2);

//mp3初期化
mp3.begin();
mp3.setVolume(25);
//停止させておく
mp3.stop();

//トラック数情報を表示
uint16_t count = mp3.getTotalTrackCount();
Serial.printf("files %d", count);
}

//サンプルコードそのまま:再生時間を指定する関数
void waitMilliseconds(uint16_t msWait)
{
uint32_t start = millis();

while ((millis() - start) < msWait)
{
// calling mp3.loop() periodically allows for notifications
// to be handled without interrupts
mp3.loop();
delay(1);
}
}

//変数定義
int i = 1;
char msg[17] = "";

void loop()
{
//アップデート
M5.update();

//LCD消去
M5.Lcd.clear();

//出力文字列作成・表示
sprintf(msg, "sd:/mp3/%04d.mp3", i);
Serial.printf("%d\n", i);
Serial.printf("%s\n", msg);
M5.Lcd.drawString(msg, 0, 0);

//mp3データ再生
mp3.playMp3FolderTrack(i); // sd:/mp3/000[i].mp3が再生
mp3.start();

//再生終了待ち
while (!digitalRead(2)) {
waitMilliseconds(1000);
}
//mp3データ停止
mp3.stop();

//カウンタ処理
if (i < 3) {
i++;
}
else {
i = 1;
}
}

M5Stack にPlayMp3-M5Stack.inoを書き込み、
DFPlayer Mini に差し込むマイクロ SD カードに、mp3 フォルダを作成して、0001.mp3,0002.mp3,0003.mp3 を保存します。
すると電源を入れなおすと、0001.mp3~0003.mp3 をループで再生します。

mp3 ファイルの再生ができました。
使っているスピーカーと音量設定のせいか、若干音が割れる割れてるけど、
ハード側で調整(部品交換含め)すればよくなりそうです。
この前のM5Stack で RFID を読み込むと組み合わせて RFID の読み取り結果で音を鳴らしてみようかと思います。

ではでは。