ESP32开发之旅——RC522模块的使用

前言

  • 在本文中,您将学会如何使用ESP32连接RFID模块RC522,本文提供了简单的示例供学习参考。
  • 需要注意的是,本文中的ESP32是使用Micro Python进行开发的,(同时ESP8266也可按照本文进行开发)。
  • 本文中出现的代码是从GitHub开源库中搬运而来,GitHub链接已放在文尾。

RFID-RC522模块的简单介绍

​ 射频识别RFID(Radio Frequency Identification)是一种无线数据传输系统,用于在标签和读取器设备之间传输数据,而RC522模块则是用于读取和写入RFID卡和标签,该模块的工作频率为13.56MHz。

正文

所需材料

  • ESP32开发板(已刷入MicroPython固件,未刷入的小伙伴可以参考我前面的教程)
  • RC522读卡器以及对应频率的RFID卡
  • Thonny(其他支持MicroPython开发的IDE皆可)

连线说明

​ 在RC522模块上共有8个引脚,实际上我们只需使用7个引脚就可以完成本次的开发。引脚对应表如下:

Signal SCK MOSI MISO RST CS(SDA)
ESP32/ESP8266 P0 P2 P4 P5 P14

​ (注意:VCC与GND在表格中未标出来,但也需要连接,且VCC使用3.3V电源)

核心代码

mfrc522.py

from machine import Pin, SPI
from os import unameclass MFRC522:OK = 0NOTAGERR = 1ERR = 2REQIDL = 0x26REQALL = 0x52AUTHENT1A = 0x60AUTHENT1B = 0x61def __init__(self, sck, mosi, miso, rst, cs):self.sck = Pin(sck, Pin.OUT)self.mosi = Pin(mosi, Pin.OUT)self.miso = Pin(miso)self.rst = Pin(rst, Pin.OUT)self.cs = Pin(cs, Pin.OUT)self.rst.value(0)self.cs.value(1)board = uname()[0]self.spi = SPI(baudrate=100000, polarity=0, phase=0, sck=self.sck, mosi=self.mosi, miso=self.miso)self.spi.init()self.rst.value(1)self.init()def _wreg(self, reg, val):self.cs.value(0)self.spi.write(b'%c' % int(0xff & ((reg << 1) & 0x7e)))self.spi.write(b'%c' % int(0xff & val))self.cs.value(1)def _rreg(self, reg):self.cs.value(0)self.spi.write(b'%c' % int(0xff & (((reg << 1) & 0x7e) | 0x80)))val = self.spi.read(1)self.cs.value(1)return val[0]def _sflags(self, reg, mask):self._wreg(reg, self._rreg(reg) | mask)def _cflags(self, reg, mask):self._wreg(reg, self._rreg(reg) & (~mask))def _tocard(self, cmd, send):recv = []bits = irq_en = wait_irq = n = 0stat = self.ERRif cmd == 0x0E:irq_en = 0x12wait_irq = 0x10elif cmd == 0x0C:irq_en = 0x77wait_irq = 0x30self._wreg(0x02, irq_en | 0x80)self._cflags(0x04, 0x80)self._sflags(0x0A, 0x80)self._wreg(0x01, 0x00)for c in send:self._wreg(0x09, c)self._wreg(0x01, cmd)if cmd == 0x0C:self._sflags(0x0D, 0x80)i = 2000while True:n = self._rreg(0x04)i -= 1if ~((i != 0) and ~(n & 0x01) and ~(n & wait_irq)):breakself._cflags(0x0D, 0x80)if i:if (self._rreg(0x06) & 0x1B) == 0x00:stat = self.OKif n & irq_en & 0x01:stat = self.NOTAGERRelif cmd == 0x0C:n = self._rreg(0x0A)lbits = self._rreg(0x0C) & 0x07if lbits != 0:bits = (n - 1) * 8 + lbitselse:bits = n * 8if n == 0:n = 1elif n > 16:n = 16for _ in range(n):recv.append(self._rreg(0x09))else:stat = self.ERRreturn stat, recv, bitsdef _crc(self, data):self._cflags(0x05, 0x04)self._sflags(0x0A, 0x80)for c in data:self._wreg(0x09, c)self._wreg(0x01, 0x03)i = 0xFFwhile True:n = self._rreg(0x05)i -= 1if not ((i != 0) and not (n & 0x04)):breakreturn [self._rreg(0x22), self._rreg(0x21)]def init(self):self.reset()self._wreg(0x2A, 0x8D)self._wreg(0x2B, 0x3E)self._wreg(0x2D, 30)self._wreg(0x2C, 0)self._wreg(0x15, 0x40)self._wreg(0x11, 0x3D)self.antenna_on()def reset(self):self._wreg(0x01, 0x0F)def antenna_on(self, on=True):if on and ~(self._rreg(0x14) & 0x03):self._sflags(0x14, 0x03)else:self._cflags(0x14, 0x03)def request(self, mode):self._wreg(0x0D, 0x07)(stat, recv, bits) = self._tocard(0x0C, [mode])if (stat != self.OK) | (bits != 0x10):stat = self.ERRreturn stat, bitsdef anticoll(self):ser_chk = 0ser = [0x93, 0x20]self._wreg(0x0D, 0x00)(stat, recv, bits) = self._tocard(0x0C, ser)if stat == self.OK:if len(recv) == 5:for i in range(4):ser_chk = ser_chk ^ recv[i]if ser_chk != recv[4]:stat = self.ERRelse:stat = self.ERRreturn stat, recvdef select_tag(self, ser):buf = [0x93, 0x70] + ser[:5]buf += self._crc(buf)(stat, recv, bits) = self._tocard(0x0C, buf)return self.OK if (stat == self.OK) and (bits == 0x18) else self.ERRdef auth(self, mode, addr, sect, ser):return self._tocard(0x0E, [mode, addr] + sect + ser[:4])[0]def stop_crypto1(self):self._cflags(0x08, 0x08)def read(self, addr):data = [0x30, addr]data += self._crc(data)(stat, recv, _) = self._tocard(0x0C, data)return recv if stat == self.OK else Nonedef write(self, addr, data):buf = [0xA0, addr]buf += self._crc(buf)(stat, recv, bits) = self._tocard(0x0C, buf)if not (stat == self.OK) or not (bits == 4) or not ((recv[0] & 0x0F) == 0x0A):stat = self.ERRelse:buf = []for i in range(16):buf.append(data[i])buf += self._crc(buf)(stat, recv, bits) = self._tocard(0x0C, buf)if not (stat == self.OK) or not (bits == 4) or not ((recv[0] & 0x0F) == 0x0A):stat = self.ERRreturn stat

read.py

import mfrc522
from os import uname
import timedef do_read():rdr = mfrc522.MFRC522(0, 2, 4, 5, 14)index = True ###用于标记是否读到卡片try:while True:(stat, tag_type) = rdr.request(rdr.REQIDL)if stat == rdr.OK:(stat, raw_uid) = rdr.anticoll()if stat == rdr.OK:print("识别到卡片:")print("uid: 0x%02x%02x%02x%02x" % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))print("")index = Falseif rdr.select_tag(raw_uid) == rdr.OK:key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:print("Address 8 data: %s" % rdr.read(8))rdr.stop_crypto1()else:print("Authentication error")except KeyboardInterrupt:print("Bye")

write.py

import mfrc522
from os import uname
def do_write():rdr = mfrc522.MFRC522(0, 2, 4, 5, 14)try:while True:(stat, tag_type) = rdr.request(rdr.REQIDL)if stat == rdr.OK:(stat, raw_uid) = rdr.anticoll()if stat == rdr.OK:print("  - uid: 0x%02x%02x%02x%02x" % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))print("")if rdr.select_tag(raw_uid) == rdr.OK:key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:stat = rdr.write(8, b"这里输入你要写入的数据,16进制")rdr.stop_crypto1()if stat == rdr.OK:print("数据已写入")else:print("数据写入失败")else:print("Authentication error")else:print("Failed to select tag")except KeyboardInterrupt:print("Bye")

函数调用

此时,您可以通过调用库的方式来实现简单的功能。

如果您想要读取卡的相关信息的话,可以通过下面两行代码进行实现:

import read
read.do_read()

如果您想将信息写入卡的话,可以通过下面两行代码进行实现:

import write
write.do_write()

结尾

本文中出现的代码大部分是在GitHub开源库中搬运过来,并在原有基础上加以修改。

参考文献:

  • GitHub源码地址

ESP32开发之旅——RC522模块的使用相关推荐

  1. ESP32开发之旅——AS608指纹识别模块

    ESP32开发之旅--AS608指纹识别模块) 前言 本文中,您将了解到如何使用ESP32调用AS608指纹识别模块. 需要注意的是,本文中的ESP32是使用Micro Python进行开发的,(同时 ...

  2. ESP32开发之旅——人体感应传感器HC-SR501

    ESP32开发之旅--人体感应传感器HC-SR501 前言 在本文中,您将学会HC-SR501人体感应传感器在ESP32中的使用,本文提供了简单的示例供学习参考. 需要注意的是,本文中的ESP32是使 ...

  3. ESP32开发之旅——ssd1306 OLED屏的使用

    ESP32开发之旅--ssd1306 OLED屏的使用 前言 在本文中,您将学会ssd1306 OLED屏在ESP32中的使用,本文提供了简单的示例供学习参考. 需要注意的是,本文中的ESP32是使用 ...

  4. ESP32开发之旅——基于ESP32的室内空气质量检测系统

    ESP32开发之旅--基于ESP32的室内空气质量检测系统 前言 成果展示 核心代码 MQTT部分 获取传感器数据部分 连接WiFi部分 结尾 前言 本文主要是我课设项目的一个备忘,部分资料来源于网上 ...

  5. ESP32开发之旅——搭建MicroPython开发环境

    ESP32开发之旅--搭建MicroPython开发环境 获取ESP32-MicroPython固件 写入固件 编译器配置 编写第一行代码--Hello World 结尾 获取ESP32-MicroP ...

  6. ESP32开发之旅——MicroPython介绍

    ESP32开发之旅--MicroPython介绍 什么是ESP32 为什么使用MicroPython开发ESP32 参考文献链接 什么是ESP32 ESP32是由我国乐鑫公司继ESP8266芯片后推出 ...

  7. ESP32 开发之旅② Arduino For ESP32说明

        从这一篇开始,博主将会带领各位读者进入ESP32开发的征程.在此,博主认为各位读者已经具备以下前提: 读者具有C语言以及Arduino的开发知识: 读者了解过博主的ESP8266开发系列: 读 ...

  8. ESP32 开发之旅⑪ UDP服务

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... 快速导航 单片机菜鸟的博客快速索引(快速找到你 ...

  9. ESP32 开发之旅③ Ticker——定时库

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... 快速导航 单片机菜鸟的博客快速索引(快速找到你 ...

最新文章

  1. mysql8.0.12最小化安装_简述MySql8.0编译安装过程
  2. ctypealpha php_php ctype函数中文翻译和示例
  3. java中保存图片到本地_java保存网络图片到本地
  4. 滤波器的主要特性指标
  5. c3p0如何配置多数据源的解决方法
  6. React.js 的 Web 应用场景有哪些
  7. 【Android】系统目录理解
  8. php怎么跳转别的手机浏览器,JavaScript_JS脚本根据手机浏览器类型跳转WAP手机网站(两种方式),随着移动互联网的不断普及, - phpStudy...
  9. java类加载器正确的是_Java面试题:面向对象,类加载器,JDBC, Spring 基础概念
  10. python怎么定义一个变量为空列表_python – 为什么一个类变量没有在列表理解中定义,但另一个是?...
  11. [导入]在asp.net中实现观察者模式,或有更好的方法(续)
  12. 【TSP】基于matlab遗传算法求解13城市旅行商问题【含Matlab源码 1255期】
  13. Android虚拟AB升级流程简述及升级完整log
  14. 深圳台电:联合国的“沟通”之道
  15. 搜狗输入法如何禁用所有快捷键包括系统快键键
  16. python + selenium + chrome 凡人修仙小说爬取
  17. OA项目之Mybatis多表链接查询
  18. 第七周 OJ总结4-求三角形面积-gyy
  19. 快速生成不重复的卡号
  20. Python递归学习6 涂格子问题

热门文章

  1. 招聘 关于数通与云计算的岗位
  2. elasticsearch源码结构一览
  3. geokit无法适用计算机怎么弄,一般说来,没有操作系统,计算机就无法工作。(  )——青夏教育精英家教网——...
  4. 小.心情5(21天减肥法)
  5. 【 实测可用 】ESP32 + AD8232 心电图实验
  6. 关于三菱GXWORK安装失败或者安装向导被中断的解决办法
  7. Java项目ssm企业工资管理系统源码
  8. 带平滑功能的斜坡函数(多段曲线控温纯S型曲线SCL源代码+完整算法分析)
  9. 理解快速离散傅里叶变换算法(FFT)
  10. 计算机硬件设备的连接教案,教师资格证面试高中信息技术教案:计算机的硬件设备...