RC522 RFID/NFC 读卡模块
| 器材 | 数量 | 参考 |
|---|---|---|
| RC522 RFID 模块(含白卡+钥匙扣) | 1 | — |
价格随渠道波动,以购买页实时为准。
想给工作室做个刷卡开门:每个人发一张卡,往门口一贴门就开,谁来过、几点来的还能记下来当考勤。不想自己造轮子去算射频协议,只想要一颗"卡一靠近就把卡号读出来"的现成件——RC522 就是这件事最便宜、资料最多的入门选择。一个模块通常配一张白卡、一个钥匙扣卡,十几块钱,插上 SPI 就能开始刷。
RC522 用的是恩智浦(NXP)的 MFRC522 芯片,工作在 13.56MHz 频段,专门读这个频段的 IC 卡(最常见的就是 Mifare 系列:公交卡、门禁卡、酒店房卡那一类)。它最常用、最简单的功能,就是读出每张卡独一无二的 UID(卡号),拿这个卡号去比对名单,就能判断"这是谁、放不放行"。
工作原理
刷卡这件事,本质是读卡器和卡片之间一次无线对话,全过程没有电池:
- 读卡器发射电磁场:RC522 板上那圈方形铜线就是天线,通电后以 13.56MHz 的频率持续往外发射交变电磁场。
- 卡片被激活(无源取电):门禁卡里其实也有一圈线圈和一颗小芯片,但卡里没有电池。当卡靠近读卡器(几厘米内),卡片线圈被电磁场感应出电流——这就是"无源取电",靠的就是读卡器发出的那个电磁场给卡供电,卡芯片这才被唤醒。
- 卡片回传数据(负载调制):醒来的卡芯片把存在里面的数据(首先是 UID)发回去。它的发法很巧妙:不是自己发射信号,而是通过改变自己线圈对电磁场的"吸收量"(负载调制),让读卡器侧检测到电磁场的细微强弱变化,从而解出卡传回来的 0 和 1。
- 读卡器解码:RC522 把这串变化还原成数据,UID 等内容就拿到了。
这套机制叫 RFID(射频识别)。卡不用电、不用接触、隔着钱包就能读,靠的全是"读卡器供电 + 卡片反射回传"这一来一回。读 UID 是其中最轻量的一步,不需要任何密钥,卡一进场就能拿到。
接线
RC522 走 SPI 接口,线比 I2C 多——除了电源地,还有 SCK/MOSI/MISO 三根数据线加一根片选 SDA(SS) 和一根复位 RST。模块标的 SDA 脚在 SPI 里其实是片选 SS:
| RC522 | ESP32(VSPI 默认) | 说明 |
|---|---|---|
| 3.3V | 3.3V | 只能 3.3V,绝不接 5V |
| GND | GND | 公共地 |
| SDA(SS) | GPIO5 | 片选,选中这颗芯片 |
| SCK | GPIO18 | SPI 时钟 |
| MOSI | GPIO23 | 主机发给模块 |
| MISO | GPIO19 | 模块发回主机 |
| RST | GPIO22 | 复位脚,给个普通 GPIO 即可 |
| IRQ | 不接 | 中断输出,一般用不到 |
ESP32 默认的硬件 SPI(VSPI)就是 SCK=18 / MISO=19 / MOSI=23 / SS=5 这组,照这个接最省事。SPI 五六根线很容易接错一根,接完务必逐根核对,尤其别把 MOSI 和 MISO 调反。想搞懂 SPI 这几根线各自干什么、为什么要片选,参考 /principle/digital-analog/。
VCC 只能接 3.3V,接 5V 会烧芯片:MFRC522 是 3.3V 器件,模块上也没有 5V 转 3.3V 的稳压。很多人按超声波、继电器那种"5V 随便接"的习惯把它怼到 5V,结果一上电芯片就废。注意 RC522 的电源脚和 Arduino UNO 的 5V 是天生不兼容的——UNO 上要用 3.3V 脚供电,逻辑电平的事见 /principle/level-shift/。
完整代码
用社区最流行的 MFRC522 库(Arduino 库管理器搜 "MFRC522" by GithubCommunity,即 miguelbalboa/rfid)。下面这段开机初始化,循环里检测有没有卡、有就把 UID 以十六进制打印出来:
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 5 // SDA/SS 片选
#define RST_PIN 22 // 复位脚
MFRC522 rfid(SS_PIN, RST_PIN);
void setup() {
Serial.begin(115200);
SPI.begin(); // ESP32 默认 SCK18/MISO19/MOSI23
rfid.PCD_Init(); // 初始化 RC522
Serial.println("把卡贴近模块试试……");
}
void loop() {
// 没有新卡就直接返回,省得空转
if (!rfid.PICC_IsNewCardPresent()) return;
// 读不到卡的序列号也返回
if (!rfid.PICC_ReadCardSerial()) return;
Serial.print("卡 UID: ");
for (byte i = 0; i < rfid.uid.size; i++) {
if (rfid.uid.uidByte[i] < 0x10) Serial.print("0"); // 补前导零
Serial.print(rfid.uid.uidByte[i], HEX); // 十六进制打印
Serial.print(" ");
}
Serial.println();
rfid.PICC_HaltA(); // 让卡休眠,避免同一张卡被反复读
}
PICC_IsNewCardPresent() 检测电磁场里有没有进来一张卡,PICC_ReadCardSerial() 把这张卡的 UID 读进 rfid.uid 结构里。uid.uidByte[] 就是卡号的每一个字节,uid.size 是字节数(Mifare Classic 通常 4 字节)。最后 PICC_HaltA() 让卡进入休眠,否则同一张卡贴着不动会被一秒钟读上百次。
你应该看到什么
打开串口监视器(115200 波特率),把白卡或钥匙扣卡贴到模块那圈天线上,正常会每贴一次打印一行十六进制卡号:
把卡贴近模块试试……
卡 UID: A3 7F 21 5C ← 贴上白卡
卡 UID: A3 7F 21 5C ← 同一张再贴一次,号一样
卡 UID: 04 B9 1E 8A ← 换钥匙扣卡,号不同
同一张卡多次读出来的 UID 完全一致,换一张卡号就变——这说明它在正常工作。卡要贴近才行,13.56MHz 这类模块读距通常只有几厘米,离远了就什么都不打印。隔着薄手机壳、薄钱包一般还能读,金属贴着卡背会屏蔽掉信号。
读数解读
- UID:卡的唯一序列号,出厂烧死、不可改(普通卡),是识别"这是哪张卡"的核心,做门禁/考勤读这个就够了。
- 扇区 / 块(进阶):Mifare Classic 卡的存储被分成若干扇区、每扇区若干块,可以往里写数据(比如余额、积分、姓名)。但读写这些数据块必须先用密钥(Key A/Key B)做认证——出厂默认密钥常是全 FF,认证通过才能读写对应块。这一步比读 UID 复杂得多,初学先把读 UID 跑通即可。
简单记:读身份 = 读 UID(免密钥、最简单);存数据 = 读写扇区块(要密钥认证、属于进阶)。
选型 / 避坑
不同频段的卡、不同玩法,对应的模块完全不一样,买之前先认准频段:
| 需求 | 选谁 | 理由 |
|---|---|---|
| 读 13.56MHz IC 卡(门禁卡/Mifare/公交卡) | RC522 | 最便宜、库最全的入门款,本页讲的就是它 |
| 读 125kHz ID 卡(老式门禁工牌、宠物芯片) | RDM6300 等 125kHz 模块 | 频段不同,RC522 读不了 125k 卡,要另买 |
| 要和手机 NFC 互相通信 | 支持完整 NFC 协议的模块(如 PN532) | RC522 只能当读卡器读卡,手机 NFC 双向交互更复杂 |
认准频段别买错:13.56MHz 和 125kHz 是两套互不相通的体系,RC522 只吃 13.56M 的卡。手上的卡是哪种,看卡或问发卡方。
SPI 接线多、易接反:六根线只要错一根就读不到卡,最常见是 MOSI/MISO 反、SS 接错脚。先核对再上电。
卡要贴近:读距只有几厘米,没反应时先把卡直接贴到天线圈上再判断是不是真的读不到。
进阶 / 变体
把读到的 UID 拿去比对白名单,就从"打印卡号"升级成了"刷卡开锁":
// 简化示意:把已授权的卡号写进数组
const char* whitelist[] = {"A37F215C"}; // 授权卡的 UID 拼成字符串
// 读到卡后,把 uid 拼成同样格式的字符串再逐个比对
// 命中 → digitalWrite(RELAY_PIN, HIGH) 吸合继电器,电磁锁通电开门,延时几秒再断开
// 未命中 → 蜂鸣器响一声,拒绝
实际工程里把卡号存到代码数组、SD 卡或后端数据库都行;继电器/电磁锁怎么驱动、怎么用低电平触发、怎么加续流保护,参考 /guide/l2-relay/。再往上,把"刷卡 → 比对 → 开门 → 记考勤"做成带 AI 辅助开发的完整项目,参考 /guide/l4-sensor-ai/。
典型应用
- 门禁开锁(刷卡 → 比对名单 → 继电器开电磁锁)
- 考勤打卡(刷卡记录 UID + 时间,导出统计)
- 刷卡开锁的储物柜、设备使用授权
- 积分卡 / 会员卡识别(读 UID 关联账户)
- 教学演示:理解 RFID 无源取电与无线识别原理
仅读 UID 做的门禁,安全性很弱:UID 是明文、不加密的,市面上的读卡-复制设备几分钟就能把一张卡的 UID 克隆到空白卡上,刷克隆卡照样开门。所以自制的 RC522 门禁只适合学习、家里玩、低风险场景,绝不要用在真正需要安防的门(公司机要室、仓库、入户大门)。真正安全的门禁要用扇区加密 + 密钥认证、甚至带挑战应答的 CPU 卡,那是另一个量级的工程,不在本页范围。
小结 · 相关
RC522 的核心价值是"用 13.56MHz 射频把卡号读出来":读卡器发电磁场给无源卡供电,卡靠负载调制把 UID 回传,芯片解码——这就是 RFID 的全过程。接线走 SPI 六根线(ESP32 用 VSPI 默认脚 SCK18/MISO19/MOSI23/SS5),电源只能 3.3V;代码用 MFRC522 库 PCD_Init() 加 PICC_ReadCardSerial() 十几行就能把 UID 以十六进制打印出来。读 UID 免密钥、最简单,读写扇区块要密钥认证属于进阶。要读 13.56M 的门禁卡、做门禁/考勤入门项目,它就是首选;但记住仅读 UID 易被复制,自制门禁只供学习。
相关阅读:/principle/level-shift/(3.3V/5V 电平的事)、/principle/digital-analog/、/guide/l2-relay/(用继电器驱动电磁锁)、/guide/l4-sensor-ai/,更多器件见 /sensor/ 与 /principle/、/guide/。
参数以 datasheet 为准;本页公开资料整理,接线与代码请结合实物验证。