嵌入式人工智能(43-基于树莓派4B的刷卡模块射频识别RFID-RC522)

1、RFID

射频识别(RFID,Radio Frequency Identification)是一种无线通信技术,用于自动识别和追踪标签上的信息。这项技术基于射频信号的传输和接收,通过将标签上的数据存储在特定的芯片中,实现物体的识别和跟踪。

射频识别系统由三个主要组件组成:读写器、标签和后台系统。读写器用于发送射频信号,并接收标签返回的信息。标签通常由一个芯片和一个天线组成,用于存储数据,并与读写器进行通信。后台系统则用于处理和管理从标签中读取的数据。

射频识别技术具有诸多优点,包括快速读取、无需直接接触、大容量存储、抗干扰能力强等。它在物流、零售、医疗、农业等领域得到广泛应用。例如,物流领域中可以使用射频识别追踪货物的流动和可靠性;零售领域中可以使用射频识别快速扫描商品并提供库存信息。

然而,射频识别技术也存在一些挑战和问题,例如安全性问题、实施成本较高等。为了克服这些问题,需要在技术上不断改进,并制定相应的规范和标准。

总的来说,射频识别技术具有广泛的应用前景和发展空间,可以为各行各业提供更高效、更准确的自动识别和追踪解决方案。

2、RC522 

一套完整的RFID系统,由读写器、电子标签和数据管理系统(应用软件系统)三部分组成。系统涵盖数据库、前端服务器、硬件模块等资源来实协调控制,其低成本,通用性强的特点,也可以满足其他近距离通信、身份识别等领域,或者是其他个性化的二次开发。

RC522 是一种非接触式读写卡芯片,底层采用SPI模拟时序,可以应用于校园一卡通、水卡充值消费、公交卡充值消费设计、门禁卡等。

RC522 有两个部分组成,射频读写器和IC卡。射频读写器向IC卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与读写器发射的频率相同,这样在电磁波激励下,LC谐振电路产生共振,从而使电容内有了电荷;在这个电荷的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内存储,当所积累的电荷达到2V时,此电容可作为电源为其它电路提供工作电压,将卡内数据发射出去或接受读写器的数据。

非接触性IC卡与读卡器之间通过无线电波来完成读写操作。二者之间的通讯频率为13.56MHZ。非接触性IC卡本身是无源卡,当读写器对卡进行读写操作时,读写器发出的信号由两部分叠加组成:一部分是电源信号,该信号由卡接收后,与本身的LC产生一个瞬间能量来供给芯片工作。另一部分则是指令和数据信号,指挥芯片完成数据的读取、修改、储存等,并返回信号给读写器,完成一次读写操作。

复位应答:M1射频卡的通讯协议和通讯波特率是定义好的,当有卡片进入读写器的操作范围时,读写器以特定的协议与它通讯,从而确定该卡是否为M1射频卡,即验证卡片的卡型。

防冲突机制:当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作,未选中的则处于空闲模式等待下一次选卡,该过程会返回被选卡的序列号。

选择卡片:选择被选中的卡的序列号,并同时返回卡的容量代码。

三次互相确认:选定要处理的卡片之后,读写器就确定要访问的扇区号,并对该扇区密码进行密码校验,在三次相互认证之后就可以通过加密流进行通讯。(在选择另一扇区时,则必须进行另一扇区密码校验。)

如果概括来说的话,主要也就四部分:开关连接、寻卡、验证密码、读取。

3、SPI通信

 嵌入式不同芯片之间最常用的三种串行通信协议:UART、I2C、SPI,前面2个已经非常熟悉了,剩下SPI还没有用过,SPI是全双工串行通信,IIC为半双工通信。SPI也是采用主从方式工作,主机通常为FPGA、MCU或DSP等可编程控制器,从机通常为EPROM、Flash,AD/DA,音视频处理芯片等设备。一般由SCLK、CS、MOSI,MISO四根线组成,有的地方可能是:SCK、SS、SDI、SDO等名称,都是一样的含义。

当有多个从机存在时,通过CS来选择要控制的从机设备。IIC通过器件地址来选择从机,从机数量的增加不会导致GPIO的增加,而SPI通过CS选择从机,每增加一个从机就要多占用一个GPIO,当然也可以通过加入译码器来实现多从机控制。

主机发送到从机时:主机产生相应的时钟信号,然后数据一位一位地将从MOSI信号线上进行发送到从机;主机接收从机数据:如果从机需要将数据发送回主机,则主机将继续生成预定数量的时钟信号,并且从机会将数据通过MISO信号线发送;

 4、引脚定义与连接

 

这个接线要稍微比IIC复杂写,注意看准引脚,不要差错。 

RC522蓝色MOSI接树莓派GPIO10(MOSI)BOARD19

RC522紫色MISO接树莓派GPIO9(MISO)BOARD21

RC522绿色SCK接树莓派GPIO11(SCLK)BOARD23

RC522黄色SS接树莓派GPIO8(CE0)BOARD24

RC522白色RST接树莓派GPIO25-BOARD22

GND接地,VCC接3.3V

这线比较多,比较乱,看的头晕啊。

5、环境搭建

(1)硬件开发板开启SPI总线,开启后重启。

(2)安装Python库。

pip install spidev
pip install mfrc522

6、实验代码与现象

实际上能用上RFID的基本都是大点的项目,至少有个前端系统,有个数据库,Python的Falsk框架我感觉挺好的,我现在没时间做,等有时间我把前端页面简单的写下,然后将后端的数据库和业务逻辑加上,然后将结果通过wifi显示到网页。我们今天的实验做不了这么复杂,通过mfrc522库简单调用下即可。

整个实验我们就把蜂鸣器和OLED也拿来,如果是蓝卡,则门禁打开,蜂鸣器响一下,OLED显示用户号码欢迎你。否则显示用户没有找到。

import RPi.GPIO as GPIO
#引入Simple MFRC522库
from mfrc522 import SimpleMFRC522
import time
from PIL import Image  
from PIL import ImageDraw
from PIL import ImageFont
import RPi.GPIO as GPIO
import luma.oled as oled  
from luma.core.interface.serial import i2c    
from luma.oled.device import ssd1306  
from luma.core.render import canvas
  
WIDTH=128
HEIGHT=64 

beeper = 37
# 指定编号规则为BOARD
GPIO.setmode(GPIO.BOARD)
# 将第40个引脚设置为输出模式
GPIO.setup(beeper, GPIO.OUT)
GPIO.output(beeper,1)
time.sleep(0.3)

#调用SimpleMFRC522的函数,将其作为对象存储到创建的reader变量中,方便与其进行交互
reader = SimpleMFRC522()
print(reader)
def load_device():
    # 创建I2C接口对象  
    serial = i2c(port=1, address=0x3C)  # 地址可能因显示屏型号而异,由命令行“sudo i2cdetect -y 1”得到
    # 创建OLED设备对象  
    device = ssd1306(serial, WIDTH, HEIGHT) 
    return device

device = load_device()
font = ImageFont.truetype('STKAITI.TTF',17)
try:     
    while True:
        #调用读取到的RFID标签数据作为对象
        id,text = reader.read()
        #打印RFID标签的ID
        if id ==429216044767:
            reader.write('No9567')   
            GPIO.output(beeper,0)
            time.sleep(0.3) 
            GPIO.output(beeper,1)        
            with canvas(device) as draw:
                draw.rectangle(device.bounding_box, outline=0, fill=0)
                draw.text((0,0), str(text),font=font, fill='white')
                draw.text((60,0), '欢迎你!', font=font, fill="white")
        else:
            print('User not find!')
            with canvas(device) as draw:
                draw.rectangle(device.bounding_box, outline=0, fill=0)
                draw.text((0,0), 'User not find',font=font, fill='white')


except KeyboardInterrupt:
     print('end!')
#终止
finally:
	#清理GPIO
	GPIO.cleanup()

RFID

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值