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 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.
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:

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:
Modül üzerinde ayrıca güç LED’i ve ters polarite koruma diyotu bulunur.

AccelStepper, step motor kontrolü için gelişmiş fonksiyonlar sunan bir kütüphanedir. Özellikleri:
Projede kullanılan pin atamaları:
Ö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.

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.
Arduino IDE’yi açın ve aşağıdaki kütüphaneyi 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 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
}
#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.
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.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.Kod yüklendikten sonra:
Temel işlevi tamamladıktan sonra projeyi aşağıdaki şekilde genişletebilirsiniz:
setMaxSpeed() ve setAcceleration() değerlerini değiştirerek motor performansını optimize edin.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.