1、功能介绍:
识别ifid卡,如果是管理员卡则驱动屏幕显示“Key access!”开放键盘输入权限,并亮起绿灯。如果不是管理员卡,则亮起红灯,屏幕显示“Access deny”,关闭键盘输入。
等待刷卡:
刷非管理员卡:
刷管理员卡:
2、rc522的使用
rc522介绍:
rc522支持以下几种卡片:
MIFARE Mini
MIFARE 1K
MIFARE 4K,
MIFARE Ultralight
MIFARE DESFire EV1
MIFARE Plus RF
rc522接口定义
模块连接
例程库使用的是树莓派GPIO.BOARD引脚模式,引脚定义如下:
rc522 | 树莓派 |
---|---|
3.3V | 1 |
RST | 22 |
GND | 6 |
IRQ | 悬空 |
MISO | 21 |
MOSI | 19 |
SCK | 23 |
SDA | 24 |
开启spi和iic模块
终端执行:
sudo raspi-config
回车键确认即可打开
输入指令:
ls /dev/spidev0.*
查看是否成功开启spi模块
同理输入
ls /dev/i2c-1
查看是否成功开启iic功能。
安装spi驱动python库
sudo apt-get install python-spidev python3-spidev
安装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
这样python2和python3都能使用spi了
下载RC522 的Python库
cd ~
git clone https://github.com/mxgxw/MFRC522-python.git
使用示例测试:
cd MFRC522-python
python Read.py
测试成功!
bug总结:
1、没成功打开spi模块和iic模块,可能是镜像有问题,比如树莓派4b的镜像烧进了树莓派3b(本人有过这种操作,目前发现spi会无法开启)
2、最新的SPI-Py库参数少了一个导致无法运行;
执行:
cd SPI-Py.git
git checkout 8cce26b9ee6e69eb041e9d5665944b88688fca68
sudo python setup.py install
sudo python3 setup.py install
使用git指令回退到旧版本即可正常运行
3、矩阵键盘使用
参照:https://blog.csdn.net/q943413302/article/details/80487821
4、LCD1602 iic版本使用
参照:https://shumeipai.nxez.com/2020/06/17/raspberry-pi-drives-lcd1602-screen-through-i2c.html
5、项目工程
将矩阵键盘驱动程序打包成keyboard.py
将LCD1602驱动程序打包成LCD1602.py
然后将这两文件放入MFRC522-python例程文件夹里,在文件夹里新建一个test.py:
#!/usr/bin/env python
# -*- coding: utf8 -*-
import time #导入时间模块
import RPi.GPIO as GPIO #导入引脚控制模块
import MFRC522 #导入rc522协议
import keypad #导入键盘模块
import LCD1602 #导入屏幕显示模块
green = 15 #定义引脚
red = 13
time=0 #定义计时变量
GPIO.setmode(GPIO.BOARD) #设置引脚模式
GPIO.setup(green,GPIO.OUT) #点灯引脚为输出
GPIO.setup(red,GPIO.OUT)
GPIO.output(green,GPIO.LOW) #关灯
GPIO.output(red,GPIO.LOW)
# Create an object of the class MFRC522
MIFAREReader = MFRC522.MFRC522() #定义rc522信息读取对象
# 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
LCD1602.init_lcd() #初始化屏幕
key=None
have_card = 0;
try:
while True:
# Scan for cards
(status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL) #查询rc522状态(是否存在rfid卡)
# Get the UID of the card
(status,uid) = MIFAREReader.MFRC522_Anticoll() #获取rfid卡的uid号
if status == MIFAREReader.MI_OK:
# Print UID
print("UID: "+str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3])) #输出rfid卡的uid号
# If we have the UID, continue
if have_card==0: #状态1:判断此卡是否是管理员卡,如果是则have_card=1,否则have_card=2
GPIO.output(green,GPIO.LOW)
GPIO.output(red,GPIO.LOW)
LCD1602.print_lcd(0, 0, 'Swipe card! ')
LCD1602.print_lcd(0, 1, ' ')
if status == MIFAREReader.MI_OK:
if uid[0]==252 and uid[1] == 158 and uid[2] == 12 and uid[3] == 73:
have_card=1
# Print UID
#print("UID: "+str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3]))
else:
have_card=2
elif have_card==1: #状态2:如果是管理员卡,则打开绿灯,开始轮询检测键盘值并控制屏幕显示相应内容
time=time+1
if time==30: #计时大概5秒左右回归初始状态
time=0
have_card=0
LCD1602.print_lcd(0, 0, 'Key activated! ')
key=keypad.getkey()
GPIO.output(green,GPIO.HIGH)
GPIO.output(red,GPIO.LOW)
if not key==None:
#print ('You enter the key:',key)
LCD1602.print_lcd(0, 1, 'floor:')
LCD1602.print_lcd(6, 1, key)
elif have_card==2: #刷错误的卡,则亮红灯,关闭键盘输入,屏幕显示相应内容
time=time+1
if time==20: #计时大概3秒左右回归初始状态
time=0
have_card=0
LCD1602.print_lcd(0, 0, 'Access denied ')
LCD1602.print_lcd(0, 1, ' ')
GPIO.output(green,GPIO.LOW)
GPIO.output(red,GPIO.HIGH)
except KeyboardInterrupt:
GPIO.cleanup()
注意python文件头顶要加上:
#!/usr/bin/env python
# -*- coding: utf8 -*-
否则无法用终端来执行。
6、合作
如有任何问题可以加我微信交流学习。如果有树莓派,arduino,stc单片机,stm32单片机,esp8266,NXP单片机等开发需求,电子设计定制开发需求也可以联系我:18076427103