RFID RC522の使い方:Arduinoでカードを読み取り、カード式ドアロックを作る
RC522 RFIDモジュールはどう動くのか。13.56 MHzのカードとキーホルダー型タグ、3.3 VでのSPI配線、MFRC522ライブラリ、UIDの読み取り、登録カードの判定、サーボ式ドアロック、ESP32とPicoでの使い方を解説します。
RFID(Radio Frequency IDentification)は、カードやキーホルダー型タグを、リーダーに触れずに電波で識別する技術です。交通系ICカード、オフィスの入館カード、お店の万引き防止タグ、ペットのマイクロチップは、どれもRFIDを使っています。RC522は13.56 MHzで動く安価なリーダーモジュールで、たいてい白いカードと青いキーホルダー型タグが付いて売られています。カード式ドアロックから出席管理システムまで、多くのプロジェクトの基本になっています。

RFIDはどう動く?
リーダー基板の銅のアンテナは、13.56 MHzの磁界を作ります。カードやキーホルダー型タグの中には薄いコイルと小さなチップがありますが、電池はありません。カードが磁界に近づくと、コイルに誘導されたエネルギーでチップが動き、チップは磁界をごくわずかに変化させることで、自分のIDとデータをリーダーに送り返します。そのため、カードは一度も充電せずに何年も使えますが、RC522での読み取り距離は約3〜5センチメートルしかありません。
キットに入っているカードは、たいていMIFARE Classic 1Kです。1 KBのメモリは16のセクターに分かれ、各セクターは16バイトのブロック4つでできています。どのカードにも工場で書き込まれたUID(固有のID)があり、ふつうは4バイトの長さです。簡単なプロジェクトの多くは、カードにデータを書き込むのではなく、このUIDを読み取ってカードを見分けます。
RC522の仕様
| 項目 | 値 |
|---|---|
| 動作周波数 | 13.56 MHz |
| 電源 | 3.3 V(5 Vではない) |
| 消費電流 | 13〜26 mA |
| 読み取り距離 | 約3〜5 cm(カードによる) |
| 対応カード | MIFARE Classic 1K/4K、Ultralight、NTAG(ISO 14443A) |
| インターフェース | SPI(チップはI2CとUARTにも対応) |
RC522の配線(SPI)
RC522はSPIでボードと通信します。SCK、MOSI、MISOピンは各ボードの決まったSPIピンにつなぐ必要がありますが、SDA(SS)とRSTはコードと合っていればどのデジタルピンでもかまいません。お使いのボードのSPIピンはピン配置ツールで確認できます。
| RC522のピン | Arduino Uno | Arduino Mega | ESP32 | Raspberry Pi Pico |
|---|---|---|---|---|
| SDA (SS) | D10 | 53 | GPIO 5 | GP17 |
| SCK | D13 | 52 | GPIO 18 | GP18 |
| MOSI | D11 | 51 | GPIO 23 | GP19 |
| MISO | D12 | 50 | GPIO 19 | GP16 |
| IRQ | 接続しない | 接続しない | 接続しない | 接続しない |
| GND | GND | GND | GND | GND |
| RST | D9 | 5 | GPIO 22 | GP20 |
| 3.3V | 3.3V | 3.3V | 3V3 | 3V3 |
MFRC522ライブラリとカードのUIDの読み取り
ライブラリマネージャでMFRC522を検索し、GithubCommunity(miguelbalboa)作のライブラリをインストールします。下のコードは、読み取ったカードのUIDを16進数(HEX)でシリアルモニタに表示します。
1#include <SPI.h>
2#include <MFRC522.h>
3
4const int SS_PIN = 10;
5const int RST_PIN = 9;
6
7MFRC522 rfid(SS_PIN, RST_PIN);
8
9void setup() {
10 Serial.begin(9600);
11 SPI.begin();
12 rfid.PCD_Init();
13 Serial.println("Kartı okutun / scan a card");
14}
15
16void loop() {
17 if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) return; // kart yok / no card
18
19 Serial.print("UID:");
20 for (byte i = 0; i < rfid.uid.size; i++) {
21 Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
22 Serial.print(rfid.uid.uidByte[i], HEX);
23 }
24 Serial.println();
25
26 rfid.PICC_HaltA(); // kartı beklemeye al / halt the card
27 rfid.PCD_StopCrypto1();
28}登録カードかどうかを判定する
読み取ったUIDを保存しておいた値と比べれば、そのカードが登録済みかどうかを判定できます。下の例では1枚の登録カードを確認しています。複数のカードを扱うなら、配列を2次元にしてループで比較するだけです。
1// yukarıdaki tanımlar ve setup() aynen / definitions and setup() as above
2byte allowed[4] = {0xDE, 0xAD, 0xBE, 0xEF}; // kendi kartının UID'si / your card's UID
3
4bool isAllowed() {
5 if (rfid.uid.size != 4) return false;
6 for (byte i = 0; i < 4; i++) {
7 if (rfid.uid.uidByte[i] != allowed[i]) return false;
8 }
9 return true;
10}
11
12void loop() {
13 if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) return;
14 Serial.println(isAllowed() ? "İzin verildi / access granted" : "Reddedildi / access denied");
15 rfid.PICC_HaltA();
16 rfid.PCD_StopCrypto1();
17}サーボで動くカード式ドアロック
登録カードをかざすとサーボを90度回して3秒間開き、登録されていないカードではブザーで短い警告音を鳴らすロックを作ってみましょう。サーボの配線はサーボモーターとは?、警告音はブザーとは?を参照してください。UnoではServoライブラリがTimer1を、tone()がTimer2を使うので、2つは問題なく一緒に動きます。
1#include <SPI.h>
2#include <MFRC522.h>
3#include <Servo.h>
4
5MFRC522 rfid(10, 9); // SS, RST
6Servo lock;
7const int BUZZER_PIN = 8;
8byte allowed[4] = {0xDE, 0xAD, 0xBE, 0xEF};
9
10void setup() {
11 SPI.begin();
12 rfid.PCD_Init();
13 lock.attach(6);
14 lock.write(0); // kilitli / locked
15}
16
17void loop() {
18 if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) return;
19 bool ok = rfid.uid.size == 4 && memcmp(rfid.uid.uidByte, allowed, 4) == 0;
20 if (ok) {
21 lock.write(90); // kilidi aç / unlock
22 delay(3000);
23 lock.write(0); // tekrar kilitle / lock again
24 } else {
25 tone(BUZZER_PIN, 400, 600); // reddedildi sesi / denied beep
26 }
27 rfid.PICC_HaltA();
28 rfid.PCD_StopCrypto1();
29}ESP32とRaspberry Pi PicoでRC522を使う
ESP32でも同じMFRC522ライブラリが動きます。VSPIのピンを使い、オブジェクトをMFRC522 rfid(5, 22);と宣言してください。ESP32は3.3 Vで動くのでRC522とぴったり合い、Wi-Fiのおかげで読み取ったカードをインターネットに記録することもできます。MicroPythonを使うPicoでは、mfrc522.pyファイル(たとえばdanjperron氏のライブラリ)をPicoにコピーし、次のように使います。
1from mfrc522 import MFRC522 # mfrc522.py Pico'da olmalı / mfrc522.py must be on the Pico
2import time
3
4reader = MFRC522(spi_id=0, sck=18, miso=16, mosi=19, cs=17, rst=20)
5
6while True:
7 reader.init()
8 stat, tag_type = reader.request(reader.REQIDL)
9 if stat == reader.OK:
10 stat, uid = reader.SelectTagSN()
11 if stat == reader.OK:
12 print("UID:", "".join("{:02X}".format(b) for b in uid))
13 time.sleep_ms(200)RFIDの種類:RC522が読めるカードは?
| 種類 | 周波数 | 読み取り距離 | 主な用途 |
|---|---|---|---|
| LF RFID | 125 kHz | 約10 cm | 古い入館カード、ペットのマイクロチップ(EM4100) |
| HF RFID / NFC | 13.56 MHz | 1〜10 cm | 交通系ICカード、MIFARE、スマホのNFC |
| UHF RFID | 860〜960 MHz | 数メートル | 倉庫、物流、小売のタグ |
RC522が読めるのは13.56 MHzのHFカードだけです。多くの建物の入口で使われている125 kHzのカード(「EM」と書かれていることが多い)は、RC522では読めません。読むにはRDM6300のような125 kHzのリーダーが必要です。NFCはスマホで読める13.56 MHzのRFIDの一種で、RC522はNTAGシールのUIDを読み取れます。
RFIDのプロジェクトアイデア
- カード式のドアや引き出しのロック:登録カードで開き、登録されていないカードでは警告するロックです。
- 出席管理システム:カードごとに名前を割り当て、到着時刻をSDカードやインターネットに記録します。
- ウェルカム表示:カードをかざすとLCDに「Welcome」とその人の名前を表示します。ディスプレイについてはI2C LCDディスプレイの使い方を参照してください。
- おはなしボックス:カードごとに別の音声ファイルを割り当て、DFPlayerで子ども向けの音のおもちゃを作ります。
- スマート給餌器:ペットの首輪のタグを読み取ったらエサを出します。
- カードゲーム:カードを使ったクイズや神経衰弱のゲームを作ります。
よくあるミスと直し方
- カードがまったく読めず、バージョンが0x0と表示される:SPIの線が違うピンにつながっています。とくにMOSIとMISOを確認してください。
- モジュールを5Vにつないでいる:RC522は3.3 Vで動きます。5 Vで壊れることがあります。
- 125 kHzのカードを読もうとしている:RC522にはこれらのカードが見えません。13.56 MHzのカードを使ってください。
- カードが遠すぎる、または金属の上にある:カードを1〜3 cm以内に近づけてください。金属の面は磁界を乱します。
- 同じカードが何度も読み取られる:PICC_HaltA()を呼んでいません。読み取り後にカードを停止させてください。
- 配線が長い:SPIの信号は長い線では劣化します。20 cm未満に収めてください。
RFIDは「これは誰?」という問いにかざすだけで答えてくれるので、セキュリティや自動化のプロジェクトに大きな価値を加えます。BlueGraysアプリには、RFIDの値の読み取り、LCD付きカードリーダー、サーボ式RFIDドアロックのプロジェクトが回路図とコード付きでステップごとに載っています。
よくある質問
RC522はどのくらいの距離からカードを読めますか?
キットに入っているカードやキーホルダー型タグなら、たいてい3〜5 cmから読み取れます。カードの種類、アンテナの大きさ、近くの金属がすべて距離に影響します。もっと長い距離には、違う周波数で動くUHFリーダーが必要です。
RC522はどのカードを読めますか?125 kHzのカードは読めますか?
RC522が読めるのは、MIFARE Classic 1K/4K、Ultralight、NTAGタグのような13.56 MHzのISO 14443Aカードだけです。建物の入口でよく使われる125 kHzのEMカードは読めません。それらにはRDM6300のような125 kHzのリーダーを使います。
RC522は5Vで動きますか?
いいえ、RC522は3.3 Vから給電する必要があります。5Vピンにつなぐとモジュールが壊れることがあります。データピンはたいていUnoの5 Vの信号に耐えますが、チップは公式には5 V耐性がないので、常設のプロジェクトではレベル変換モジュールをおすすめします。
カードのUIDは変わったり、コピーされたりしますか?
ふつうのカードのUIDは工場で書き込まれていて変わりません。ただし、UIDを書き換えられる「マジック」カードがあり、MIFARE ClassicのUIDはそこにコピーできます。そのため、UIDだけを信用するシステムは本当のセキュリティにはなりません。
RC522でカードにデータを書き込めますか?
はい。MIFARE Classicのカードでは各セクターが鍵で守られていて、新品のカードの初期の鍵はFF FF FF FF FF FFです。MFRC522ライブラリのReadAndWriteの例を使えば、ブロックにデータを書き込んで読み戻せます。各セクターの最後のブロックには鍵が入っているので、そこにでたらめなデータを書き込まないでください。
スマホをRC522用のカードとして使えますか?
たいていは確実には使えません。iPhoneはカードエミュレーションにNFCを開放しておらず、Androidのスマホはかざすたびに変わるランダムなUIDを送ります。スマホを使うシステムなら、スマホでNFCタグを読み取り、その結果をWi-FiやBluetoothでボードに送るほうがよいでしょう。
この記事を読んだ後に作れるプロジェクト
全プロジェクトを見る
RFIDの値の読み取り
建物のキーフォブや入館カードには、見えない識別番号が保存されています。このプロジェクトでは、その番号を読み取ります。カードをRFIDリーダーに近づけると、Arduinoがカードの番号をコンピューターの画面に表示します。カード式のドアや錠のプロジェクトで、どのカードに解錠を許可するかを決めるための第一歩です。

ESP32 RFID RC522カードリーダー(LCD付き)
このプロジェクトでは、MFRC522を搭載したRC522 RFIDモジュールをSPIでESP32に接続し、カードやタグのUIDを読み取ります。ドアロック、会員システム、入退室管理などの基礎となる仕組みです。読み取ったUIDはLCDディスプレイに表示します。このバージョンでは、許可されたカードのリストとの照合は行いません。注意:RC522は3.3V専用です。5Vを供給するとモジュールが焼損します!

ESP32のRFIDドアロック(RC522 + サーボモーター + OLED + ブザー + LED)
ESP32、RC522 RFIDモジュール、SG90サーボモーター、SSD1306 OLEDディスプレイ、アクティブブザー、LED2個を使ってスマートドアロックを作ります。カードを読み取ると、UIDをコード内に登録した許可済みカードの一覧と照合します。許可されたカードなら、サーボモーターを回して解錠し、緑色のLEDが点灯して短い音が2回鳴ります。5秒後に自動で施錠します。許可されていないカードでは赤色のLEDが点灯し、短い間隔で3回音を鳴らして警告し、読み取ったUIDをOLEDに表示します。実際のIoTセキュリティの仕組みを実践的に学べます。

スマート電子金庫
貴重品を保管できる、暗証番号で開く小さな金庫です。キーパッドで4桁の暗証番号を入力すると、正しければサーボモーターが解錠し、緑色のLEDが点灯してディスプレイに金庫の状態が表示されます。キーを押すたびにブザーが短く鳴ります。3回間違えると30秒間ロックアウトされます。暗証番号はいつでも変更でき、電源が切れても保持されます。

4x4キーパッドとLCDで暗証番号ロック
正しい暗証番号を知らないと開けられない、小さな電子ドアロックです。ハッシュキーを押してキーパッドから暗証番号を入力します。正しければ画面に入室許可が表示され、緑のLEDが点灯し、サーボモーターがドアを5秒間開けてから再び閉めます。間違っていれば赤のLEDが点灯します。建物や金庫のロックの仕組みを自分で作ります。

ESP32動体検知アラーム(PIR + ブザー + LED + Telegram)
PIRセンサーが動きを検知するとブザーとLEDを作動させ、同時にTelegramで持ち主に即座に通知するスマート防犯アラームです。アラームが繰り返される頻度を抑えるため、30秒のクールダウン(待ち時間)を設けています。この仕組みはPIRの検知が正しいかを確認したり、誤検知をなくしたりするものではありません。家の防犯、ガレージの監視、倉庫や作業部屋などに使えます。ESP32-CAMなら写真付きの通知を追加でき、通常のESP32 DevKit V1ではテキストで通知します。

ESP32 I2C LCDディスプレイ(16x2)
このプロジェクトでは、16x2文字のLCDをI2CでESP32に接続して文字を表示します。I2Cならデータ用の2本のピン(SDAとSCL)だけで制御でき、従来のパラレル接続のように6本以上のピンを使わずに済みます。コードでは1行目に固定メッセージ、2行目に毎秒増えるカウンターを表示します。また、起動時にI2Cスキャナーを実行し、ディスプレイのアドレス(通常は0x27または0x3F)をシリアルモニタに表示します。
ほかの記事
BlueGraysアプリ
この回路をスマホでステップごとに作る
回路図、コード、部品リストを1つの画面で確認できます。Arduino、ESP32、Picoのプロジェクトを200件以上用意しています。

