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:
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.
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
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şlatan MFRC522 ve SPI kütüphanesini dahil ederek başlar.
#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
Ardından, verilerimizi saklayacağımız bir blok tanımlamamız gerekiyor. Burada sektör 0, blok 2 seçilir. Herhangi bir sektörün 3. bloğunu asla seçmeyi unutmayın. 'Sektör fragmanı' bloğuna yazmak bloğu kullanılamaz hale getirebilir.
//this is the block number we will write into and then read.
int block=2;
Sonra, blockcontent[16] bloğa yazmak istediğimiz mesajı içeren 16 baytlık bir dizi tanımlarız. Sıfır yazarak herhangi bir bloğu silebilirsiniz.
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.
Ardından, 18 baytlık bir dizi tanımlamamız gerekiyor readbackblock[18]. Bu, yazılı içeriği geri okumak için kullanılabilir. Bekle… 18 bayt? Bu 16 bayt olmamalı mı? Yanıt hayırdır. gibi... MFRC522 kitaplığındaki MIFARE_Read yöntemi, bir bloğun 16 baytını tutmak için en az 18 baytlık bir arabellek gerektirir.
//This array is used for reading out a block.
byte readbackblock[18];
Kurulum işlevinde: PC, SPI kütüphanesi ve MFRC522 nesnesiyle seri iletişimi başlatırız. Ayrıca, okuma ve yazma işlevleri için güvenlik anahtarını da hazırlamamız gerekir. Burada altı anahtar baytın tümü 0xFF olarak ayarlanmıştır. Setteki kartlar yeni olduğundan ve anahtarlar hiçbir zaman tanımlanmadığından 0xFF'dir. Başka biri tarafından programlanmış bir kartımız olsaydı, erişebilmek için anahtarı bilmemiz gerekirdi. Bu anahtarın 'key'de depolanması gerekir.
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
}
Döngü işlevinde: önce görünümde bir kart olup olmadığını tararız, eğer evet ise, bu kart yazma ve okuma amacıyla seçilir.
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
Serial.println("card selected");
Blok için writeBlock() iki parametre alan denilen özel bir işlevi çağırmamız gerekiyor - biri verileri ve verilerin kendisini yazmakla ilgilendiğimiz blok numarası.
//the blockcontent array is written into the card block
writeBlock(block, blockcontent);
Yazma işleminin başarılı olup olmadığını kontrol etmek için blok içeriğini tekrar okumamız gerekir. Bu, yine iki parametre alan denilen özel işlev kullanılarak yapılabilir - biri blok numarası ve diğeri blok içeriğini depolamak için dizi. PICC_DumpToSerial() 1k hafızanın tamamını, bloğa yazılmış olarak görmek istiyorsanız bu işlevi kullanabilirsiniz.
//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));
Son olarak, seri monitörde for döngüsü ve ekran içerikleri kullanarak readbackblock dizisinin içeriğini yazdırıyoruz.
//print the block contents
Serial.print("read block: ");
for (int j=0 ; j<16 ; j++)
{
Serial.write (readbackblock[j]);
}
Serial.println("");
Arduino Projesi
RFID Kapı Kilidi (Kartlı Geçiş)
Basit bir RC522 RFID okuyucu modülünün bir RFID Kapı Kilidi - Kartlı Geçiş Sistemi yapmak için nasıl kullanılabileceğini göstermek için hızlı bir Arduino projesi oluşturalım. Programımız, RC522 okuyucu tarafından enerjilendirilecek kadar yakın olduğunda her RFID etiketinin benzersiz kimliğini tarar. Etiketin UID'si Arduino belleğinde saklanan önceden tanımlanmış bir değerle (Ana etiket) eşleşirse, erişim verilir. Bilinmeyen bir etiketi tararsak erişim reddedilir. Çıktı böyle görünür.
Tabii ki bu proje kapıları açmak, bir röleyi açmak, bir LED yakmak veya aklınıza gelebilecek başka bir şeyle arayüzlenebilir. 16 × 2 karakterli LCD'lere aşina değilseniz, öğreticinin altındaki okumayı (en azından gözden geçirme) düşünün.
Kod yüklemeye ve etiketleri taramaya başlamadan önce, proje için devre şemasına bakalım.
Şimdi, aşağıdaki kodu deneyin.
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
#define RST_PIN 9
#define SS_PIN 10
byte readCard[4];
String MasterTag = "20C3935E"; // REPLACE this Tag ID with your Tag ID!!!
String tagID = "";
// Create instances
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //Parameters: (rs, enable, d4, d5, d6, d7)
void setup()
{
// Initiating
SPI.begin(); // SPI bus
mfrc522.PCD_Init(); // MFRC522
lcd.begin(16, 2); // LCD screen
lcd.clear();
lcd.print(" Access Control ");
lcd.setCursor(0, 1);
lcd.print("Scan Your Card>>");
}
void loop()
{
//Wait until new tag is available
while (getID())
{
lcd.clear();
lcd.setCursor(0, 0);
if (tagID == MasterTag)
{
lcd.print(" Access Granted!");
// You can write any code here like opening doors, switching on a relay, lighting up an LED, or anything else you can think of.
}
else
{
lcd.print(" Access Denied!");
}
lcd.setCursor(0, 1);
lcd.print(" ID : ");
lcd.print(tagID);
delay(2000);
lcd.clear();
lcd.print(" Access Control ");
lcd.setCursor(0, 1);
lcd.print("Scan Your Card>>");
}
}
//Read new tag if available
boolean getID()
{
// Getting ready for Reading PICCs
if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
return false;
}
if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
return false;
}
tagID = "";
for ( uint8_t i = 0; i < 4; i++) { // The MIFARE PICCs that we use have 4 byte UID
//readCard[i] = mfrc522.uid.uidByte[i];
tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
}
tagID.toUpperCase();
mfrc522.PICC_HaltA(); // Stop reading
return true;
}
Program oldukça basit. Başlangıçta gerekli kütüphaneleri ekliyoruz, Arduino pinlerini tanımlıyoruz, LCD ve MFRC522 nesnelerinin örneklerini oluşturuyoruz ve ana etiketi tanımlıyoruz.
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
#define RST_PIN 9
#define SS_PIN 10
byte readCard[4];
String MasterTag = "20C3935E"; // REPLACE this Tag ID with your Tag ID!!!
String tagID = "";
// Create instances
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //Parameters: (rs, enable, d4, d5, d6, d7)
Kurulum işlevinde SPI arabirimini, MFRC522 nesnesini ve LCD'yi başlatırız. Bunu takiben LCD'ye karşılama mesajı yazdırıyoruz.
void setup()
{
// Initiating
SPI.begin(); // SPI bus
mfrc522.PCD_Init(); // MFRC522
lcd.begin(16, 2); // LCD screen
lcd.clear();
lcd.print(" Access Control ");
lcd.setCursor(0, 1);
lcd.print("Scan Your Card>>");
}
Döngü işlevinde, yeni etiket taranana kadar bekleriz. Tamamlandığında, bilinmeyen etiketi önceki kurulum işlevinde tanımlanan ana etiketle karşılaştırırız. Kimlik, ana kimlikle eşleşirse, erişim reddedilir.
void loop()
{
//Wait until new tag is available
while (getID())
{
lcd.clear();
lcd.setCursor(0, 0);
if (tagID == MasterTag)
{
lcd.print(" Access Granted!");
// You can write any code here like opening doors, switching on a relay, lighting up an LED, or anything else you can think of.
}
else
{
lcd.print(" Access Denied!");
}
lcd.setCursor(0, 1);
lcd.print(" ID : ");
lcd.print(tagID);
delay(2000);
lcd.clear();
lcd.print(" Access Control ");
lcd.setCursor(0, 1);
lcd.print("Scan Your Card>>");
}
}
Projedeki anahtar şey getID () adı verilen özel bir işlevdir. Yeni kartı taradıktan sonra, bir for döngüsü içinde 4 bayt UID'yi dizeye dönüştürür ve tek bir dize oluşturmak için birleştirir.
boolean getID()
{
// Getting ready for Reading PICCs
if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
return false;
}
if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
return false;
}
tagID = "";
for ( uint8_t i = 0; i < 4; i++) { // The MIFARE PICCs that we use have 4 byte UID
//readCard[i] = mfrc522.uid.uidByte[i];
tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
}
tagID.toUpperCase();
mfrc522.PICC_HaltA(); // Stop reading
return true;
}