基于RFID RC522模块制作树莓派通读卡器
RC522 RFID模块在单片机开发中常用来作为读卡器使用,在本文中我们把它连接到树莓派,然后就可以制作读卡器了,比如读取门禁卡的UID。本项目只是一个读卡器的雏形,如果需要运用到实际项目中,还需要你的更多深加工。读卡器常见的应用场景还是安全管理系统,其它常见的应用场景还有按卡计时、考勤系统和游戏系统授权等。
RC522 RFID模块支持的卡片标准
使用RC522芯片的模块支持以下标准的卡片:
- MIFARE Mini
- MIFARE 1K
- MIFARE 4K,
- MIFARE Ultralight
- MIFARE DESFire EV1
- MIFARE Plus RF
当我们购买卡片时,应该确保卡片支持以上标准。
RC522 RFID模块接口定义
市面上的RC522 RFID模块可能因为生产厂家不同外观上会有些许不同,常见的是下图蓝色外观,8个引脚的这种。在模块的PCB上我们可以看到天线的线路布局,模块就是通过天线与靠近它的卡片进行通信的。
上图左上角,蓝色圆扣状卡片是一种可以挂在钥匙扣上的卡片,所有的卡片都有一个惟一的UID,我们可以使用Python脚本来读取它。
上图是RC522 RFID模块的接口定义,从图中可以看出RC522 RFID模块支持UART接口、I2C总线接口和SPI可编程接口。
RC522 RFID模块与树莓派的电路连接
RC522模块有8个引脚,但我们只需要将其中7个引脚连接到树莓派的GPIO接口即可。RC522模块的引脚定义见上图,电路连接见下图。
接口对应关系详见下表:(树莓派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。
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
输出结果如下:
UID是由四个元素组成的数组,脚本将每个元素组合成一个由逗号分隔的字符串。数组的4个元素可以组合成一个纯数字。例如,我的卡片UID是“1483565119”,而不是“148,35,65,119”。至此读卡器项目的雏形就完成了。