Arduino ilə RFID RC522 Təlimatı
RFID texnologiyası bir müddətdir mövcuddur. Ancaq bu yaxınlarda hobbi və istehsalçılar bu texnologiyanı Mifare RC522 RFID modulu vasitəsilə istifadə edə bildilər. Bu yazıda, kartları, giriş sistemlərindən(attendance systems) tutmuş elektron kilidlərə və hətta arcade oyunlarına qədər hər şey üçün açar kimi necə asanlıqla istifadə edə biləcəyinizi göstərəcəyəm!
Mifare RC522 RFID Modulu
Modulu satın aldıqdan sonra RFID oxuyucu lövhəsi, bir RFID kartı və etiketi və iki səkkiz pin başlığı olacaq: biri düz, biri də 90 dərəcəyə qədər əyilmiş. Aydındır ki, bu sancaqlardan birini oxucu lövhəsindəki səkkizlik dəliyə lehimləməlisiniz. Hansı başlığın istifadə ediləcəyi barədə seçim layihənizə bağlıdır.
RFID oxucu lövhəsi budur:
Embedded və mikrokontroller sistemləri ilə işləmisinizsə, baxan kimi bu modulun SPI və I2C ilə işlədiyini biləcəksiniz. Modul 3.3V-də işləyir, amma çox yaxşıdır ki, çox enerji istehlak etmir, belə ki, onu Arduinonun güc pininə bağlaya bilərsiniz.
Arduino ilə RFID Reader qurmaq
Xoşbəxtlikdən, modul 3.3V gücündə olmasına baxmayaraq, qalan pinlər 5V-a davamlıdır. Bu o deməkdir ki, RC522 modulunu birbaşa belə bir Arduinoya bağlaya bilərik:
------------------------------------------
MFRC522 Arduino
Reader Uno
Signal Pin Pin
----------------------------------------
RST/Reset RST 9
SPI SS SDA(SS) 10
SPI MOSI MOSI 11
SPI MISO MISO 12
SPI SCK SCK 13
Yuxarıda təqdim etdiyim naqillərlə I2C ilə yox, SPI rabitəsindən istifadə edirəm. I2C istifadə etmək istəyirsinizsə, çipin I2C rejiminə keçməsi üçün modulu dəyişdirməlisiniz. Bu məqalənin son hissəsində bu qeyd olunur.
Arduino RFID Kitabxanası
Arduino üçün ən populyar RFID kitabxanası Miguel Balboa tərəfindən yaradılan kitabxanadır. Bunu onun hesabından yükləyə bilərsiniz.
Kitabxananı quraşdırdıqdan sonra File > Examples > MFRC522 vasitəsilə bir sıra nümunələrə giriş əldə edəcəksiniz.
İlk cəhdimiz üçün DumpInfo kodundan istifadə edəcəyik. Bu kodu Arduino lövhənizə yükləyin və sonra RFID kartınızı və ya etiketinizi oxucuya vurun. Serial monitorda görəcəyiniz bu olmalıdır:
Burada RFID kartınızın və ya etiketinizin məzmununa baxacaqsınız. Kart və ya etiketdə bənzərsiz bir UID və 1 KB yaddaş sahəsi var (btw, satın alınmaq üçün 4 KB kart da var). 1 KB yer 16 sektora bölünür. Sektorlar ayrıca hər biri 2 bayt məlumatla 4 bloka bölünür.
Yalnız RFID Kartının UID-in oxunması
Kartı müəyyən etmək üçün UID-dən istifadə edə bilərsiniz! Daxil olan ReadNUID kodunu dəyişdirə bilərsiniz ki, kartı və ya RFID oxuyucusuna hər vuranda yalnız UID görünsün.
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class
MFRC522::MIFARE_Key key;
// Init array that will store UID
byte uid[4];
void setup() {
Serial.begin(9600);
SPI.begin(); // Init SPI bus
rfid.PCD_Init(); // Init MFRC522
for (byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF;
}
}
void loop() {
if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()){
for (byte i = 0; i < 4; i++) {
uid[i] = rfid.uid.uidByte[i];
}
printHex(rfid.uid.uidByte, rfid.uid.size);
Serial.println();
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
}
void printHex(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}
RFID giriş və ya kilidləmə / kiliddən çıxarma layihələri qurmaq istəyirsinizsə, yuxarıdakı nümunə başlanğıc nöqtəniz olacaqdır. Etməli olduğunuz tək şey kartınızın UID kodunu qeyd etmək və sonra vurulmuş kartın UID kodunun qeyd etdiyiniz kartla uyğun olub olmadığını yoxlamaqdır.
RFID Kart Yaddaşından istifadə
Yuxarıda qeyd edildiyi kimi, daxil olan RFID kartı 1 KB yaddaş sahəsi ehtiva edir. Bu yaddaşdan məlumatları karta yazmaq üçün istifadə edə bilərik. Rfid_write_personal_data nümunə adınızı karta necə yaza biləcəyinizi göstərir:
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 9 // Configurable, see typical pin layout above
#define SS_PIN 10 // Configurable, see typical pin layout above
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance
void setup() {
Serial.begin(9600); // Initialize serial communications with the PC
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card
Serial.println(F("Write personal data on a MIFARE PICC "));
}
void loop() {
// Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
MFRC522::MIFARE_Key key;
for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
Serial.print(F("Card UID:")); //Dump UID
for (byte i = 0; i < mfrc522.uid.size; i++) {
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
}
Serial.print(F(" PICC type: ")); // Dump PICC type
MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
Serial.println(mfrc522.PICC_GetTypeName(piccType));
byte buffer[34];
byte block;
MFRC522::StatusCode status;
byte len;
Serial.setTimeout(20000L) ; // wait until 20 seconds for input from serial
// Ask personal data: Family name
Serial.println(F("Type Family name, ending with #"));
len = Serial.readBytesUntil('#', (char *) buffer, 30) ; // read family name from serial
for (byte i = len; i < 30; i++) buffer[i] = ' '; // pad with spaces
block = 1;
//Serial.println(F("Authenticating using key A..."));
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
else Serial.println(F("PCD_Authenticate() success: "));
// Write block
status = mfrc522.MIFARE_Write(block, buffer, 16);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Write() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
else Serial.println(F("MIFARE_Write() success: "));
block = 2;
//Serial.println(F("Authenticating using key A..."));
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
// Write block
status = mfrc522.MIFARE_Write(block, &buffer[16], 16);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Write() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
else Serial.println(F("MIFARE_Write() success: "));
// Ask personal data: First name
Serial.println(F("Type First name, ending with #"));
len = Serial.readBytesUntil('#', (char *) buffer, 20) ; // read first name from serial
for (byte i = len; i < 20; i++) buffer[i] = ' '; // pad with spaces
block = 4;
//Serial.println(F("Authenticating using key A..."));
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
// Write block
status = mfrc522.MIFARE_Write(block, buffer, 16);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Write() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
else Serial.println(F("MIFARE_Write() success: "));
block = 5;
//Serial.println(F("Authenticating using key A..."));
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
// Write block
status = mfrc522.MIFARE_Write(block, &buffer[16], 16);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Write() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
else Serial.println(F("MIFARE_Write() success: "));
Serial.println(" ");
mfrc522.PICC_HaltA(); // Halt PICC
mfrc522.PCD_StopCrypto1(); // Stop encryption on PCD
}
RFID Reader ilə əlaqə qurmaq üçün I2C istifadə edilməsi
Yuxarıda qeyd edildiyi kimi, RC522 RFID oxuyucu modulu ilə xəbərləşmədə SPI əvəzinə I2C istifadə etmək mümkündür. I2C-ni aktivləşdirmək üçün lövhədəki izin bağlantısını IC-yə 1-ci sancaq üçün kəsməliyik. Bu, Arduino icmasının Renate-USB istifadəçisi tərəfindən göstərildiyi kimi bir lövhədə bir dəlik açaraq edilə bilər.
Bunu etdikdən sonra RC522, 0x3C ünvanı olan I2C rejiminə girəcəkdir.
İndi I2C istifadə etdiyimiz üçün RFID modulunun SDA və SCL sancaqlarını Arduino UNO-nun I2C sancaqlarına bağlamalıyıq:
------------------------------------------
MFRC522 Arduino
Reader Uno
Signal Pin Pin
----------------------------------------
RST/Reset RST 3
I2C SDA SDA(SS) A4
I2C SCL MISO A5
Nümunəyə gəldikdə, artıq Miguel Balboa’nın kitabxanasını I2C üçün istifadə edə bilmərik. İndi arozcanın RFID kitabxanasından istifadə edəcəyik. Budur bu kitabxanadan istifadə edən bir nümunə (Manuautoya kreditlər):
#include <Wire.h>
#include "MFRC522_I2C.h"
#define RST 3
MFRC522 mfrc522(0x3C, RST); // Create MFRC522 instance.
void setup() {
Serial.begin(9600); // Initialize serial communications with the PC
Wire.begin(); // Initialize I2C
mfrc522.PCD_Init(); // Init MFRC522
ShowReaderDetails(); // Show details of PCD - MFRC522 Card Reader details
Serial.println(F("Scan PICC to see UID, type, and data blocks..."));
}
void loop() {
// Look for new cards, and select one if present
if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
delay(50);
return;
}
// Now a card is selected. The UID and SAK is in mfrc522.uid.
// Dump UID
Serial.print(F("Card UID:"));
for (byte i = 0; i < mfrc522.uid.size; i++) {
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
}
Serial.println();
}
void ShowReaderDetails() {
// Get the MFRC522 software version
byte v = mfrc522.PCD_ReadRegister(mfrc522.VersionReg);
Serial.print(F("MFRC522 Software Version: 0x"));
Serial.print(v, HEX);
if (v == 0x91)
Serial.print(F(" = v1.0"));
else if (v == 0x92)
Serial.print(F(" = v2.0"));
else
Serial.print(F(" (unknown)"));
Serial.println("");
// When 0x00 or 0xFF is returned, communication probably failed
if ((v == 0x00) || (v == 0xFF)) {
Serial.println(F("WARNING: Communication failure, is the MFRC522 properly connected?"));
}
}
Yuxarıdakı nümunə Miguel Balboa’nın kitabxanasındakı DumpInfo nümunəsinə bənzəyir.
I2C-nin SPI üzərində istifadəsinin açıq üstünlüyü, pin istifadəsini azaldır.
Bu qədər!
Ümid edirəm, möhtəşəm Arduino RFID RC522 layihələri qurmağınız üçün kömək edə bildim.
Əgər oxudunuzsa və istifadə etdinizsə zəhmət olmasa şərhlərinizi aşağıda yazın.