techemo(てけも)のブログ

30代リーマンの副業ブログ

【買ってよかった中国輸入品】MFRC-522 RFIDキット~特徴は?使い方は?~

📝 投稿: 🔄 更新:

319記事目(中国輸入品シリーズ)

 

こんばんは。いつも読んでいただきありがとうございます。

趣味で中国から面白そう・便利そうな商品を輸入して使ってみています。techemoです。

今日は最近購入したMFRC-522 RFIDキット(リーダー/ライターモジュール、タグ、カードセット)の紹介です。

RFIDキット MFRC-522

ICカードをかざすだけで認証できるシステムを自作したいと思い購入しました。

なんと付属のカードとキーホルダーもついて700円程度という驚きの価格!

ESP32-C3と組み合わせれば、WiFi対応のスマートロックだって作れちゃいます。

 

特徴は

・非接触でカード読み取り

13.56MHz帯のRFID/NFCカードを約3〜5cmの距離で読み書きできます

タッチするだけで認証完了、まさにSuicaのような操作感!

 

・読み取りだけでなく書き込みも可能

カードのUID読み取りはもちろん、データの書き込みもできます

独自の会員カードや入退室管理システムが作れます

 

・付属品が充実

S50カード(MIFARE Classic 1K互換)とキーホルダータグが付属

届いたその日からすぐに実験できます

 

・とにかく安い(700円程度)

付属カード込みでこの価格は破格!

同等品を日本で買うと1000円以上することも

 

Arduino/ESP32との連携が簡単

SPI通信で接続、専用ライブラリも充実

サンプルコードも豊富で初心者でも扱いやすい

 

 

・はんだ付けが必要

ピンヘッダが別で付属しているのではんだ付けしてから使います

 

📦 MFRC-522 セット内容

📡
MFRC-522

リーダー本体

💳
S50カード

MIFARE 1K互換

🔑
キーホルダー

持ち運び用タグ

※ピンヘッダは別売りの場合あり

技術仕様

動作電圧: 3.3V(5Vは使わないこと!)

動作周波数: 13.56MHz

対応カード: MIFARE Classic (S50/1K, S70/4K)、MIFARE Ultralight

通信方式: SPI(最大10Mbit/s)

読み取り距離: 約3〜5cm

データ転送速度: 106 kbit/s

動作温度: -20〜80℃

 

⚡ 通信仕様まとめ

通信方式

SPI(4線式)

周波数

13.56MHz(NFC帯域)

電圧

3.3V(5V厳禁!)

距離

約3〜5cm

使い道は

私は主にESP32-C3と組み合わせて、カード認証システムの実験に使ってみたいと考えています

 

他にもいろんな使い道が想定されます

 

DIYスマートロック

ESP32とリレーを組み合わせれば、カードをかざすだけで開くドアロックが作れます

WiFi経由でログ記録やリモート解錠も可能!

 

・出退勤・勤怠管理システム

社員証をかざすだけで打刻完了

Google スプレッドシートと連携すれば自動記録も

 

・PCのログイン認証

パスワード入力の代わりにカードタッチでログイン

セキュリティと利便性の両立

 

・子供のお小遣い管理

ポイントカード風のシステムを自作

お手伝いするとポイント付与、なんて使い方も

 

・IRリモコンやセンサーとの連携

以前紹介したIRリモコンやリレーモジュールと組み合わせれば

「カードをかざすとエアコンON」なんてこともできます

 

🔧 活用アイデア

🚪
スマートロック +リレー+サーボ
勤怠管理 +WiFi+GAS
💡
照明制御 +IRリモコン
💰
ポイント管理 +ディスプレイ

読み取れるカード・読み取れないカード

ここが一番重要なポイントです!

MFRC-522は13.56MHz帯のMIFARE規格専用なので、読めるカードと読めないカードがあります

 

📋 カード対応早見表

✅ 読み取り可能

  • 💳 付属のS50カード・キーホルダー
  • 🏢 MIFARE採用の社員証・学生証
  • 🏠 MIFARE採用のマンション入館証
  • 🏨 一部のホテルキーカード
  • 🏷️ NFCタグ(NTAG213/215/216)
  • 📱 NFC Type A対応機器

❌ 読み取り不可

※日本で普及している交通系ICはFeliCa方式のため非対応です

なぜSuicaが読めないの?

Suicaなどの交通系ICは同じ13.56MHzでも「FeliCa」という別規格です

MFRC-522は「MIFARENFC Type A)」専用なので互換性がありません

FeliCaを読みたい場合は、Sony製のRC-S380などの専用リーダーが必要です

 

⚠️ 日本特有の注意点

🇯🇵
日本で主流

FeliCaSony

Suica, おサイフケータイ

🌍
世界で主流

MIFARE(NXP)

海外の交通カード等

MFRC-522はMIFARE専用です。日本の交通系ICには使えません!

配線図

ESP32-C3との接続は以下の通りです

重要:必ず3.3Vで接続してください!5Vを繋ぐと壊れます

 

🔌 ESP32-C3 との接続(SPI通信)

MFRC-522
SDA(SS)
SCK
MOSI
MISO
GND
RST
3.3V
ESP32-C3
GPIO10
GPIO6
GPIO7
GPIO2
未接続
GND
GPIO1
3.3V

⚠️ 絶対に5Vを接続しないでください!

MFRC-522 ESP32-C3 備考
SDA(SS) GPIO10 チップセレクト
SCK GPIO6 クロック
MOSI GPIO7 データ送信
MISO GPIO2 データ受信
IRQ 未接続 今回は不使用
GND GND 必須!
RST GPIO1 リセット
3.3V 3.3V ⚠️ 5V厳禁!

使い方は

①ライブラリのインストール

ArduinoIDEのツール>ライブラリを管理

ライブラリマネージャーの検索窓に"MFRC522"と入力し

"MFRC522" by GithubCommunity をインストール

 

②ボード設定

ボード: "ESP32C3 Dev Module"

Upload Speed: 115200

シリアルモニタ: 115200 bps

 

③配線

上記の配線図を参考に接続します

特にGNDと3.3Vは確実に接続してください

 

④コードの書き込み

以下のサンプルコードを書き込みます

 

📝 サンプルコード(クリックで展開)
/*
 * MFRC-522 カード読み取りテスト for ESP32-C3
 * 通信エラー対策版
 */

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

// ESP32-C3のピン設定
#define RST_PIN     1   // RSTピン
#define SS_PIN      10  // SDA(SS)ピン

// ESP32-C3のSPIピン(明示的に定義)
#define SCK_PIN     6
#define MISO_PIN    2
#define MOSI_PIN    7

MFRC522 mfrc522(SS_PIN, RST_PIN);

void setup() {
  Serial.begin(115200);
  delay(1000);
  
  Serial.println("\n========================================");
  Serial.println("MFRC-522 接続テスト for ESP32-C3");
  Serial.println("========================================\n");
  
  // ピン状態の確認
  Serial.println("【ピン設定】");
  Serial.print("SS (SDA): GPIO");
  Serial.println(SS_PIN);
  Serial.print("RST:      GPIO");
  Serial.println(RST_PIN);
  Serial.print("SCK:      GPIO");
  Serial.println(SCK_PIN);
  Serial.print("MISO:     GPIO");
  Serial.println(MISO_PIN);
  Serial.print("MOSI:     GPIO");
  Serial.println(MOSI_PIN);
  Serial.println();
  
  // SPI通信開始(ピンを明示的に指定)
  Serial.println("SPI初期化中...");
  SPI.begin(SCK_PIN, MISO_PIN, MOSI_PIN, SS_PIN);
  delay(100);
  
  // MFRC-522初期化
  Serial.println("MFRC-522初期化中...");
  mfrc522.PCD_Init();
  delay(100);
  
  // セルフテスト実行
  Serial.println("\n【セルフテスト実行】");
  bool selfTestResult = mfrc522.PCD_PerformSelfTest();
  
  if (selfTestResult) {
    Serial.println("✅ セルフテスト: 成功");
  } else {
    Serial.println("❌ セルフテスト: 失敗");
    Serial.println("   配線を確認してください");
  }
  
  // 再初期化(セルフテスト後に必要)
  mfrc522.PCD_Init();
  delay(100);
  
  // リーダー情報表示
  Serial.println("\n【リーダー情報】");
  mfrc522.PCD_DumpVersionToSerial();
  
  // ファームウェアバージョンをチェック
  byte version = mfrc522.PCD_ReadRegister(mfrc522.VersionReg);
  Serial.print("ファームウェアバージョン: 0x");
  Serial.print(version, HEX);
  
  if (version == 0x00 || version == 0xFF) {
    Serial.println(" ❌ エラー");
    Serial.println("\n【トラブルシューティング】");
    Serial.println("1. 配線を確認してください");
    Serial.println("   特にGND、3.3V、MOSI、MISOを確認");
    Serial.println("2. 3.3V電源の電圧を確認");
    Serial.println("3. ブレッドボード接触不良の確認");
    Serial.println("4. MFRC-522モジュールの不良の可能性");
  } else {
    Serial.println(" ✅ 正常");
    Serial.println("\nカードをリーダーに近づけてください...\n");
  }
}

void loop() {
  // カードが近づいたかチェック
  if (!mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  // カードのUIDを読み取り
  if (!mfrc522.PICC_ReadCardSerial()) {
    return;
  }

  Serial.println("\n========================================");
  Serial.println("🎉 カード検出!");
  Serial.println("========================================");
  
  // カードタイプを判定
  printCardType();
  
  // UIDを表示(カードの固有番号)
  printUID();
  
  // カードの詳細情報
  printCardDetails();
  
  Serial.println("========================================\n");
  Serial.println("次のカードをかざしてください...\n");
  
  // カード処理終了
  mfrc522.PICC_HaltA();
  mfrc522.PCD_StopCrypto1();
  
  delay(2000); // 連続読み取り防止
}

// カードタイプを表示
void printCardType() {
  Serial.print("【カードタイプ】 ");
  
  MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
  String typeName = mfrc522.PICC_GetTypeName(piccType);
  
  Serial.println(typeName);
  
  // 日本語で詳細説明
  if (piccType == MFRC522::PICC_TYPE_MIFARE_MINI) {
    Serial.println("  → MIFARE Mini (320バイト)");
  }
  else if (piccType == MFRC522::PICC_TYPE_MIFARE_1K) {
    Serial.println("  → MIFARE Classic 1K (1KBメモリ)");
    Serial.println("  → 一般的なマンション入館証、社員証に使用");
  }
  else if (piccType == MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println("  → MIFARE Classic 4K (4KBメモリ)");
  }
  else if (piccType == MFRC522::PICC_TYPE_MIFARE_UL) {
    Serial.println("  → MIFARE Ultralight (64バイト)");
    Serial.println("  → 使い捨てチケット、簡易NFCタグに使用");
  }
  else if (piccType == MFRC522::PICC_TYPE_MIFARE_PLUS) {
    Serial.println("  → MIFARE Plus");
  }
  else if (piccType == MFRC522::PICC_TYPE_MIFARE_DESFIRE) {
    Serial.println("  → MIFARE DESFire (高セキュリティ)");
  }
  else if (piccType == MFRC522::PICC_TYPE_TNP3XXX) {
    Serial.println("  → TNP3xxx");
  }
  else if (piccType == MFRC522::PICC_TYPE_ISO_14443_4) {
    Serial.println("  → ISO/IEC 14443-4 準拠");
  }
  else if (piccType == MFRC522::PICC_TYPE_ISO_18092) {
    Serial.println("  → ISO/IEC 18092 (NFC)");
  }
  else {
    Serial.println("  → 不明なカードタイプ");
  }
}

// UIDを表示(カードの固有ID)
void printUID() {
  Serial.print("【UID】 ");
  
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    if (mfrc522.uid.uidByte[i] < 0x10) {
      Serial.print("0");
    }
    Serial.print(mfrc522.uid.uidByte[i], HEX);
    if (i < mfrc522.uid.size - 1) {
      Serial.print(":");
    }
  }
  Serial.println();
  
  Serial.print("  → UIDサイズ: ");
  Serial.print(mfrc522.uid.size);
  Serial.println(" バイト");
}

// カードの詳細情報を表示
void printCardDetails() {
  Serial.print("【SAK値】 0x");
  Serial.println(mfrc522.uid.sak, HEX);
  
  // 判定結果
  Serial.println("\n【判定結果】");
  
  MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
  
  if (piccType == MFRC522::PICC_TYPE_MIFARE_1K || 
      piccType == MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println("✅ このカードは読み書き可能です");
    Serial.println("✅ アクセス制御システムに使用できます");
    Serial.println("✅ データ保存が可能です");
  }
  else if (piccType == MFRC522::PICC_TYPE_MIFARE_UL) {
    Serial.println("✅ このカードは読み取り可能です");
    Serial.println("⚠️  メモリ容量が小さいです(64バイト)");
  }
  else if (piccType == MFRC522::PICC_TYPE_NOT_COMPLETE) {
    Serial.println("❌ カードタイプを完全に識別できませんでした");
    Serial.println("   もう一度かざしてみてください");
  }
  else if (piccType == MFRC522::PICC_TYPE_UNKNOWN) {
    Serial.println("❌ 不明なカードです");
    Serial.println("   125kHz帯のカードの可能性があります");
    Serial.println("   → MFRC-522では読み取れません");
  }
  else {
    Serial.println("✅ このカードは対応しています");
  }
  
  // 詳細情報をダンプ(デバッグ用)
  Serial.println("\n【詳細情報】");
  mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
}

 

⑤動作確認

シリアルモニタを開いて、付属のカードをリーダーにかざします

「カード検出!」と表示されれば成功です

 

シリアルモニタ出力例

✅ 成功した場合

【セルフテスト実行】
✅ セルフテスト: 成功
ファームウェアバージョン: 0x92 ✅ 正常

カードをリーダーに近づけてください...

❌ 失敗した場合

【セルフテスト実行】
❌ セルフテスト: 失敗
ファームウェアバージョン: 0xFF ❌ エラー

【トラブルシューティング】
1. 配線を確認してください...

うまくいかない場合のチェックポイント

・GNDが確実に接続されているか

・3.3Vで給電しているか(5Vはダメ)

・ブレッドボードの接触不良はないか

・ピン番号が合っているか

 

手持ちのカードをいろいろかざしてみると面白いですよ

意外なカードがMIFARE対応だったりします

 

次はボタン付きディスプレイと組み合わせて、タグをコピーできるシステムを組んでみようかと考えています

 

まとめ

MFRC-522は本当にコスパ最強のRFIDリーダーだと思います

 

付属カード込みで700円程度、ESP32と組み合わせれば

WiFi対応のスマートロックやアクセス管理システムが作れます

 

ただし、日本で主流のSuicaおサイフケータイFeliCa)は非対応なので

その点だけは注意してください

 

付属のS50カードで実験するには十分な性能があるので

RFID/NFCに興味がある方はぜひ試してみてください

 

ESP32-C3についてはこちらの記事でも紹介しています

techemo.hatenablog.com

 

今日も最後までお付き合いいただきありがとうございました。

私が買ってよかった商品はネットショップで販売できればと思っています。

似たようなものはAmazonでも購入できます。