基于RFID RC522模块制作树莓派通读卡器

  • 内容
  • 评论
  • 相关

RC522 RFID模块在单片机开发中常用来作为读卡器使用,在本文中我们把它连接到树莓派,然后就可以制作读卡器了,比如读取门禁卡的UID。本项目只是一个读卡器的雏形,如果需要运用到实际项目中,还需要你的更多深加工。读卡器常见的应用场景还是安全管理系统,其它常见的应用场景还有按卡计时、考勤系统和游戏系统授权等。

基于rfid_rc522模块制作树莓派3b读卡器

RC522 RFID模块支持的卡片标准

使用RC522芯片的模块支持以下标准的卡片:

  • MIFARE Mini
  • MIFARE 1K
  • MIFARE 4K,
  • MIFARE Ultralight
  • MIFARE DESFire EV1
  • MIFARE Plus RF

当我们购买卡片时,应该确保卡片支持以上标准。

RC522 RFID模块接口定义

市面上的RC522 RFID模块可能因为生产厂家不同外观上会有些许不同,常见的是下图蓝色外观,8个引脚的这种。在模块的PCB上我们可以看到天线的线路布局,模块就是通过天线与靠近它的卡片进行通信的。

rfid_rc522模块

上图左上角,蓝色圆扣状卡片是一种可以挂在钥匙扣上的卡片,所有的卡片都有一个惟一的UID,我们可以使用Python脚本来读取它。

rc522读卡器模块接口定义

上图是RC522 RFID模块的接口定义,从图中可以看出RC522 RFID模块支持UART接口、I2C总线接口和SPI可编程接口。

RC522 RFID模块与树莓派的电路连接

RC522模块有8个引脚,但我们只需要将其中7个引脚连接到树莓派的GPIO接口即可。RC522模块的引脚定义见上图,电路连接见下图。

RC522模块连接树莓派GPIO接口。

接口对应关系详见下表:(树莓派3b的GPIO接口定义可查阅:树莓派3的外围I/O数据接口  )

RC522 Header Diagram Colour Pi Header  Notes
3.3V Grey 1 3.3V
RST White 22 GPIO25
GND Black  6 Ground
IRQ Not connected
MISO Purple 21 GPIO9
MOSI Blue 19 GPIO10
SCK Green 23 GPIO11
SDA Yellow 24 GPIO8

树莓派3B+如何打开SPI接口

在本项目中,RC522模块使用SPI接口与树莓派进行通信。因此,树莓派的SPI接口必须要先启用,默认情况下树莓派的SPI接口是禁用的,SPI接口如何打开可以参照 修改树莓派I2C总线接口速度 中的做法。也就是从命令行“sudo raspi-config”进入系统配置打开,或者从桌面进入“Raspberry Pi Configuration”面板中去打开。

安装树莓派3B+的SPI接口支持库

这里的支持库分别是“Py-spidev”和“SPI-Py”,安装“Py-spidev”可以使用命令来安装:

sudo apt-get install python-spidev python3-spidev

这样“Py-spidev”就可以同时支持Python 2和Python 3了。虽然使用“py-spidev”可以驱动Python中的SPI接口,但是项目中我们使用了“SPI-Py”,可以通过以下命令来完成安装“SPI-Py”:

cd ~
git clone https://github.com/lthiery/SPI-Py.git
cd SPI-Py
sudo python setup.py install
sudo python3 setup.py install

同样的“SPI-Py”也可以同时支持Python 2和Python 3了。

下载RC522 的Python库

最后我们还需要下载一个RC522 的Python库,它可以实现SPI接口与RC522模块的通信,这个库依赖于上一步中安装的“SPI-Py”。

cd ~
git clone https://github.com/mxgxw/MFRC522-python.git

Python脚本示例

在“MFRC522-python”目录中有一些示例脚本。可以这样使用它:

cd MFRC522-python
进入“MFRC522-python”目录,然后运行“Read.py”
python Read.py

这个脚本的功能是,首先等待RFID模块检测可识别卡。当它检测到一张卡时,读取该卡的UID并将其显示在屏幕上。该脚本可循环执行,也就是当它读取一个UID后,它还会继续等待读取并显示任何检测到的卡片UID。

RC522模块读取卡片UID

Python 2 或 Python 3代码

默认情况下,MFRC522的库只支持Python 2。如果使用Python 3也可以很容易的进行修改。我们只需要修改“MFRC522.py”文件即可,按Python 3的语法格式修改9个 print 语句即可。例如,

print "Authentication Error" 修改为:print("Authentication Error")

Python 3语法中,print语句之后的所有内容都应该用括号“()”括起来。这样示例程序也可以在Python 3下运行了,依然采用“python Read.py”。

本项目的Python脚本

为了简化输出,本项目代码中创建了一个修改过的示例脚本。它首先读取一张卡片,打印出UID后等待2秒,这样就不会重复打印相同的UID了,除非你将卡片放置天线感应到的区域超过2秒。

import time
import RPi.GPIO as GPIO
import MFRC522
 
# Create an object of the class MFRC522
MIFAREReader = MFRC522.MFRC522()
 
# Welcome message
print("Looking for cards")
print("Press Ctrl-C to stop.")
 
# This loop checks for chips. If one is near it will get the UID
try:
   
  while True:
 
    # Scan for cards
    (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
 
    # 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("UID: "+str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3]))
 
      time.sleep(2)
 
except KeyboardInterrupt:
  GPIO.cleanup()

将上面的代码保存为“rc522_read_card.py”。然后运行:

python rc522_read.py

输出结果如下:

RC522模块读取卡片UID

UID是由四个元素组成的数组,脚本将每个元素组合成一个由逗号分隔的字符串。数组的4个元素可以组合成一个纯数字。例如,我的卡片UID是“1483565119”,而不是“148,35,65,119”。至此读卡器项目的雏形就完成了。