在智慧居家、感應門禁與考勤打卡系統中,RFID(Radio Frequency Identification,無線射頻識別) 是應用最廣泛的無線通訊技術之一。
RC522 是基於 NXP 晶片開發的 13.56MHz 高頻 RFID 讀寫模組,具備低成本、高靈敏度與低功耗的優勢。本篇文章將手把手帶你了解 RFID 的工作原理,並教你如何使用 Arduino 搭配 SPI 介面讀取 RFID 卡片的獨一無二識別碼(UID)與記憶體資料!
什麼是 RFID-RC522 模組?
RFID-RC522 是一款專門用於 13.56MHz 無線通訊的感應讀卡模組,支援 ISO/IEC 14443A 協定(如常見的 Mifare1 S50、Mifare1 S70、Mifare UltraLight 等感應卡與白卡)。
RFID-RC522 核心規格與特點:
-
工作頻率: 13.56 MHz 高頻段。
-
通訊介面: 支援 SPI(預設且最常用)、I2C 與 UART 通訊。
-
工作電壓: 3.3V(注意:VCC 切勿連接至 5V!)。
-
感應距離: 約 0 ~ 5 cm(視天線尺寸與卡片品質而定)。
-
雙向無源感應: 感應卡(Tag)內部無需電池,當進入 RC522 的電磁場時,會透過感應線圈獲得微弱電能並回傳資料。
RFID 卡片內部構造與 UID 概念
市面上最常見的 Mifare S50 白卡與藍色鑰匙扣(Keyfob) 內部包含:
-
獨一無二序號(Card UID): 每張 RFID 卡片在出廠時,晶片內皆燒錄了一個獨一無二的硬體 ID(通常為 4 位元組或 7 位元組十六進位碼),這是門禁系統用於識別使用者身份的核心依據。
-
1KB EEPROM 記憶體空間: Mifare S50 劃分為 16 個扇區(Sectors),每個扇區包含 4 個區塊(Blocks),可用於儲存儲值金額、卡片密碼或個人資料。
實驗所需硬體材料
進行本實作前,請先準備以下電子零件(點擊連結可直接前往商城選購):
-
Arduino Uno R3 開發板 x 1
-
USB 數據傳輸線 x 1
-
RFID-RC522 讀卡模組 x 1(通常附贈一張 Mifare 白卡與一個藍色感應鑰匙扣)
-
麵包板與杜邦跳線若干
準備好你的硬體工具了嗎? 推薦選購:米羅科技 – Arduino 程式學習爆款套件組(包含豐富驅動專案模組)
硬體電路接線說明(SPI 介面)
RC522 模組採用標準 SPI(Serial Peripheral Interface) 通訊。在 Arduino Uno 上,SPI 介面對應固定腳位(D11/D12/D13),而 SS(SDA)與 RST 則可在程式中彈性自訂。
Arduino IDE 程式庫安裝
使用 RC522 模組需要安裝官方推薦的 MFRC522 程式庫。
-
開啟 Arduino IDE,點選上方選單 草稿碼 (Sketch) 匯入程式庫 (Include Library) 管理程式庫 (Manage Libraries…)。
-
在右上方搜尋欄輸入
MFRC522。 -
找到由 github-community (Miguel Balboa) 維護的
MFRC522程式庫。 -
點擊 安裝(建議選擇最新穩定版本請選擇「1.3.6版本」),該項目右下角會出現「安裝」鈕,按「安裝」鈕開始安裝。

完整 Arduino 程式碼範例:讀取卡片 UID 與詳細資料
本程式將初始化 SPI 匯流排與 RC522 模組。當白卡或感應鑰匙扣靠近時,序列埠視窗將印出卡片 UID、卡片類型以及記憶體區塊傾印資料(Dump Info)。
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN A0 // Configurable, see typical pin layout above
#define SS_PIN 10 // Configurable, see typical pin layout above
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance
void setup() {
Serial.begin(9600); // Initialize serial communications with the PC
while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522
delay(4); // Optional delay. Some board do need more time after init to be ready, see Readme
Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks..."));
}
void loop() {
// Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
// Dump debug info about the card; PICC_HaltA() is automatically called
mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
}
程式碼重點剖析
-
#include <SPI.h>&#include <MFRC522.h>:引用 Arduino 標準 SPI 庫與 MFRC522 驅動程式庫。 -
MFRC522 mfrc522(SS_PIN, RST_PIN):傳入自訂的 SS (Pin 10) 與 RST (Pin A0) 腳位建立物件。 -
mfrc522.PCD_Init():初始化 RC522 讀卡機晶片。 -
mfrc522.PICC_IsNewCardPresent():檢查感應區內是否有新的 RFID 卡片(PICC)。 -
mfrc522.PICC_ReadCardSerial():讀取卡片序列號,確認通訊成功。 -
mfrc522.PICC_DumpToSerial(&(mfrc522.uid)):一鍵將卡片完整資訊(包含 16 個扇區的所有 Block 資料與 UID)印出至 Serial Monitor,並自動執行休眠指令。
成果驗證與測試
-
將 RC522 正確接線至 Arduino Uno 並上傳程式。
-
開啟 序列埠監控視窗(Serial Monitor),並將鮑率調整為 9600 baud。
-
將原廠隨附的 白卡 或 藍色感應鑰匙扣 靠攏 RC522 天線區。
-
序列埠視窗將顯示類似以下的讀取結果:
▼ 下載程序完成後,將白卡靠近RFID-RC522模組,序列埠監視器將打印出白卡的所有資訊(Card UID、type、Sector Block …等等)

常見問題與除錯指南(FAQ)
Q1:為什麼卡片靠近時完全沒有反應?
-
電壓接錯: 請務必確認 RC522 的 VCC 是接到 3.3V,接 5V 容易導致晶片燒毀或異常。
-
SPI 接線錯誤: 請確認 MISO (12)、MOSI (11)、SCK (13) 是否接對。Arduino 的 SPI 腳位是固定的,不可任意更換。
-
焊接接觸不良: RC522 排針若沒有焊好(或只靠插拔接觸),容易因為接觸不良導致 SPI 通訊失敗。
Q2:如何實現「特定卡片開鎖(門禁驗證)」?
只要在程式中比對讀取到的 mfrc522.uid.uidByte 是否與預先授權的 UID 陣列(如 {0x83, 0xA1, 0x2B, 0x4C})完全吻合,即可透過 GPIO 觸發繼電器(Relay)解鎖電磁鎖或控制伺服馬達(Servo)開門!
延伸學習與推薦教學