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

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

Projede kullanılan pin atamaları:
Ö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.

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.
Arduino IDE’yi açın ve aşağıdaki ayarları kontrol edin:
analogSetAttenuation(ADC_11db) ile ADC’nin 0-3.3V aralığını okuyabilmesi sağlanırAş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);
}
#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.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.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.Kod yüklendikten sonra:
Temel işlevi tamamladıktan sonra projeyi aşağıdaki şekilde genişletebilirsiniz:
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.