我們常用的悠遊卡、門禁卡都是 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
張貼留言