RFID技术与应用场景已深入日常生活各个领域!建筑门禁系统通过RFID实现人员进出管理,办公设备利用RFID标签识别员工身份,畜牧业与宠物管理同样依赖RFID识别技术。基于树莓派Pico和MFRC522读卡器的RFID解决方案成本极低,仅需9美元(5美元读卡器+4美元Pico)即可构建完整的卡片/标签识别系统。
本教程将详细指导如何利用MFRC522读卡器与树莓派Pico读取RFID标签信息。我们将构建一个模拟门禁控制系统,通过识别卡片ID决定是否允许进入或触发安全警报。教程分为两个核心环节:首先获取卡片ID信息,随后通过LED状态灯模拟门锁控制机制。
材料清单
运行MicroPython的树莓派Pico开发板
MFRC522 RFID读卡器模块
大型面包板
11根公对公杜邦线
绿色LED指示灯
红色LED指示灯
2个100Ω电阻(棕-黑-棕-金环)
硬件连接指南
硬件搭建包含两大功能模块。首先是MFRC522 RFID读卡器的接线配置,该模块通过SPI协议与树莓派Pico通信,共需连接七个引脚:其中两个为电源引脚(3.3V和GND),其余五个为SPI通信引脚。
第二部分为状态指示系统。我们配置双色LED指示灯用于反馈RFID验证结果:绿灯表示认证通过,红灯表示认证失败。每个LED通过100Ω限流电阻连接至GPIO引脚和GND接地端。您可根据实际需求选用100-330Ω范围内的电阻,如需精确计算电阻值,可参考专业电子元件选型指南。
完成接线后请务必进行线路复查,确保所有连接准确无误。
RFID驱动安装与配置
MFRC522作为基础型RFID读卡器,我们使用专为MicroPython优化的开源库简化开发流程。该pico-rfid模块由Kevin McAleer基于Danjperron的工作成果开发完善。
将树莓派Pico连接至计算机并启动Thonny IDE(需提前完成Pico基础配置)
创建新文件并复制此链接内容,保存为mfrc522.py上传至Pico
该Python库将实现与RFID读卡器的高效通信
门禁系统代码实现
完成环境配置后,开始编写核心控制代码。代码设计目标:检测并显示RFID卡片ID,通过ID比对决定门禁状态,匹配成功允许进入,否则触发警报。
在Thonny中新建空白文件
导入RFID读写器、时间控制及GPIO操作库
from mfrc522 import MFRC522
import utime
from machine import Pin
初始化RFID读卡器对象并指定引脚配置
reader = MFRC522(spi_id=0,sck=2,miso=4,mosi=3,cs=1,rst=0)
配置红绿LED引脚为输出模式
red = Pin(14, Pin.OUT)
green = Pin(15, Pin.OUT)
显示用户引导提示信息
print("请将卡片靠近读卡器\n")
创建历史记录变量避免重复读取
PreviousCard = [0]
主循环持续检测卡片状态
while True:
reader.init()
(stat, tag_type) = reader.request(reader.REQIDL)
卡片检测成功时读取UID信息
if stat == reader.OK:
(stat, uid) = reader.SelectTagSN()
if uid == PreviousCard:
continue
有效卡片信息处理与显示
if stat == reader.OK:
print("卡片详细信息如下")
card = reader.tohexstring(uid)
print(card)
PreviousCard = uid
无卡片状态处理与循环延时
else:
PreviousCard=[0]
utime.sleep_ms(50)
将代码保存为reader.py并运行
将RFID卡片贴近读卡器,在终端复制显示的UID信息(格式示例:[0x04, 0xBC, 0xA0, 0x9A, 0xB3, 0x43, 0x80])
完整代码清单:
from mfrc522 import MFRC522
import utime
from machine import Pin
reader = MFRC522(spi_id=0,sck=2,miso=4,mosi=3,cs=1,rst=0)
red = Pin(14, Pin.OUT)
green = Pin(15, Pin.OUT)
print("请将卡片靠近读卡器\n")
PreviousCard = [0]
while True:
reader.init()
(stat, tag_type) = reader.request(reader.REQIDL)
if stat == reader.OK:
(stat, uid) = reader.SelectTagSN()
if uid == PreviousCard:
continue
if stat == reader.OK:
print("卡片详细信息如下")
card = reader.tohexstring(uid)
print(card)
PreviousCard = uid
else:
PreviousCard=[0]
utime.sleep_ms(50)
门禁控制逻辑扩展
在ID读取功能基础上,增加门禁决策逻辑:
在输出卡片信息后插入验证代码
print(card)
# 门禁验证逻辑
if card == "[0x04, 0xBC, 0xA0, 0x9A, 0xB3, 0x43, 0x80]":
授权成功时绿灯闪烁提示
print("认证通过")
for i in range(10):
green.toggle()
utime.sleep(0.1)
green.off()
未授权卡片红灯警报
else:
print("认证失败")
for i in range(10):
red.toggle()
utime.sleep(0.1)
red.off()
PreviousCard = uid
保存完整代码并测试:有效卡片触发绿灯闪烁,无效卡片触发红灯警报
完整门禁系统代码:
from mfrc522 import MFRC522
import utime
from machine import Pin
reader = MFRC522(spi_id=0,sck=2,miso=4,mosi=3,cs=1,rst=0)
red = Pin(14, Pin.OUT)
green = Pin(15, Pin.OUT)
print("请将卡片靠近读卡器\n")
PreviousCard = [0]
while True:
reader.init()
(stat, tag_type) = reader.request(reader.REQIDL)
if stat == reader.OK:
(stat, uid) = reader.SelectTagSN()
if uid == PreviousCard:
continue
if stat == reader.OK:
print("卡片详细信息如下")
card = reader.tohexstring(uid)
print(card)
if card == "[0x04, 0xBC, 0xA0, 0x9A, 0xB3, 0x43, 0x80]":
print("认证通过")
for i in range(10):
green.toggle()
utime.sleep(0.1)
green.off()
else:
print("认证失败")
for i in range(10):
red.toggle()
utime.sleep(0.1)
red.off()
PreviousCard = uid
else:
PreviousCard=[0]
utime.sleep_ms(50)