Arduino layihələriKoteqoriyasız

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.

Əlaqəli Məqalələr

0 0 səslər
Article Rating
Abunə ol
Xəbər ver
guest

0 Comments
Sətir içi geri bildirimlər
Bütün şərhlərə baxın
Back to top button
0
Fikirlərinizi bilmək istərdik,lütfən şərh yazın.x