M5Stackで RFIDを読み込んでmp3ファイルを鳴らす

今まで書いた

を組み合わせて、RFID の読み取り結果で mp3 ファイルを鳴らし分けるテストをした。
作成自体は 3 月初めに終わっていて動画まで撮っていたので供養の意味を込めて記事化。
動作は次の動画の通り(作業机キタナイ・・・。)

動画を撮ったときの時点ではM5Stack を使って mp3 ファイルを鳴らす
の後日談で書いた M5Stack の TFT が真っ白になって操作できない件が解決していません。

先日、M5Stack ユーザーミーティング vol.4に LT 発表者として「M5Stack と RFID でデバイスを作った話」というタイトルで、
今回の記事の構成を発展させた「変身ブレス」を作った話をさせてもらいました。
そういう意味でも、失敗したなりにも記事にします。

目次

配線

配線のみの写真を撮り忘れていたので、雰囲気は動画を止めて確認してもらうしかありません。
ごめんなさい。

配線はこれまでの記事を組み合わせて以下のようになります。

M5Stack 抵抗 DFPlayer Mini スピーカー RC522
3V3 - VCC - 3V3
G - GND - GND
16 - RX -
17 1KΩ TX -
2 - BUSY -
- - SPK_1 スピーカー(+)
- - SPK_2 スピーカー(-)
RST RST
- IRQ
SDA SDA
MO MOSI
MI MISO
SCK SCK

ライブラリ追加

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

コード

過去に作成した

のコードを組み合わせる形で作成。

NFC-UID-MP3-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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149

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

#define RST_PIN 33
#define SS_PIN 21

MFRC522 mfrc522(SS_PIN, RST_PIN);

//サンプルコードそのまま:通知クラス実装
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 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);
}
}


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

M5.Lcd.setTextSize(2);

//シリアル通信初期化
Serial.begin(115200);
while (!Serial);

//SPI,mfrc522初期化
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522
mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);

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

uint16_t count = mp3.getTotalTrackCount();
Serial.printf("files %d", count);

Serial.printf("Loading");
}

char msg[17] = "";

void loop() {

//カードの読み取り確認
if (!mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial()) {
return;
}

//読み取りしたuidを文字列に変換
String strBuf[mfrc522.uid.size];
for (byte i = 0; i < mfrc522.uid.size; i++) {
strBuf[i] = String(mfrc522.uid.uidByte[i], HEX);
if (strBuf[i].length() == 1) {
strBuf[i] = "0" + strBuf[i];
}
}

//文字列連結-表示
char msg2[9];
sprintf(msg2, "%02x%02x%02x%02x", mfrc522.uid.uidByte[0], mfrc522.uid.uidByte[1], mfrc522.uid.uidByte[2], mfrc522.uid.uidByte[3]);
Serial.printf("UID: %s\n", msg2);

int i = 0;
Serial.printf("414d0c69:%s\n", msg2);
char msg3[9]="414d0c69";
if (strcmp(msg2,msg3)) {
i = 1;
}
else {
i = 2;
}
//出力文字列作成・表示
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(5)) {
waitMilliseconds(1000);
}
//mp3データ停止
mp3.stop();
}

M5Stack にNFC-UID-MP3-M5Stack.inoを書き込み、
カードをかざすと、UID の内容に基づいて音を鳴らします。
動作は以下の通り

とこんな感じで、RFID の読み取りと MP3 の読み取りを連携させました。
これを発展させた「変身ブレス」については、記事を準備中。
M5Stack の画面遷移アニメーション処理と、デモ用のゲーム画面の処理が結構なスパゲッティになっていて、マジックナンバーも含まれているので、
自身の整理の意味でもリファクタリングしてから公開したい所存。

ではでは。