AtomS3 と Unit RFID 2 でひとまず UUID とタイプ判定を実装してみたメモ
AtomS3 と Unit RFID 2 でひとまず UUID とタイプ判定を実装してみたメモです。
この記事は IoTLT Advent Calendar 2025 の 8 日目の記事です。
ガチで頑張った仕組みの基礎の知見です

息子の参観日で RFID で宝さがしができる仕掛けを見せてきました - 1ft-seabass.jp.MEMO
こちらの知見のめっちゃ基礎になる知見です。
振り返っても、このシンプルな基礎部分を把握できたということは大切でしたね。
カードデータの読み込みが好き
以前からカードからのデータ読み込みが好きです。
ただ、いつも USB デバイスからキー入力できる仕組みなのも制御しづらいなと思って、今回はよりっ組み込みやすいように AtomS3 と Unit RFID 2 の連携をやってみます。

M5Stack用WS1850S搭載 RFID 2ユニット — スイッチサイエンス
こちらのデバイスです。
実際のプログラム
このあたりがコードとしては参考になりました。
ただ、UID 読み取りサンプル とタイプ判定をシンプルに切り出しつつ AtomS3 と連携しやすいものにしています。
#include <M5Unified.h>
#include <MFRC522_I2C.h>
MFRC522_I2C mfrc522(0x28, -1);
void setup() {
auto cfg = M5.config();
M5.begin(cfg);
Wire.begin();
M5.Display.clear();
M5.Display.setCursor(0, 0);
M5.Display.setTextSize(1);
M5.Display.println("[Clean UID Reader]");
M5.Display.println();
M5.Display.println("Place card on reader...");
mfrc522.PCD_Init();
}
// カードタイプを取得
String getCardTypeName(uint8_t piccType) {
switch (piccType) {
case MFRC522_I2C::PICC_TYPE_MIFARE_1K:
return "MIFARE 1K";
case MFRC522_I2C::PICC_TYPE_MIFARE_UL:
return "MIFARE Ultralight";
case MFRC522_I2C::PICC_TYPE_MIFARE_4K:
return "MIFARE 4K";
case MFRC522_I2C::PICC_TYPE_MIFARE_MINI:
return "MIFARE Mini";
default:
return "Other";
}
}
void loop() {
M5.update();
if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
// カードタイプを取得
uint8_t piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
String cardTypeName = getCardTypeName(piccType);
// UIDを文字列に変換(コロンなし)
String uidString = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
if (mfrc522.uid.uidByte[i] < 0x10) uidString += "0";
uidString += String(mfrc522.uid.uidByte[i], HEX);
}
uidString.toUpperCase();
// 結果表示
M5.Display.clear();
M5.Display.setCursor(0, 0);
M5.Display.setTextSize(2);
// カードタイプ(2行に分けて表示)
if (cardTypeName.startsWith("MIFARE")) {
M5.Display.println("MIFARE");
String subType = cardTypeName.substring(7); // "MIFARE "以降を取得
M5.Display.println(subType);
} else {
M5.Display.println(cardTypeName);
M5.Display.println();
}
M5.Display.println("----");
// UID(フォントサイズ2で表示)
M5.Display.setTextSize(2);
M5.Display.println(uidString);
M5.Display.setTextSize(1);
// カードがかざされている間は表示を維持
while (true) {
M5.update();
// カードの存在をチェック
if (!mfrc522.PICC_IsNewCardPresent()) {
delay(50);
if (!mfrc522.PICC_IsNewCardPresent()) {
break; // カードが離れた
}
}
delay(100);
}
// 待機画面に戻る
M5.Display.clear();
M5.Display.setCursor(0, 0);
M5.Display.setTextSize(1);
M5.Display.println("[Clean UID Reader]");
M5.Display.println();
M5.Display.println("Place card on reader...");
delay(500);
}
delay(50);
}
実際に動かしてみる
こちらを AtomS3 に書き込んで動かしてみます。最近は PlatformIO を愛用してます。

起動しました!

カードを読んでみます。UID が見えますね!

他のカードでもバッチリです!
ちょっと安定させるまでに、個人的には苦労したので、メモしておきます!