ESP32 ile Servo Motor Projesi

Bu rehber, ESP32 geliştirme kartı kullanarak bir potansiyometre ile servo motorun açı konumunu kontrol etme işlemini adım adım açıklar. Potansiyometreden okunan analog değerin servo motorun 0-180 derece aralığında hareket etmesi için ölçeklendirilmesi prensibine dayanan bu proje, analog giriş okuma, PWM kontrolü ve servo motor sürme konularını öğrenmek için temel bir uygulamadır.

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

Servo Motor

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

  • VCC (Kırmızı): Güç beslemesi (5V veya 6V, motor spesifikasyonuna göre)
  • GND (Siyah/Kahverengi): Toprak bağlantısı
  • Sinyal (Sarı/Turuncu): Kontrol sinyali için PWM girişi

Potansiyometre

Potansiyometre, mekanik olarak ayarlanabilen değişken dirençtir. Mil çevrildikçe 0V ile 3.3V arasında değişen analog voltaj üretir. ESP32’nin ADC (Analog-to-Digital Converter) birimi bu voltajı 0-4095 aralığında dijital değere dönüştürür.

ESP32Servo Kütüphanesi

ESP32’nin servo motor kontrolü için özel bir kütüphaneye ihtiyacı vardır. ESP32Servo kütüphanesi, ESP32’nin LEDC donanımını kullanarak servo motorlar için uygun PWM sinyalleri üretir.

Adım 2 – GPIO Pin Atamaları

Projede kullanılan pin atamaları:

  • GPIO 36 (ADC1_CH0): Potansiyometre sinyal ucu için analog giriş pini
  • GPIO 26: Servo motor sinyal ucu için PWM çıkış pini

Önemli: GPIO 34, 35, 36 ve 39 pinleri ESP32’de yalnızca giriş (input) olarak kullanılabilir ve dahili pull-up/pull-down dirençleri bulunmaz.

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

Potansiyometre Bağlantısı:

  1. Potansiyometrenin bir uç bacağını ESP32 3.3V pinine bağlayın.
  2. Potansiyometrenin diğer uç bacağını GND (Toprak) pinine bağlayın.
  3. Potansiyometrenin orta (sinyal) bacağını ESP32 GPIO 36 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 26 pinine bağlayın.

Uyarı: Servo motorlar yüksek akım çeker. ESP32’nin 3.3V veya 5V pininden doğrudan beslemek kararsız çalışmaya veya kartın zarar görmesine neden olabilir. Harici güç kaynağı kullanılması önerilir.

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

Arduino IDE’yi açın ve aşağıdaki ayarları 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
  • ESP32Servo Kütüphanesi: Kütüphane Yöneticisi’nden “ESP32Servo” kütüphanesini yükleyin
  • ADC Ayarları: analogSetAttenuation(ADC_11db) ile ADC’nin 0-3.3V aralığını okuyabilmesi sağlanır

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 Potansiyometre Kontrollü Servo Motor Projesi
 * Potansiyometre: GPIO36 (ADC1_CH0), Servo: GPIO26
 * ADC çözünürlüğü: 12-bit (0-4095)
 * Servo açı aralığı: 0-180 derece
 * Gerekli kütüphane: ESP32Servo
 */

// ESP32Servo kütüphanesini projeye dahil et
// Bu kütüphane ESP32'nin LEDC donanımını kullanarak servo PWM sinyali üretir
#include 

// Potansiyometrenin sinyal ucunun bağlı olduğu analog giriş pini
// GPIO36 (ADC1_CH0) sadece giriş modunu destekler
#define PIN_POTENTIOMETER 36

// Servo motorun sinyal kablosunun bağlı olduğu PWM çıkış pini
// GPIO26 PWM çıkışı destekleyen bir pindir
#define PIN_SERVO 26

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

// Kurulum fonksiyonu: reset atıldığında bir kez çalışır
void setup() {
  // Serial iletişim hızını 9600 baud olarak başlat
  // Analog değer ve açı bilgilerini Serial Monitor'de görüntülemek için kullanılır
  Serial.begin(9600);

  // ADC giriş zayıflatmasını 11 dB olarak ayarla
  // Bu ayar, ADC'nin ~3.3V'a kadar voltajları doğru okuyabilmesini sağlar
  // Varsayılan ayar (0 dB) yalnızca ~1V'a kadar güvenilir sonuç verir
  analogSetAttenuation(ADC_11db);

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

// Ana döngü fonksiyonu: sürekli tekrarlanır
void loop() {
  // GPIO36 pininden potansiyometre analog değerini oku
  // ESP32 ADC'si 12-bit çözünürlükte çalışır: 0-4095 arası değer döndürür
  int analogValue = analogRead(PIN_POTENTIOMETER);

  // Okunan analog değeri 0-4095 aralığından 0-180 derece aralığına ölçeklendir
  // map() fonksiyonu lineer dönüşüm uygular: (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
  int angle = map(analogValue, 0, 4095, 0, 180);

  // Servo motorun hedef açısını ayarla
  // write() fonksiyonu servo motoru belirtilen açıya (0-180) hareket ettirir
  myServo.write(angle);

  // Analog değer ve hesaplanan açıyı Serial Monitor'e yazdır
  Serial.print("Analog value: ");   // "Analog value: " etiketini ekrana yaz
  Serial.print(analogValue);        // Okunan ham analog değeri (0-4095) yaz
  Serial.print(" => Angle: ");      // " => Angle: " ayırıcısını ekrana yaz
  Serial.println(angle);            // Hesaplanan açı değerini (0-180) yaz ve satır sonu ekle

  // 100 milisaniye bekle
  // Bu kısa gecikme, servo motorun hareketini yumuşatır ve Serial veri akışını düzenler
  delay(100);
}

Kod Nasıl Çalışır

Kütüphane ve Tanımlar

  • #include <ESP32Servo.h>: ESP32 için optimize edilmiş servo kontrol kütüphanesini projeye dahil eder.
  • #define direktifleri ile pin atamaları sabit olarak tanımlanır; kodun okunabilirliği ve bakımı kolaylaşır.
  • Servo myServo;: Servo kontrolü için bir nesne örneği oluşturulur.

Setup Fonksiyonu

  • Serial.begin(9600): Serial iletişim başlatılır; hata ayıklama ve veri izleme için kullanılır.
  • analogSetAttenuation(ADC_11db): ADC giriş aralığı 0-3.3V olacak şekilde yapılandırılır.
  • myServo.attach(PIN_SERVO): Servo nesnesi belirtilen PWM pinine bağlanır ve servo motor için gerekli sinyal parametreleri otomatik olarak ayarlanır.

Loop Fonksiyonu

  • analogRead(PIN_POTENTIOMETER): Potansiyometreden 12-bit çözünürlükte analog değer okunur (0-4095).
  • map(analogValue, 0, 4095, 0, 180): Okunan değer lineer olarak 0-180 derece aralığına dönüştürülür.
  • myServo.write(angle): Servo motor hedef açıya konumlandırılır.
  • Serial.print/println: Gerçek zamanlı veri izleme için analog değer ve açı bilgisi Serial Monitor’e yazdırılır.
  • delay(100): Her döngü arasında 100ms bekleme ile servo hareketi yumuşatılır ve işlemci yükü azaltılır.

Adım 6 – Test Edin

Kod yüklendikten sonra:

  1. Arduino IDE’de Serial Monitor’ü açın (9600 baud).
  2. Potansiyometre milini yavaşça bir uçtan diğer uca çevirin.
  3. Servo motorun potansiyometre konumuna paralel olarak 0-180 derece aralığında hareket ettiğini gözlemleyin.
  4. Serial Monitor’de “Analog value: [değer] => Angle: [açı]” formatında güncellenen verileri kontrol edin.
  5. Servo motor tepki vermiyorsa güç bağlantılarını, ortak toprak bağlantısını ve pin atamalarını doğrulayın.

İsteğe Bağlı Geliştirmeler

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

  • Açı Sınırlama: Servo motorun hareket aralığını 30-150 derece gibi daha dar bir aralıkla sınırlayın.
  • Ortalama Alma: Analog okumalarda oluşan gürültüyü azaltmak için birden fazla okumanın ortalamasını alın.
  • Buton ile Sıfırlama: Ek bir buton ekleyerek servo motoru başlangıç konumuna (90 derece) döndürün.
  • Çoklu Servo: Birden fazla potansiyometre ve servo motor ile çok eksenli kontrol sistemi kurun.
  • WiFi Kontrol: ESP32’yi web sunucusu olarak yapılandırarak tarayıcı üzerinden servo kontrolü sağlayın.

ESP32 Servo Projesi SSS

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: Servo sadece belirli bir aralıkta hareket ediyor.
C: Bazı servo motorlar mekanik olarak 0-180 derece yerine daha dar aralıkta çalışabilir. Ayrıca map() fonksiyonundaki çıkış aralığını servo spesifikasyonuna göre ayarlayabilirsiniz.

S: analogSetAttenuation(ADC_11db) neden gerekli?
C: ESP32 ADC’si varsayılan olarak 0-1V aralığında en iyi çözünürlüğe sahiptir. 11 dB attenuasyon ile giriş aralığı ~3.9V’a kadar genişletilir; bu sayede 3.3V referanslı potansiyometre okumaları doğru yapılır.

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: Servo motor çok yavaş veya çok hızlı tepki veriyor.
C: Servo motorların tepki hızı donanımsal olarak sabittir. Yazılımsal olarak delay() süresini ayarlayarak kontrol döngüsünü yavaşlatabilir veya hızlandırabilirsiniz.

S: Farklı GPIO pinleri kullanabilir miyim?
C: Evet. Analog giriş için ADC1 kanalına ait GPIO 32, 33, 34, 35, 36, 39 pinleri kullanılabilir. PWM çıkışı için ise çoğu GPIO pini uygundur; ancak GPIO 34-39 gibi sadece giriş destekleyen pinleri servo sinyali için kullanmayın.

Leave a Reply

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