Basic Tutorial for Arduino, 感測器 Sensor, 進階篇

【Arduino 進階教學】RFID-RC522 模組刷卡實作:SPI 接線、MFRC522 程式庫與卡片 UID 解析

在智慧居家、感應門禁與考勤打卡系統中,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 核心規格與特點:

  1. 工作頻率: 13.56 MHz 高頻段。

  2. 通訊介面: 支援 SPI(預設且最常用)、I2C 與 UART 通訊。

  3. 工作電壓: 3.3V(注意:VCC 切勿連接至 5V!)。

  4. 感應距離: 約 0 ~ 5 cm(視天線尺寸與卡片品質而定)。

  5. 雙向無源感應: 感應卡(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 程式學習爆款套件組(包含豐富驅動專案模組)

爆款推薦:程式學習套件組 

購買網址:shop.mirotek.com.tw

 

 

硬體電路接線說明(SPI 介面)

RC522 模組採用標準 SPI(Serial Peripheral Interface) 通訊。在 Arduino Uno 上,SPI 介面對應固定腳位(D11/D12/D13),而 SS(SDA)與 RST 則可在程式中彈性自訂。

RC522 腳位 功能描述 Arduino Uno 接線位置 備註 / 說明
VCC 電源輸入 3.3V ⚠️ 嚴禁接 5V,否則會燒毀 RC522!
RST 復位 (Reset) A0(或 D9) 可在程式中更改
GND 接地 GND 電源接地
IRQ 中斷腳位 懸空不接 一般專案不需使用
MISO 主入從出 Digital Pin 12 Arduino 固定 SPI MISO 腳位
MOSI 主出從入 Digital Pin 11 Arduino 固定 SPI MOSI 腳位
SCK 時脈訊號 Digital Pin 13 Arduino 固定 SPI SCK 腳位
SDA (SS) 片選 (Chip Select) Digital Pin 10 可在程式中更改

Arduino IDE 程式庫安裝

使用 RC522 模組需要安裝官方推薦的 MFRC522 程式庫。

  1. 開啟 Arduino IDE,點選上方選單 草稿碼 (Sketch) 匯入程式庫 (Include Library) 管理程式庫 (Manage Libraries…)。

  2. 在右上方搜尋欄輸入 MFRC522。

  3. 找到由 github-community (Miguel Balboa) 維護的 MFRC522 程式庫。

  4. 點擊 安裝(建議選擇最新穩定版本請選擇「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));
}

程式碼重點剖析

  1. #include <SPI.h> & #include <MFRC522.h>:引用 Arduino 標準 SPI 庫與 MFRC522 驅動程式庫。

  2. MFRC522 mfrc522(SS_PIN, RST_PIN):傳入自訂的 SS (Pin 10) 與 RST (Pin A0) 腳位建立物件。

  3. mfrc522.PCD_Init():初始化 RC522 讀卡機晶片。

  4. mfrc522.PICC_IsNewCardPresent():檢查感應區內是否有新的 RFID 卡片(PICC)。

  5. mfrc522.PICC_ReadCardSerial():讀取卡片序列號,確認通訊成功。

  6. mfrc522.PICC_DumpToSerial(&(mfrc522.uid)):一鍵將卡片完整資訊(包含 16 個扇區的所有 Block 資料與 UID)印出至 Serial Monitor,並自動執行休眠指令。

成果驗證與測試

  1. 將 RC522 正確接線至 Arduino Uno 並上傳程式。

  2. 開啟 序列埠監控視窗(Serial Monitor),並將鮑率調整為 9600 baud。

  3. 將原廠隨附的 白卡 或 藍色感應鑰匙扣 靠攏 RC522 天線區。

  4. 序列埠視窗將顯示類似以下的讀取結果:

▼ 下載程序完成後,將白卡靠近RFID-RC522模組,序列埠監視器將打印出白卡的所有資訊(Card UID、type、Sector Block …等等)

 

常見問題與除錯指南(FAQ)

Q1:為什麼卡片靠近時完全沒有反應?

  1. 電壓接錯: 請務必確認 RC522 的 VCC 是接到 3.3V,接 5V 容易導致晶片燒毀或異常。

  2. SPI 接線錯誤: 請確認 MISO (12)、MOSI (11)、SCK (13) 是否接對。Arduino 的 SPI 腳位是固定的,不可任意更換。

  3. 焊接接觸不良: RC522 排針若沒有焊好(或只靠插拔接觸),容易因為接觸不良導致 SPI 通訊失敗。

Q2:如何實現「特定卡片開鎖(門禁驗證)」?

只要在程式中比對讀取到的 mfrc522.uid.uidByte 是否與預先授權的 UID 陣列(如 {0x83, 0xA1, 0x2B, 0x4C})完全吻合,即可透過 GPIO 觸發繼電器(Relay)解鎖電磁鎖或控制伺服馬達(Servo)開門!

延伸學習與推薦教學