Başa dön
RFID Nedir? Arduino ile RC522 Rfid Modül Nasıl Çalışır?

RFID Nedir? Arduino ile RC522 Rfid Modül Nasıl Çalışır?

Merhaba arkadaşlar, bu yazımızda rfid nedir? rc522 rfid modülü arduino ile nasıl çalışır? konulu arduino projeleri serimizi inceleyip öğreneceğiz.

Uzun zamandır insanların market kasalarında uzun çıkış kuyruklarında durup bekledikleri günleri henüz tam aşamadık. Ama artık RFID tabanlı otomatik ödeme çözümü ile sepetinizi kolaylıkla doldurabilirsiniz. Artık kasiyer sepetinizdeki her ürünü birer birer okuturken beklemek zorunda kalmayacaksınız. Bunun yerine, ürünlere eklenen RFID etiketleri ile sistem alışveriş sepetindeki her öğeyi algılayacak ve her birini neredeyse anında RFID okuyucu ile okutarak faturalandıracaktır.

RFID tabanlı Arduino projelerimizin çoğu için RC522 RFID Okuyucu / Yazıcı modülü ile yapılır. RC522 rfid kit tercih edilmesinin sebebi, düşük güç tüketimi, düşük maliyetli, oldukça sağlam, arayüzü kolay olmasıdır.

RFID teknolojisi nedir ve nasıl çalışır?

RFID veya Radyo Frekansı Tanımlama sistemi iki ana bileşenden oluşur: tanımlanacak bir nesneye bağlı bir aktarıcı / etiket ve sorgulayıcı / Okuyucu olarak da bilinen bir Alıcı-Verici.

Rfid okuyucu, bir Radyo Frekansı modülü ve yüksek frekanslı elektromanyetik alan üreten bir antenden oluşur. Rfid etiket aslında pasif bir rfid cihazdır. Enerjisiz çalışmasına en olanak tanıyan özelliği bilgiyi depolayan ve işleyen bir mikroçip ve bir sinyal almak ve iletmek için bir anten içermesidir.

Nasıl Çalışır?

Bir etikette kodlanan bilgileri okumak için, okuyucunun menziline etiket yerleştirilir (okuyucunun doğrudan görüş alanı içinde olması gerekmez). Okuyucu, elektronların etiketin anteninden geçmesine ve daha sonra çipe güç vermesine neden olan bir elektromanyetik alan oluşturur.

 

 

Etiketin içindeki güç yongası daha sonra saklanan bilgilerini başka bir radyo sinyali biçiminde okuyucuya geri göndererek yanıt verir. Buna backscatter denir. RF dalgasındaki değişiklik, daha sonra verileri bir bilgisayara veya mikrodenetleyiciye gönderen okuyucu tarafından algılanır ve yorumlanır.

Donanıma Genel Bakış – RC522 RFID Okuyucu / Yazıcı Modülü

RC522 RFID Okuyucu modülü, RFID etiketleriyle (ISO 14443A standart etiketleri) iletişim kurmak için 13.56MHz elektromanyetik alan oluşturur. Okuyucu, maksimum 10Mbps veri hızına sahip 4 pimli Seri Çevresel Arabirim ( SPI ) üzerinden bir mikro denetleyici ile iletişim kurabilir. Ayrıca I2C ve UART protokolleri üzerinden de iletişimi destekler.

Modülün çalışma voltajı 2.5 ila 3.3 V arasındadır, ancak iyi haber logic pimlerinin 5 volt toleranslı olmasıdır. Böylece herhangi bir logic seviye dönüştürücü kullanmadan kolayca bir Arduino’ya bağlayabiliriz.

 

İşte Tam Özellikler:

Frekans aralığı13.56 MHz ISM Bandı
Ana Bilgisayar ArayüzüSPI / I2C / UART
Çalışma Besleme Gerilimi2.5 V – 3.3 V
Maks. Çalışma Akımı13-26mA
Min. Akım (Güç kapalı)10μA
Mantık Girişleri5V Toleranslı
Okuma Aralığı5 cm

RC522 RFID Modülü Pinout

RC522 modülünün 8 pini vardır. Bağlantılar aşağıdaki gibidir:

VCC modüle güç sağlar. Bu 2.5 ila 3.3 volt arasında olabilir. Arduino’nuzun 3.3V çıkışına bağlayabilirsiniz. 5V pinine bağlamanın büyük olasılıkla modülünüzü yok edeceğini unutmayın!

RST  Sıfırlama ve kapatma için bir giriştir. Bu pim enerjisi azaldığında, sistem kapanma etkinleştirilir. Bu, osilatör dahil tüm dahili akımları ve pinleri kapatır ve modül sıfırlanır.

GND  Toprak pinidir ve Arduino’daki GND pinine bağlanması gerekir.

IRQ  RFID etiketi modül menziline geldiğinde mikrodenetleyiciyi uyarabilen bir kesme pinidir.

MISO / SCL / Tx pin, SPI arabirimi etkinleştirildiğinde Master-In-Slave-Out işlevi görür, I2C arabirimi etkinleştirildiğinde seri saat işlevi görür ve UART arabirimi etkinleştirildiğinde seri veri çıkışı görevi görür. 

MOSI (Master Out Slave In)  RC522 modülüne SPI girişidir.

SCK (Seri Saat)  SPI veriyolu tarafından sağlanan saat darbelerini kabul eder.

SS / SDA / Rx pin SPI arabirimi etkinleştirildiğinde Sinyal girişi, I2C arabirimi, UART arabirimi etkinleştirildiğinde seri veri girişi işlevi görür. Bu pim genellikle pimi bir kare içine sararak işaretlenir, böylece diğer pimleri tanımlamak için referans olarak kullanılabilir.

 

Kablolama – RC522 RFID modülünü Arduino UNO Bağlantısı

Artık modül hakkında her şeyi bildiğimize göre, onu Arduino’muza bağlamaya başlayabiliriz!

Başlamak için, modül üzerindeki VCC pimini Arduino’daki 3.3V’ye ve GND pimini modüle bağlayın. RST, Arduino’daki herhangi bir dijital pime bağlanabilir. Bizim durumumuzda, dijital pin # 5’e bağlı. Kullanacağımız Arduino kütüphanesi desteklemediğinden IRQ pin bağlantısı yapılmadı.

Şimdi SPI iletişimi için kullanılan pinlere bakıyoruz. RC522 modülü çok fazla veri aktarımı gerektirdiğinden, mikro denetleyici SPI pinlerine bağlandığında en iyi performansı verecektir.

Her Arduino Kartında buna göre bağlanması gereken farklı SPI pinleri olduğunu unutmayın. UNO / Nano V3.0 gibi Arduino kartları için bu pinler dijital 13 SCK, 12 MISO, 11 MOSI ve 10 SS.

Mega’nız varsa, pimler farklıdır! Dijital 50 MISO, 51 MOSI, 52 SCK ve 53 SS kullanmak isteyeceksiniz. Hızlı anlamak için aşağıdaki tabloya bakın.

 MOSIMİSOSCKCS
Arduino Uno11121310
Arduino Nano11121310
Arduino Mega51505253

Yukarıda belirtilenden farklı bir Arduino kartı kullanıyorsanız, devam etmeden önce Arduino resmi belgelerini kontrol etmeniz önerilir.

Arduino Kodu – RFID Etiketi Okuma

RC522 RFID modülü ile iletişim kurmak emek ister, ancak neyse ki bizim için RFR etiketlerinden okumayı ve bunlara yazmayı kolaylaştıran MFRC522 kütüphanesi adlı bir kütüphane var. Miguel Balboa’ya teşekkürler. Önce GitHub deposunu ziyaret ederek kütüphaneyi indirin veya zip dosyasını indirmek için bu düğmeye tıklayın:

Yüklemek için Arduino IDE’yi açın, Taslak> Kitaplığı Dahil Et> .ZIP Kitaplığı Ekle‘ye gidin ve az önce indirdiğiniz rfid-master.zip dosyasını seçin.

Kitaplığı kurduktan sonra, Örnekler alt menüsünü açın ve MFRC522> DumpInfo örnek çizimini seçin.

Bu çizim, etikete hiçbir veri yazmaz. Sadece etiketi okumayı başarabildiğini söyler ve etiket hakkında bazı bilgiler görüntüler. Bu işlem, herhangi bir yeni etiketi denemeden önce çok yararlı olabilir!

Çizimin başına gidin ve RST_PIN’in doğru şekilde başlatıldığından emin olun, bizim durumumuzda # 5 numaralı dijital pimi kullanıyoruz, bu yüzden 5 olarak değiştirin!

Tamam, şimdi çizimi(kodu) yükleyin ve ekranı açın. Etiketi modüle yaklaştırdığınızda, muhtemelen aşağıdaki gibi bir şey elde edersiniz. Tüm bilgiler görüntülenene kadar etiketi okutmaya devam edin.

Etiketin Benzersiz Kimliği (UID), bellek boyutu ve tüm 1K bellek dahil olmak üzere etiketle ilgili tüm yararlı bilgileri görüntüler.

MIFARE Klasik 1K Bellek Düzeni

Etiketin 1K hafızası 16 sektör olarak düzenlenmiştir (0 ila 15) Her sektör ayrıca 4 blok olarak (0 ila 3 blok) ayrılmıştır. Her blok 16 bayt veri depolayabilir.

16 sektör x 4 blok x 16 bayt veri = 1024 bayt = 1K bellek

Sektörler, bloklar ve veriler içeren tüm 1K bellek aşağıda vurgulanmıştır.

 

Her sektörün 3. Bloğuna Sector Trailer denir ve bir sektörde kalan bloklara okuma ve yazma erişimi vermek için Erişim Bitleri adı verilen bilgiler içerir. Bu, her bir sektörün yalnızca alt 3 bloğunun (blok 0, 1 ve 2) veri depolama için kullanılabilir olduğu anlamına gelir, yani 64 bayt sektör başına 48 bayt kendi kullanımımız için kullanılabilir.

Ayrıca, sektör 0’ın Blok 0’ı Üretici Bloğu / Üretici Verileri olarak bilinir, IC üretici verilerini ve Benzersiz Tanımlayıcı’yı (UID) içerir. Üretici Bloğu aşağıda kırmızı ile vurgulanmıştır.

 

 

 

Uyarı: Üretici Bloğunun üzerine yazmak çok risklidir ve kartı kalıcı olarak kilitleyebilir.

 

Arduino Kodu – RFID Etiketi Yazma

RFID etiketini başarıyla okuduğunuzu düşünürsek, bir sonraki denememize geçeceğiz. Aşağıdaki kod, RFID etiketine özel veri yazmanın temel bir gösterimini yapacaktır. Ayrıntılı dökümüne başlamadan önce taslağı deneyin.

 
#include <SPI.h>      //include the SPI bus library
#include <MFRC522.h>  //include the RFID reader library

#define SS_PIN 10  //slave select pin
#define RST_PIN 5  //reset pin

MFRC522 mfrc522(SS_PIN, RST_PIN);  // instatiate a MFRC522 reader object.
MFRC522::MIFARE_Key key;          //create a MIFARE_Key struct named 'key', which will hold the card information

//this is the block number we will write into and then read.
int block=2;  

byte blockcontent[16] = {"Last-Minute-Engg"};  //an array with 16 bytes to be written into one of the 64 card blocks is defined
//byte blockcontent[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};  //all zeros. This can be used to delete a block.

//This array is used for reading out a block.
byte readbackblock[18];

void setup() 
{
    Serial.begin(9600);        // Initialize serial communications with the PC
    SPI.begin();               // Init SPI bus
    mfrc522.PCD_Init();        // Init MFRC522 card (in case you wonder what PCD means: proximity coupling device)
    Serial.println("Scan a MIFARE Classic card");
  
  // Prepare the security key for the read and write functions.
  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;  //keyByte is defined in the "MIFARE_Key" 'struct' definition in the .h file of the library
  }
}

void loop()
{  
  // Look for new cards
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }
  
  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial()) 
  {
    return;
  }
    Serial.println("card selected");
         
   //the blockcontent array is written into the card block
   writeBlock(block, blockcontent);
   
   //read the block back
   readBlock(block, readbackblock);
   //uncomment below line if you want to see the entire 1k memory with the block written into it.
   //mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
   
   //print the block contents
   Serial.print("read block: ");
   for (int j=0 ; j<16 ; j++)
   {
     Serial.write (readbackblock[j]);
   }
   Serial.println("");
}



//Write specific block    
int writeBlock(int blockNumber, byte arrayAddress[]) 
{
  //this makes sure that we only write into data blocks. Every 4th block is a trailer block for the access/security info.
  int largestModulo4Number=blockNumber/4*4;
  int trailerBlock=largestModulo4Number+3;//determine trailer block for the sector
  if (blockNumber > 2 && (blockNumber+1)%4 == 0){Serial.print(blockNumber);Serial.println(" is a trailer block:");return 2;}
  Serial.print(blockNumber);
  Serial.println(" is a data block:");
  
  //authentication of the desired block for access
  byte status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
  if (status != MFRC522::STATUS_OK) {
         Serial.print("PCD_Authenticate() failed: ");
         Serial.println(mfrc522.GetStatusCodeName(status));
         return 3;//return "3" as error message
  }
  
  //writing the block 
  status = mfrc522.MIFARE_Write(blockNumber, arrayAddress, 16);
  //status = mfrc522.MIFARE_Write(9, value1Block, 16);
  if (status != MFRC522::STATUS_OK) {
           Serial.print("MIFARE_Write() failed: ");
           Serial.println(mfrc522.GetStatusCodeName(status));
           return 4;//return "4" as error message
  }
  Serial.println("block was written");
}



//Read specific block
int readBlock(int blockNumber, byte arrayAddress[]) 
{
  int largestModulo4Number=blockNumber/4*4;
  int trailerBlock=largestModulo4Number+3;//determine trailer block for the sector

  //authentication of the desired block for access
  byte status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));

  if (status != MFRC522::STATUS_OK) {
         Serial.print("PCD_Authenticate() failed (read): ");
         Serial.println(mfrc522.GetStatusCodeName(status));
         return 3;//return "3" as error message
  }

//reading a block
byte buffersize = 18;//we need to define a variable with the read buffer size, since the MIFARE_Read method below needs a pointer to the variable that contains the size... 
status = mfrc522.MIFARE_Read(blockNumber, arrayAddress, &buffersize);//&buffersize is a pointer to the buffersize variable; MIFARE_Read requires a pointer instead of just a number
  if (status != MFRC522::STATUS_OK) {
          Serial.print("MIFARE_read() failed: ");
          Serial.println(mfrc522.GetStatusCodeName(status));
          return 4;//return "4" as error message
  }
  Serial.println("block was read");
}

Çıkış bu şekilde görünecektir.

Kod Açıklaması:

Kod, RC522’nin bağlı olduğu Arduino pinlerini tanımlayan ve MFRC522 okuyucu nesnesini başl