ESP32 ile Step Motor ve Sürücü Projesi

Bu rehber, ESP32 geliştirme kartı kullanarak 28BYJ-48 step motoru ULN2003 sürücü modülü ile kontrol etme işlemini adım adım açıklar. AccelStepper kütüphanesi ile hızlandırma/yavaşlatma profillerinin uygulanması ve tam adım (full-step) modunda motorun hassas konumlandırılması prensibine dayanan bu proje, step motor entegrasyonu, hareket kontrolü ve kütüphane kullanımı konularını öğrenmek için temel bir uygulamadır.

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

28BYJ-48 Step Motor

28BYJ-48, dahili redüktörlü unipolar step motorudur. Dört bobin sargısı bulunur ve her bobine sıralı olarak gerilim uygulandığında rotor belirli bir açıda ilerler. Teknik özellikleri:

  • Adım açısı: 5.625°/64 (redüktör sonrası)
  • Devir başına adım: 2048 adım (64 × 32 redüktör oranı)
  • Çalışma gerilimi: 5V DC
  • Bağlantı uçları: 5 pinli konektör (IN1, IN2, IN3, IN4, VCC)

ULN2003 Sürücü Modülü

ULN2003, yüksek akım anahtarlama yapabilen Darlington transistör dizisidir. Step motor bobinlerini sürmek için kullanılır ve aşağıdaki bağlantı uçlarına sahiptir:

  • IN1-IN4: Kontrol sinyali girişleri (ESP32 GPIO pinlerine bağlanır)
  • VCC: Güç beslemesi (5V)
  • GND: Toprak bağlantısı
  • OUT1-OUT4: Step motor bobin çıkışları

Modül üzerinde ayrıca güç LED’i ve ters polarite koruma diyotu bulunur.

AccelStepper Kütüphanesi

AccelStepper, step motor kontrolü için gelişmiş fonksiyonlar sunan bir kütüphanedir. Özellikleri:

  • Hızlandırma (acceleration) ve yavaşlatma (deceleration) profilleri
  • Maksimum hız sınırı ayarlama
  • Hedef konuma hareket ve mevcut konum takibi
  • Farklı adım modları desteği (full-step, half-step, wave-step)

Adım 2 – GPIO Pin Atamaları

Projede kullanılan pin atamaları:

  • GPIO 19: ULN2003 IN1 pini (Bobin 1 kontrol)
  • GPIO 18: ULN2003 IN3 pini (Bobin 3 kontrol)
  • GPIO 17: ULN2003 IN2 pini (Bobin 2 kontrol)
  • GPIO 16: ULN2003 IN4 pini (Bobin 4 kontrol)

Önemli: 28BYJ-48 motor için doğru adım sırası IN1-IN3-IN2-IN4 şeklindedir. Bu sıra AccelStepper nesnesi oluşturulurken belirtilmelidir.

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

ULN2003 Sürücü Modülü Bağlantısı:

  1. ULN2003 IN1 pinini ESP32 GPIO 19 pinine bağlayın.
  2. ULN2003 IN3 pinini ESP32 GPIO 18 pinine bağlayın.
  3. ULN2003 IN2 pinini ESP32 GPIO 17 pinine bağlayın.
  4. ULN2003 IN4 pinini ESP32 GPIO 16 pinine bağlayın.
  5. ULN2003 VCC pinini harici 5V güç kaynağına bağlayın.
  6. ULN2003 GND pinini hem ESP32 GND’ye hem de harici güç kaynağının GND’sine bağlayın (ortak toprak).

28BYJ-48 Step Motor Bağlantısı:

  1. Step motorun 5 pinli konektörünü ULN2003 modülündeki 5 pinli sokete takın.
  2. Konektörün yönü önemlidir; yanlış takılırsa motor çalışmaz.

Uyarı: Step motorlar yüksek akım çeker. ESP32’nin 5V pininden doğrudan 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üphaneyi Kütüphane Yöneticisi üzerinden yükleyin:

  • AccelStepper: “AccelStepper” araması ile Mike McCauley 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 28BYJ-48 Step Motor ve ULN2003 Sürücü Projesi
 * Motor: 28BYJ-48 unipolar step motor (redüktörlü)
 * Sürücü: ULN2003 Darlington sürücü modülü
 * Adım modu: Full-step (4 bobin sıralı sürme)
 * Devir başına adım: 2048 (datasheet değeri)
 * Pin sırası: IN1-IN3-IN2-IN4 (28BYJ-48 için özel sıra)
 * Gerekli kütüphane: AccelStepper
 */

// AccelStepper kütüphanesini projeye dahil et
// Bu kütüphane step motorlar için hızlandırma, hedef konum ve çoklu motor desteği sağlar
#include <AccelStepper.h>

// Full-step modu için sabit tanımlama
// AccelStepper kütüphanesinde FULLSTEP = 4, dört bobinli tam adım sürme modunu temsil eder
// Bu modda her adımda iki bobin aynı anda enerjilenir, daha yüksek tork sağlar
#define FULLSTEP 4

// 28BYJ-48 motor için bir tam devirdeki toplam adım sayısı
// Motor dahili redüktör oranı 1:64 ve adım açısı 5.625° olduğundan:
// 360° / 5.625° = 64 adım (motorda) × 64 (redüktör) = 4096 teorik
// Ancak 28BYJ-48 datasheet değeri 2048 adım/devir olarak belirtilmiştir
// Bu değer motor üreticisine göre değişebilir; gerekirse kalibre edilmelidir
#define STEP_PER_REVOLUTION 2048  // Bir tam devir için gerekli adım sayısı

// AccelStepper nesnesi oluştur
// Parametreler:
//   1. FULLSTEP: Adım modu (4 = full-step, 8 = half-step)
//   2-5. Pin sırası: IN1, IN3, IN2, IN4 (28BYJ-48 için doğru adım sırası)
// NOT: Pin sırası IN1-IN2-IN3-IN4 değil, IN1-IN3-IN2-IN4 olmalıdır
// Bu özel sıra, 28BYJ-48 motorun iç bobin bağlantı şemasından kaynaklanır
// Yanlış sıra motorun titremesine veya dönmemesine neden olur
AccelStepper stepper(FULLSTEP, 19, 18, 17, 16);  // GPIO19=IN1, GPIO18=IN3, GPIO17=IN2, GPIO16=IN4

// Kurulum fonksiyonu: reset atıldığında bir kez çalışır
void setup() {
  // Serial iletişim hızını 9600 baud olarak başlat
  // Motor konum bilgisini ve hata ayıklama verilerini Serial Monitor'de izlemek için kullanılır
  Serial.begin(9600);

  // Step motorun ulaşabileceği maksimum hızı ayarla (adım/saniye cinsinden)
  // setMaxSpeed(): Motorun kararlı çalışabileceği üst hız sınırını belirler
  // 28BYJ-48 redüktörlü motor için 1000 adım/saniye makul bir başlangıç değeridir
  stepper.setMaxSpeed(1000.0);  // Maksimum hız: 1000 adım/saniye

  // Hızlandırma (acceleration) değerini ayarla (adım/saniye² cinsinden)
  // setAcceleration(): Motorun duruştan maksimum hıza ne kadar hızlı çıkacağını belirler
  // Düşük değer yumuşak kalkış, yüksek değer ani hızlanma sağlar
  // 50.0 değeri 28BYJ-48 için dengeli bir başlangıç noktasıdır
  stepper.setAcceleration(50.0);  // Hızlandırma: 50 adım/saniye²

  // Motorun başlangıç hızını ayarla (adım/saniye cinsinden)
  // setSpeed(): runSpeed() veya run() fonksiyonları ile kullanılacak hedef hızı belirler
  // moveTo() ile hedef konum modunda bu değer otomatik olarak yönetilir
  stepper.setSpeed(200);  // Başlangıç hızı: 200 adım/saniye

  // Motorun mevcut konumunu sıfırla (referans noktası belirle)
  // setCurrentPosition(0): Motorun şu anki fiziksel konumunu "0" olarak tanımlar
  // Bu işlem mutlak konum kontrolü için başlangıç referansı oluşturur
  stepper.setCurrentPosition(0);  // Mevcut konumu 0 olarak ayarla

  // Hedef konumu belirle: Bir tam devir (2048 adım) ileri hareket
  // moveTo(): Motorun ulaşması gereken hedef adımı mutlak konum olarak ayarlar
  // Pozitif değer saat yönü, negatif değer saat yönünün tersine hareket sağlar
  stepper.moveTo(STEP_PER_REVOLUTION);  // Hedef: 2048. adım (1 tam devir)
}

// Ana döngü fonksiyonu: sürekli tekrarlanır
void loop() {
  // Motor hedef konuma ulaştığında hareket yönünü tersine çevir
  // distanceToGo(): Hedef konum ile mevcut konum arasındaki kalan adım sayısını döner
  // Değer 0 ise motor hedefe ulaşmış demektir
  if (stepper.distanceToGo() == 0) {
    // moveTo() fonksiyonuna mevcut konumun negatifi verilerek yön tersine çevrilir
    // currentPosition(): Motorun şu anki mutlak konumunu (adım cinsinden) döner
    // Örnek: Mevcut konum 2048 ise -2048 hedefi ile motor başlangıç noktasına döner
    stepper.moveTo(-stepper.currentPosition());  // Yönü tersine çevir
  }

  // Step motor hareket fonksiyonunu çalıştır
  // run(): AccelStepper kütüphanesinin temel hareket fonksiyonudur
  // Hızlandırma profiline uygun olarak motoru bir adım ilerletir
  // Bu fonksiyon loop() içinde düzenli çağrılmalıdır, aksi halde motor hareket etmez
  // Bloklayıcı değildir; diğer kodlar ile paralel çalışabilir
  stepper.run();  // Motoru bir adım ilerlet (hızlandırma profiline uygun)

  // Motorun mevcut konumunu Serial Monitor'e yazdır
  // F() makrosu: String sabitini flash bellekte tutar, RAM kullanımını azaltır
  // currentPosition(): Motorun şu anki mutlak konumunu (adım cinsinden) döner
  Serial.print(F("Current Position: "));  // "Current Position: " etiketini yaz
  Serial.println(stepper.currentPosition());  // Mevcut konum değerini yaz ve satır sonu ekle
}

Kod Nasıl Çalışır

Kütüphane ve Tanımlar

  • #include <AccelStepper.h>: Step motor kontrolü için gelişmiş fonksiyonlar sunan AccelStepper kütüphanesini projeye dahil eder.
  • #define FULLSTEP 4: Tam adım modunu temsil eden sabit; AccelStepper kütüphanesinde 4 bobinli full-step sürme için kullanılır.
  • #define STEP_PER_REVOLUTION 2048: 28BYJ-48 motorun bir tam devir için gereken adım sayısı; datasheet değerine dayanır.
  • AccelStepper stepper(...): Step motor nesnesi oluşturulur; adım modu ve GPIO pin sırası (IN1-IN3-IN2-IN4) yapılandırılır.

Setup Fonksiyonu

  • Serial.begin(9600): Serial iletişim başlatılır; motor konum bilgisini izlemek ve hata ayıklama için kullanılır.
  • stepper.setMaxSpeed(1000.0): Motorun ulaşabileceği maksimum hız sınırı belirlenir; redüktörlü motor için 1000 adım/saniye uygundur.
  • stepper.setAcceleration(50.0): Hızlandırma profili ayarlanır; motorun yumuşak kalkış yapmasını sağlar.
  • stepper.setSpeed(200): Başlangıç hızı belirlenir; moveTo() modunda bu değer otomatik yönetilir.
  • stepper.setCurrentPosition(0): Motorun fiziksel konumu referans noktası olarak sıfırlanır.
  • stepper.moveTo(STEP_PER_REVOLUTION): Motorun ulaşacağı hedef konum (2048 adım = 1 devir) ayarlanır.

Loop Fonksiyonu

  • if (stepper.distanceToGo() == 0): Motor hedef konuma ulaştığında koşul sağlanır; yön değiştirme işlemi tetiklenir.
  • stepper.moveTo(-stepper.currentPosition()): Mevcut konumun negatifi hedef olarak ayarlanır; motor ters yönde hareket eder.
  • stepper.run(): AccelStepper kütüphanesinin temel hareket fonksiyonudur; hızlandırma profiline uygun bir adım ilerleme sağlar. loop() içinde düzenli çağrılmalıdır.
  • Serial.print/println: Motorun mevcut konumu (adım cinsinden) Serial Monitor’de gerçek zamanlı olarak görüntülenir.

Adım 6 – Test Edin

Kod yüklendikten sonra:

  1. Arduino IDE’de Serial Monitor’ü açın (9600 baud).
  2. Step motorun saat yönünde yavaşça dönmeye başladığını gözlemleyin.
  3. Serial Monitor’de “Current Position: [değer]” formatında artan sayıları kontrol edin.
  4. Motor yaklaşık 2048 adımda (1 tam devir) duraksayıp ters yönde dönmeye başlamalıdır.
  5. Serial Monitor’de konum değerlerinin azaldığını ve 0’a yaklaştığını izleyin.
  6. Motor dönmez veya titrerse pin sırasını (IN1-IN3-IN2-IN4) ve güç bağlantılarını doğrulayın.

İsteğe Bağlı Geliştirmeler

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

  • Hız/Acceleration Ayarı: setMaxSpeed() ve setAcceleration() değerlerini değiştirerek motor performansını optimize edin.
  • Potansiyometre ile Kontrol: Analog giriş ile motor hızını veya hedef konumunu gerçek zamanlı ayarlayın.
  • Buton ile Yön Değiştirme: Dijital giriş ile motor yönünü manuel olarak kontrol edin.
  • Konum Hafızası: EEPROM veya SPIFFS kullanarak motorun son konumunu kaydedin; güç kesintisi sonrası devam ettirin.
  • WiFi Entegrasyonu: ESP32 WiFi özelliği ile uzaktan motor kontrolü sağlayın (web arayüzü veya MQTT).
  • Limit Switch: Fiziksel sınır anahtarları ekleyerek motorun güvenli hareket aralığını sınırlayın.

ESP32 Step Motor Projesi SSS

S: Motor titriyor ama dönmüyor, neden?
C: Pin sırası yanlış olabilir. 28BYJ-48 için AccelStepper nesnesinde pin sırası IN1-IN3-IN2-IN4 olmalıdır. Ayrıca güç kaynağı yetersiz olabilir; harici 5V/2A kullanın.

S: Motor çok yavaş veya çok hızlı dönüyor.
C: setMaxSpeed() ve setAcceleration() değerlerini ayarlayarak motor performansını optimize edebilirsiniz. 28BYJ-48 redüktörlü motor olduğu için yüksek hızlarda tork düşer.

S: distanceToGo() hiç sıfır olmuyor.
C: STEP_PER_REVOLUTION değeri motorunuz için yanlış olabilir. 28BYJ-48 üreticilerine göre 2038-4096 arası değişebilir. Motorun bir tam devirde kaç adım attığını sayarak kalibre edin.

S: run() fonksiyonu neden loop() içinde çağrılmalı?
C: AccelStepper kütüphanesi bloklayıcı olmayan (non-blocking) yapıda çalışır. run() her çağrıldığında motoru bir adım ilerletir. Sürekli çağrılmazsa motor hareket etmez.

S: Half-step modu kullanabilir miyim?
C: Evet. FULLSTEP yerine HALFSTEP (değer: 8) kullanarak adım çözünürlüğünü iki katına çıkarabilirsiniz. Ancak pin sırası ve STEP_PER_REVOLUTION değerini güncellemeniz gerekir.

S: Farklı GPIO pinleri kullanabilir miyim?
C: Evet. AccelStepper nesnesi oluşturulurken pin parametrelerini değiştirebilirsiniz. Ancak GPIO 34-39 gibi sadece giriş destekleyen pinleri çıkış olarak atamayın.

S: Motor ısınıyor, normal mi?
C: Step motorlar dururken bile bobinler enerjili olduğunda ısınabilir. Uzun süreli duruşlarda stepper.disableOutputs() ile bobinleri devre dışı bırakarak ısınmayı azaltabilirsiniz.

Leave a Reply

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