射频识别「Radio Frequency IDentification,简称RFID」技术,又称为无线射频识别,是一种通信技术,可通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定目标之间建立机械或光学接触,普遍应用于企业/校园一卡通、公交储值卡、高速公路收费、停车场、小区管理等。本篇介绍FRID-RC522模块的使用。
1
RFID模块
RFID 技术利用无线射频方式在阅读器和射频卡之间进行非接触双向数据传输,以达到目标识别和数据交换的目的。
本实验使用的RFID-RC522模块采用MFRC522芯片,SPI通讯方式,支持Mifarel S50、S70 、Pro、Desfire等类型的卡,附带的白卡和钥匙扣是S50卡,每张卡都有自己的标识(UID)。
2
安装驱动库
Arduino有RC522驱动库,点击「项目」—「加载库」—「管理库」,查找选择「MFC522」最新版本进行安装。
安装库
3
实验材料
- Uno R3开发板
- 配套USB数据线
- 面包板及配套连接线
- RFID-RC522模块及配套S50白卡和异形卡
4
实验步骤
1.根据原理图搭建电路图。
RC522模块的3.3V、GND分别对应连接开发板的3.3V、GND,模块的MOSI、MISO、SCK分别连接开发板的SPI接口11、12、13,模块的SDA、RST分别连接开发板数字管脚10、9。
实验原理图如下图所示:
实验原理图
2. 新建sketch,拷贝如下代码替换自动生成的代码并进行保存。
1#include < SPI.h >
2#include < MFRC522.h >
3
4#define SS_PIN 10
5#define RST_PIN 9
6
7MFRC522 rfid(SS_PIN, RST_PIN);
8
9byte nuidPICC[4]; //存储读取的UID
10
11void setup() {
12 Serial.begin(9600);
13 SPI.begin();
14 rfid.PCD_Init();
15 Serial.println("RC522初始化完成...");
16}
17
18void loop() {
19 //搜索新卡
20 if ( ! rfid.PICC_IsNewCardPresent())
21 return;
22
23 // 验证NUID是否可读
24 if ( ! rfid.PICC_ReadCardSerial())
25 return;
26
27 MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
28
29 // 检查是否MIFARE卡类型
30 if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
31 piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
32 piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
33 Serial.println("不支持读取此卡类型");
34 return;
35 }
36
37 // 保存读取到的UID
38 for (byte i = 0; i < 4; i++) {
39 nuidPICC[i] = rfid.uid.uidByte[i];
40 }
41
42 Serial.print("十六进制UID:");
43 printHex(rfid.uid.uidByte, rfid.uid.size);
44 Serial.println();
45
46 Serial.print("十进制UID:");
47 printDec(rfid.uid.uidByte, rfid.uid.size);
48 Serial.println();
49
50 // 使放置在读卡区的IC卡进入休眠状态,不再重复读卡
51 rfid.PICC_HaltA();
52
53 // 停止读卡模块编码
54 rfid.PCD_StopCrypto1();
55}
56
57// 十六进制输出
58void printHex(byte *buffer, byte bufferSize) {
59 for (byte i = 0; i < bufferSize; i++) {
60 Serial.print(buffer[i] < 0x10 ? " 0" : " ");
61 Serial.print(buffer[i], HEX);
62 }
63}
64
65//十进制输出
66void printDec(byte *buffer, byte bufferSize) {
67 for (byte i =