如何使用 Arduino 和 RFID 以及 RC522 模組

  • RFID 技術允許使用被動或主動標籤,透過射頻和唯一的 UID 來識別物體,而無需直接的視覺接觸。
  • RC522 模組基於 MFRC522 晶片,工作頻率為 13,56 MHz,支援 MIFARE Classic 板,主要透過 SPI 與 Arduino 通訊。
  • MIFARE Classic 1K 卡將其記憶體組織成磁區和區塊,具有 Key A/Key B 金鑰和存取條件,這些都必須了解和變更。
  • 透過將 MFRC522 庫與 Arduino 結合使用,可以實現諸如門禁控製或可充電交通卡等實用項目。

如何使用 Arduino 和 RFID:感測器和專案完整指南

如果你曾在超市自助結帳機前操作過,看到你把商品放在托盤上後,它們會自動顯示在螢幕上,那麼你已經見識過RFID技術了。這並非魔法或心靈感應:它是一種基於射頻的系統,無需直接接觸即可識別物體。你甚至可以用一個簡單的Arduino板和一個像RC522這樣價格低廉的讀卡機在家實現同樣的功能。

在本指南中,您將逐步學習如何使用 Arduino 和 RC522 RFID 閱讀器來讀寫標籤,了解 RFID 的本質、現有系統類型、無源卡的供電方式、MIFARE Classic 1K 卡的內存組織結構,以及如何構建實際項目,例如門禁系統或可充值交通卡。請做好準備,我們將深入探討主題,但將以清晰易懂的方式進行講解。

什麼是RFID技術?它是如何運作的?

無線射頻辨識(RFID)系統利用無線電波傳輸的唯一識別碼來辨識物體。此識別符通常稱為UID(唯一識別碼),可以理解為標籤的ID。整個系統由兩個主要部分組成:RFID標籤(或應答器)和RFID讀寫器(收發器)。

RFID標籤有多種形式:類似信用卡的塑膠卡、鑰匙圈、貼在產品上防止被盜的貼紙,甚至還有植入動物皮下用於識別的晶片。它們的內部組件基本上相同:天線和用於儲存資訊並與讀寫器通訊的小型晶片。

標籤分為唯讀標籤和讀寫標籤。只讀標籤的UID在出廠時已預先編程,無法修改;讀寫標籤則可以使用適當的讀卡機(例如RC522模組)進行讀寫操作。這使得儲值交通卡、預付費門禁系統、考勤系統等應用成為可能。

另一方面,我們還有RFID讀寫器或收發器。這種設備不僅接收數據,還會發射射頻電磁場。了解這個電磁場對於理解被動標籤的供電方式以及卡片和讀寫器之間如何交換資訊至關重要。

RFID標籤的供電和工作原理

一個很常見的問題是:如果超市商品上的RFID標籤或門禁卡沒有電池,它們從哪裡獲得能量來運作?關鍵在於,許多這類標籤是被動的,它們透過讀寫器產生的電磁場進行感應供電。

當被動標籤靠近讀寫器時,其天線會進入模組產生的電磁場(例如,RC522 的電磁場頻率為 13,56 MHz)。此電磁場會在標籤天線中感應出電流,用於瞬間為內部晶片供電。晶片「喚醒」後,會調變其發送回讀寫器的訊號(稱為反向散射),對 UID 以及(如果適用)儲存在記憶體中的其他資料進行編碼。

與紅外線等技術不同,標籤和讀取器之間不需要直接視線接觸:射頻可以穿透某些材料,儘管其行為取決於頻率、金屬、水等的存在。讀取器會擷取反向散射訊號,對其進行解釋,然後將資料傳送到微控制器(例如 Arduino、ESP8266 或 ESP32)或電腦。

根據頻率劃分的RFID系統類型

射頻頻譜非常寬廣,而且無線電波在不同頻率下的特性並不相同。因此,RFID技術會根據應用場景使用不同的頻段。讀寫器和標籤必須設計成在同一頻率下工作,就像收音機必須調到正確的電台一樣。

一般來說,我們可以根據RFID系統所使用的頻段,將其分為三大類:

  • 低頻 (LF):約 125-134 kHz。
  • 高頻(HF):約 13,56 MHz,其中包括 MIFARE 和 NFC 等技術。
  • 超高頻(UHF):大約在 433 MHz 到 860-960 MHz 之間。

低頻(LF)RFID系統

低頻RFID系統波長相對較長,因此能夠更好地穿透薄層材料和含水量高的物體,例如水果或飲料。它們在薄金屬附近也表現良好。

然而,這種優勢也伴隨著明顯的限制:典型範圍只有幾厘米,資料傳輸速率低,導致記憶體容量有限,標籤成本較高。這些系統通常用於簡單的門禁控制、老式近距離感應鑰匙和動物標記。

高頻(HF)RFID和NFC系統

13,56 MHz 的高頻段可能是「創客」和 DIY 專案中最受歡迎的頻段,因為 MIFARE 卡和NFC(近場通訊)技術就位於該頻段,許多手機都使用這種技術進行非接觸式支付。

高頻系統在金屬附近以及中高濕度環境下均能良好工作,在理想條件下,其有效範圍通常為幾厘米到一米左右。資料傳輸速率雖然不高,但足以滿足身分識別、存取和小規模資料傳輸等應用需求。許多全球標準都基於高頻技術,從而促進了設備和卡片的互通性。

超高頻(UHF)射頻識別系統

與此相反的是超高頻(UHF)系統,其傳輸距離從幾公分到20多公尺不等。當需要快速遠距離讀取大量標籤時,例如倉庫庫存管理、活動現場人數統計或運動員衝過終點線計時,超高頻系統是理想之選。

缺點是波長較短,訊號衰減較大,穿透金屬和水的能力也較弱。即便如此,它們仍廣泛應用於收費系統、停車場門禁管制和大規模物流追蹤。

RC522 RFID模組:特性與引腳

對於 Arduino 專案而言,最常用的讀卡機之一是基於 NXP MFRC522 晶片的 RC522。它是一款價格實惠且應用廣泛的模組,工作頻率高達 13,56 MHz,支援 MIFARE 卡,並允許對相容的標籤進行讀寫操作。

它通常以套裝形式出售,套裝內包含讀卡器、信用卡和RFID鑰匙圈。這些卡通常是1K或4K的MIFARE Classic卡,這是交通運輸、門禁控制和低成本解決方案中非常流行的標準。 RC522產生高頻電磁場,實際有效範圍約3-5厘米,理論上可以更遠。

在與微控制器通訊方面,RC522 主要透過SPI(串行外設介面)集成,支援高達 10 Mbps 的速度。它也支援 I2C 和 UART,但由於 SPI 在這種情況下速度更快、更簡單,因此大多數 Arduino 專案都使用 SPI。

此模組的電氣工作電壓範圍為 2,5V 至 3,3V。電路板上通常會有一個清晰標記的 VCC 引腳,用於連接 3,3V 電源。切勿直接使用 5V 電源供電,否則可能會損壞模組。值得一提的是,該模組的邏輯電平通常可以承受 5V 電壓,因此在進行基本測試時,無需電平轉換器即可將其連接到 Arduino UNO 的數位引腳。不過,在專業設計中,建議對電平進行轉換。

RC522模組的接腳連接

典型的RC522包含8個與微控制器連接接腳:

  • VCC電源電壓介於 2,5V 和 3,3V 之間。
  • RST:重設引腳;允許透過將電平設定為 LOW/HIGH 來關閉和重新啟動模組。
  • GND地球的質量或參考物。
  • IRQ:中斷引腳,當標籤進入讀卡機區域時,可以向微控制器發出警報。
  • MISO / SCL / TX多功能引腳;例如 SPI 中的 MISO、I2C 中的 SCL 或 UART 中的 TX。
  • 摩西:SPI 中主設備到從設備的輸出資料線。
  • SCK:SPI介面時脈。
  • SS / SDA / RX:SPI 中的從機選擇引腳,I2C 中的 SDA 或 UART 中的 RX。

在 Arduino UNO 和其他基於 ATmega328P 的開發板上,SPI 引腳已由硬體定義,因此使用 SPI 的典型連接圖如下:

  • VCC → 來自 Arduino 的 3,3V 電壓。
  • GND → Arduino GND。
  • SCK → UNO/Nano 上的第 13 腳。
  • 摩西 → UNO/Nano 上的第 11 腳。
  • 味噌 → UNO/Nano 上的第 12 腳。
  • SS(基督復臨安息日會) → 腳位 10(或您選擇的 SS 引腳,但您必須在程式碼中指定它)。
  • RST → 例如,Arduino 腳位 9。
  • IRQ → 可選,如果未使用中斷,則可以不連線。

在 Arduino Mega、Leonardo 或 Micro 等開發板上,SPI 線可能位於不同的引腳或 ICSP 連接器上,因此在進行任何接線之前,請務必查看官方文件中的等效表。

安裝 MFRC522 庫和基本標籤讀取

雖然 MFRC522 可以從頭開始編程,但其內部通訊相當複雜,因此通常的做法是使用Miguel Balboa 開發的函式庫,可在 GitHub 和 Arduino IDE 的庫管理器中找到。此程式庫封裝了初始化讀卡機、偵測卡片、驗證磁區以及讀寫資料區塊所需的所有操作。

要從 Arduino IDE 安裝它,只需打開庫管理器,搜尋“MFRC522”,然後選擇社區維護的版本(GitHub Community)。您還需要包含 SPI 庫,該庫已包含在 IDE 中。

安裝完成後,讀取標籤 UID 的典型流程(簡單範例)如下:

  • 包括書店 SPI.hy MFRC522.h.
  • 定義讀卡機將使用的 RST 和 SS 引腳。
  • 透過傳遞這些引腳來建立一個 MFRC522 物件。
  • 在 setup() 函數中,初始化 Serial、SPI 和讀卡機。 PCD_Init().
  • 在 loop() 中,使用 PICC_IsNewCardPresent() 看看附近是否有卡片 PICC_ReadCardSerial() 讀取您的基本資料。
  • 使用以下方式存取 UID mfrc522.uid.uidByte 並使用 mfrc522.uid.size 來設定大小。
  • 致電結束與唱片公司的溝通。 PICC_HaltA().

這種類型的草圖非常適合獲取多張卡片或鑰匙圈的 UID並進行快速測試,例如,對於簡單的存取控制,只需將讀取的 UID 與授權 UID 清單進行比較即可。

MIFARE Classic 1K 卡的記憶體結構

RC522 通常配備的卡片是MIFARE Classic 1K卡。這些卡提供 1 KB 的內存,按扇區和區塊進行分層組織,並具有相當特殊的密鑰和權限系統,在寫入任何內容之前應該了解該系統。

總記憶體被劃分為 16 個磁區,編號從 0 到 15。每個磁區包含 4 個資料區塊,磁區內的資料區塊編號從 0 到 3。每個資料區塊儲存16 位元組的數據,即 16 個編號為 0 到 15 的位置,因此每個磁區提供 64 位元組的儲存空間。

每個磁區包含四個資料區塊,其中只有三個用於儲存使用者資料:每個磁區的第 0、1 和 2 區塊(磁區 0 除外,它具有特殊特性)。每個磁區的最後一個資料塊,即第 3 塊,被稱為尾部資料塊。它儲存加密金鑰和存取位,用於控制該磁區允許的操作。

在預告片中,這 16 個位元組被分割如下:

  • 圖A:6 位元組。
  • 准入條件:3 個位元組,用於定義讀取/寫入權限、身份驗證和金鑰可見性。
  • 未使用的位元組 (U):1 個未使用的位元組。
  • 關鍵 B:6 位元組。

出廠時模組自帶的卡片通常會將金鑰 A 和金鑰 B 初始化為 FF FF FF FF FF FF,這極不安全,因為任何了解該標準的人都可以驗證並修改卡片內容。在 DIY 專案中,比較常見的做法是在所有磁區使用相同的金鑰,但為了真正的安全,最好使用不同的金鑰。

此外,第 0 區的第 0 個資料區塊比較特殊:它儲存卡片的唯一識別碼(在這些 MIFARE Classic 卡中通常為 4 個位元組)和製造商資料。實際上,該資料塊被視為唯讀;嘗試修改它可能會永久損壞卡片。

更改磁區中的密鑰 A 和密鑰 B

如果你想在 Arduino 和 RC522 專案中有效地使用 MIFARE 卡,首先應該做的就是更改預設金鑰。這樣可以防止任何擁有讀卡機和標準庫的人未經授權竄改你的卡。

更新特定磁區(例如,磁區 15)金鑰的基本想法如下:

  • 在程式碼中定義目前鍵(如果未更改,則使用出廠預設值)。
  • 確定您希望在該領域使用的新關鍵字 A 和關鍵字 B。
  • 計算該扇區的拖車區塊編號,即 扇區 * 4 + 3 (適用於第 15 區,第 63 街區)。
  • 首先使用目前金鑰 A 進行身份驗證 PCD_Authenticate() 關於拖車模組。
  • 閱讀預告片部分 MIFARE_Read() 獲取您的內容。
  • 修改緩衝區中與新鍵對應的位元組。
  • 如有必要,請再次進行身份驗證(例如,使用金鑰 B)。
  • 寫入更新後的尾部程式碼區塊 MIFARE_Write().

在此過程中,請務必在操作完成前不要將卡片從讀卡機中移開,因為中斷對尾部區塊的寫入可能會導致該磁區無法存取。金鑰變更後,您還需要更新 Arduino 程式碼,以便在將來對該磁區進行操作時使用這些新金鑰。

閱讀與寫作障礙:模擬交通卡

MIFARE Classic 讀寫功能的一個很好的應用範例是模擬可充值公共交通卡的行為。原理很簡單:卡片在一個特定的區塊中儲存若干行程,系統允許您加載行程(充值)或使用這些行程(上車或上電車時進行驗證)。

為此,例如,可以將第 15 扇區預留用於用戶數據,並使用其中的一個數據塊(例如,第 60 塊)來儲存行程計數器。可用行程數儲存在該資料區塊的第 0 個位元組中。該資料區塊的其餘位元組可以用於其他數據,也可以留空。

重新載入部分的典型程式碼流程如下:

  • 確定 圖A和圖B 現行保護相關行業的法規(例如,我們在上一步中修改的法規)。
  • 定義扇區號、資料塊(60)和尾部塊(63)。
  • 宣告一個 16 位元組陣列(blockData),其中第一個位元組表示行程次數。
  • 每次將卡片靠近讀卡機時, 讀取第 60 區塊 使用 MIFARE_Read() 取得目前行程。
  • 將充電次數(例如 10 次)加到讀取的值上。
  • 更新數據。根據新的行程數量設定路段。
  • 使用金鑰 A 對對應的尾部代碼區塊進行身份驗證。
  • 用以下方式寫入第 60 塊 MIFARE_Write().
  • 請再次閱讀以確認該值已正確更新。

對於行程消耗部分(公車上的驗證),程式碼幾乎完全相同,只是計數器不是加一,而是減一。減一之前,它會檢查讀取的值是否為零:如果沒有剩餘行程,則拒絕存取並提示使用者重新載入。如果計數器大於零,則減一,重寫該程式碼區塊,並在螢幕上顯示剩餘行程數。

在這兩種情況下,正確處理 MFRC522 庫函數的返回碼(例如,身份驗證或寫入錯誤)非常重要,並且始終在每個週期結束時使用 PCD_StopCrypto1() 停止加密通信,並使用 PICC_HaltA() 停止卡本身的加密通信。

基於UID的簡單存取控制

另一個使用 RC522 和 Arduino 的經典項目是基本的門禁系統,它根據所展示電路板的 UID 來決定是否允許進入。這種方法不使用電路板的內部記憶體,而只使用其唯一標識符,因此安全性相當有限,但它可以作為一個簡單的範例。

通常的做法是:

  • 使用基本函式庫函數(PICC_IsNewCardPresent、PICC_ReadCardSerial 等)讀取卡 UID。
  • 將讀取的 UID 的位元組複製到臨時數組(例如 ActualUID)。
  • 在程式碼中定義幾個數組,其中包含已授權卡的 UID(例如,User1、User2)。
  • 建立一個位元組數組比較函數,該函數返回 如果兩者相同,則為真。.
  • 將 ActualUID 與每個授權的 UID 進行比較,如果存在匹配項,則啟動數位輸出、顯示「存取已授予」訊息或啟動電子鎖。
  • 如果與任何匹配項都不匹配,則顯示“訪問被拒絕”並保持系統關閉。

在實際環境中,這種系統容易受到標籤複製攻擊,因為許多廉價讀卡機允許複製或模擬UID。為了提高安全性,需要使用卡片的內部記憶體、自訂金鑰,以及可能比MIFARE Classic更強大的加密機制——MIFARE Classic的安全性目前備受質疑。即便如此,它仍然是學習讀卡工作流程以及如何與實體執行器整合的絕佳教學範例。

透過以上內容,您現在已經牢固掌握了RFID的基本概念,了解不同頻段的特性,了解MIFARE Classic 1K卡的內部工作原理,掌握了RC522模組與Arduino的基本連接和使用方法,並且詳細了解瞭如何讀寫模組來創建實際應用系統,例如門禁系統或交通卡系統。接下來,自然而然地,您可以將RFID與其他模組(例如LCD螢幕、繼電器、Wi-Fi、雲端資料庫)結合使用,並學習如何控制智慧燈泡,從而建立更全面的解決方案,使其更接近您每天在商店、公共交通和非接觸式支付設備中看到的專業系統。

如何在 Windows 11 中審核應用程式權限
相關文章:
如何在 Windows 11 中審核和控制應用程式權限

在 Google 中將其新增為首選來源