新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 如何将RFID阅读器与Raspberry Pi Pico一起使用

如何将RFID阅读器与Raspberry Pi Pico一起使用

作者: 时间:2025-03-12 来源:Toms hardware 收藏

卡和标签无处不在!我们在建筑物中使用它们进行访问控制。打印机和复印机可以使用它们来识别工作人员。牲畜标签和宠物识别标签都使用一种 形式。读取 设备的技术很便宜,大约 5 美元就可以买到,而 4 美元, 可以从卡/标签中读取 ID。

本文引用地址:https://www.eepw.com.cn/article/202503/467963.htm

Pico NFC

(图片来源:Tom's Hardware)

在此作方法中,我们将学习如何使用 MFRC522 读取 RFID 标签和卡,目标是创建一个虚构的 RFID 门禁系统,该系统允许用户进入建筑物,或提醒安全人员将其移除。在我们这样做之前,我们需要识别我们的卡/标签的 ID。本作指南的第一部分将执行此作,然后我们将插入一些代码来控制两个 LED 以模拟锁定机制。

为此,您将需要

  • 运行 MicroPython 的

  • MFRC522 RFID

  • 大型面包板

  • 11 x 公对公跳线

  • 绿色 LED

  • 红灯 LED

  • 2 x 100 欧姆电阻器(棕色 - 黑色 - 棕色 - 金色)

构建硬件

Pico NFC

(图片来源:Tom's Hardware)

硬件构建分为两个部分。首先是 MFRC522 RFID 阅读器的接线。读取器使用 SPI 与 Raspberry Pi Pico 通信,它需要 7 个引脚才能做到这一点。两个用于电源(3.3V 和 GND),其余用于 SPI。

MFRC522

Raspberry Pi Pico

Wire Color

SDA

GP1

SCK

GP2

MOSI

GP3

紫色

GP4

接地

任何 GND

RST

GP0

3.3

3V3 输出(物理引脚 36)

Pico NFC

(图片来源:Tom's Hardware)

其次是我们的输出。要查看是否显示了正确的卡,我们需要添加两个 LED。红色表示 RFID 卡不正确,绿色表示卡正确。LED 连接到 GPIO 引脚,我们控制该引脚以打开/关闭 LED,并通过 100 欧姆电阻器连接到任何可用的 GND 引脚。您可以使用 220 或 330 欧姆的电阻器,我的办公桌上恰好有一些 100 欧姆的电阻器。需要找出正确的电阻器吗?我们为您准备了一份指南!

标题单元格 - 列 0

Raspberry Pi Pico

Wire Color

红色 LED 阳极 (+)

GP14

红色 LED 阴极 (-)

任何 GND

绿色 LED 阳极 (+)

GP15 系列

绿

绿色 LED 阴极 (-)

任何 GND

Pico NFC

(图片来源:Tom's Hardware)

在继续之前,请检查您的接线是否正确。

安装 RFID 读取器软件

MFRC522 是一个简单的 RFID 阅读器,为了使其更简单,我们使用了一个 MicroPython 模块,该模块将缩短使用阅读器的工作。pico-rfid 模块来自 Tom 的 Hardware 的朋友 Kevin McAleer,基于 Danjperron 的工作。

1. 将 Raspberry Pi Pico 连接到计算机,然后打开 Thonny。我们假设您已经知道如何设置 Raspberry Pi Pico。如果没有,我们有方便的指南。

2. 创建一个新的空白文件,并将此链接的内容复制到空白文件中。然后将其作为 mfrc522.py 保存到 Raspberry Pi Pico。这是 Python 模块/库,它将使我们的代码能够与 RFID 阅读器通信。

编写项目代码

完成所有设置后,我们现在开始对项目进行编码。为此,我们将再次使用 Thonny,并编写代码来检查提供给阅读器的任何 RFID 卡的 ID。对于第一部分,我们需要记下 ID,因为稍后我们将将其与条件测试一起使用,该测试检查 ID 是否与硬编码值匹配,然后它将允许输入。如果没有,那么我们将收到 ACCESS DENIED 消息。

1. 在 Thonny 中创建新的空白文件。

2. 导入三个模块(库),用于使用 MFRC522 RFID 阅读器、控制代码的速度以及使用 GPIO。

from mfrc522 import MFRC522
import utime
from machine import Pin

3. 创建一个对象 reader 来告诉代码 RFID reader 的连接位置。

reader = MFRC522(spi_id=0,sck=2,miso=4,mosi=3,cs=1,rst=0)

4. 为红色和绿色 LED 创建两个对象,告诉代码 LED 的连接位置以及它们是我们想要将电流发送到的输出设备。

red = Pin(14, Pin.OUT)
green = Pin(15, Pin.OUT)

5. 向用户写一条短消息,指示他们向读者出示卡片。 “n” 是 Python 的语法,用于在 print() 函数的末尾引入新行。

print("Present the card to the readern")

6. 创建一个名为 “PreviousCard” 的列表,并在其中存储值 0。我们稍后将使用此列表来存储当前卡 ID。

PreviousCard = [0]

7. 创建一个 while True 循环以持续运行其中的代码。

while True:

8. 初始化读取器,使其可供使用。

   reader.init()

9. 创建一个元组来存储读取器状态和 RFID 标签类型。

   (stat, tag_type) = reader.request(reader.REQIDL)

10. 如果读卡器准备好了,if 条件将读取卡的内容。然后,它将使用卡片中的详细信息更新 stat 和 uid 对象。

   if stat == reader.OK:
        (stat, uid) = reader.SelectTagSN()

11. 如果卡片的 uid 与 PreviousCard 对象中存储的值相同,则代码将继续。当同一张卡重复显示给读者时,就会发生这种情况。

       if uid == PreviousCard:
            continue

12. 创建一个 if 条件语句以检查卡读取是否正常。

       if stat == reader.OK:

13. 向用户打印一条消息,然后将卡片的 UID 存储到一个名为 “card” 的对象中。然后将卡详细信息打印到 Python shell。

             print("The card details are as follows")
            card = reader.tohexstring(uid)
            print(card)

14. 使用显示的卡的 uid 更新 PreviousCard 对象。

            PreviousCard = uid

15. 创建一个 else 条件,该条件将在没有卡片时运行。更新 PreviousCard 对象。然后在 main 循环重复之前向代码添加 50ms 的暂停。

   else:
        PreviousCard=[0]
    utime.sleep_ms(50)

16. 将代码作为 reader.py 保存到 Raspberry Pi Pico,然后单击 Run >> Run Current Script(或按绿色的播放按钮)。按照说明将 RFID 卡/标签出示给读卡器。

17. 复制整个卡详细信息,这是 RFID 卡的 uid,我们将在此作方法的下一部分需要它。 uid 看起来像这样,你的 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("Present the card to the readern")
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("The card details are as follows")
            card = reader.tohexstring(uid)
            print(card)
            PreviousCard = uid
    else:
        PreviousCard=[0]
    utime.sleep_ms(50)

我们已经有了代码,现在我们需要告诉项目代码我们想要使用该代码来授予我们访问权限,并点亮绿色 LED。如果向读卡器出示另一张卡/标签,则红色 LED 将亮起。

1. 在这两行之间,创建新的代码行。

            print(card)
NEWCODE GOES HERE
            	PreviousCard = uid

2. 创建一个 if 条件来检查卡的 uid。请注意,它看起来像一个 Python 列表,但实际上它是以字符串形式存储的,因此我们需要将值包装在 “ ” 中。不要忘记 [ ] 括号。

           if card == "[0x04, 0xBC, 0xA0, 0x9A, 0xB3, 0x43, 0x80]":

3. 如果存储在 card 对象中的值与硬编码值匹配,则向 Python shell 打印“ACCESS GRANTED”。

               print("ACCESS GRANTED")

4. 创建一个 for 循环以打开/关闭绿色 LED 十次,每次状态变化之间有 0.1 秒的间隔。在 for 循环结束时关闭绿色 LED。

               for i in range(10):
                    green.toggle()
                    utime.sleep(0.1)
                green.off()

5. 当无法识别的卡片/标签呈现给读者时,请使用 else 条件。 这将像绿色 LED 一样打开和关闭红色 LED。

           else:
                print("ACCESS DENIED")
                for i in range(10):
                    red.toggle()
                    utime.sleep(0.1)
                red.off()

6 .将代码另存为 Raspberry Pi Pico reader.py。单击 Run >> Run Current Script(或按绿色的播放按钮)。按照说明将 RFID 卡/标签出示给读卡器。如果卡正确无误,则绿色 LED 将闪烁,并且 Python shell 将打印 “ACCESS GRANTED”。尝试另一个 RFID 卡/标签,这应该会使红色 LED 亮起,并且 Python shell 将打印“ACCESS DENIED”

完整代码列表

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("Present the card to the readern")
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("The card details are as follows")
            card = reader.tohexstring(uid)
            print(card)
            if card == "[0x04, 0xBC, 0xA0, 0x9A, 0xB3, 0x43, 0x80]":
                print("ACCESS GRANTED")
                for i in range(10):
                    green.toggle()
                    utime.sleep(0.1)
                green.off()
            else:
                print("ACCESS DENIED")
                for i in range(10):
                    red.toggle()
                    utime.sleep(0.1)
                red.off()
            PreviousCard = uid
    else:
        PreviousCard=[0]
    utime.sleep_ms(50)




评论


相关推荐

技术专区

关闭