ESP32 ile RFID Kontrollü Servo Motor Projesi

Bu rehber, ESP32 geliştirme kartı kullanarak MFRC522 RFID okuyucu modülü ile yetkili kartları tanıma ve servo motor kontrolü gerçekleştirme işlemini adım adım açıklar. SPI iletişim protokolü ile RFID okuyucunun kontrol edilmesi ve yetkili kart algılandığında servo motorun açı değiştirmesi prensibine dayanan bu proje, RFID entegrasyonu, SPI haberleşme ve erişim kontrol sistemleri konularını öğrenmek için temel bir uygulamadır.

Adım 1 – Bileşenleri Tanıyın

MFRC522 RFID Okuyucu Modülü

MFRC522, 13.56 MHz frekansında çalışan RFID/NFC kart ve etiketleri okuyabilen bir modüldür. SPI iletişim protokolü kullanır ve sekiz bağlantı ucu bulunur:

  • VCC: Güç beslemesi (3.3V – 5V uyumlu)
  • GND: Toprak bağlantısı
  • RST: Reset sinyali (isteğe bağlı, yazılımsal reset için)
  • IRQ: Kesme sinyali (bu projede kullanılmıyor)
  • MISO: SPI Master In Slave Out veri hattı
  • MOSI: SPI Master Out Slave In veri hattı
  • SCK: SPI saat sinyali (Clock)
  • SS/SDA: SPI Slave Select, modül seçimi için kullanılır

Modül, MIFARE Classic, MIFARE Ultralight ve NFC Type A/B kartları destekler.

Servo Motor

Servo motor, 0-180 derece aralığında hassas açı kontrolü sağlayan bir aktüatördür. Üç bağlantı ucu bulunur:

  • VCC (Kırmızı): Güç beslemesi (5V veya 6V)
  • GND (Siyah/Kahverengi): Toprak bağlantısı
  • Sinyal (Sarı/Turuncu): PWM kontrol sinyali girişi

Gerekli Kütüphaneler

Projede kullanılan kütüphaneler:

  • SPI.h: ESP32’nin dahili SPI iletişim kütüphanesi
  • MFRC522.h: MFRC522 RFID okuyucu modülü için sürücü kütüphanesi
  • ESP32Servo.h: ESP32 için optimize edilmiş servo motor kontrol kütüphanesi

Adım 2 – GPIO Pin Atamaları

Projede kullanılan pin atamaları:

  • GPIO 5 (SS/SDA): RFID modülü SPI Slave Select pini
  • GPIO 27 (RST): RFID modülü reset pini
  • GPIO 32: Servo motor sinyal pini
  • GPIO 23 (MOSI): SPI veri çıkışı (ESP32 varsayılan)
  • GPIO 19 (MISO): SPI veri girişi (ESP32 varsayılan)
  • GPIO 18 (SCK): SPI saat sinyali (ESP32 varsayılan)

Not: ESP32’de SPI pinleri yazılımsal olarak değiştirilebilir; bu projede varsayılan VSPI pinleri kullanılmıştır.

Adım 3 – Devre Bağlantısı

MFRC522 RFID Modülü Bağlantısı:

  1. RFID VCC pinini ESP32 3.3V pinine bağlayın.
  2. RFID GND pinini ESP32 GND pinine bağlayın.
  3. RFID SCK pinini ESP32 GPIO 18 (SCK) pinine bağlayın.
  4. RFID MISO pinini ESP32 GPIO 19 (MISO) pinine bağlayın.
  5. RFID MOSI pinini ESP32 GPIO 23 (MOSI) pinine bağlayın.
  6. RFID SS/SDA pinini ESP32 GPIO 5 pinine bağlayın.
  7. RFID RST pinini ESP32 GPIO 27 pinine bağlayın.

Servo Motor Bağlantısı:

  1. Servo motorun VCC (kırmızı) kablosunu harici 5V güç kaynağına bağlayın.
  2. Servo motorun GND (siyah/kahverengi) kablosunu hem ESP32 GND’ye hem de harici güç kaynağının GND’sine bağlayın (ortak toprak).
  3. Servo motorun sinyal (sarı/turuncu) kablosunu ESP32 GPIO 32 pinine bağlayın.

Uyarı: Servo motorlar yüksek akım çeker. ESP32’nin dahili regülatörü üzerinden beslemek kararsız çalışmaya veya kartın zarar görmesine neden olabilir. Harici 5V/2A güç kaynağı kullanılması önerilir.

Adım 4 – Arduino IDE Hazırlığı

Arduino IDE’yi açın ve aşağıdaki kütüphaneleri Kütüphane Yöneticisi üzerinden yükleyin:

  • MFRC522: “MFRC522” araması ile Miguel Balboa versiyonunu yükleyin
  • ESP32Servo: “ESP32Servo” araması ile Kevin Harrington versiyonunu yükleyin

Ayrıca aşağıdaki kart ayarlarını kontrol edin:

  • Board: ESP32 geliştirme kartınızın modeli (Örn: DOIT ESP32 DEVKIT V1)
  • Port: ESP32’nin bağlı olduğu COM portu
  • ESP32 Paketi: Board Manager’dan “esp32” paketinin yüklü olduğundan emin olun

Adım 5 – Kodu Yükleyin

Aşağıdaki kodu Arduino IDE editörüne yapıştırın ve ESP32 kartınıza yükleyin:

/*
 * ESP32 RFID Kontrollü Servo Motor Projesi
 * RFID: SS=GPIO5, RST=GPIO27, SPI: MOSI=23/MISO=19/SCK=18
 * Servo: GPIO32
 * Yetkili kart UID'si: FF:FF:FF:FF (örnek - değiştirilmelidir)
 * Gerekli kütüphaneler: SPI, MFRC522, ESP32Servo
 */

// SPI.h kütüphanesi: ESP32'nin dahili SPI iletişim protokolü fonksiyonlarını içerir
// RFID modülü ile veri alışverişi için gereklidir
#include <SPI.h>

// MFRC522.h kütüphanesi: MFRC522 RFID/NFC okuyucu modülünü kontrol eden sürücü kütüphanesidir
// Kart algılama, UID okuma, kripto işlemleri gibi fonksiyonları sağlar
#include <MFRC522.h>

// ESP32Servo.h kütüphanesi: ESP32'nin LEDC donanımını kullanarak servo motor PWM sinyali üretir
// Standart Servo kütüphanesi ESP32 ile tam uyumlu olmadığı için bu kütüphane kullanılır
#include <ESP32Servo.h>

// RFID modülünün SS (Slave Select) pininin bağlı olduğu GPIO
// SPI haberleşmesinde modül seçimi için kullanılır
#define SS_PIN 5  // GPIO5 pini RFID SS/SDA hattına bağlanır

// RFID modülünün RST (Reset) pininin bağlı olduğu GPIO
// Modülü yazılımsal olarak sıfırlamak için kullanılır
#define RST_PIN 27  // GPIO27 pini RFID RST hattına bağlanır

// Servo motorun sinyal kablosunun bağlı olduğu PWM çıkış pini
// GPIO32 ADC ve DAC desteği olan bir pindir, PWM çıkışı için uygundur
#define SERVO_PIN 32  // GPIO32 pini servo motor sinyal hattına bağlanır

// MFRC522 nesnesi oluştur
// Parametreler: SS pini, RST pini
// Bu nesne üzerinden RFID modülünün tüm kontrol işlemleri yapılır
MFRC522 rfid(SS_PIN, RST_PIN);

// Servo nesnesi oluştur
// Bu nesne üzerinden servo motorun açı kontrolü yapılır
Servo servo;

// Yetkili RFID kartının UID (Unique Identifier) değerlerini tanımla
// 4 byte'lık UID değeri: {0xFF, 0xFF, 0xFF, 0xFF}
// Gerçek uygulamada bu değerler okunan kartın UID'si ile değiştirilmelidir
// UID değerlerini öğrenmek için Serial Monitor'de "Unauthorized Tag" çıktısı izlenebilir
byte authorizedUID[4] = {0xFF, 0xFF, 0xFF, 0xFF};

// Servo motorun mevcut açı konumunu tutan değişken
// Başlangıç değeri 0 derece olarak ayarlanmıştır
int angle = 0;  // Servo motorun mevcut açısı (0 veya 90 derece)

// Kurulum fonksiyonu: reset atıldığında bir kez çalışır
void setup() {
  // Serial iletişim hızını 9600 baud olarak başlat
  // RFID okuma sonuçlarını, hata mesajlarını ve servo durumunu izlemek için kullanılır
  Serial.begin(9600);

  // SPI haberleşme bus'ını başlat
  // RFID modülü ile veri alışverişi için SPI protokolü aktif hale getirilir
  // ESP32'de varsayılan VSPI kullanılır: MOSI=23, MISO=19, SCK=18
  SPI.begin();

  // MFRC522 RFID modülünü başlat ve yapılandır
  // PCD_Init(): Proximity Coupling Device (okuyucu) inisyalizasyonu yapar
  rfid.PCD_Init();

  // Servo nesnesini GPIO32 pinine bağla
  // Bu işlem servo motor için gerekli PWM sinyal parametrelerini yapılandırır
  servo.attach(SERVO_PIN);

  // Servo motoru başlangıç konumuna (0 derece) getir
  // write() fonksiyonu servo motoru belirtilen açıya hareket ettirir
  servo.write(angle);

  // Kullanıcıya talimat mesajını Serial Monitor'e yazdır
  Serial.println("Tap RFID/NFC Tag on reader");
}

// Ana döngü fonksiyonu: sürekli tekrarlanır
void loop() {
  // PICC_IsNewCardPresent(): Yeni bir kart/etiket okuyucu alanında mı kontrol et
  // PICC: Proximity Integrated Circuit Card (RFID kart/etiket)
  // Yeni kart algılandığında true döner
  if (rfid.PICC_IsNewCardPresent()) {

    // PICC_ReadCardSerial(): Algılanan kartın seri numarasını (UID) oku
    // Okuma başarılı olursa true döner ve rfid.uid yapısı doldurulur
    if (rfid.PICC_ReadCardSerial()) {

      // PICC_GetType(): Okunan kartın tipini belirle (MIFARE Classic, Ultralight vb.)
      // Bu projede kart tipi kontrolü yapılmıyor ancak hata ayıklama için kullanılabilir
      MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);

      // Okunan kartın UID değerlerini yetkili UID ile byte byte karşılaştır
      // rfid.uid.uidByte[0-3]: Okunan kartın 4 byte'lık UID değeri
      // authorizedUID[0-3]: Önceden tanımlanmış yetkili kart UID değeri
      // Tüm byte'lar eşleşirse kart yetkili kabul edilir
      if (rfid.uid.uidByte[0] == authorizedUID[0] &&
          rfid.uid.uidByte[1] == authorizedUID[1] &&
          rfid.uid.uidByte[2] == authorizedUID[2] &&
          rfid.uid.uidByte[3] == authorizedUID[3]) {

        // Yetkili kart algılandığında Serial Monitor'e bilgi mesajı yaz
        Serial.println("Authorized Tag");

        // Servo motorun hedef açısını toggle (değiştir) mantığı ile ayarla
        // Mevcut açı 0 derece ise 90 dereceye, 90 derece ise 0 dereceye döner
        if (angle == 0)
          angle = 90;  // 0° ise 90°'ye değiştir
        else
          angle = 0;   // 90° ise 0°'ye değiştir

        // Servo motoru hesaplanan hedef açıya konumlandır
        // write() fonksiyonu servo motoru belirtilen açıya hareket ettirir
        servo.write(angle);

        // Servo motorun yeni konumunu Serial Monitor'e yazdır
        Serial.print("Rotate Servo Motor to ");  // Mesaj etiketi
        Serial.print(angle);                      // Hedef açı değeri
        Serial.println("°");                      // Derece sembolü ve satır sonu

      } else {
        // Yetkisiz kart algılandığında Serial Monitor'e uyarı mesajı yaz
        Serial.print("Unauthorized Tag with UID:");  // Uyarı etiketi

        // Okunan kartın UID değerlerini hexadecimal formatında Serial Monitor'e yazdır
        // rfid.uid.size: UID byte sayısı (genellikle 4)
        // rfid.uid.uidByte[i]: i. byte değeri
        for (int i = 0; i < rfid.uid.size; i++) {
          // Byte değeri 0x10'dan küçükse başına "0" ekle (örn: 0x0A)
          // HEX formatında yazdır: Serial.print(değer, HEX)
          Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
          Serial.print(rfid.uid.uidByte[i], HEX);
        }
        // UID yazdırma işlemi tamamlandı, satır sonu ekle
        Serial.println();
      }

      // PICC_HaltA(): Okunan kartı "halt" moduna al, iletişimi sonlandır
      // Aynı kartın tekrar tekrar okunmasını önler
      rfid.PICC_HaltA();

      // PCD_StopCrypto1(): RFID modülündeki kripto1 şifreleme işlemini durdur
      // Güvenlik ve kaynak yönetimi için her okuma sonrası çağrılmalıdır
      rfid.PCD_StopCrypto1();
    }
  }
}

Bu uygulamaya benzer çoklu kart okuma yapmakta mümkündür.

Kod Nasıl Çalışır

Kütüphane ve Tanımlar

  • #include <SPI.h>: ESP32’nin dahili SPI iletişim kütüphanesini projeye dahil eder; RFID modülü ile veri alışverişi için gereklidir.
  • #include <MFRC522.h>: MFRC522 RFID okuyucu modülünü kontrol eden sürücü kütüphanesini ekler; kart algılama ve UID okuma fonksiyonlarını sağlar.
  • #include <ESP32Servo.h>: ESP32 için optimize edilmiş servo kontrol kütüphanesini ekler; servo motorlar için uygun PWM sinyalleri üretir.
  • #define direktifleri ile RFID ve servo pinleri sabit olarak tanımlanır; kodun okunabilirliği ve bakımı kolaylaşır.
  • MFRC522 rfid(...) ve Servo servo;: RFID okuyucu ve servo motor için nesne örnekleri oluşturulur.
  • authorizedUID[4]: Yetkili kartın 4 byte’lık UID değeri saklanır; erişim kontrolü için karşılaştırma yapılır.

Setup Fonksiyonu

  • Serial.begin(9600): Serial iletişim başlatılır; RFID okuma sonuçlarını izlemek ve hata ayıklama için kullanılır.
  • SPI.begin(): SPI haberleşme bus’ı aktif hale getirilir; RFID modülü ile iletişim için gereklidir.
  • rfid.PCD_Init(): MFRC522 RFID modülü inisyalize edilir ve okumaya hazırlanır.
  • servo.attach(SERVO_PIN): Servo nesnesi belirtilen PWM pinine bağlanır ve servo motor için gerekli sinyal parametreleri yapılandırılır.
  • servo.write(angle): Servo motor başlangıç konumuna (0 derece) getirilir.
  • Serial.println(...): Kullanıcıya kart okutma talimatı Serial Monitor’de görüntülenir.

Loop Fonksiyonu

  • rfid.PICC_IsNewCardPresent(): Okuyucu alanında yeni bir RFID kart/etiket olup olmadığını kontrol eder.
  • rfid.PICC_ReadCardSerial(): Algılanan kartın seri numarasını (UID) okur ve rfid.uid yapısına kaydeder.
  • rfid.PICC_GetType(): Okunan kartın tipini belirler (MIFARE Classic, Ultralight vb.); bu projede bilgi amaçlı kullanılır.
  • if (rfid.uid.uidByte[...] == authorizedUID[...]): Okunan kartın UID değeri yetkili UID ile karşılaştırılır; tüm byte’lar eşleşirse erişim izni verilir.
  • angle = (angle == 0) ? 90 : 0;: Servo motorun hedef açısı toggle mantığı ile değiştirilir; kapı aç/kapa efekti oluşturulur.
  • servo.write(angle): Servo motor hesaplanan hedef açıya konumlandırılır.
  • rfid.PICC_HaltA() ve rfid.PCD_StopCrypto1(): Okuma işlemi tamamlandıktan sonra kart iletişimi sonlandırılır ve kripto işlemi durdurulur.

Adım 6 – Test Edin

Kod yüklendikten sonra:

  1. Arduino IDE’de Serial Monitor’ü açın (9600 baud).
  2. “Tap RFID/NFC Tag on reader” mesajının görüntülendiğini kontrol edin.
  3. Herhangi bir RFID kartını okuyucuya yaklaştırın; Serial Monitor’de kartın UID değeri hexadecimal formatında görüntülenecektir.
  4. Görüntülenen UID değerini koddaki authorizedUID[4] dizisine kopyalayın ve kodu tekrar yükleyin.
  5. Yetkili kartı okutun; Serial Monitor’de “Authorized Tag” mesajı ve servo motorun 0° ↔ 90° arasında hareket ettiğini gözlemleyin.
  6. Yetkisiz kart okutulduğunda “Unauthorized Tag with UID:…” mesajının görüntülendiğini ve servo motorun hareket etmediğini doğrulayın.

İsteğe Bağlı Geliştirmeler

Temel işlevi tamamladıktan sonra projeyi aşağıdaki şekilde genişletebilirsiniz:

  • Çoklu Yetkili Kart: authorizedUID dizisini iki boyutlu hale getirerek birden fazla yetkili kart tanımlayın.
  • EEPROM Kayıt: Yetkili kart UID’lerini EEPROM veya SPIFFS’e kaydederek kalıcı hale getirin; kod değişmeden yeni kartlar ekleyin.
  • LED/Geri Bildirim: Yetkili kartta yeşil, yetkisiz kartta kırmızı LED yakarak görsel geri bildirim ekleyin.
  • Zaman Aşımı: Servo motor 90° konumunda belirli bir süre kaldıktan sonra otomatik olarak 0°’ye dönsün.
  • WiFi Entegrasyonu: ESP32 WiFi özelliği ile erişim loglarını bulut platformuna aktarın veya uzaktan kart yönetimi sağlayın.
  • LCD/OLED Ekran: Kart okuma durumunu ve erişim izni mesajlarını grafik ekranda görüntüleyin.

ESP32 RFID-Servo Projesi SSS

S: RFID modülü kart okumuyor, neden?
C: SPI bağlantılarını (MOSI, MISO, SCK, SS) ve güç beslemesini kontrol edin. Ayrıca rfid.PCD_Init() sonrası modülün doğru başlatıldığından emin olun. Bazı MFRC522 modüllerinde anten bağlantısı gevşek olabilir.

S: Servo motor titriyor veya kararlı durmuyor.
C: Güç kaynağı yetersiz olabilir. Servo motorlar ani akım çeker; harici 5V/2A güç kaynağı kullanın ve ESP32 ile ortak toprak bağlantısı yaptığınızdan emin olun.

S: UID değerleri nasıl öğrenilir?
C: Yetkisiz kart okutulduğunda Serial Monitor’de “Unauthorized Tag with UID: XX XX XX XX” formatında hexadecimal değerler görüntülenir. Bu değerleri authorizedUID dizisine kopyalayın.

S: ESP32Servo yerine standart Servo kütüphanesi kullanabilir miyim?
C: Hayır. Standart Arduino Servo kütüphanesi ESP32 donanımı ile tam uyumlu değildir. ESP32 için optimize edilmiş ESP32Servo kütüphanesi kullanılmalıdır.

S: RFID okuma çok yavaş veya tekrarlı okuma yapıyor.
C: rfid.PICC_HaltA() ve rfid.PCD_StopCrypto1() fonksiyonlarının her okuma sonrası çağrıldığından emin olun. Ayrıca kartı okuyucudan uzaklaştırmadan tekrar okuma yapılabilir; bu normal bir davranıştır.

S: Farklı GPIO pinleri kullanabilir miyim?
C: Evet. SPI pinleri (MOSI, MISO, SCK) yazılımsal olarak değiştirilebilir ancak SPI.begin(mosi, miso, sck, ss) fonksiyonu ile yapılandırılmalıdır. SS ve RST pinleri herhangi bir GPIO olabilir. Servo pini için PWM destekleyen çoğu GPIO kullanılabilir; GPIO 34-39 gibi sadece giriş pinlerinden kaçının.

S: UID karşılaştırması neden byte byte yapılıyor?
C: RFID kart UID’leri byte dizisi olarak saklanır. Doğrudan dizi karşılaştırması (==) C/C++’ta bellek adreslerini karşılaştırır, içerikleri değil. Bu nedenle her byte ayrı ayrı karşılaştırılmalıdır. Alternatif olarak memcmp() fonksiyonu kullanılabilir.

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir