七千二百袋水泥
七千二百袋水泥
Published on 2025-06-08 / 0 Visits

告别钥匙时代!树莓派Pico结合RFID技术打造智能门禁系统实战教程

Image

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Ω电阻(棕-黑-棕-金环)

硬件连接指南

Image

硬件搭建包含两大功能模块。首先是MFRC522 RFID读卡器的接线配置,该模块通过SPI协议与树莓派Pico通信,共需连接七个引脚:其中两个为电源引脚(3.3V和GND),其余五个为SPI通信引脚。

Image

Image

第二部分为状态指示系统。我们配置双色LED指示灯用于反馈RFID验证结果:绿灯表示认证通过,红灯表示认证失败。每个LED通过100Ω限流电阻连接至GPIO引脚和GND接地端。您可根据实际需求选用100-330Ω范围内的电阻,如需精确计算电阻值,可参考专业电子元件选型指南。

Image

Image

完成接线后请务必进行线路复查,确保所有连接准确无误。

RFID驱动安装与配置

MFRC522作为基础型RFID读卡器,我们使用专为MicroPython优化的开源库简化开发流程。该pico-rfid模块由Kevin McAleer基于Danjperron的工作成果开发完善。

  1. 将树莓派Pico连接至计算机并启动Thonny IDE(需提前完成Pico基础配置)

  2. 创建新文件并复制此链接内容,保存为mfrc522.py上传至Pico

  3. 该Python库将实现与RFID读卡器的高效通信

门禁系统代码实现

完成环境配置后,开始编写核心控制代码。代码设计目标:检测并显示RFID卡片ID,通过ID比对决定门禁状态,匹配成功允许进入,否则触发警报。

  1. 在Thonny中新建空白文件

  2. 导入RFID读写器、时间控制及GPIO操作库

from mfrc522 import MFRC522
import utime
from machine import Pin
  1. 初始化RFID读卡器对象并指定引脚配置

reader = MFRC522(spi_id=0,sck=2,miso=4,mosi=3,cs=1,rst=0)
  1. 配置红绿LED引脚为输出模式

red = Pin(14, Pin.OUT)
green = Pin(15, Pin.OUT)
  1. 显示用户引导提示信息

print("请将卡片靠近读卡器\n")
  1. 创建历史记录变量避免重复读取

PreviousCard = [0]
  1. 主循环持续检测卡片状态

while True:
    reader.init()
    (stat, tag_type) = reader.request(reader.REQIDL)
  1. 卡片检测成功时读取UID信息

    if stat == reader.OK:
        (stat, uid) = reader.SelectTagSN()
        if uid == PreviousCard:
            continue
  1. 有效卡片信息处理与显示

        if stat == reader.OK:
            print("卡片详细信息如下")
            card = reader.tohexstring(uid)
            print(card)
            PreviousCard = uid
  1. 无卡片状态处理与循环延时

    else:
        PreviousCard=[0]
    utime.sleep_ms(50)
  1. 将代码保存为reader.py并运行

  2. 将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读取功能基础上,增加门禁决策逻辑:

  1. 在输出卡片信息后插入验证代码

            print(card)
            # 门禁验证逻辑
            if card == "[0x04, 0xBC, 0xA0, 0x9A, 0xB3, 0x43, 0x80]":
  1. 授权成功时绿灯闪烁提示

                print("认证通过")
                for i in range(10):
                    green.toggle()
                    utime.sleep(0.1)
                green.off()
  1. 未授权卡片红灯警报

            else:
                print("认证失败")
                for i in range(10):
                    red.toggle()
                    utime.sleep(0.1)
                red.off()
            PreviousCard = uid
  1. 保存完整代码并测试:有效卡片触发绿灯闪烁,无效卡片触发红灯警报

完整门禁系统代码:

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)