树莓派RFID实战完全指南:从零打造门禁与自动化系统

越来越多的创客与开发者将树莓派与 RFID 技术结合,构建低成本、可扩展的实体自动化方案。射频识别(RFID)早已深深嵌入我们的生活:门禁卡、员工胸牌、仓库货物追踪,乃至公共交通票据,几乎随处都能见到它的身影。借助树莓派的通用输入输出引脚(GPIO)和完整的 Linux 环境,RFID 项目既能满足初学者的实验需求,也可以成为长期运行的可靠设备,例如自助终端、门禁控制器、物联网网关等。
树莓派的天生优势在于其活跃的社区、丰富的文档以及灵活的接口,使它成为 RFID 开发的理想平台。无论是刚入门的爱好者,还是寻找稳定原型的工程师,都可以在 Pi 上快速实现卡片读取、事件触发和远程数据上报。常见的应用场景包括:基于卡片或钥匙扣的门禁系统、带时间记录的考勤签到方案、工具或资产的库存管理,以及智能家居自动化——例如用一张 RFID 卡片切换场景或执行预设动作。
RFID 工作原理解析
RFID(射频识别)利用无线电波在读写器和标签之间传递信息,无需接触或视线对准。一套典型的 RFID 系统由三个关键部分组成:
- RFID 标签(应答器):附着在物体上或由人员携带,内部存储唯一标识符,部分还存有额外数据。
- RFID 读写器(询问器):产生射频能量场,唤醒无源标签并读取其内容。
- 通信协议:定义了标签与读写器之间如何交换指令和数据。
不同频段的 RFID 适用于不同场景,且与树莓派项目的兼容性各异:
- 125 kHz 低频(LF):结构简单、抗干扰能力强。标签通常只输出唯一标识符(UID),多见于基础门禁卡和钥匙扣,但安全防护能力较弱。
- 13.56 MHz 高频(HF)/ NFC:这是树莓派项目中最常用的频段,支持更复杂的存储结构和加密功能。智能卡、NFC 设备几乎都工作在此频段,可以搭载 RC522、PN532 等模块。
- UHF 超高频:专为远距离(数米)读取而设计,主要用于物流和大规模库存系统,很少直接通过 GPIO 与树莓派连接。
标签还分为无源和有源两类。无源标签本身不带电池,从读写器的射频场中获取能量;有源标签内置电池,通信距离更远,但体积和成本也更高。掌握这些基础有助于合理选择硬件和设计系统。

如何选择树莓派 RFID 读写器
市面上多款读写器可与树莓派良好配合,不同模块在成本、功能和协议上各有侧重。
RC522(13.56MHz,SPI 通信)
价格低廉,Python 驱动成熟,是入门学习与简易门禁的首选。缺点是支持的标签类型较少,读取距离偏短。

PN532 模块
兼容性更强,同时支持 I2C、SPI 和串口 UART 三种通信接口,几乎适配所有常见的 NFC 标签。如果需要读取更高级的标签格式或未来可能扩展功能,PN532 是更稳妥的长期选择。

USB 接口 RFID 读写器
这类设备通常被系统识别为键盘或串口设备,无需连接 GPIO,在量产或被封装成成品时稳定性更高,但底层可定制的空间较小。
对于简单的门禁控制或学习目标,RC522 已经足够;若项目以 NFC 为核心或存在后续扩展需求,PN532 是更为明智的决策。
必需硬件与工具准备
绝大多数树莓派型号(Pi 3、Pi 4、Pi 5、Pi Zero 2 W)都可以连接 RFID 读写器。如果需要网络功能,建议选用内置 Wi‑Fi 的型号。
基础清单包括:
- 已安装树莓派 OS 的树莓派主板
- 一个 RFID 读写器模块(如 RC522 或 PN532)
- 若干跳线,可选面包板
若想让系统提供更直观的反馈,还可以准备 LED、蜂鸣器或 LCD 屏幕。这些辅助元件在调试和演示阶段尤为有用。
树莓派 5 接线与引脚说明
正确的接线是稳定运行的前提。多数 RFID 模块的故障都源于供电错误或引脚分配混乱。
RC522 接法(SPI)
RC522 必须使用 3.3V 电源,切勿接入 5V。典型连接如下:
- SDA 连接 Pin 24
- SCK 连接 Pin 23
- MOSI 连接 Pin 19
- MISO 连接 Pin 21
- GND 连接 Pin 6
- RST 连接 Pin 22
- 3.3V 连接 Pin 1
PN532 接法(I2C 或 UART)
若采用 I2C,请务必确认 SDA 与 SCL 针脚方向正确;若使用 UART,则需提前禁用串口登录功能,避免资源冲突(参见树莓派官方接口配置文档)。

常见的接线错误包括:误接 5V 供电、忘记在 config 中开启相应接口、或混淆 SPI 的片选引脚。
操作系统与软件环境配置
硬件就绪后,首先更新系统并启用必要的接口:
- 使用 RC522 时,通过
raspi-config开启 SPI; - 使用 PN532 时,根据实际接线选择开启 I2C 或 串口。
随后可以用系统命令检测硬件是否被识别。例如,扫描 I2C 总线确认 PN532 的地址;对于 SPI 设备,确保驱动正常加载。
Python 是树莓派 RFID 开发的首选语言,其生态包含了丰富且易于上手的驱动库。不同模块对应不同的库:
- RC522 通常调用
mfrc522库,通过 SPI 进行通信; - PN532 依赖
adafruit-circuitpython-pn532等库,支持 I2C 或 UART; - USB 读写器在系统中通常直接表现为输入设备,无需额外驱动。
安装好所需的 Python 包后,就可以运行一个简单的测试脚本:持续等待卡片靠近,并打印出读取到的 UID。这一步的重点是确认读取稳定,之后再逐步加入业务逻辑。
实战项目:入门级门禁演示
一个最简单的 RFID 项目是读取卡片 UID 并在终端显示,这构成了门禁系统、考勤记录等功能的基础。典型流程如下:
- 初始化读写器模块
- 进入等待循环,监视卡片靠近和事件
- 成功读取后获取 UID
- 显示或处理结果
请确保已在 raspi-config 中启用 SPI(若使用 RC522)。

RC522 基础脚本
1. 安装依赖
sudo apt update
sudo apt install python3-pip
pip3 install mfrc522 RPi.GPIO
2. 读取并打印 UID
from mfrc522 import SimpleMFRC522
import RPi.GPIO as GPIO
import time
reader = SimpleMFRC522()
print("RFID reader ready. Place a card near the reader.")
try:
while True:
id, text = reader.read()
print(f"Card detected")
print(f"UID: {id}")
time.sleep(1)
except KeyboardInterrupt:
print("Exiting program")
finally:
GPIO.cleanup()
典型输出示例:
RFID reader ready.
Place a card near the reader.
Card detected
UID: 123456789
这个基础脚本可以轻松扩展为以下功能:
- 将读取到的 UID 与授权列表比对;
- 为每次读取事件附加时间戳并记入日志;
- 驱动继电器、LED 或蜂鸣器做出响应;
- 通过 HTTP 或 MQTT 将 UID 上传到后端服务器;
- 将数据存入本地文件或数据库。
例如,添加简单的白名单判断:
AUTHORIZED_UIDS = [123456789, 987654321]
if id in AUTHORIZED_UIDS:
print("Access granted")
else:
print("Access denied")
PN532 基础脚本(I2C)
以下示例展示如何通过 I2C 连接的 PN532 读取 NFC 标签的 UID(详细指南可参阅 Adafruit PN532 RFID/NFC 文档)。
前置条件:
- PN532 已按 I2C 模式接线
- 树莓派上已启用 I2C
- 系统包为最新
1. 安装所需库
sudo apt update
sudo apt install python3-pip
pip3 install adafruit-circuitpython-pn532
2. UID 读取脚本
import board
import busio
from adafruit_pn532.i2c import PN532_I2C
import time
# 初始化 I2C 总线
i2c = busio.I2C(board.SCL, board.SDA)
# 初始化 PN532(I2C 模式)
pn532 = PN532_I2C(i2c, debug=False)
# 配置 PN532 进入正常读取模式
pn532.SAM_configuration()
print("PN532 RFID reader ready. Waiting for a card...")
try:
while True:
uid = pn532.read_passive_target(timeout=0.5)
if uid is not None:
uid_hex = "".join([f"{byte:02X}" for byte in uid])
print(f"Card detected")
print(f"UID: {uid_hex}")
time.sleep(1)
except KeyboardInterrupt:
print("Exiting program")
该脚本通过 I2C 接口驱动 PN532,持续扫描无源标签,读取其 UID 并以可读的十六进制格式输出。
常见问题排查
- 系统未识别读写器:首先检查供电电压和接口配置。SPI 或 I2C 未开启是多数故障的根源;
- 完全无法读取卡片:确认标签的工作频段与模块匹配,同时检查天线的摆放位置和距离。读取距离太远或对齐不佳都会导致识别失败;
- 权限错误:通常是当前用户没有硬件访问权限,或者接口未在
raspi-config中激活; - UID 格式混乱:不同模块输出的 UID 长度或编码可能不同,在比较和存储前应统一转换为标准格式(如十六进制大写字符串)。
安全与稳定性设计要点
对于打算构建真实门禁或考勤系统的开发者,仅靠简单的 UID 比对远远不够。以下是一些面向初学者的实用建议。
MIFARE Classic 加密的真相
许多 13.56MHz 的 RFID 卡(尤其是 RC522 常用的卡片)属于 MIFARE Classic 系列,使用较老的 Crypto‑1 加密算法保护存储扇区。需要明确的是:
- 这种加密算法已被证明存在漏洞,密钥可通过低廉的工具被提取;
- 仅判断 UID 并不能提供真正的安全保障;
- 虽然加密扇区可以防止随意读取,但无法抵抗有针对性的攻击。
简而言之,“加密”并不等同于“足够安全”。
防范卡片克隆
RFID 卡片克隆是系统最常见的风险之一。可以采取以下措施:
- 绝不只用卡片 UID 作为唯一凭证;
- 不将 RFID 当作关键门禁的唯一安全层;
- 尽可能选用安全级别更高的 NFC 标签(如支持 AES 或动态认证的型号);
- 将 RFID 与额外验证因子结合,例如 PIN 码、时间段限制或后端双重核查;
- 监控并记录异常或重复的访问尝试。
真实项目的系统级建议
为使系统更加健壮,应遵循以下原则:
- 将 RFID 视为身份标识,而非完整的身份验证;
- 在服务器端或应用层统一执行访问决策;
- 规范化并统一存储所有 UID,避免因格式不一致导致逻辑错误;
- 加入去抖动逻辑,防止一次贴近被误读多次;
- 确保供电稳定,避免因电压波动造成误判或系统崩溃;
- 为每个事件记录精确的时间戳和结果,便于事后审计。
树莓派与 RFID 的结合为构建现实自动化项目提供了一条上手快、扩展性强的路径。理解基本原理,选对读写器模块,遵循正确的接线和软件配置,你就可以快速打造门禁控制、考勤追踪或智能家居触发系统。RC522 和 PN532 各有适用场景,按需选择即可。从最基础的 UID 读取起步,再逐步添加高级逻辑和安全功能,借助树莓派和 Python 的灵活生态,小实验完全能够成长为扎实的工程应用。