如何將RFID閱讀器與Raspberry Pi Pico一起使用
RFID 卡和標簽無(wú)處不在!我們在建筑物中使用它們進(jìn)行訪(fǎng)問(wèn)控制。打印機和復印機可以使用它們來(lái)識別工作人員。牲畜標簽和寵物識別標簽都使用一種 RFID 形式。讀取 RFID 設備的技術(shù)很便宜,大約 5 美元就可以買(mǎi)到閱讀器,而 4 美元,Raspberry Pi Pico 可以從卡/標簽中讀取 ID。
本文引用地址:http://dyxdggzs.com/article/202503/467963.htm(圖片來(lái)源:Tom's Hardware)
在此作方法中,我們將學(xué)習如何使用 MFRC522 閱讀器和 Raspberry Pi Pico 讀取 RFID 標簽和卡,目標是創(chuàng )建一個(gè)虛構的 RFID 門(mén)禁系統,該系統允許用戶(hù)進(jìn)入建筑物,或提醒安全人員將其移除。在我們這樣做之前,我們需要識別我們的卡/標簽的 ID。本作指南的第一部分將執行此作,然后我們將插入一些代碼來(lái)控制兩個(gè) LED 以模擬鎖定機制。
為此,您將需要
運行 MicroPython 的 Raspberry Pi Pico
MFRC522 RFID 閱讀器
大型面包板
11 x 公對公跳線(xiàn)
綠色 LED
紅燈 LED
2 x 100 歐姆電阻器(棕色 - 黑色 - 棕色 - 金色)
構建硬件
(圖片來(lái)源:Tom's Hardware)
硬件構建分為兩個(gè)部分。首先是 MFRC522 RFID 閱讀器的接線(xiàn)。讀取器使用 SPI 與 Raspberry Pi Pico 通信,它需要 7 個(gè)引腳才能做到這一點(diǎn)。兩個(gè)用于電源(3.3V 和 GND),其余用于 SPI。
MFRC522 | Raspberry Pi Pico | Wire Color |
---|---|---|
SDA | GP1 | 藍 |
SCK | GP2 | 橙 |
MOSI | GP3 | 紫色 |
醬 | GP4 | 藍 |
接地 | 任何 GND | 黑 |
RST | GP0 | 白 |
3.3 | 3V3 輸出(物理引腳 36) | 紅 |
(圖片來(lái)源:Tom's Hardware)
其次是我們的輸出。要查看是否顯示了正確的卡,我們需要添加兩個(gè) LED。紅色表示 RFID 卡不正確,綠色表示卡正確。LED 連接到 GPIO 引腳,我們控制該引腳以打開(kāi)/關(guān)閉 LED,并通過(guò) 100 歐姆電阻器連接到任何可用的 GND 引腳。您可以使用 220 或 330 歐姆的電阻器,我的辦公桌上恰好有一些 100 歐姆的電阻器。需要找出正確的電阻器嗎?我們?yōu)槟鷾蕚淞艘环葜改希?/p>
標題單元格 - 列 0 | Raspberry Pi Pico | Wire Color |
---|---|---|
紅色 LED 陽(yáng)極 (+) | GP14 | 紅 |
紅色 LED 陰極 (-) | 任何 GND | 黑 |
綠色 LED 陽(yáng)極 (+) | GP15 系列 | 綠 |
綠色 LED 陰極 (-) | 任何 GND | 黑 |
(圖片來(lái)源:Tom's Hardware)
在繼續之前,請檢查您的接線(xiàn)是否正確。
安裝 RFID 讀取器軟件
MFRC522 是一個(gè)簡(jiǎn)單的 RFID 閱讀器,為了使其更簡(jiǎn)單,我們使用了一個(gè) MicroPython 模塊,該模塊將縮短使用閱讀器的工作。pico-rfid 模塊來(lái)自 Tom 的 Hardware 的朋友 Kevin McAleer,基于 Danjperron 的工作。
1. 將 Raspberry Pi Pico 連接到計算機,然后打開(kāi) Thonny。我們假設您已經(jīng)知道如何設置 Raspberry Pi Pico。如果沒(méi)有,我們有方便的指南。
2. 創(chuàng )建一個(gè)新的空白文件,并將此鏈接的內容復制到空白文件中。然后將其作為 mfrc522.py 保存到 Raspberry Pi Pico。這是 Python 模塊/庫,它將使我們的代碼能夠與 RFID 閱讀器通信。
編寫(xiě)項目代碼
完成所有設置后,我們現在開(kāi)始對項目進(jìn)行編碼。為此,我們將再次使用 Thonny,并編寫(xiě)代碼來(lái)檢查提供給閱讀器的任何 RFID 卡的 ID。對于第一部分,我們需要記下 ID,因為稍后我們將將其與條件測試一起使用,該測試檢查 ID 是否與硬編碼值匹配,然后它將允許輸入。如果沒(méi)有,那么我們將收到 ACCESS DENIED 消息。
1. 在 Thonny 中創(chuàng )建新的空白文件。
2. 導入三個(gè)模塊(庫),用于使用 MFRC522 RFID 閱讀器、控制代碼的速度以及使用 GPIO。
from mfrc522 import MFRC522 import utime from machine import Pin
3. 創(chuàng )建一個(gè)對象 reader 來(lái)告訴代碼 RFID reader 的連接位置。
reader = MFRC522(spi_id=0,sck=2,miso=4,mosi=3,cs=1,rst=0)
4. 為紅色和綠色 LED 創(chuàng )建兩個(gè)對象,告訴代碼 LED 的連接位置以及它們是我們想要將電流發(fā)送到的輸出設備。
red = Pin(14, Pin.OUT) green = Pin(15, Pin.OUT)
5. 向用戶(hù)寫(xiě)一條短消息,指示他們向讀者出示卡片。 “n” 是 Python 的語(yǔ)法,用于在 print() 函數的末尾引入新行。
print("Present the card to the readern")
6. 創(chuàng )建一個(gè)名為 “PreviousCard” 的列表,并在其中存儲值 0。我們稍后將使用此列表來(lái)存儲當前卡 ID。
PreviousCard = [0]
7. 創(chuàng )建一個(gè) while True 循環(huán)以持續運行其中的代碼。
while True:
8. 初始化讀取器,使其可供使用。
reader.init()
9. 創(chuàng )建一個(gè)元組來(lái)存儲讀取器狀態(tài)和 RFID 標簽類(lèi)型。
(stat, tag_type) = reader.request(reader.REQIDL)
10. 如果讀卡器準備好了,if 條件將讀取卡的內容。然后,它將使用卡片中的詳細信息更新 stat 和 uid 對象。
if stat == reader.OK: (stat, uid) = reader.SelectTagSN()
11. 如果卡片的 uid 與 PreviousCard 對象中存儲的值相同,則代碼將繼續。當同一張卡重復顯示給讀者時(shí),就會(huì )發(fā)生這種情況。
if uid == PreviousCard: continue
12. 創(chuàng )建一個(gè) if 條件語(yǔ)句以檢查卡讀取是否正常。
if stat == reader.OK:
13. 向用戶(hù)打印一條消息,然后將卡片的 UID 存儲到一個(gè)名為 “card” 的對象中。然后將卡詳細信息打印到 Python shell。
print("The card details are as follows") card = reader.tohexstring(uid) print(card)
14. 使用顯示的卡的 uid 更新 PreviousCard 對象。
PreviousCard = uid
15. 創(chuàng )建一個(gè) else 條件,該條件將在沒(méi)有卡片時(shí)運行。更新 PreviousCard 對象。然后在 main 循環(huán)重復之前向代碼添加 50ms 的暫停。
else: PreviousCard=[0] utime.sleep_ms(50)
16. 將代碼作為 reader.py 保存到 Raspberry Pi Pico,然后單擊 Run >> Run Current Script(或按綠色的播放按鈕)。按照說(shuō)明將 RFID 卡/標簽出示給讀卡器。
17. 復制整個(gè)卡詳細信息,這是 RFID 卡的 uid,我們將在此作方法的下一部分需要它。 uid 看起來(lái)像這樣,你的 uid 會(huì )有所不同。
[0x04, 0xBC, 0xA0, 0x9A, 0xB3, 0x43, 0x80]
完整代碼列表
from mfrc522 import MFRC522 import utime from machine import Pin reader = MFRC522(spi_id=0,sck=2,miso=4,mosi=3,cs=1,rst=0) red = Pin(14, Pin.OUT) green = Pin(15, Pin.OUT) print("Present the card to the readern") PreviousCard = [0] while True: reader.init() (stat, tag_type) = reader.request(reader.REQIDL) if stat == reader.OK: (stat, uid) = reader.SelectTagSN() if uid == PreviousCard: continue if stat == reader.OK: print("The card details are as follows") card = reader.tohexstring(uid) print(card) PreviousCard = uid else: PreviousCard=[0] utime.sleep_ms(50)
我們已經(jīng)有了代碼,現在我們需要告訴項目代碼我們想要使用該代碼來(lái)授予我們訪(fǎng)問(wèn)權限,并點(diǎn)亮綠色 LED。如果向讀卡器出示另一張卡/標簽,則紅色 LED 將亮起。
1. 在這兩行之間,創(chuàng )建新的代碼行。
print(card) NEWCODE GOES HERE PreviousCard = uid
2. 創(chuàng )建一個(gè) if 條件來(lái)檢查卡的 uid。請注意,它看起來(lái)像一個(gè) Python 列表,但實(shí)際上它是以字符串形式存儲的,因此我們需要將值包裝在 “ ” 中。不要忘記 [ ] 括號。
if card == "[0x04, 0xBC, 0xA0, 0x9A, 0xB3, 0x43, 0x80]":
3. 如果存儲在 card 對象中的值與硬編碼值匹配,則向 Python shell 打印“ACCESS GRANTED”。
print("ACCESS GRANTED")
4. 創(chuàng )建一個(gè) for 循環(huán)以打開(kāi)/關(guān)閉綠色 LED 十次,每次狀態(tài)變化之間有 0.1 秒的間隔。在 for 循環(huán)結束時(shí)關(guān)閉綠色 LED。
for i in range(10): green.toggle() utime.sleep(0.1) green.off()
5. 當無(wú)法識別的卡片/標簽呈現給讀者時(shí),請使用 else 條件。 這將像綠色 LED 一樣打開(kāi)和關(guān)閉紅色 LED。
else: print("ACCESS DENIED") for i in range(10): red.toggle() utime.sleep(0.1) red.off()
6 .將代碼另存為 Raspberry Pi Pico reader.py。單擊 Run >> Run Current Script(或按綠色的播放按鈕)。按照說(shuō)明將 RFID 卡/標簽出示給讀卡器。如果卡正確無(wú)誤,則綠色 LED 將閃爍,并且 Python shell 將打印 “ACCESS GRANTED”。嘗試另一個(gè) RFID 卡/標簽,這應該會(huì )使紅色 LED 亮起,并且 Python shell 將打印“ACCESS DENIED”
完整代碼列表
from mfrc522 import MFRC522 import utime from machine import Pin reader = MFRC522(spi_id=0,sck=2,miso=4,mosi=3,cs=1,rst=0) red = Pin(14, Pin.OUT) green = Pin(15, Pin.OUT) print("Present the card to the readern") PreviousCard = [0] while True: reader.init() (stat, tag_type) = reader.request(reader.REQIDL) if stat == reader.OK: (stat, uid) = reader.SelectTagSN() if uid == PreviousCard: continue if stat == reader.OK: print("The card details are as follows") card = reader.tohexstring(uid) print(card) if card == "[0x04, 0xBC, 0xA0, 0x9A, 0xB3, 0x43, 0x80]": print("ACCESS GRANTED") for i in range(10): green.toggle() utime.sleep(0.1) green.off() else: print("ACCESS DENIED") for i in range(10): red.toggle() utime.sleep(0.1) red.off() PreviousCard = uid else: PreviousCard=[0] utime.sleep_ms(50)
評論