M5Stackで RFIDを読み込む

M5Stack で NFC を読んでみることを試みてみた。
M5Stack で使うにあたって調べたりで、いろいろあったのでメモ。

目次

RFID モジュール RC522 を購入した。

Anmbest 2 個セット MF RC522 RFID RF IC カードセンサーモジュールおよび Arduino ウノ Mega2560 ラズベリー円周率のための SPI を持つ Mifare1S50 ブランクカードとキーホールダ

品名の翻訳がなんかおかしいけれど、これを購入した。
同じものなのに値段は上から下まであるので、買うときは注意したほうがいいそうだ。

使い方を調べると、Arduino uno と Raspberry Pi での使い方は出てくるが、
M5Stack につないだ記事は見つけられず、ピン配置から調べ始めた。

以下のページを参考にさせていただきました。
2018-05-04 ESP32(ESP-WROOM-32)に RFID リーダーを繋ぐ
Arduino で複数の NFC タグを区別する
https://bokunimo.net/arduino/rfid.html
非接触 IC タグで遊ぼう!Arduino で RFID リーダ RC522 を使う方法

配線

ここに画像
M5stack 側

RC522 側

結線前の RC522

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

M5Stack RC522
3V3 3V3
G GND
RST RST
- IRQ
SDA SDA
MO MOSI
MI MISO
SCK SCK

ライブラリ追加

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

コード

ArduinoIDE の[ファイル]->[スケッチ例]->[互換性なし]->[MFRC522]->[DumpInfo]をベースに書き換えた。
主なやったことは、

  • M5Stack のライブラリインクルード
  • シリアル通信の速度を 115200 に変更
  • RST_PIN と SS_PIN の割り当て番号変更

配線で、見てもらった接続を行ったけど、
コードでピン番号を割り当てをし直す必要があって、
サンプルコードでの RST_PIN と SS_PIN が何番ピンなのか調べた。

調べた時の参考は、m5stack/M5-Schematic
ここに、RESET は 6 って書いてある。
だけど、6 にした時全くうまくいかなくて、さまよう。
屋根裏実験室 M5Stack を使ってみるにたどり着いて、ようやく 33 でよいらしいことが分かった。

SS は IIS_SCLK の略だなと気が付いて 21 だとすぐわかった。
数打ちゃ当たるようなことをしているので非常に反省が多いのだが、
言い調べ方は無いだろうか?

書き換えたスケッチは以下の通り、

NFC-UIDInfo-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
#include <M5Stack.h>
#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN 33
#define SS_PIN 21

MFRC522 mfrc522(SS_PIN, RST_PIN);

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

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

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

Serial.printf("Loading");
}

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 mes1[9];
sprintf(mes1, "%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", mes1);
}

これを書き込んで、

Ctrl+Shift+m でコンソールを開くと
次のような画面が出る。
参考ページに倣い UID は隠しておきます

別のカードを試すと別の UID が読める。
いい感じ。

今回、M5Stack で RFID を読んでみた。
M5stack で RFID を使うなら、M5Stack 最新ミニ RFID ユニット RC522 モジュールセンサー、Arduino SPI ライターリーダー用 IC カード、Grove ポート I2C インターフェース ESP32 用
でも良かったのでは?と思われそうだけど、
他のデバイスでも使うことを考えたいので、今回のものを選んでみた。

これを使用して音を出すとかコマンド送信するとかアプリケーションにしてみようかと思う。

ではでは。

-後日談-

今回の組み合わせだと、M5Stack の TFT が真っ白になって操作できない致命的な問題が出ることが後でわかった。
どうやら、TFT を使用しているピンと今回使用したピンが同じらしい?
m5stack をずっと裏側にしてピン配置だけ見ていたので最後の最後まで気が付かなかった。
後に、M5Stack 最新ミニ RFID ユニット RC522 モジュールセンサーを買ったのでした。