Başa dön
arduino rfid kapı kilidi

Arduino RFID Kartlı Kapı Kilidi Projesi

 

Rfid Nedir?


RFID, Radyo Frekansı Tanımlama anlamına gelir ve pek çok endüstride, personel takibi, erişim kontrolü, tedarik zinciri yönetimi, stok ve satış kontrolü, kütüphanelerde kitap takibi, ücretsiz sistemler ve benzeri işler için yaygın olarak kullanılan temassız bir teknolojidir.

 

RFID uygulamaları ve kullanımları

RFID Nasıl Çalışır?


Bir RFID sistemi iki ana bileşenden, tanımlanmasını istediğimiz nesnenin üzerinde bulunan bir etiket ve bir alıcı-verici okuyucudan oluşur.

RFID Nasıl Çalışıyor?

RFID okuyucu, bir radyo frekans modülünden, bir kontrol ünitesinden ve yüksek frekanslı elektromanyetik alan üreten bir anten bobininden oluşur. Öte yandan, etiket genellikle sadece bir anten ve bir elektronik mikroçipten oluşan pasif bir bileşendir, bu nedenle, alıcı-vericinin elektromanyetik alanına yaklaşınca, indüksiyon nedeniyle bir manyetik alan üretilir ve bu alan mikroçipin çalışması için gerekli enerji görevi görür.

RFID Çalışma Prensibi

Etiket güçlendirildiği için iletilen mesajı okuyucudan çıkarabilir ve okuyucuya geri mesaj göndermek için yük manipülasyonu adı verilen bir teknik kullanır. Etiketin antenindeki gücün açılması ve kapatılması, okuyucunun anteninin voltaj düşüşü olarak ölçülebilen güç tüketimini etkileyecektir. Gerilimdeki bu değişimler bir ve sıfır olarak yakalanacak ve verilerin etiketten okuyucuya aktarılması bu şekilde olacaktır.

Okuyucu ve etiket arasında geriye saçmalı kaplin denilen başka bir veri aktarım yolu vardır. Etiket, okuyucunun anteni tarafından algılanacak başka bir elektromanyetik alan üretmek için alınan gücün bir bölümünü kullanır.

 

Arduino Uno Rfid Kapı Kilidi – RFID ve Arduino


İşte bu temel çalışma prensibi ve şimdi RFID’yi Arduino ile nasıl kullanabileceğimizi ve kendi arduino rfid kapı kilidi projemizi nasıl kurabileceğimizi görelim. Sadece birkaç dolara mal olan MIFARE protokolüne ve RC522 RFID okuyucusu ile çalışan etiketleri kullanacağız.

RFID ve Arduino Eğitimi

Bu etiketler 1kb belleğe sahiptir ve aritmetik işlemler yapabilen bir mikroçip içerir. Çalışma frekansı 13.56 MHz’dir ve çalışma mesafesi antenin geometrisine bağlı olarak 10 cm’dir. Bu etiketlerden birini bir ışık kaynağının önüne getirirsek, daha önce bahsettiğimiz anten ve mikroçipi görebiliriz.

Anten ve Mikroçip İçinde RFID Etiketi

RFID okuyucu modülüne gelince, Arduino kartıyla iletişim kurmak için SPI protokolünü kullanır. Lütfen modülün VCC‘sini 3.3V‘a bağlamamız gerektiğini ve diğer pinlerde olduğu gibi 5V toleranslı oldukları için endişelenmemize gerek olmadığını unutmayın.

Modülü bağladıktan sonra, RC522 kütüphanesini  GitHub’dan indirmemiz gerekiyor . Kütüphane, modülü nasıl kullanacağımızı öğrenebileceğimiz birkaç güzel örnek ile birlikte geliyor.

İlk önce “DumpInfo” örneğini yükleyebilir ve sistemimizin düzgün çalışıp çalışmadığını test edebiliriz. Şimdi Seri İzleyiciyi çalıştırıp etiketi modülün yanına getirirsek, okuyucu etiketi okumaya başlar ve etiketten gelen tüm bilgiler 16×2 lcd ekran da görüntülenir.

Arduino MFRC522 kütüphanesi Dumpinfo Örnek

Burada, etiketin UID numarasını görebiliriz. Aslında 1 KB’lık bellek 16 bölüme ayrılmıştır. Her bölüm 4 bloğa ayrılır ve her blok 2 bayt veri depolayabilir. Bu bilgi için, etiketin hiçbir hafızasını kullanmayacağız, sadece etiketin UID numarasını kullanacağız.

 

Arduino RFID Kartlı Kapı Kilidi Projesi – Erişim Kontrol


RFID kapı kilidi projemizin kodunu incelemeden önce, bu projenin bileşenlerine ve devre şemalarına bir göz atalım.

Arduino RFID Kapı Kilidi Erişim Kontrol Projesi

RFID modülüne ek olarak, kapının kapalı veya açık olup olmadığını, kilit mekanizması için bir servo motoru ve bir 16×2 lcd ekran üzerinden kontrol etmek için bir kızılötesi alıcı-verici yakınlık sensörü kullanacağız.

Bu Arduino projesi için gerekli bileşenleri aşağıdaki linklerden alabilirsiniz:

 

Proje iş akışı şu şekildedir: Önce bir ana etiket yani master(admin) ayarlamamız gerekiyor, sonra sistem normal moda giriyor. Bilinmeyen bir etiket tararsak erişim reddedilir, ancak ana belgeyi tararsak bilinmeyen etiketi ekleyip yetkilendirebileceğimiz bir program moduna gireriz. Şimdi etiketi tekrar tararsak, kapıyı açabilmemiz için izin verilecek.

Arduino RFID Kapı Kilidi Erişim Kontrol Projesi

Kapıyı kapattıktan sonra kapı otomatik olarak kilitlenir. Bir etiketi sistemden kaldırmak istiyorsak, tekrar program moduna geçmemiz gerekir, “know tag” ‘i tarayın ve kart kaldırılacaktır.

Kaynak kodu


Şimdi koda bir göz atalım.  Öncelikle, RFID modülü için kütüphaneleri, göstergeyi ve servo motoru dahil etmemiz, aşağıdaki program için gerekli bazı değişkenleri tanımlamanın yanı sıra kütüphanelerin örneklerini oluşturmamız gerekir.

#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
#include <Servo.h>
#define RST_PIN   9
#define SS_PIN    10
byte readCard[4];
char* myTags[100] = {};
int tagsCount = 0;
String tagID = "";
boolean successRead = false;
boolean correctTag = false;
int proximitySensor;
boolean doorOpened = false;
// Create instances
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Parameters: (rs, enable, d4, d5, d6, d7)
Servo myServo; // Servo motor

Kurulum bölümünde, ilk önce modülleri başlattık ve servo motorun başlangıç ​​değerini kilitleme konumuna getirdik. Ardından ilk mesajı ekrana yazdırırız ve aşağıdaki while döngüsüyle ana etiket taranana kadar bekleriz. Daha sonra GetID () işlevi UID etiketini alıp myTags [0] dizisinin ilk konumuna koyalım.

void setup() {
  // Initiating
  SPI.begin();        // SPI bus
  mfrc522.PCD_Init(); //  MFRC522
  lcd.begin(16, 2);   // LCD screen
  myServo.attach(8);  // Servo motor
  myServo.write(10); // Initial lock position of the servo motor
  // Prints the initial message
  lcd.print("-No Master Tag!-");
  lcd.setCursor(0, 1);
  lcd.print("    SCAN NOW");
  // Waits until a master card is scanned
  while (!successRead) {
    successRead = getID();
    if ( successRead == true) {
      myTags[tagsCount] = strdup(tagID.c_str()); // Sets the master tag into position 0 in the array
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Master Tag Set!");
      tagsCount++;
    }
  }
  successRead = false;
  printNormalModeMessage();
}

GetID () işlevine bir göz atalım. Öncelikle, okuyucunun yanına yerleştirilmiş yeni bir etiket olup olmadığını kontrol edelim. Öyleyse etiketin UID‘sini alan “for” döngüsüne devam edeceğiz. Kullandığımız etiketlerde 4 byte UID numarası var ve bu yüzden bu döngüde 4 yineleme yapmamız gerekiyor ve concat () işlevini kullanarak 4 baytı tek bir String değişkenine ekliyoruz. Ayrıca dizenin tüm karakterlerini büyük harflere ayarladık ve okumayı durdurduk.

uint8_t getID() {
  // Getting ready for Reading PICCs
  if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
    return 0;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) {   //Since a PICC placed get Serial and continue
    return 0;
  }
  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 1;
}

Ana döngüye girmeden önce, kurulum bölümünün sonunda, ekranda “Erişim Kontrolü” mesajını gösteren printNormalModeMessage () işlevini de çağırırız.

void printNormalModeMessage() {
  delay(1500);
  lcd.clear();
  lcd.print("-Access Control-");
  lcd.setCursor(0, 1);
  lcd.print(" Scan Your Tag!");
}

Ana döngüde, kapının kapalı olup olmadığını bize söyleyen yakınlık sensörünün değerini okumakla bu adıma başlayalım.

int proximitySensor = analogRead(A0);

Kapı kapalıysa, getID () işlevinde tanımladığımız satırların aynısını kullanarak yeni etiketin UID‘sini tarar ve alırız. Burada if ifadelerindekireturn satırları nedeniyle bir etiket tarayana kadar kodun daha ileri gitmeyeceğini fark edebiliriz.

 

Etiketi taradıktan sonra, bu etiketin daha önce kaydettiğimiz master olup olmadığını kontrol ederiz ve bu doğruysa, program moduna gireceğiz. Bu modda, önceden yetkilendirilmiş bir etiketi tararsak, sistemden kaldırılır veya etiket bilinmiyorsa sisteme yetkili olarak eklenir.

// Checks whether the scanned tag is the master tag
    if (tagID == myTags[0]) {
      lcd.clear();
      lcd.print("Program mode:");
      lcd.setCursor(0, 1);
      lcd.print("Add/Remove Tag");
      while (!successRead) {
        successRead = getID();
        if ( successRead == true) {
          for (int i = 0; i < 100; i++) {
            if (tagID == myTags[i]) {
              myTags[i] = "";
              lcd.clear();
              lcd.setCursor(0, 0);
              lcd.print("  Tag Removed!");
              printNormalModeMessage();
              return;
            }
          }
          myTags[tagsCount] = strdup(tagID.c_str());
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("   Tag Added!");
          printNormalModeMessage();
          tagsCount++;
          return;
        }
      }
    }

Program kipinin dışında, sonraki for döngüsüyle taranan etiketin kayıtlı etiketlerden herhangi biri olup olmadığını kontrol ederiz. Uyumlu ise kapının kilidi açılır ya da erişimi reddedilir. Else ifadesinin sonunda kapı kapanana kadar bekleriz, sonra kapıyı kilitler ve normal mod mesajını tekrar yazdırırız.

// Checks whether the scanned tag is authorized
    for (int i = 0; i < 100; i++) {
      if (tagID == myTags[i]) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print(" Access Granted!");
        myServo.write(170); // Unlocks the door
        printNormalModeMessage();
        correctTag = true;
      }
    }
    if (correctTag == false) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(" Access Denied!");
      printNormalModeMessage();
    }
  }
  // If door is open...
  else {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(" Door Opened!");
    while (!doorOpened) {
      proximitySensor = analogRead(A0);
      if (proximitySensor > 200) {
        doorOpened = true;
      }
    }
    doorOpened = false;
    delay(500);
    myServo.write(10); // Locks the door
    printNormalModeMessage();
  }

Ve işte projenin tam kodu:

/*
* Arduino RFID Kartlı Kapı Kilidi Projesi
*                
* www.HayaletVeYap.com
* 
* Library: RC522, https://github.com/miguelbalboa/rfid
*/
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
#include <Servo.h>
#define RST_PIN   9
#define SS_PIN    10
byte readCard[4];
char* myTags[100] = {};
int tagsCount = 0;
String tagID = "";
boolean successRead = false;
boolean correctTag = false;
int proximitySensor;
boolean doorOpened = false;
// Create instances
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Parameters: (rs, enable, d4, d5, d6, d7)
Servo myServo; // Servo motor
void setup() {
  // Initiating
  SPI.begin();        // SPI bus
  mfrc522.PCD_Init(); //  MFRC522
  lcd.begin(16, 2);   // LCD screen
  myServo.attach(8);  // Servo motor
  myServo.write(10); // Initial lock position of the servo motor
  // Prints the initial message
  lcd.print("-No Master Tag!-");
  lcd.setCursor(0, 1);
  lcd.print("    SCAN NOW");
  // Waits until a master card is scanned
  while (!successRead) {
    successRead = getID();
    if ( successRead == true) {
      myTags[tagsCount] = strdup(tagID.c_str()); // Sets the master tag into position 0 in the array
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Master Tag Set!");
      tagsCount++;
    }
  }
  successRead = false;
  printNormalModeMessage();
}
void loop() {
  int proximitySensor = analogRead(A0);
  // If door is closed...
  if (proximitySensor > 200) {
    if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
      return;
    }
    if ( ! mfrc522.PICC_ReadCardSerial()) {   //Since a PICC placed get Serial and continue
      return;
    }
    tagID = "";
    // The MIFARE PICCs that we use have 4 byte UID
    for ( uint8_t i = 0; i < 4; i++) {  //
      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
    correctTag = false;
    // Checks whether the scanned tag is the master tag
    if (tagID == myTags[0]) {
      lcd.clear();
      lcd.print("Program mode:");
      lcd.setCursor(0, 1);
      lcd.print("Add/Remove Tag");
      while (!successRead) {
        successRead = getID();
        if ( successRead == true) {
          for (int i = 0; i < 100; i++) {
            if (tagID == myTags[i]) {
              myTags[i] = "";
              lcd.clear();
              lcd.setCursor(0, 0);
              lcd.print("  Tag Removed!");
              printNormalModeMessage();
              return;
            }
          }
          myTags[tagsCount] = strdup(tagID.c_str());
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("   Tag Added!");
          printNormalModeMessage();
          tagsCount++;
          return;
        }
      }
    }
    successRead = false;
    // Checks whether the scanned tag is authorized
    for (int i = 0; i < 100; i++) {
      if (tagID == myTags[i]) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print(" Access Granted!");
        myServo.write(170); // Unlocks the door
        printNormalModeMessage();
        correctTag = true;
      }
    }
    if (correctTag == false) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(" Access Denied!");
      printNormalModeMessage();
    }
  }
  // If door is open...
  else {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(" Door Opened!");
    while (!doorOpened) {
      proximitySensor = analogRead(A0);
      if (proximitySensor > 200) {
        doorOpened = true;
      }
    }
    doorOpened = false;
    delay(500);
    myServo.write(10); // Locks the door
    printNormalModeMessage();
  }
}
uint8_t getID() {
  // Getting ready for Reading PICCs
  if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
    return 0;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) {   //Since a PICC placed get Serial and continue
    return 0;
  }
  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 1;
}
void printNormalModeMessage() {
  delay(1500);
  lcd.clear();
  lcd.print("-Access Control-");
  lcd.setCursor(0, 1);
  lcd.print(" Scan Your Tag!");
}

 

Umarım bu projemizi beğenmişsinizdir.

Diğer Güncel Arduino Projelerimiz için BURAYA TIKLAYABİLİRSİNİZ.

Sizde Robotlara ve Maker’lığa Meraklıysanız, Robotik Marketimiz ROBOCOMBO‘yu Ziyaret Edebilirsiniz.

 

Okuduğunuz İçin Teşekkürler.
Kaynak: howtomechatronics.com/tutorials/arduino/rfid-works-make-arduino-based-rfid-door-lock/