基于Arduino Uno和RFID-RC522的RFID卡号读取技术详解
基于Arduino Uno和RFID-RC522的RFID卡号读取技术详解
RFID(射频识别)技术因其非接触式、高效性和低成本的特点,广泛应用于门禁系统、物流管理和智能设备等领域。本文将通过Arduino Uno和MFRC522 RFID模块,手把手教你实现RFID卡号的读取,并提供完整的代码解析和硬件配置指南。
硬件介绍
Arduino Uno
Arduino Uno是一款基于ATmega328P微控制器的开源开发板,具备14个数字I/O引脚和6个模拟输入引脚,是快速原型开发的理想选择。其兼容性强,支持SPI、I2C等多种通信协议。
RFID-RC522模块
MFRC522是基于NXP芯片的RFID读卡器模块,支持ISO/IEC 14443A标准的RFID卡和标签。
- 工作频率:13.56 MHz
- 通信接口:SPI(默认)、I2C、UART
- 有效读取距离:3~5 cm
工作原理
RFID技术基础
RFID系统由读卡器(Reader)和标签(Tag)组成。读卡器通过天线发射电磁波激活标签,标签返回存储的数据(如唯一UID)。
- UID:每张RFID卡的唯一标识符(4~7字节)。
SPI通信协议
RC522模块默认使用SPI协议与Arduino通信。SPI的优点是高速、全双工,需要以下引脚:
- SCK(时钟)、MOSI(主机输出)、MISO(主机输入)、SS(片选)。
实现步骤
所需材料
- Arduino Uno ×1
- RFID-RC522模块 ×1
- RFID卡片或标签 ×1
- 杜邦线若干
硬件连接
按照下表连接Arduino与RC522模块:
RC522引脚 Arduino Uno引脚
SDA 10 (SS)
SCK 13
MOSI 11
MISO 12
GND GND
RST 9
3.3V 3.3V
注意事项:
- RC522必须使用3.3V电源,否则可能损坏模块!
- 确保SPI引脚(10~13)未被其他设备占用。
安装依赖库
在Arduino IDE中安装MFRC522库:
- 点击工具→管理库,搜索MFRC522。
- 选择最新版本并安装。
代码解析
完整代码
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 9 // 复位引脚
#define SS_PIN 10 // 片选引脚
MFRC522 mfrc522(SS_PIN, RST_PIN); // 创建RC522实例
void setup() {
Serial.begin(9600); // 初始化串口
SPI.begin(); // 初始化SPI总线
mfrc522.PCD_Init(); // 初始化RC522
delay(4); // 等待模块稳定
Serial.println("RFID Reader Ready!");
}
void loop() {
// 检测是否有新卡片
if (!mfrc522.PICC_IsNewCardPresent()) {
return;
}
// 读取卡片UID
if (!mfrc522.PICC_ReadCardSerial()) {
return;
}
// 输出UID到串口
Serial.print("Card UID:");
dumpByteArray(mfrc522.uid.uidByte, mfrc522.uid.size);
Serial.println();
// 停止卡片通信
mfrc522.PICC_HaltA();
}
// 辅助函数:以十六进制格式输出字节数组
void dumpByteArray(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}
实物展示:
通过串口监视器查看卡号:
关键代码解析
- 初始化阶段
- SPI.begin():启动SPI总线通信。
- mfrc522.PCD_Init():配置RC522的寄存器,使其进入工作状态。
- 卡片检测逻辑
- PICC_IsNewCardPresent():通过天线检测是否有新卡片进入磁场范围。
- PICC_ReadCardSerial():读取卡片的UID和SAK(选择应答)信息。
- UID输出
- uid.uidByte:存储卡片UID的字节数组(例如0x01 0xFE 0xA3 0x1B)。
- dumpByteArray():将字节数组转换为十六进制字符串,便于人类阅读。
应用场景
门禁系统
将合法卡片的UID存储在Arduino的EEPROM中,当读取到匹配的UID时,控制继电器打开电磁锁。
资产追踪
结合LCD屏幕和SD卡模块,记录RFID标签的扫描时间和位置。
交互式项目
制作一个“魔法书”道具,当特定RFID卡片靠近时,触发音效或灯光效果。
常见问题与解决
无法读取卡片
- 检查电源:确保RC522使用3.3V供电。
- 调整距离:卡片需贴近读卡器(<5cm)。
- 验证接线:重点检查SDA(SS)、SCK、MOSI、MISO是否接触良好。
串口输出乱码
- 确认串口波特率设置为9600。
- 检查是否有多个程序占用串口。
扩展多张卡片
在代码中添加UID比对逻辑:
byte authorizedUID[4] = {0x01, 0x02, 0x03, 0x04}; // 合法卡片UID
if (memcmp(mfrc522.uid.uidByte, authorizedUID, 4) == 0) {
Serial.println("Access Granted!");
}
通过本文,您已经掌握了使用Arduino Uno和RC522模块读取RFID卡号的核心技术。此项目不仅适合物联网入门学习,还可作为更复杂系统(如智能家居控制、仓储管理)的基础模块。下一步可以尝试结合Wi-Fi模块(如ESP8266)将UID数据上传到云端,或设计基于UID的个性化交互逻辑。
扩展学习建议:
- 研究MIFARE Classic 1K卡片的数据块读写
- 探索RFID与Web API的集成(如HTTP请求)