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 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.
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.
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.
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
- Öncelikle kütüphaneyi indirmeniz gerekiyor, üstteki bağlantıdan indirmediyseniz buradan indirebilirsiniz.
- 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.
RFID Bağlantı Şeması
RFID Pinleri | Arduino UNO |
---|---|
SDA | Dijital 10 |
SCK | Dijital 13 |
MOSI | Dijital 11 |
MISO | Dijital 12 |
IRQ | Boş |
GND | GND |
RST | Dijital 9 |
3.3V | 3.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.
SD Kart Modülü Bağlantı Şeması
SD Kart Modülü Pinleri | Arduino UNO |
---|---|
VCC | 3.3V |
CS | Dijital 4 |
MOSI | Dijital 11 |
CLK | Dijital 13 |
MISO | Dijital 12 |
GND | GND |
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.
FAT32 seçeneğini seçin ve biçimlendirme işlemini başlatın.
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.
İ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
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:
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.
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.
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ü Pinleri | Arduino UNO |
---|---|
SCL | A5 |
SDA | A4 |
VCC | 5V |
GND | GND |
RTCLib Kütüphanesi Kurulumu
- Öncelikle kütüphaneyi indirmeniz gerekiyor, buradan indirebilirsiniz.
- 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,
Devrenin son görüntüsü ise bu şekilde olacaktır:
Proje Kodu
#include <MFRC522.h> #include <SPI.h> #include <SD.h> #include <RTClib.h> #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("hazirlik tamamlandi."); 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.
Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.