Arduino ile Yoklama Sistemi Uygulaması

Bu projede MFRC522 RFID Okuyucu ve Arduino ile yoklama sistemi kuruyoruz. RFID okuyucuya her bir kart-paso okutulduğunda, kullanıcı UID’sini ve zamanını bir SD karta kaydediyoruz. Ayrıca önceden ayarlanmış bir saat ve dakikaya göre kullanıcının geç kalıp kalmadığınıda da görebiliyoruz.

Projeye Genel Bakış

Bu proje ile birlikte, RFID, SD Kart, RTC Modülü, SPI iletişimi gibi kavramları öğrenmiş ve uygulamış olacaksınız. Kartların UID’sini öğrenmek için RFID okuyucu, bu verileri kaydetmek için SD kart modülü, kaydedilen verilerin zaman damgaları ve geç gelip gelmeme kontrolünü yapmak RTC zaman modülü kullanıyoruz. Eğer zamanında kart okuma işlemi yapılırsa LED yeşil yanar, eğer geç kalırsanız LED kırmızı yanar. Ayrıca kartın okunduğunun anlaşılması için, bir buzzer(hoparlör) yardımı ile uyarı sesi verir.

Gerekli Malzemeler

arduino rfid yoklama

  • Arduino UNO
  • SD Kart Modülü ve SD Kart
  • RTC Modülü(kullanılan DS3231)
  • MFRC522 RFID Modülü ve Uygun Kart
  • LED ve 220 Ohm Direnç
  • Breadboard ve Kablolar

RFID Nedir?

Radyo frekansı tanımlama (RFID), bir nesneye bağlı bir etikette saklanan bilgileri okumak ve yakalamak için radyo dalgalarının kullanılmasıdır. Bir etiket birkaç metreye kadar okunabilir ve izlenecek okuyucunun doğrudan görüş alanı içinde olması gerekmez.

arduino rfid yoklama

MFRC522 RFID Modülü

Bu projede RFID etiketlerini okumak için MRFC522 RFID okuma modülünü kullanıyoruz. Farklı bir RFID okuma modülüde kullanabilirsiniz, fakat kütüphane uyumluluğu ve kolay kullanım açısından bu modül öncelikli tercihiniz olabiliriz.

RFID sisteminin etiketlere ve bir okuyucuya ihtiyacı vardır:

Etiketler tanımlanacak nesneye eklenir, bu örnekte bir Anahtarlık ve bir elektromanyetik kart kullanıyoruz. Bazı mağazalar, giriş sistemleri ürünlerini ya da sayımları tanımlamak için kağıt şeklindeki RFID etiketlerini de kullanır. Her etiketin kendine özgü bir kimliği (UID) vardır.

arduino rfid yoklama

RFID okuyucusu, iki yönlü yani hem verici hem alıcı olarak çalışmaktadır. Önce etikete okuma sinyalini gönderir, devamında gönderilen sinyale verilen cevabı bekler. Bu sayede iki yönlü bir iletişim kurmuş olur.

yJcvD

MFRC522 RFID okuyucusu 3.3V ile çalışmakta ve iletişim yolu olarak SPI ya da I2C protokollerini kullanmakta. Bu içerikte kullanacağımız RFID kütüphanesine buradan erişebilirsiniz, bu kütüphane sadece SPI veriyolunu desteklemekte bu yüzden SPI veriyoluna uygun bir şekilde bağlantıları yapıyoruz.

MFRC522 Kütüphanesinin Kurulumu

  1. Öncelikle kütüphaneyi indirmeniz gerekiyor, üstteki bağlantıdan indirmediyseniz buradan indirebilirsiniz.
  2. Kütüphane klasörünü indirdikten sonra klasörü çıkartarak doğrudan Arduino kütüphanelerinin yüklü olduğu klasöre kopyalayabilirsiniz. Ya da indirdiğiniz .zip klasörünü doğrudan Arduino IDE içerisinden, Taslak > library ekle > .ZIP Kitaplığı Ekle… yolunu takip ederek kütüphane konumuna ekleyebilirsiniz.

arduino rfid yoklama

RFID Bağlantı Şeması

RFID PinleriArduino UNO
SDADijital 10
SCKDijital 13
MOSIDijital 11
MISODijital 12
IRQBoş
GNDGND
RSTDijital 9
3.3V3.3V

Her Arduino kartı farklı SPI pinleri kullanmakta, bu pin bağlantıları Arduino UNO için yapılmıştır.

Bilgi

IRQ pini “Interrupt request”in kısaltması olarak karşımıza çıkmakta, bu projede interrupt yani kesme işlemi kullanmayacağımız için boş bırakıyor.

Interrupt: Kesme isteği (veya IRQ), çalışan bir programı geçici olarak durduran ve bunun yerine özel bir program olan bir kesme işleyicisinin çalışmasına izin veren işlemciye gönderilen bir donanım sinyalidir.

SD Kart Modülü

SD Kart’a yazma işlemleri için her hangi bir SD Kart Modülü kullanabilirsiniz. Bu modülün kullandığı kütüphane Arduino IDE’sine yüklü ve kullanıma hazır bir şekilde geliyor.

a7bAX

SD Kart Modülü Bağlantı Şeması

SD Kart Modülü PinleriArduino UNO
VCC3.3V
CSDijital 4
MOSIDijital 11
CLKDijital 13
MISODijital 12
GNDGND

SD Kartı Kullanıma Hazırlamak

Kullandığımız modül ve kütüphane gereği SD Kartı mutlaka FAT16 ya da FAT32 olarak biçimlendirmemiz gerekiyor. Bu işlemleri Windows ve Linux işletim sistemleri için şu adımları izleyerek yapabilirsiniz:

Bilgi

Mac OS işletim sistemlerinde FAT16 ve FAT32 dosya sistemlerini biçimlendirmek için ek programlar ya da sanal sunucu gereklidir.

Windows İçin

SD Kart adaptörü ile bilgisayarınıza SD Kartınızı bağlayın. Ardından Bilgisayarım konumuna gidin ve SD Karta sağ tıklayarak “Biçimlendir/Format” seçeneğine tıklayın.

vP6TQ

FAT32 seçeneğini seçin ve biçimlendirme işlemini başlatın.

arduino rfid yoklama

Linux Dağıtımları İçin

Terminali açın ve aşağıdaki kodu çalıştırın.

df

Terminal, takılı olan tüm bölümlerin ve ilgili bilgilerin bir listesini yazdırır: kullanılan alan, kullanılabilir alan, kullanılan alan yüzdesi ve bağlı olduğu yol gibi.

Listeden SD kartınızı bulun. Bu örnekte, SD Kart sürücüsü /dev/sdb1 olarak gözüküyor, bu yol sizde farklı olabilir bu yüzden dikkat edin.

arduino rfid yoklama

İkinci adım olarak takılı olan SD Kartı “unmount” yani demonte etmemiz gerekiyor. Aşağıdaki kod ile demonte edebilirsiniz.

sudo umount /dev/sdb1

arduino rfid yoklama

Demonte işlemi tamamlandıktan sonra istediğiniz dosya formatını biçimlendirebilirsiniz. Bu projede FAT32 kullanacağımız için bu kodu kullanmalısınız:

sudo mkfs.vfat /dev/sdb1

Diğer dosya formatları ise:

NTFS:

sudo mkfs.ntfs /dev/sdb1

exFAT:

sudo mkfs.exfat /dev/sdb1

SD Kartı Test Etmek(Opsiyonel)

Aslında bu adıma gerek yok fakat bazen formatlama işlemleri düzgün ilerlemediğinde SD Kart Modülü ile çalışırken problemler çıkabiliyor. Bu adımda hem SD kartınızı hem de SD Kart Modülünüzü test edebilirsiniz.

SD Kart Modülünü aşağıdaki gibi Arduino UNO kartınıza bağlayın:

arduino rfid yoklama

Bağlantıları tamamladıktan sonra Arduino IDE’yi açıp, Dosya > Örnekler > SD > CardInfo örneğini Arduino UNO’ya yükleyin. Yükleme tamamlandıktan sonra Seri Ekranı, 9600 baudrate ile açıp çıktıyı kontrol edin. Eğer her şey normal ve doğru ise aşağıdaki gibi bir çıktı almanız gerekiyor.

jeKhu

RTC Modülü

Zamanı takip etmek RTC modülü kullanmamız gerekiyor. Bu modül için bir çok alternatif mevcut örneğin, DS3231, DS1307, DS1302, biz bu projede DS3231 kullanıyoruz, eğer elinizde farklı bir RTC modülü varsa onu tercih edebilirsiniz.

Bilgi

DS3231 ve DS1307 I2C protokolünü kullanmaktayken DS1302 seri iletişim protokolünü kullanmakta. Bu yüzden bu projede kullanmak için kodda bazı değişiklikler yapmanız gerekiyor.

JFOB0

Ayrıca kullandığımız modülün CR2032 pil yuvasına pil takarak modül bir kaynağa bağlı olmadığı anda bile zamanı takip etmesine olanak sağlayabilirsiniz. Bu modüllerin ufakta olsa bir sapma payınında olduğunu belirtelim.

RTC Modülü Bağlantı Şeması

RTC Modülü PinleriArduino UNO
SCLA5
SDAA4
VCC5V
GNDGND

RTCLib Kütüphanesi Kurulumu

  1. Öncelikle kütüphaneyi indirmeniz gerekiyor, buradan indirebilirsiniz.
  2. Kütüphane klasörünü indirdikten sonra klasörü çıkartarak doğrudan Arduino kütüphanelerinin yüklü olduğu klasöre kopyalayabilirsiniz. Ya da indirdiğiniz .zip klasörünü doğrudan Arduino IDE içerisinden, Taslak > library ekle > .ZIP Kitaplığı Ekle… yolunu takip ederek kütüphane konumuna ekleyebilirsiniz.

Kullandığımız modüllerin kütüphane kurulumlarını ve bilgilerini parça parça bitirdik şimdi projenin tamamına büyük mercekten bakabiliriz.

Devre Şeması

Burada dikkat etmeniz gereken husus 3.3V ve 5V bağlantılarını doğru yapmak,

arduino rfid yoklama

Devrenin son görüntüsü ise bu şekilde olacaktır:

arduino rfid yoklama

Proje Kodu

#include  //  RFID
#include  // RFID ve SD kart
#include  // SD kart
#include  // RTC
#define CS_RFID 10
#define RST_RFID 9
#define CS_SD 4 
File dosya;
MFRC522 rfid(CS_RFID, RST_RFID); 
String uidString;
RTC_DS1307 rtc;
const int checkInHour = 9;
const int checkInMinute = 5;
int userCheckInHour;
int userCheckInMinute;
const int redLED = 6;
const int greenLED = 7;
const int buzzer = 5;
void setup() {
  pinMode(redLED, OUTPUT);  
  pinMode(greenLED, OUTPUT);
  pinMode(buzzer, OUTPUT);
  Serial.begin(9600);
  while(!Serial);
  SPI.begin(); 
  rfid.PCD_Init(); 
  Serial.print("SD kart hazirlaniyor...");
  if(!SD.begin(CS_SD)) {
    Serial.println("hazirlanmada beklenmeyen hata!");
    return;
  }
  Serial.println("initialization done.");
  if(!rtc.begin()) {
    Serial.println("RTC bulunamadi");
    while(1);
  }
  else {
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }
  if(!rtc.isrunning()) {
    Serial.println("RTC modulu calismiyor!");
  }
}
void loop() {
  if(rfid.PICC_IsNewCardPresent()) {
    readRFID();
    logCard();
    verifyCheckIn();
  }
  delay(10);
}
void readRFID() {
  rfid.PICC_ReadCardSerial();
  Serial.print("Tag UID: ");
  uidString = String(rfid.uid.uidByte[0]) + " " + String(rfid.uid.uidByte[1]) + " " + 
    String(rfid.uid.uidByte[2]) + " " + String(rfid.uid.uidByte[3]);
  Serial.println(uidString);
  tone(buzzer, 2000); 
  delay(100);        
  noTone(buzzer);
  delay(100);
}
void logCard() {
  digitalWrite(CS_SD,LOW);
  dosya=SD.open("DATA.txt", FILE_WRITE);
  if (dosya) {
    Serial.println("Dosya acildi");
    dosya.print(uidString);
    dosya.print(", ");   
    DateTime now = rtc.now();
    dosya.print(now.year(), DEC);
    dosya.print('/');
    dosya.print(now.month(), DEC);
    dosya.print('/');
    dosya.print(now.day(), DEC);
    dosya.print(',');
    dosya.print(now.hour(), DEC);
    dosya.print(':');
    dosya.println(now.minute(), DEC);
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.println(now.minute(), DEC);
    Serial.println("SD karta yazildi");
    dosya.close();
    userCheckInHour = now.hour();
    userCheckInMinute = now.minute();
  }
  else {
    Serial.println("data.txt acilamadi ");  
  }
  digitalWrite(CS_SD,HIGH);
}
void verifyCheckIn(){
  if((userCheckInHour < checkInHour)||((userCheckInHour==checkInHour) && (userCheckInMinute <= checkInMinute))){
    digitalWrite(greenLED, HIGH);
    delay(2000);
    digitalWrite(greenLED,LOW);
    Serial.println("Hosgeldiniz");
  }
  else{
    digitalWrite(redLED, HIGH);
    delay(2000);
    digitalWrite(redLED,LOW);
    Serial.println("Geciktiniz...");
  }
}

SD Karttan Verileri Okumak

Devreyi çalıştırıp bir kaç kartı okuttuktan sonra veriler SD Kartın içinde DATA.txt isimli metin dosyasına sıralı bir şekilde yazılmış olacak. Favori metin düzenleyiciniz ile açarak kontrol edebilirsiniz.

arduino rfid yoklama