本課程旨在展示何將RFID讀卡器和執行器與Raspberry Pi整合在一起。基於本文討論的基本原理,我們還會製造一個RFID狗門。
在本課程中,我將介紹如何將RC522 RFID模組與Raspberry Pi機板整合在一起。我還將展示如何整合一個執行器(本例中是一個LED),來響應RFID模組的正確讀取資訊。該執行器可以是電磁鎖、揚聲器,甚至可以是記錄資料的Web介面。我還會介紹如何利用此設計實現一個RFID狗門。
物品 | 連結 |
---|---|
Raspberry Pi 3 | Raspberry Pi 連結 |
RC522 RFID 模組 | RFID 模組連結 |
HDMI 線 | HDMI 線連結 |
LED | Adafruit LED連結 |
滑鼠 + 鍵盤 | 鍵盤/滑鼠的Amazon連結 |
顯示器 / 電視機 | 任何帶有HDMI介面的電視機或顯示器 |
跳線 | 跳線的Amazon連結 |
Micro USB 資料線 | Micro USB資料線的Amazon連結 |
麵包板 | 麵包板的Amazon連結 |
1.設計電路
我一直喜歡使用開源的原理圖繪製和PCB佈線軟體Fritzing來製作接線圖(圖1:執行器為LED的電路原理圖)。您可以透過以下連結(可選)下載Fritzing:http://fritzing.org/home/。
第一張原理圖是我正在製作的以LED作為執行器的電路。當RFID模組產生正確讀取訊號,LED會亮起。
第二個電路中的執行器是一個電磁鎖。這個電路用於實現門鎖和狗門設計。TIP120是一款達林頓功率電晶體陣列。它只允許Raspberry Pi控制電磁鎖,電磁鎖所需功率比Paspberry Pi的GPIO埠的輸出還要大。
RC522 RFID模組使用SPI(序列週邊介面匯流排)連接到Raspberry Pi。SPI匯流排在嵌入式系統中應用相當普遍。讀卡器應根據下表進行接線。
RC522 Pin | Raspberry Pi 引腳 | 導線顏色 |
---|---|---|
3.3V | 引腳 1 | 紅 |
RST | 引腳 22 | 橙 |
GND | 引腳 6 | 黑 |
MISO | 引腳 21 | 白 |
MOSI | 引腳 19 | 灰 |
SCK | 引腳 23 | 綠 |
SDA | 引腳 24 | 藍 |
我將執行器(一個LED)連接到了Raspberry Pi的引腳18。你也應該連接這個引腳。
2.編寫代碼
a.啟用SPI
第一步是在Raspberry Pi上啟用SPI。為此,請打開命令列視窗並輸入sudoraspi-config。系統會彈出Configuration Menu。選擇功能表5“Interfacing Options”。現在選擇“P4 SPI”。當系統問你是否要啟用SPI介面時,選擇“Yes”。配置功能表將顯示“The SPI interface is enabled.”。要完成SPI的啟用,請打開命令列端子並輸入命令sudo reboot。Raspberry Pi會重啟,從而完成SPI啟用。
b.安裝套裝軟體
我們要用的程式館是用Python 2編寫的,不是Python 3。因此,第一步是安裝Python 2.7。請輸入sudo apt-get install python2.7-dev完成該操作。SPI PY程式館負責與RC522模組通信。我透過鍵入命令git clone https://github.com/lthiery/SPI-Py.git 來克隆這個程式館。然後安裝該程式館。首先,透過鍵入cd SPI-Py進入SPI-Py目錄。然後鍵入sudo python setup.py install安裝程式館。
c.添加到Read.py
Read.py腳本需要更改才能與RC522模組對話。編輯此腳本時,請滾動到腳本底部,然後加入注釋“Authenticate”。本課程不涉及RFID的身份驗證。確保在腳本頭添加時間程式館。接下來找到標題為“#Configure LED Output Pin”的部分。這裡是你配置執行器的地方。如果要將該設計應用於狗門,那麼應將輸出引腳配置到電磁鎖。
接下來找到標題為“#Check to see if card UID read matches your card UID.”的部分。該If/Else語句檢查讀卡器從卡上讀取的UID與您之前保存在腳本中的UID是否匹配,如果UID匹配,則執行器的輸出為高。
3.運行代碼
a. 獲取UID
首次運行腳本時,您需要獲取卡的UID。RFID卡的UID是與此卡相關聯的唯一編號,類似於序號。
要運行腳本,請將目錄更改為保存腳本的目錄。然後輸入python Read.py,運行腳本。因為腳本讀卡器UID,所以當你將卡放在讀取器上時,它會拒絕訪問。螢幕上會顯示這張卡的UID。記下這個UID。編輯腳本,然後將腳本的UID更改為此值並保存。
b.運行最終腳本
輸入python Read.py,再次運行腳本。現在,當你將卡放在讀卡器上時,驗證透過且LED會亮5秒鐘。如果將你的設計應用於狗門,那麼在驗證透過後電磁鎖會打開。
4.製作狗門的注意事項
5.其他裝置選項
6.附錄:Read.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
#!/usr/bin/env python # -*- coding: utf8 -*- import RPi.GPIO as GPIO import MFRC522 import signal import time continue_reading = True # Capture SIGINT for cleanup when the script is aborted def end_read(signal,frame): global continue_reading print ("Ctrl+C captured, ending read.") continue_reading = False GPIO.cleanup() # Hook the SIGINT signal.signal(signal.SIGINT, end_read) # Create an object of the class MFRC522 MIFAREReader = MFRC522.MFRC522() # Welcome message print ("Welcome to the MFRC522 data read example") print ("Press Ctrl-C to stop.") # This loop keeps checking for chips. If one is near it will get the UID and authenticate while continue_reading: # Scan for cards (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL) # If a card is found if status == MIFAREReader.MI_OK: print ("Card detected") # Get the UID of the card (status,uid) = MIFAREReader.MFRC522_Anticoll() # If we have the UID, continue if status == MIFAREReader.MI_OK: # Print UID print ("Card read UID: "+str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3])+','+str(uid[4])) # This is the default key for authentication key = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF] # Select the scanned tag MIFAREReader.MFRC522_SelectTag(uid) #ENTER Your Card UID here my_uid = [61,84,4,114,31] #Configure LED Output Pin LED = 18 GPIO.setup(LED, GPIO.OUT) GPIO.output(LED, GPIO.LOW) #Check to see if card UID read matches your card UID if uid == my_uid: #Open the Doggy Door if matching UIDs print("Access Granted") GPIO.output(LED, GPIO.HIGH) #Turn on LED time.sleep(5) #Wait 5 Seconds GPIO.output(LED, GPIO.LOW) #Turn off LED else: #Don't open if UIDs don't match print("Access Denied, YOU SHALL NOT PASS!") ## # Authenticate ## status = MIFAREReader.MFRC522_Auth(MIFAREReader.PICC_AUTHENT1A, 8, key, uid) ## ## # Check if authenticated ## if status == MIFAREReader.MI_OK: ## MIFAREReader.MFRC522_Read(8) ## MIFAREReader.MFRC522_StopCrypto1() ## else: ## print "Authentication error" |