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 以上
3.MFRC522 Library Git下載地址:https://github.com/ntausr4/Arduino-RFID-Library-for-MFRC522.git
下載程式庫之後,導入 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 的擴充函式庫:
安裝 MFRC522-python:
$ git clone https://github.com/ntausr4/MFRC522-python.git
$ 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)
留言
張貼留言