IoT|硬體|ARDUINO|實作|感測器|RFID RC522




Arduino Mifare 讀寫器模組    2017-09-23 週六     
本文根據網路文章修改:https://swf.com.tw/?p=930



影片網址:

[注意]
1.本文採用的Mifare是13.56MHz
2.配合 MFRC522 Library,Arduino IDE 版本必須 1.6.6 以上

 下載程式庫之後,導入 zip 壓縮檔「草稿碼->Incloud Library->Add ZIP Library 」,再開啟Arduino IDE,即可從主功能表的「檔案→範例→MFRC522」指令底下找到一些範例程式。


[接線]
3.3(必須 3.3v)
3.3
RST(重置)
A0
GND
GND
IRQ
不需接
MISO(主機<-周邊資料)
12
MOSI(主機->周邊資料)
11
SCK(時脈)
13
SDA(晶片選擇)
10

Arduino Uno板的接線示範如下,SPI介面的晶片線選擇通常接在Arduino數位10腳,但這不是強制性的,模組的Reset腳也可以接在其他腳位


#include <SPI.h>
#include <MFRC522.h>     // 引用程式庫
#define RST_PIN      A0        // 讀卡機的重置腳位
#define SS_PIN       10        // 晶片選擇腳位
MFRC522 mfrc522(SS_PIN, RST_PIN);  // 建立MFRC522物件
void setup() {
  Serial.begin(9600);
  Serial.println("RFID reader is ready!");
  SPI.begin();
  mfrc522.PCD_Init();   // 初始化MFRC522讀卡機模組
}
void loop() {
    // 確認是否有新卡片
    if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
      byte *id = mfrc522.uid.uidByte;   // 取得卡片的UID
      byte idSize = mfrc522.uid.size;   // 取得UID的長度
      Serial.print("PICC type: ");      // 顯示卡片類型
      // 根據卡片回應的SAK值(mfrc522.uid.sak)判斷卡片類型
      MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
      Serial.println(mfrc522.PICC_GetTypeName(piccType));
      Serial.print("UID Size: ");       // 顯示卡片的UID長度值
      Serial.println(idSize);
      for (byte i = 0; i < idSize; i++) {  // 逐一顯示UID碼
        Serial.print("id[");
        Serial.print(i);
        Serial.print("]: ");
        Serial.println(id[i], HEX);       // 以16進位顯示UID值
      }
      Serial.println();
      mfrc522.PICC_HaltA();  // 讓卡片進入停止模式
    }
}

無線射頻辨識控制 LED    2017-09-20 週三     



影片:

[材料]

• Raspberry Pi 2 Model B x 1
• RFID-RC522模組
• LED x 2個 (紅、綠各 1個)
• 麵包版 x 1
• 連接線 x 11條


[接線]

24 pin (GPIO8)接到 RFID 模組的 SDA,第23pin (GPIO11)接到 SCK,其他 pin 連接如下表:

RC522:
RFID-RC522模組
Raspberry pi接腳
SDA
24
SCK
23
MOSI
19
MISO
21
IRQ
none
GND
6
RST
22
3.3V
1    

LED:
將 Raspberry Pi 的第7pin (GPIO4)接到綠色 LED的一支腳,第11pin (GPIO17)接到紅色 LED的一支腳,LED的另一支腳則接到第6pin (Ground)。
LED
Raspberry pi 接腳
LED 1+
7
LED 1 -
6
LED 2+
11
LED 1 -
6

SPI匯流排定義四組 logic signals:

• SCLK—Serial Clock(自master輸出)
• MOSI/SIMO—Master Output, Slave Input(自master輸出)
• MISO/SOMI—Master Input, Slave Output(自slave輸出)

[設定步驟]

# raspi-config

舊版:
選項如下:7.Advanced Options -> A4 SPI -> Enable -> YES -> OK -> <Finish>
新版:
選項如下:5.Interfacing  Options -> P4 SPI

重新開機後,設定 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 的擴充函式庫:

$ cd SPI-Py
$ sudo python setup.py install
$ cd


安裝 MFRC522-python:
$ cd MFRC522-python

讀取 RFID 卡片資料:
$ mv Read.py Read_back.py
$ python Read_back.py

將 MFRC522-python 的 Read_back.py 改寫如以下程式,執行時,需將 MFRC522-python 目錄內的MFRC522.pyc 放在跟本程式同一目錄內

[程式]     Read.py
touch Read.py

#coding=utf-8

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)

留言

這個網誌中的熱門文章

IoT|硬體|樹莓派|外接麥克風及喇叭設置

成長|語文|學習-英文 持續更新!

IoT|硬體|通訊|Arduino 使用 SoftwareSerial Library 與電腦通訊