Raspberry Pi 筆記(25):RFID 無線射頻辨識控制 LED

我們常用的悠遊卡、門禁卡都是 RFID 無線射頻辨識的應用,無線射頻辨識(英文:Radio Frequency IDentification,縮寫:RFID)是一種無線通訊技術,可以通過無線電訊號識別特定目標並讀寫相關數據,而無需識別系統與特定目標之間建立機械或者光學接觸。[維基百科]

想做一個實驗是利用 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 24SDA
Pin 23SCK
Pin 19MOSI
Pin 21MISO
Pin NoneIRQ
Pin 6GND
Pin 22RST
Pin 13,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)

執行的影片結果如下:

[參考資料]

4 留言

  1. 作者已經移除這則留言。

    回覆刪除
  2. 想請問未審麼我怎麼設定他都是error
    它的結果未審麼只會到size
    下面全部是error如果是設定問題那請問要怎麼設定

    回覆刪除
    回覆
    1. 您好,不確定您說的error問題是什麼?但是有可能是SPI的問題造成的,先檢查一下Pi是否已開啟SPI?可執行 sudo raspi-config -> 5.Interfacing Options -> P4 SPI -> Enable,再看看是否程式執行有錯誤!!

      刪除
  3. 錯誤:「spi.transfer(((addr<<1)&0x7E,val))」
    SPI-Py的函式庫調用方式有變動,但MFRC522-python的API沒有跟上,解決方案:https://github.com/mxgxw/MFRC522-python/issues/69

    回覆刪除

張貼留言

較新的 較舊