部品 · 読了まで6分

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で動く安価なリーダーモジュールで、たいてい白いカードと青いキーホルダー型タグが付いて売られています。カード式ドアロックから出席管理システムまで、多くのプロジェクトの基本になっています。

RC522 RFIDリーダーモジュール
RC522 RFIDモジュール:基板上の銅のパターンがリーダーのアンテナです。横にあるのは読み取りできるカードとキーホルダー型タグです。

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 UnoArduino MegaESP32Raspberry Pi Pico
SDA (SS)D1053GPIO 5GP17
SCKD1352GPIO 18GP18
MOSID1151GPIO 23GP19
MISOD1250GPIO 19GP16
IRQ接続しない接続しない接続しない接続しない
GNDGNDGNDGNDGND
RSTD95GPIO 22GP20
3.3V3.3V3.3V3V33V3
RC522を5Vピンにつながないでください。モジュールは3.3 Vで動き、5 Vをかけると永久に壊れることがあります。Unoの5 Vのデータピンに直接つなぐ人も多く、たいていは動きますが、チップは公式には5 V耐性がありません。長時間動かすプロジェクトではレベル変換モジュールを使うほうが安全です。ESP32やPicoはもともと3.3 Vで動くので、この問題はありません。

MFRC522ライブラリとカードのUIDの読み取り

ライブラリマネージャでMFRC522を検索し、GithubCommunity(miguelbalboa)作のライブラリをインストールします。下のコードは、読み取ったカードのUIDを16進数(HEX)でシリアルモニタに表示します。

C++ (Arduino IDE)
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をメモしておきましょう。次のステップで「登録カード」として使います。カードが読み取れない場合は、「ファイル」>「スケッチ例」>「MFRC522」>「DumpInfo」を書き込んでください。シリアルモニタに「Firmware Version: 0x0」や「0xFF」と表示されたら、問題は配線です。

登録カードかどうかを判定する

読み取ったUIDを保存しておいた値と比べれば、そのカードが登録済みかどうかを判定できます。下の例では1枚の登録カードを確認しています。複数のカードを扱うなら、配列を2次元にしてループで比較するだけです。

C++ (Arduino IDE)
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つは問題なく一緒に動きます。

C++ (Arduino IDE)
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}
UIDだけを確認するロックは学習や趣味のプロジェクトには十分ですが、本当のセキュリティにはなりません。MIFARE ClassicのUIDは安価な機器でコピーできるからです。実際のドアに使うなら、カードに加えて暗証番号も求めるか、暗号化されたセクターに保存した情報を検証してください。

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にコピーし、次のように使います。

Python
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 RFID125 kHz約10 cm古い入館カード、ペットのマイクロチップ(EM4100)
HF RFID / NFC13.56 MHz1〜10 cm交通系ICカード、MIFARE、スマホのNFC
UHF RFID860〜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の値の読み取り
#53初級
プレミアム

RFIDの値の読み取り

建物のキーフォブや入館カードには、見えない識別番号が保存されています。このプロジェクトでは、その番号を読み取ります。カードをRFIDリーダーに近づけると、Arduinoがカードの番号をコンピューターの画面に表示します。カード式のドアや錠のプロジェクトで、どのカードに解錠を許可するかを決めるための第一歩です。

4.7(47)
61
ESP32 RFID RC522カードリーダー(LCD付き)
#123中級

ESP32 RFID RC522カードリーダー(LCD付き)

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

4.8(21)
39
ESP32のRFIDドアロック(RC522 + サーボモーター + OLED + ブザー + LED)
#137上級
プレミアム

ESP32のRFIDドアロック(RC522 + サーボモーター + OLED + ブザー + LED)

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

4.8(9)
15
スマート電子金庫
#92上級
プレミアム

スマート電子金庫

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

4.7(42)
63
4x4キーパッドとLCDで暗証番号ロック
#64上級
プレミアム

4x4キーパッドとLCDで暗証番号ロック

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

4.8(59)
75
ESP32動体検知アラーム(PIR + ブザー + LED + Telegram)
#145上級
プレミアム

ESP32動体検知アラーム(PIR + ブザー + LED + Telegram)

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

0.0(0)
9
ESP32 I2C LCDディスプレイ(16x2)
#119中級
プレミアム

ESP32 I2C LCDディスプレイ(16x2)

このプロジェクトでは、16x2文字のLCDをI2CでESP32に接続して文字を表示します。I2Cならデータ用の2本のピン(SDAとSCL)だけで制御でき、従来のパラレル接続のように6本以上のピンを使わずに済みます。コードでは1行目に固定メッセージ、2行目に毎秒増えるカウンターを表示します。また、起動時にI2Cスキャナーを実行し、ディスプレイのアドレス(通常は0x27または0x3F)をシリアルモニタに表示します。

4.9(23)
40