基于 Arduino Uno 和 RFID-RC522 的 RFID 卡号读取技术详解
引言
射频识别(RFID)技术因其非接触式、高效性和低成本的特点,广泛应用于门禁系统、物流管理和智能设备等领域。本文将通过 Arduino Uno 和 MFRC522 RFID 模块,手把手教你实现 RFID 卡号的读取,并提供完整的代码解析和硬件配置指南。
第一部分:硬件介绍
1.1 Arduino Uno
Arduino Uno 是一款基于 ATmega328P 微控制器的开源开发板,具备 14 个数字 I/O 引脚和 6 个模拟输入引脚,是快速原型开发的理想选择。其兼容性强,支持 SPI、I2C 等多种通信协议。
1.2 RFID-RC522 模块
MFRC522 是基于 NXP 芯片的 RFID 读卡器模块,支持 ISO/IEC 14443A 标准的 RFID 卡和标签。
-
工作频率:13.56 MHz
-
通信接口:SPI(默认)、I2C、UART
-
有效读取距离:3~5 cm
第二部分:工作原理
2.1 RFID 技术基础
RFID 系统由读卡器(Reader)和标签(Tag)组成。读卡器通过天线发射电磁波激活标签,标签返回存储的数据(如唯一 UID)。
-
UID:每张 RFID 卡的唯一标识符(4~7 字节)。
2.2 SPI 通信协议
RC522 模块默认使用 SPI 协议与 Arduino 通信。SPI 的优点是高速、全双工,需要以下引脚:
-
SCK(时钟)、MOSI(主机输出)、MISO(主机输入)、SS(片选)。
第三部分:实现步骤
3.1 所需材料
-
Arduino Uno ×1
-
RFID-RC522 模块 ×1
-
RFID 卡片或标签 ×1
-
杜邦线若干
3.2 硬件连接
按照下表连接 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)未被其他设备占用。
3.3 安装依赖库
在 Arduino IDE 中安装 MFRC522 库:
-
点击
工具
→管理库
,搜索MFRC522
。 -
选择最新版本并安装。
第四部分:代码解析
4.1 完整代码
#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);
}
}
实物展示 :
通过串口监视器查看卡号:
4.2 关键代码解析
-
初始化阶段
-
SPI.begin()
:启动 SPI 总线通信。 -
mfrc522.PCD_Init()
:配置 RC522 的寄存器,使其进入工作状态。
-
-
卡片检测逻辑
-
PICC_IsNewCardPresent()
:通过天线检测是否有新卡片进入磁场范围。 -
PICC_ReadCardSerial()
:读取卡片的 UID 和 SAK(选择应答)信息。
-
-
UID 输出
-
uid.uidByte
:存储卡片 UID 的字节数组(例如0x01 0xFE 0xA3 0x1B
)。 -
dumpByteArray()
:将字节数组转换为十六进制字符串,便于人类阅读。
-
第五部分:应用场景
5.1 门禁系统
将合法卡片的 UID 存储在 Arduino 的 EEPROM 中,当读取到匹配的 UID 时,控制继电器打开电磁锁。
5.2 资产追踪
结合 LCD 屏幕和 SD 卡模块,记录 RFID 标签的扫描时间和位置。
5.3 交互式项目
制作一个“魔法书”道具,当特定 RFID 卡片靠近时,触发音效或灯光效果。
第六部分:常见问题与解决
6.1 无法读取卡片
-
检查电源:确保 RC522 使用 3.3V 供电。
-
调整距离:卡片需贴近读卡器(<5cm)。
-
验证接线:重点检查 SDA(SS)、SCK、MOSI、MISO 是否接触良好。
6.2 串口输出乱码
-
确认串口波特率设置为 9600。
-
检查是否有多个程序占用串口。
6.3 扩展多张卡片
在代码中添加 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 请求)
希望本文能为您的 IoT 开发之旅提供扎实的起点!如有疑问,欢迎在评论区留言讨论!