目的
本教程旨在展示何将RFID读卡器和执行器与Raspberry Pi集成在一起。基于本文讨论的基本原理,我们还会制造一个RFID狗门。
概述
在本教程中,我将介绍如何将RC522 RFID模块与Raspberry Pi基板集成在一起。我还将展示如何集成一个执行器(本例中是一个LED),来响应RFID模块的正确读取信息。该执行器可以是电磁锁、扬声器,甚至可以是记录数据的Web界面。我还会介绍如何利用此设计实现一个RFID狗门。
设备
物品 | 链接 |
---|---|
Raspberry Pi 3 | Raspberry Pi 链接 |
RC522 RFID 模块 | RFID 模块链接 |
HDMI 线 | HDMI 线链接 |
LED | Adafruit LED链接 |
鼠标 + 键盘 | 键盘/鼠标的Amazon链接 |
显示器/电视机 | 任何带有HDMI接口的电视机或显示器 |
跳线 | 跳线的Amazon链接 |
Micro USB 数据线 | Micro USB数据线的Amazon链接 |
面包板 | 面包板的Amazon链接 |
目录
- 1. 设计电路
- 2. 编写代码
- a.启用 SPI
- b.安装软件包
- c.添加到 Read.py
- 3. 运行代码
- a.获取 UID
- b.运行最终脚本
- 4. 制作狗门的注意事项
- 5.其他设备选项
- 6.附录:Read.py
程序
1. 设计电路
我一直喜欢使用开源的原理图绘制和PCB布线软件Fritzing来制作接线图(图1:执行器为LED的电路原理图)。您可以通过以下链接(可选)下载Fritzing: https://fritzing.org/home/
第一张原理图是我正在制作的以LED作为执行器的电路。当RFID模块产生正确读取信号,LED会亮起。
第二个电路中的执行器是一个电磁锁。这个电路用于实现门锁和狗门设计。TIP120是一款达林顿功率晶体管阵列。它只允许Raspberry Pi控制电磁锁,电磁锁所需功率比Paspberry Pi的GPIO端口的输出还要大。
RC522 Pin | Raspberry Pi 引脚 | 导线颜色 |
---|---|---|
3.3V | 引脚 1 | 红 |
RST | 引脚 22 | 橙 |
GND | 引脚 6 | 黑 |
MISO | 引脚 21 | 白 |
MOSI | 引脚 19 | 灰 |
SCK | 引脚 23 | 绿 |
SDA | 引脚 24 | 蓝 |
我将执行器(一个LED)连接到了Raspberry Pi的引脚18。你也应该连接这个引脚。
2. 编写代码
a. 启用 SPI
第一步是在Raspberry Pi上启用SPI。为此,请打开命令行窗口并输入sudo raspi-config。系统会弹出Configuration Menu。选择菜单5“Interfacing Options”。现在选择“P4 SPI”。当系统问你是否要启用SPI接口时,选择“Yes”。配置菜单将显示“The SPI interface is enabled.”。要完成SPI的启用,请打开命令行终端并输入命令sudo reboot。Raspberry Pi会重启,从而完成SPI启用。
b. 安装软件包
我们要用的库是用Python 2编写的,不是Python 3。因此,第一步是安装Python 2.7。请输入sudo apt-get install python2.7-dev完成该操作。SPI PY库负责与RC522模块通信。我通过键入命令git clone https://github.com/lthiery/SPI-Py.git来克隆这个库。然后安装该库。首先,通过键入cd SPI-Py进入SPI-Py目录。然后键入sudo python setup.py install安装库。
c. 添加到 Read.py
Read.py脚本需要更改才能与RC522模块对话。编辑此脚本时,请滚动到脚本底部,然后加入注释“Authenticate”。本教程不涉及RFID的身份验证。确保在脚本头添加时间库。接下来找到标题为“#Configure LED Output Pin”的部分。这里是你配置执行器的地方。如果要将该设计应用于狗门,那么应将输出引脚配置到电磁锁。
接下来找到标题为“#Check to see if card UID read matches your card UID.”的部分。该If/Else语句检查读卡器从卡上读取的UID与您之前保存在脚本中的UID是否匹配,如果UID匹配,则执行器的输出为高。
3. 运行代码
a. 获取 UID
首次运行脚本时,您需要获取卡的UID。RFID卡的UID是与此卡相关联的唯一编号,类似于序列号。
要运行脚本,请将目录更改为保存脚本的目录。然后输入python Read.py,运行脚本。因为脚本读卡器UID,所以当你将卡放在读取器上时,它会拒绝访问。屏幕上会显示这张卡的UID。记下这个UID。编辑脚本,然后将脚本的UID更改为此值并保存。
输入python Read.py,再次运行脚本。现在,当你将卡放在读卡器上时,验证通过且LED会亮5秒钟。如果将你的设计应用于狗门,那么在验证通过后电磁锁会打开。
- 如果要将该设计实现为一个狗门,那么你需要考虑其他一些设计技巧:
-
- 1. 添加第二个电磁锁,以保证两侧锁门。
- 2. 在门上添加一个霍尔效应(磁传感器)传感器和一块磁铁,以便让Raspberry Pi在锁门之前知道门已返回到关闭位置。
- 3. 如果你真的很有想法,那么可以围绕门设计较大的环形天线,代替在门上安装小型读卡器。你需要电磁线,而且需要将其焊接到读取模块上。这需要资深技巧,有关环形天线的信息请在这里阅读。
- 4. 如果你是资深程序员,那么可以阅读MFRC522 数据表,更改芯片组上的固件,更好地满足自己的应用要求。
5. 其他设备选项
-
- a.门锁
- b.安全锁
- c.支付设备
- d.运输跟踪/物流
- e.零售/购物
6. 附录:Read.py
#!/usr/bin/env python
# -*- coding: utf8 -*-
import RPi.GPIO as GPIO
import MFRC522
import signal
import time
continue_reading = True
# Capture SIGINT for cleanup when the script is aborted
def end_read(signal,frame):
global continue_reading
print ("Ctrl+C captured, ending read.")
continue_reading = False
GPIO.cleanup()
# Hook the SIGINT
signal.signal(signal.SIGINT, end_read)
# Create an object of the class MFRC522
MIFAREReader = MFRC522.MFRC522()
# Welcome message
print ("Welcome to the MFRC522 data read example")
print ("Press Ctrl-C to stop.")
# This loop keeps checking for chips. If one is near it will get the UID and authenticate
while continue_reading:
# Scan for cards
(status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
# If a card is found
if status == MIFAREReader.MI_OK:
print ("Card detected")
# Get the UID of the card
(status,uid) = MIFAREReader.MFRC522_Anticoll()
# If we have the UID, continue
if status == MIFAREReader.MI_OK:
# Print UID
print ("Card read UID: "+str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3])+','+str(uid[4]))
# This is the default key for authentication
key = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF]
# Select the scanned tag
MIFAREReader.MFRC522_SelectTag(uid)
#ENTER Your Card UID here
my_uid = [61,84,4,114,31]
#Configure LED Output Pin
LED = 18
GPIO.setup(LED, GPIO.OUT)
GPIO.output(LED, GPIO.LOW)
#Check to see if card UID read matches your card UID
if uid == my_uid: #Open the Doggy Door if matching UIDs
print("Access Granted")
GPIO.output(LED, GPIO.HIGH) #Turn on LED
time.sleep(5) #Wait 5 Seconds
GPIO.output(LED, GPIO.LOW) #Turn off LED
else: #Don't open if UIDs don't match
print("Access Denied, YOU SHALL NOT PASS!")
## # Authenticate
## status = MIFAREReader.MFRC522_Auth(MIFAREReader.PICC_AUTHENT1A, 8, key, uid)
##
## # Check if authenticated
## if status == MIFAREReader.MI_OK:
## MIFAREReader.MFRC522_Read(8)
## MIFAREReader.MFRC522_StopCrypto1()
## else:
## print "Authentication error"