Arduino提高篇19—RFID模塊的使用

射頻識別「Radio Frequency IDentification,簡稱RFID」技術,又稱爲無線射頻識別,是一種通信技術,可通過無線電訊號識別特定目標並讀寫相關數據,而無需識別系統與特定目標之間建立機械或光學接觸,普遍應用於企業/校園一卡通、公交儲值卡、高速公路收費、停車場、小區管理等。本篇介紹FRID-RC522模塊的使用。

1. RFID模塊

RFID 技術利用無線射頻方式在閱讀器和射頻卡之間進行非接觸雙向數據傳輸,以達到目標識別和數據交換的目的。

  • 標籤(Tag,即射頻卡),耦合元件及芯片組成,標籤含有內置天線,用於和射頻天線間進行通信。
  • 閱讀器:讀取(在讀寫卡中還可以寫入)標籤信息的設備。
  • 天線:在標籤和讀取器間傳遞射頻信號。

本實驗使用的RFID-RC522模塊採用MFRC522芯片,SPI通訊方式,支持Mifarel S50、S70 、Pro、Desfire等類型的卡,附帶的白卡和鑰匙扣是S50卡,每張卡都有自己的標識(UID)。

RFID模塊

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,拷貝如下代碼替換自動生成的代碼並進行保存。

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9

MFRC522 rfid(SS_PIN, RST_PIN);

byte nuidPICC[4]; //存儲讀取的UID

void setup() {
  Serial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();
  Serial.println("RC522初始化完成...");
}

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;
  }

  // 保存讀取到的UID
  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);
  }
}

3. 連接開發板,設置好對應端口號和開發板類型,進行程序下載。

程序下載

5. 實驗現象

打開串口監視器,波特率設置成與程序中相一致的9600。將卡靠近模塊天線感應區,可讀出卡片ID。

實驗現象


關注公衆號「TonyCode」,回覆「1024」獲取1000G學習資料。
個人博客
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章