319記事目(中国輸入品シリーズ)
こんばんは。いつも読んでいただきありがとうございます。
趣味で中国から面白そう・便利そうな商品を輸入して使ってみています。techemoです。
今日は最近購入したMFRC-522 RFIDキット(リーダー/ライターモジュール、タグ、カードセット)の紹介です。

ICカードをかざすだけで認証できるシステムを自作したいと思い購入しました。
なんと付属のカードとキーホルダーもついて700円程度という驚きの価格!
ESP32-C3と組み合わせれば、WiFi対応のスマートロックだって作れちゃいます。
特徴は
・非接触でカード読み取り
13.56MHz帯のRFID/NFCカードを約3〜5cmの距離で読み書きできます
タッチするだけで認証完了、まさにSuicaのような操作感!
・読み取りだけでなく書き込みも可能
カードのUID読み取りはもちろん、データの書き込みもできます
独自の会員カードや入退室管理システムが作れます
・付属品が充実
S50カード(MIFARE Classic 1K互換)とキーホルダータグが付属
届いたその日からすぐに実験できます
・とにかく安い(700円程度)
付属カード込みでこの価格は破格!
同等品を日本で買うと1000円以上することも
・Arduino/ESP32との連携が簡単
SPI通信で接続、専用ライブラリも充実
サンプルコードも豊富で初心者でも扱いやすい
・はんだ付けが必要
ピンヘッダが別で付属しているのではんだ付けしてから使います
技術仕様
動作電圧: 3.3V(5Vは使わないこと!)
動作周波数: 13.56MHz
対応カード: MIFARE Classic (S50/1K, S70/4K)、MIFARE Ultralight
通信方式: SPI(最大10Mbit/s)
読み取り距離: 約3〜5cm
データ転送速度: 106 kbit/s
動作温度: -20〜80℃
⚡ 通信仕様まとめ
使い道は
私は主にESP32-C3と組み合わせて、カード認証システムの実験に使ってみたいと考えています
他にもいろんな使い道が想定されます
・DIYスマートロック
ESP32とリレーを組み合わせれば、カードをかざすだけで開くドアロックが作れます
WiFi経由でログ記録やリモート解錠も可能!
・出退勤・勤怠管理システム
社員証をかざすだけで打刻完了
Google スプレッドシートと連携すれば自動記録も
・PCのログイン認証
パスワード入力の代わりにカードタッチでログイン
セキュリティと利便性の両立
・子供のお小遣い管理
ポイントカード風のシステムを自作
お手伝いするとポイント付与、なんて使い方も
・IRリモコンやセンサーとの連携
以前紹介したIRリモコンやリレーモジュールと組み合わせれば
「カードをかざすとエアコンON」なんてこともできます
読み取れるカード・読み取れないカード
ここが一番重要なポイントです!
MFRC-522は13.56MHz帯のMIFARE規格専用なので、読めるカードと読めないカードがあります
📋 カード対応早見表
✅ 読み取り可能
なぜSuicaが読めないの?
Suicaなどの交通系ICは同じ13.56MHzでも「FeliCa」という別規格です
MFRC-522は「MIFARE(NFC Type A)」専用なので互換性がありません
FeliCaを読みたい場合は、Sony製のRC-S380などの専用リーダーが必要です
⚠️ 日本特有の注意点
配線図
ESP32-C3との接続は以下の通りです
重要:必ず3.3Vで接続してください!5Vを繋ぐと壊れます
🔌 ESP32-C3 との接続(SPI通信)
⚠️ 絶対に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カードで実験するには十分な性能があるので
ESP32-C3についてはこちらの記事でも紹介しています
今日も最後までお付き合いいただきありがとうございました。
私が買ってよかった商品はネットショップで販売できればと思っています。
似たようなものはAmazonでも購入できます。




























