我們常用的悠遊卡、門禁卡都是 RFID 無線射頻辨識的應用,無線射頻辨識(英文:Radio Frequency IDentification,縮寫:RFID)是一種無線通訊技術,可以通過無線電訊號識別特定目標並讀寫相關數據,而無需識別系統與特定目標之間建立機械或者光學接觸。[維基百科]
想做一個實驗是利用 RFID 來控制電磁閥的開關,這樣就可以做到門禁的功能,目前市售的門禁系統產品已經很成熟,且已經商品化許久。我們可以透過 RFID 相關實驗來瞭解門禁系統或其他相關的應用。我用的是 RFID-RC522,這個模組通用於Arduino 跟 Raspberry pi。
透過讀取授權的 RFID 卡片資訊,控制 LED燈號,也就是授權的卡片亮綠燈,非授權的卡片亮紅燈,以下就來看看線路及程式內容:
SPI匯流排定義四組 logic signals:
選項如下:7.Advanced Options -> A4 SPI -> Enable -> YES -> OK -> <Finish>
重新開機後,設定config.txt:
找到以下這一行:
然後在他下方增加以下這一行:
重新開機,檢查 spi 模組是否已經安裝完成:
如果出現以下這一列,表示 spi 安裝成功?
安裝 python-dev
取得SPI-py程式碼,SPI-py是 python 讀取硬體 SPI 的擴充函式庫:
安裝 MFRC522-python:
讀取 RFID 卡片資料:
讀取的結果如以下畫面:
將 MFRC522-python 的 Read.py 改寫如以下程式,執行時,需將 MFRC522-python 目錄內的MFRC522.pyc 放在跟本程式同一目錄內。您可到 Github 下載原始程式。
執行的影片結果如下:
想做一個實驗是利用 RFID 來控制電磁閥的開關,這樣就可以做到門禁的功能,目前市售的門禁系統產品已經很成熟,且已經商品化許久。我們可以透過 RFID 相關實驗來瞭解門禁系統或其他相關的應用。我用的是 RFID-RC522,這個模組通用於Arduino 跟 Raspberry pi。
透過讀取授權的 RFID 卡片資訊,控制 LED燈號,也就是授權的卡片亮綠燈,非授權的卡片亮紅燈,以下就來看看線路及程式內容:
[材料]
- Raspberry Pi 2 Model B x 1
- RFID-RC522模組
- LED x 2個 (紅、綠各 1個)
- 麵包版 x 1
- 連接線 x 11條
[接線]
將 Raspberry Pi 的第7pin (GPIO4)接到綠色 LED的一支腳,第11pin (GPIO17)接到紅色 LED的一支腳,LED的另一支腳則接到第6pin (Ground)。第 24 pin (GPIO8)接到 RFID 模組的 SDA,第23pin (GPIO11)接到 SCK,其他 pin 連接如下表:Raspberry pi接腳 | RFID-RC522 |
---|---|
Pin 24 | SDA |
Pin 23 | SCK |
Pin 19 | MOSI |
Pin 21 | MISO |
Pin None | IRQ |
Pin 6 | GND |
Pin 22 | RST |
Pin 1 | 3,3V |
SPI匯流排定義四組 logic signals:
- SCLK—Serial Clock(自master輸出)
- MOSI/SIMO—Master Output, Slave Input(自master輸出)
- MISO/SOMI—Master Input, Slave Output(自slave輸出)
[設定步驟]
進入 root 模式執行設定,並開啟 SPI:# raspi-config
選項如下:7.Advanced Options -> A4 SPI -> Enable -> YES -> OK -> <Finish>
重新開機後,設定config.txt:
$ sudo nano /boot/config.txt
找到以下這一行:
dtparam=spi=on
然後在他下方增加以下這一行:
dtoverlay=spi-bcm2708
重新開機,檢查 spi 模組是否已經安裝完成:
# lsmod | grep spi
如果出現以下這一列,表示 spi 安裝成功?
spi_bcm2835 6678 0
安裝 python-dev
$ sudo apt-get install python-dev
取得SPI-py程式碼,SPI-py是 python 讀取硬體 SPI 的擴充函式庫:
$ git clone https://github.com/lthiery/SPI-Py.git $ cd SPI-Py $ sudo python setup.py install $ cd
安裝 MFRC522-python:
$ git clone https://github.com/mxgxw/MFRC522-python.git $ cd MFRC522-python
讀取 RFID 卡片資料:
$ python Read.py
讀取的結果如以下畫面:
將 MFRC522-python 的 Read.py 改寫如以下程式,執行時,需將 MFRC522-python 目錄內的MFRC522.pyc 放在跟本程式同一目錄內。您可到 Github 下載原始程式。
[程式]
import time import RPi.GPIO as GPIO import MFRC522 import signal GPIO.setmode(GPIO.BOARD) #設定LED pin變數 LED0 = 7 LED1 = 11 counter = 0 #設定為輸出 GPIO.setup(LED0,GPIO.OUT) GPIO.setup(LED1,GPIO.OUT) continue_reading = True # 當按下 Ctrl + C時結束程式 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." # 迴圈檢查是否取得 UID 及授權 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]) # This is the default key for authentication key = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF] # Select the scanned tag MIFAREReader.MFRC522_SelectTag(uid) # Authenticate status = MIFAREReader.MFRC522_Auth(MIFAREReader.PICC_AUTHENT1A, 8, key, uid) # 檢查是否為授權卡片 if status == MIFAREReader.MI_OK: MIFAREReader.MFRC522_Read(8) MIFAREReader.MFRC522_StopCrypto1() GPIO.output(LED0,GPIO.HIGH) time.sleep(0.5) GPIO.output(LED0,GPIO.LOW) else: print "Authentication error" GPIO.output(LED1,GPIO.HIGH) time.sleep(0.5) GPIO.output(LED1,GPIO.LOW)
執行的影片結果如下:
[參考資料]
- instructables : Raspberry Pi 3 Model B & MIFARE RC522 RFID Tag Reading
- Github : MFRC522-python
作者已經移除這則留言。
回覆刪除想請問未審麼我怎麼設定他都是error
回覆刪除它的結果未審麼只會到size
下面全部是error如果是設定問題那請問要怎麼設定
您好,不確定您說的error問題是什麼?但是有可能是SPI的問題造成的,先檢查一下Pi是否已開啟SPI?可執行 sudo raspi-config -> 5.Interfacing Options -> P4 SPI -> Enable,再看看是否程式執行有錯誤!!
刪除錯誤:「spi.transfer(((addr<<1)&0x7E,val))」
回覆刪除SPI-Py的函式庫調用方式有變動,但MFRC522-python的API沒有跟上,解決方案:https://github.com/mxgxw/MFRC522-python/issues/69
張貼留言