当前位置: 首页 > article >正文

基于 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 引脚
SDA10 (SS)
SCK13
MOSI11
MISO12
GNDGND
RST9
3.3V3.3V

注意事项

  • RC522 必须使用 3.3V 电源,否则可能损坏模块!

  • 确保 SPI 引脚(10~13)未被其他设备占用。

3.3 安装依赖库

在 Arduino IDE 中安装 MFRC522 库

  1. 点击 工具 → 管理库,搜索 MFRC522

  2. 选择最新版本并安装。


第四部分:代码解析

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 关键代码解析

  1. 初始化阶段

    • SPI.begin():启动 SPI 总线通信。

    • mfrc522.PCD_Init():配置 RC522 的寄存器,使其进入工作状态。

  2. 卡片检测逻辑

    • PICC_IsNewCardPresent():通过天线检测是否有新卡片进入磁场范围。

    • PICC_ReadCardSerial():读取卡片的 UID 和 SAK(选择应答)信息。

  3. 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 开发之旅提供扎实的起点!如有疑问,欢迎在评论区留言讨论!

 


http://www.kler.cn/a/521348.html

相关文章:

  • 深度学习模型架构演进:从RNN到新兴技术
  • 数据结构——查找算法和排序算法
  • 【C++】std::prev用法
  • ubuntu下编译openjdk17,依赖的包名有所不同
  • 基于 RAMS 的数据驱动建模与应用实践:从理论到具体操作
  • 1.26 实现文件拷贝的功能
  • 我的2024年年度总结
  • 自然元素有哪些选择?
  • K8S部署DevOps自动化运维平台
  • Arouter详解・常见面试题
  • deepseek各个版本及论文
  • WPS数据分析000007
  • ArcGIS安装动物家域分析插件HRT的方法
  • 为AI聊天工具添加一个知识系统 之72 详细设计之13 图灵机
  • Level DB --- TableBuilder
  • C 或 C++ 中用于表示常量的后缀:1ULL
  • C++从入门到实战(二)C++命名空间
  • 【信息系统项目管理师-选择真题】2016上半年综合知识答案和详解
  • 第三十一周学习周报
  • 计算机图形学试题整理(期末复习/闭or开卷/>100道试题/知识点)