Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124

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.
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:
Modül, MIFARE Classic, MIFARE Ultralight ve NFC Type A/B kartları destekler.

Servo motor, 0-180 derece aralığında hassas açı kontrolü sağlayan bir aktüatördür. Üç bağlantı ucu bulunur:
Projede kullanılan kütüphaneler:
Projede kullanılan pin atamaları:
Not: ESP32’de SPI pinleri yazılımsal olarak değiştirilebilir; bu projede varsayılan VSPI pinleri kullanılmıştır.

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.
Arduino IDE’yi açın ve aşağıdaki kütüphaneleri Kütüphane Yöneticisi üzerinden yükleyin:
Ayrıca aşağıdaki kart ayarlarını kontrol edin:


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.
#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.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.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.Kod yüklendikten sonra:
authorizedUID[4] dizisine kopyalayın ve kodu tekrar yükleyin.Temel işlevi tamamladıktan sonra projeyi aşağıdaki şekilde genişletebilirsiniz:
authorizedUID dizisini iki boyutlu hale getirerek birden fazla yetkili kart tanımlayın.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.