DIY智能门控——入门篇02:基于MFRC522的RFID识别

DIY智能门控——入门篇02:基于MFRC522的RFID识别_第1张图片
一直想做一套智能门禁系统,一开始试过键盘密码锁控制的,后来简单做了一套,预期功能倒是都能实现,教程见前文。

做完后本人对键盘锁门禁依旧不是很满意,之前也看过刷卡门禁,简单查了点资料,能力范围内还是可以试试的,所以最近买来的射频 IC卡感应模块就像下面这样:
DIY智能门控——入门篇02:基于MFRC522的RFID识别_第2张图片

(RFID三年前其实就曾想尝试的,硬件准备完成后由于老师的相关提醒后来也就不了了之了。
当时老师担心我们会对学校的饭卡“下手”,误入歧途。在此再次衷心感谢老师当年的提醒与教导。
小楊说明一下,下面的内容您可以随意参考,但不要用下面的内容开展一些游离于法律边缘的活动,否则玩火自焚,没什么意思。)


小楊又一次开始学习RFID目的如下:

  • 1、熟练单片机SPI通信;
  • 2、了解 RFID 的基本概念和射频卡的工作原理;
  • 3、测试 RC522 模块对卡的识别;
  • 4、将RC522-RFID 模块应用到门禁系统。

所需材料

  • 1.普通PC一台;
    2.RFID-RC522 模块一个(附官方芯片说明书一份);
    3.CP2102模块一个;
    4.标准S50空白卡一张(附官方说明书一份);
    5.S50异形卡一个(钥匙扣形状);
    6.杜邦线一排;
    7.排针一条;
    8.禾灮Young_AVR智能机器人控制板一块(兼容Arduino代码)(附Atmel官方MCU说明书一份)。

MFRC522射频识别模块说明:

  • ◇ 芯 片: Philips MFRC522
    ◇ 支持卡型: mifare1 S50、mifare1 S70、mifare UltraLight、mifare Pro、mifare Desfire
    ◇ 晶振频率: 27.12MHZ
    ◇ 工作电流: 13—26mA/DC3.3V
    ◇ 空闲电流: 10-13mA/DC3.3V
    ◇ 休眠电流: <80uA
    ◇ 峰值电流: <30mA
    ◇ 物理尺寸: 40mm×60mm
    ◇ 工作温度: 摄氏-20—80度
    ◇ 储存温度: 摄氏-40—85度
    S50 感应式IC卡/复旦卡说明:
    ◇ 芯 片:  Philips Mifare 1 S50
    ◇ 存储容量:  8Kbit ,16个分区,每分区两组密码
    ◇ 工作频率:  13.56MHZ
    ◇ 通讯速度:  106Kboud
    ◇ 读写距离:  2.5—10CM
    ◇ 读写时间:  1-2MS
    ◇ 工作温度:  -20℃-85℃
    ◇ 擦写次数:  >100000次
    ◇ 数据保存:  >10年
    ◇ 应用范围:  企业/校园一卡通、公交储值卡、高速公路收费、停车场、小区管理等

MFRC522射频识别模块各引脚功能

  • SDA 串行数据线–在SPI接口中为NSS(从机标志管脚);(IIC接口时的I/O线)
    SCK 连接MCU的SCK信号;
    MOSI MCU输出,RC522接收(即主设备输出,从设备输入);
    MISO RC522输出,MCU接收(即从设备输出,主设备输入);
    IRQ 中断请求输出;
    GND 接地;
    RST 复位;
    3.3V 工作电压,若使用VCC为DC5V的MCU,请分压。

RFID系统组成

RFID 技术利用无线射频方式在阅读器和射频卡之间进行非接触双向数据传输,以达到目标识别和数据交换的目的。
最基本的 RFID 系统由三部分组成:

    1. 标签(Tag,即射频卡):由耦合元件及芯片组成,标签含有内置天线,用于和射频天线间进行通信。
    2. 阅读器:读取(在读写卡中还可以写入)标签信息的设备。
    3. 天线:在标签和读取器间传递射频信号。

MFRC522通信接口

MFRC522提供了3种接口模式:
DIY智能门控——入门篇02:基于MFRC522的RFID识别_第3张图片
DIY智能门控——入门篇02:基于MFRC522的RFID识别_第4张图片
* 1、10 Mbit/s的SPI通信接口;
* 2、I2C总线模式(快速模式下能达400 kbit/s,而高速模式下能达3.4 Mbit/s);
* 3、最高达1228.8 kbit/s的UART模式;

买来的射频识别模块硬件设计时采用了第一种模式——四线制SPI。
DIY智能门控——入门篇02:基于MFRC522的RFID识别_第5张图片

根据上图,绘制模块原理图如下:
DIY智能门控——入门篇02:基于MFRC522的RFID识别_第6张图片

通信时序
DIY智能门控——入门篇02:基于MFRC522的RFID识别_第7张图片
DIY智能门控——入门篇02:基于MFRC522的RFID识别_第8张图片

读写规则:
DIY智能门控——入门篇02:基于MFRC522的RFID识别_第9张图片
DIY智能门控——入门篇02:基于MFRC522的RFID识别_第10张图片
简单阅览了上述文档后,老套路,发烟测试,首先实现模块的读卡功能。

说明一下,为防止造成社会危害,小楊在文档中仅更新读卡相关的内容,写卡内容如有兴趣请在理解相关知识点后自行开发。

Arduino本身有个操作RC5200的库,需要自行安装:搜索”RC522”,选择”MFRC522”安装即可
点击”More info”可以跳转到github地址
DIY智能门控——入门篇02:基于MFRC522的RFID识别_第11张图片
安装完毕后,可以看到关于MFRC522的库示例,有读取UID、获取区块信息、卡片信息复制等。
DIY智能门控——入门篇02:基于MFRC522的RFID识别_第12张图片
注:一般而言IC卡是不能修改0扇区0区块的UID和厂商信息数据,这些是生产时就确定下来的。


硬件连接:

3.3V供电、GND接地不用多说,IRQ是中断才用到的此处没有用到可以不接,其余5个引脚接法如下表所示:

 /* Typical pin layout used:
 * -----------------------------------------------------------------------------------------
 *             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
 *             Reader/PCD   Uno/101       Mega      Nano v3    Leonardo/Micro   Pro Micro
 * Signal      Pin          Pin           Pin       Pin        Pin              Pin
 * -----------------------------------------------------------------------------------------
 * RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
 * SPI SS      SDA(SS)      10            53        D10        10               10
 * SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
 * SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
 * SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15
 */

读取UID,并将其分别以十进制和十六进制输出到串口,简化版代码如下:
DIY智能门控——入门篇02:基于MFRC522的RFID识别_第13张图片

#include 
#include 

#define SS_PIN 10
#define RST_PIN 9

MFRC522 rfid(SS_PIN, RST_PIN); //实例化类

// 初始化数组用于存储读取到的NUID 
byte nuidPICC[4];

void setup() { 
  Serial.begin(9600);
  SPI.begin(); // 初始化SPI总线
  rfid.PCD_Init(); // 初始化 MFRC522 
}

void loop() {

  // 找卡
  if ( ! rfid.PICC_IsNewCardPresent())
    return;

  // 验证NUID是否可读
  if ( ! rfid.PICC_ReadCardSerial())
    return;

  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);

  // 检查是否MIFARE卡类型
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&  
    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println("不支持读取此卡类型");
    return;
  }

  // 将NUID保存到nuidPICC数组
  for (byte i = 0; i < 4; i++) {
    nuidPICC[i] = rfid.uid.uidByte[i];
  }   
  Serial.print("十六进制UID:");
  printHex(rfid.uid.uidByte, rfid.uid.size);
  Serial.println();

  Serial.print("十进制UID:");
  printDec(rfid.uid.uidByte, rfid.uid.size);
  Serial.println();

  // 使放置在读卡区的IC卡进入休眠状态,不再重复读卡
  rfid.PICC_HaltA();

  // 停止读卡模块编码
  rfid.PCD_StopCrypto1();
}

void printHex(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : "");
    Serial.print(buffer[i], HEX);
  }
}

void printDec(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : "");
    Serial.print(buffer[i], DEC);
  }
}

DIY智能门控——入门篇02:基于MFRC522的RFID识别_第14张图片



下面不再直接调用大佬写好的库文件了,咱们仅使用SPI通信库实现识别卡
先来张图:
DIY智能门控——入门篇02:基于MFRC522的RFID识别_第15张图片
读取复旦卡ID并在串口显示
这次就不直接贴代码了,咱们一步步跟着官方说明来:
DIY智能门控——入门篇02:基于MFRC522的RFID识别_第16张图片
DIY智能门控——入门篇02:基于MFRC522的RFID识别_第17张图片
DIY智能门控——入门篇02:基于MFRC522的RFID识别_第18张图片
DIY智能门控——入门篇02:基于MFRC522的RFID识别_第19张图片

由上述MFRC522芯片相关寄存器组介绍文档,编辑代码如下:

//------------------MFRC522 register ---------------
//Page 0:Command and Status
#define Reserved00 0x00
#define CommandReg 0x01
#define CommIEnReg 0x02
#define DivlEnReg 0x03
#define CommIrqReg 0x04
#define DivIrqReg 0x05
#define ErrorReg 0x06
#define Status1Reg 0x07
#define Status2Reg 0x08
#define FIFODataReg 0x09
#define FIFOLevelReg 0x0A
#define WaterLevelReg 0x0B
#define ControlReg 0x0C
#define BitFramingReg 0x0D
#define CollReg 0x0E
#define Reserved01 0x0F
//Page 1:Command
#define Reserved10 0x10
#define ModeReg 0x11
#define TxModeReg 0x12
#define RxModeReg 0x13
#define TxControlReg 0x14
#define TxAutoReg 0x15
#define TxSelReg 0x16
#define RxSelReg 0x17
#define RxThresholdReg 0x18
#define DemodReg 0x19
#define Reserved11 0x1A
#define Reserved12 0x1B
#define MifareReg 0x1C
#define Reserved13 0x1D
#define Reserved14 0x1E
#define SerialSpeedReg 0x1F
//Page 2:CFG
#define Reserved20 0x20
#define CRCResultRegM 0x21
#define CRCResultRegL 0x22
#define Reserved21 0x23
#define ModWidthReg 0x24
#define Reserved22 0x25
#define RFCfgReg 0x26
#define GsNReg 0x27
#define CWGsPReg 0x28
#define ModGsPReg 0x29
#define TModeReg 0x2A
#define TPrescalerReg 0x2B
#define TReloadRegH 0x2C
#define TReloadRegL 0x2D
#define TCounterValueRegH 0x2E
#define TCounterValueRegL 0x2F
//Page 3:TestRegister
#define Reserved30 0x30
#define TestSel1Reg 0x31
#define TestSel2Reg 0x32
#define TestPinEnReg 0x33
#define TestPinValueReg 0x34
#define TestBusReg 0x35
#define AutoTestReg 0x36
#define VersionReg 0x37
#define AnalogTestReg 0x38
#define TestDAC1Reg 0x39
#define TestDAC2Reg 0x3A
#define TestADCReg 0x3B
#define Reserved31 0x3C
#define Reserved32 0x3D
#define Reserved33 0x3E
#define Reserved34 0x3F
//-----------------------------------------------
<-----------------未完待续----------------->

门禁示例请参考文档:
禾灮:DIY-智能门控—应用篇02-RFID门禁

码字不易,如果本文对您有帮助,请点个赞让我知道哦~

    上文中用到的所有资料小楊均已打包,如有需要请评论区留邮箱。

感谢一直关注着禾灮成长进步的朋友们。你们的信任、支持和鼓励,鞭策着我们一路走到了今天。

感谢所有的合作伙伴,我们相互促进,共同见证了彼此的成长。

感谢所有曾经在禾灮彼此倚靠、相互鼓励、携手同心、砥砺同行的兄弟姐妹。这里承载了我们的青春与热血。

            禾灮,感谢有你。

未来,我们将一如既往,砥砺前行。

                                    禾灮·小楊
                                   2018.08.14

你可能感兴趣的:(Arduino,Basic)