射頻識別「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 =