在 Pi Pico 推出不久,英國的廠商 SB Components 推出一個 RFID 的擴充模組(Raspberry Pi Pico RFID Expansion),具有 125KHz 頻率的 RFID 讀取器,加上 0.91英寸 OLED 顯示器。如下圖:
本篇實作要瞭解一下 RFID 的模組 MFRC-522 如何與 Pi Pico 連接,當接收器感應到卡片靠近後,藉由讀取卡號判斷是否為授權的行為,最常見的應用是門禁卡、悠遊卡等都是一樣方式的應用。在實作的程式撰寫時,將卡號授權與否的判斷寫在程式中,如果卡號異動就要修改程式,非常不方便,在現實生活中,也不會這樣應用。這裡我們先瞭解 RFID 卡片讀取的方法,下一篇將繼續結合 SD Card 的讀取、寫入,再將兩篇的程式整合,事先將授權的卡號寫到檔案中,如果讀取比對有此卡號,就亮綠燈,反之,則亮紅燈表示該卡號沒有經過授權。
來源:thepihut.com
本篇實作要瞭解一下 RFID 的模組 MFRC-522 如何與 Pi Pico 連接,當接收器感應到卡片靠近後,藉由讀取卡號判斷是否為授權的行為,最常見的應用是門禁卡、悠遊卡等都是一樣方式的應用。在實作的程式撰寫時,將卡號授權與否的判斷寫在程式中,如果卡號異動就要修改程式,非常不方便,在現實生活中,也不會這樣應用。這裡我們先瞭解 RFID 卡片讀取的方法,下一篇將繼續結合 SD Card 的讀取、寫入,再將兩篇的程式整合,事先將授權的卡號寫到檔案中,如果讀取比對有此卡號,就亮綠燈,反之,則亮紅燈表示該卡號沒有經過授權。
[材料]
- Raspberry Pi Pico x1
- RFID-MFRC522模組 x1
- LED x 2個 (紅、綠各 1個)
- 220 歐姆電阻 x 2個
- 麵包版 x 1
- 連接線 n 條
[接線圖]
Pi 接腳 | RFID-MFRC522 | 其他 |
---|---|---|
Pin 36(3.3V) | VCC | - |
Pin 38(GND) | GND | - |
Pin 4(GP2) | SCK | - |
Pin 5(GP3) | MOSI | - |
Pin 6(GP4) | MISO | - |
Pin 1(GP0) | rst | - |
Pin 2(GP1) | SDA(cs) | - |
Pin 29(GP22) | - | 接220歐姆電阻後,再接綠色 LED(+) |
Pin 31(GP26) | - | 接220歐姆電阻後,再接紅色 LED(+) |
[程式一]
執行程式時,讀取卡片上的序號,再將序號寫入程式,判斷是否為授權的卡片,如為認可的卡號,則顯示綠燈,若為非經授權的卡片,則顯示紅燈。以下程式使用 SelectTagSN() 讀取卡片編號,並使用 uidToString 將讀取卡號的二進位轉成十六進位。from mfrc522 import MFRC522 from machine import Pin import utime green_led = Pin(22, Pin.OUT) red_led = Pin(26, Pin.OUT) # 將卡號由 2 進位轉換為 16 進位的字串 def uidToString(uid): mystring = "" for i in uid: mystring = "%02X" % i + mystring return mystring reader = MFRC522(spi_id=0,sck=2,miso=4,mosi=3,cs=1,rst=0) print("..... 請將卡片靠近感應器.....") try: while True: (stat, tag_type) = reader.request(reader.REQIDL) # 搜尋 RFID 卡片 if stat == reader.OK: # 找到卡片 (stat, uid) = reader.SelectTagSN() if stat == reader.OK: card_num = uidToString(uid) print(".....卡片號碼: %s" % card_num) if card_num == '7A811D60': green_led.value(1) # 讀到授權的卡號後點亮綠色 LED utime.sleep(2) # 亮 2 秒鐘 green_led.value(0) else: print(".....卡片錯誤.....") red_led.value(1) # 讀到非授權的卡號後點亮紅色 LED utime.sleep(2) # 亮 2 秒鐘 red_led.value(0) else: print(".....授權錯誤.....") except KeyboardInterrupt: print(".....Bye.....")
[程式二]
程式二使用 anticoll 讀取卡號,不同的是直接使用陣列方式將卡號從二進位轉成十六進位。因為轉換的方法不同,兩個程式顯示的卡號也不相同。from mfrc522 import MFRC522 from machine import Pin import utime buffer = 0x93 green_led = Pin(22, Pin.OUT) red_led = Pin(26, Pin.OUT) reader = MFRC522(spi_id=0,sck=2,miso=4,mosi=3,cs=1,rst=0) print("..... 請將卡片靠近感應器.....") try: while True: (stat, tag_type) = reader.request(reader.REQIDL) # 搜尋 RFID 卡片 if stat == reader.OK: # 找到卡片 (stat, uid) = reader.anticoll(buffer) # 讀取 RFID 卡號 if stat == reader.OK: card_num = "%02X%02X%02X%02X" % (uid[0], uid[1], uid[2], uid[3]) # 將卡號由 2 進位轉換為 16 進位的字串 print(".....卡片號碼: %s" % card_num) if card_num == '601D817A': green_led.value(1) # 讀到授權的卡號後點亮綠色 LED utime.sleep(2) # 亮 2 秒鐘 green_led.value(0) else: print(".....卡片錯誤.....") red_led.value(1) # 讀到非授權的卡號後點亮紅色 LED utime.sleep(2) # 亮 2 秒鐘 red_led.value(0) else: print(".....授權錯誤.....") except KeyboardInterrupt: print(".....Bye.....")
張貼留言