AtomS3 と Unit RFID 2 でひとまず UUID とタイプ判定を実装してみたメモ

AtomS3 と Unit RFID 2 でひとまず UUID とタイプ判定を実装してみたメモ

AtomS3 と Unit RFID 2 でひとまず UUID とタイプ判定を実装してみたメモです。

この記事は IoTLT Advent Calendar 2025 の 8 日目の記事です。

ガチで頑張った仕組みの基礎の知見です

息子の参観日で RFID で宝さがしができる仕掛けを見せてきました - 1ft-seabass.jp.MEMO

こちらの知見のめっちゃ基礎になる知見です。

振り返っても、このシンプルな基礎部分を把握できたということは大切でしたね。

カードデータの読み込みが好き

以前からカードからのデータ読み込みが好きです。

RaspberryPi Node-REDのカードリーダーからBluemix Node-REDのWatson Text To Speechを合わせて魔法発動ぽいカードをつくる - 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 が見えますね!

他のカードでもバッチリです!

ちょっと安定させるまでに、個人的には苦労したので、メモしておきます!