RFID Kart Okuma ve Servo Kilit Sistemi
Arduino ile RC522 RFID modülünü kullanarak kart okuma, kart UID değerini bulma ve yetkili kartla servo motorlu kilit sistemi yapmayı öğreneceğiz.
Bu derste Arduino ile RFID kart veya anahtarlık okutmayı öğreneceğiz. Önce RFID kartın UID değerini Seri Port Ekranı’nda görüntüleyeceğiz. Daha sonra belirlediğimiz yetkili kart okutulduğunda servo motoru hareket ettirerek basit bir kapı kilidi mantığı kuracağız.
- Arduino Uno
- RC522 RFID modülü
- RFID kart veya RFID anahtarlık
- SG90 servo motor
- Kırmızı LED
- Yeşil LED
- Buzzer
- 220 ohm dirençler
- Jumper kablolar
RC522 RFID modülü 3.3V ile çalışır. Modülün VCC pinini Arduino’nun 5V pinine bağlamayın. VCC bağlantısı Arduino üzerindeki 3.3V pininden yapılmalıdır.
RC522 RFID modülü Arduino ile SPI haberleşmesi kullanır. Bu yüzden SDA, SCK, MOSI ve MISO pinleri doğru bağlanmalıdır. Servo motor ise 6 numaralı dijital pine bağlanacaktır.
Servo motor bazen Arduino’nun 5V pininden yeterli akımı alamayabilir. Servo titrer veya reset sorunu yaşanırsa harici 5V güç kaynağı kullanılmalı ve Arduino GND ile harici güç kaynağının GND hattı ortaklanmalıdır.
RFID kart okuyucu, kart modüle yaklaştırıldığında kartın UID değerini okur. UID, kartın kimlik numarası gibi düşünülebilir. Her kartın UID değeri farklı olabilir.
Önce basit bir kodla kart UID değerini Seri Port Ekranı’nda göreceğiz. Daha sonra bu UID değerini yetkili kart olarak tanımlayıp kart okutulduğunda servo motoru açma konumuna getireceğiz.
Bu uygulama gerçek güvenlik sistemleri için tek başına yeterli değildir. Eğitim amaçlı basit RFID okuma ve servo kontrol mantığını öğretmek için hazırlanmıştır.
Bu uygulamada RC522 modülünü kullanmak için MFRC522 kütüphanesi gerekir. Arduino IDE üzerinde Kütüphane Yöneticisi’ni açıp MFRC522 şeklinde arama yaparak kütüphaneyi kurabilirsiniz.
Kod içinde ayrıca SPI kütüphanesi de kullanılır. SPI kütüphanesi Arduino IDE ile birlikte gelir.
İlk olarak aşağıdaki kodu Arduino’ya yükleyin. Daha sonra Seri Port Ekranı’nı açıp kartı RFID modülüne yaklaştırın. Ekranda kartın UID değeri görünecektir.
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 rfid(SS_PIN, RST_PIN);
void setup() {
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
Serial.println("RFID kart okutun...");
}
void loop() {
if (!rfid.PICC_IsNewCardPresent()) {
return;
}
if (!rfid.PICC_ReadCardSerial()) {
return;
}
Serial.print("Kart UID: ");
for (byte i = 0; i < rfid.uid.size; i++) {
if (rfid.uid.uidByte[i] < 0x10) {
Serial.print("0");
}
Serial.print(rfid.uid.uidByte[i], HEX);
Serial.print(" ");
}
Serial.println();
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
}
Seri Port Ekranı’nda gördüğünüz UID değerini not alın. Bir sonraki kodda yetkiliUID bölümünü kendi kartınıza göre değiştireceğiz.
Bu kodda yetkili kart okutulduğunda yeşil LED yanar, buzzer kısa uyarı verir ve servo motor açılma konumuna gider. Yetkisiz kart okutulduğunda kırmızı LED yanar ve buzzer farklı şekilde uyarı verir.
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#define SS_PIN 10
#define RST_PIN 9
const int servoPin = 6;
const int yesilLed = 7;
const int kirmiziLed = 8;
const int buzzer = 5;
MFRC522 rfid(SS_PIN, RST_PIN);
Servo kilitServo;
// Buradaki UID değerlerini kendi kartınıza göre değiştirin.
// Örnek: Seri Port Ekranı'nda "A3 4F 1B 09" gördüyseniz
// aşağıdaki dizi {0xA3, 0x4F, 0x1B, 0x09} olmalıdır.
byte yetkiliUID[] = {0xA3, 0x4F, 0x1B, 0x09};
byte yetkiliUIDUzunluk = 4;
void setup() {
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
kilitServo.attach(servoPin);
kilitKapat();
pinMode(yesilLed, OUTPUT);
pinMode(kirmiziLed, OUTPUT);
pinMode(buzzer, OUTPUT);
digitalWrite(yesilLed, LOW);
digitalWrite(kirmiziLed, LOW);
digitalWrite(buzzer, LOW);
Serial.println("RFID kilit sistemi hazir.");
Serial.println("Kart okutun...");
}
void loop() {
if (!rfid.PICC_IsNewCardPresent()) {
return;
}
if (!rfid.PICC_ReadCardSerial()) {
return;
}
Serial.print("Okunan UID: ");
uidYazdir();
if (kartYetkiliMi()) {
Serial.println("Yetkili kart. Kilit acildi.");
basariliUyari();
kilitAc();
delay(3000);
kilitKapat();
} else {
Serial.println("Yetkisiz kart.");
hataliUyari();
}
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
}
bool kartYetkiliMi() {
if (rfid.uid.size != yetkiliUIDUzunluk) {
return false;
}
for (byte i = 0; i < yetkiliUIDUzunluk; i++) {
if (rfid.uid.uidByte[i] != yetkiliUID[i]) {
return false;
}
}
return true;
}
void uidYazdir() {
for (byte i = 0; i < rfid.uid.size; i++) {
if (rfid.uid.uidByte[i] < 0x10) {
Serial.print("0");
}
Serial.print(rfid.uid.uidByte[i], HEX);
Serial.print(" ");
}
Serial.println();
}
void kilitAc() {
kilitServo.write(90);
}
void kilitKapat() {
kilitServo.write(0);
}
void basariliUyari() {
digitalWrite(yesilLed, HIGH);
digitalWrite(kirmiziLed, LOW);
tone(buzzer, 1200);
delay(150);
noTone(buzzer);
delay(300);
digitalWrite(yesilLed, LOW);
}
void hataliUyari() {
digitalWrite(kirmiziLed, HIGH);
digitalWrite(yesilLed, LOW);
for (int i = 0; i < 3; i++) {
tone(buzzer, 300);
delay(120);
noTone(buzzer);
delay(120);
}
digitalWrite(kirmiziLed, LOW);
}
Servo motorun açılma ve kapanma açıları mekanik yapınıza göre değişebilir. kilitAc() ve kilitKapat() fonksiyonlarındaki açı değerlerini kendi düzeneğinize göre değiştirebilirsiniz.
- Birden fazla yetkili kart tanımlanabilir.
- LCD ekran eklenerek “Yetkili Kart” ve “Yetkisiz Kart” mesajları gösterilebilir.
- EEPROM kullanılarak yetkili kartlar Arduino hafızasında saklanabilir.
- Buton eklenerek içeriden kilidi açma sistemi yapılabilir.
- Röle modülü kullanılarak gerçek bir manyetik kilit veya elektrikli kapı kilidi kontrol edilebilir.
Gerçek kapı kilidi uygulamalarında röle, güç kaynağı, kablo bağlantıları ve güvenlik önlemleri dikkatli planlanmalıdır.