Raspberry Pi Pico筆記(13):RFID讀取並控制LED燈號

在 Pi Pico 推出不久,英國的廠商 SB Components 推出一個 RFID 的擴充模組(Raspberry Pi Pico RFID Expansion),具有 125KHz 頻率的 RFID 讀取器,加上 0.91英寸 OLED 顯示器。如下圖:
來源: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.....")


[結果]



[參考資料]

Post a Comment

較新的 較舊