Bu rehberimizde, ESP8266 PWM (Sinyal Genişlik Modülasyonu) sinyallerini, hem Arduino IDE hem de MicroPython platformları üzerinde ESP8266 mikrodenetleyicisini kullanarak nasıl üreteceğimizi inceliyoruz. Pratik uygulama örneği olarak, zaman içinde sinyalin görev döngüsünü (duty cycle) değiştirerek bir LED’in parlaklığını yumuşak bir şekilde artırıp azaltacağız (fading efekti).

1. Bölüm: Arduino IDE ile ESP8266 PWM Kontrolü
Arduino geliştirme ekosisteminde ESP8266 pinlerinden PWM sinyali almak için standart analogWrite(pin, deger) fonksiyonu kullanılır. Buradaki parametre (değer), görev döngüsünü belirleyen bir tamsayıdır.
ESP8266 çekirdeğinin eski sürümlerinde (v3.0 öncesi) varsayılan çözünürlük 10-bit yani 0 ila 1023 arasındadır. Ancak güncel sürümlerde bu çözünürlük aralığı standart Arduino kartlarındaki gibi 8-bit (0-255) olarak yapılandırılmıştır. PWM çözünürlük üst sınırını değiştirmek için dilerseniz analogWriteRange(yeni_aralik) fonksiyonunu çağırabilirsiniz.
Farklı donanımlarda PWM sinyal üretimi üzerine hazırladığımız diğer teknik kılavuzları da inceleyebilirsiniz:
Kodlama aşamasına geçmeden önce, bilgisayarınızdaki Arduino IDE arayüzünde ESP8266 geliştirme kartı kütüphanelerinin kurulu olduğundan emin olmalısınız. Kurulum adımları için hazırladığımız ESP8266 Arduino IDE Kurulum Rehberi içeriğimize göz atabilirsiniz.
PWM (Darbe Genişlik Modülasyonu) Çalışma Mantığı
Mikrodenetleyicilerin genel amaçlı giriş/çıkış (GPIO) pinleri fiziksel olarak sadece lojik-0 (0V) veya lojik-1 (3.3V) seviyelerini üretebilir. Pinlerden doğrudan 1.65V gibi ara bir analog voltaj çıkışı almak mümkün değildir. Ancak Darbe Genişlik Modülasyonu (Pulse Width Modulation – PWM) adı verilen teknikle, sinyal lojik seviyesini çok yüksek frekanslarda açıp kapatarak yapay bir ortalama analog voltaj seviyesi üretebiliriz.
Eğer bir LED’e uygulanan gerilimi saniyede binlerce kez lojik-1 ve lojik-0 seviyeleri arasında değiştirirseniz, insan gözü bu yüksek anahtarlama frekansını algılayamaz. Gözümüz, lojik-1 süresinin toplam periyoda oranına bağlı olarak sadece LED’in parlaklığının değiştiğini algılar.

Temel olarak PWM, sinyalin açık kalma süresiyle kapalı kalma süresinin oranını yüksek bir anahtarlama frekansında modüle ederek çalışır.
Görev Döngüsü (Duty Cycle), sinyalin bir periyot boyunca lojik-1 (açık) konumda kaldığı sürenin toplam periyot süresine oranıdır. Aşağıdaki diyagram görev döngüsü ve ortalama voltaj ilişkisini göstermektedir:

%50’lik bir görev döngüsü, sinyalin süresinin yarısında açık kaldığı anlamına gelir ve LED parlaklığı yarı yarıya azalır. %0 görev döngüsü tamamen kapalı (GND), %100 görev döngüsü ise tamamen açık (3.3V) çıkış sağlar. Sinyalin görev döngüsünü dinamik olarak değiştirerek dilediğimiz parlaklık seviyesini elde edebiliriz.
analogWrite() Fonksiyonu ve Parametreleri
ESP8266 pinleri üzerinde PWM üretmek için kullanılan standart Arduino fonksiyonu şu şekildedir:
analogWrite(pin, deger);- pin: PWM çıkışı olarak yapılandırılacak GPIO pin numarasını temsil eder. ESP8266’da GPIO 0 ila GPIO 16 arasındaki tüm pinlerde PWM donanımı aktif olarak kullanılabilir.
- deger: Sinyalin görev döngüsünü belirler. Varsayılan olarak 0 ile 255 (PWMRANGE limitleri) arasında bir tam sayı değer kabul eder. 0 değeri PWM çıkışını kapatırken (Lojik 0), 255 tepe değeri %100 görev döngüsüne (Lojik 1) karşılık gelir.
Gerektiğinde PWM tepe çözünürlük limitini değiştirmek için şu komut kullanılır:
analogWriteRange(yeni_cozunurluk_limiti);Varsayılan donanımsal anahtarlama frekansı ESP8266 için 1 kHz (1000 Hz) seviyesindedir. İhtiyaç durumunda PWM frekansını değiştirmek için şu fonksiyon çağrılabilir:
analogWriteFreq(yeni_frekans);Frekans parametresi donanımsal sınırlar dahilinde 100 Hz ile 40000 Hz (40 kHz) arasında yapılandırılabilir.
Pratik Uygulama: LED Parlaklık Kontrolü
Konseptin pratikte nasıl çalıştığını gözlemlemek için, LED parlaklığını kademeli olarak artırıp azaltan basit bir fading projesi hazırlıyoruz. İhtiyacımız olan temel donanımlar:
- ESP8266 Geliştirme Kartı (NodeMCU)
- 5mm veya 3mm LED
- 330Ω Direnç (Akım sınırlayıcı)
- Breadboard (Devre Tahtası)
- Bağlantı Kabloları (Jumper)
Arduino Devre Kurulum Şeması
LED anot bacağını 330 Ohm akım sınırlayıcı direnç üzerinden ESP8266 üzerindeki GPIO 2 (D4) pinine bağlayın. Katot bacağını ise kartın GND pinine entegre edin:

Arduino IDE Kaynak Kodu
const int ledPin = 2; // GPIO2 (D4)
void setup() {
// PWM pini setup içerisinde ayrıca pinMode tanımlaması gerektirmez, analogWrite otomatik yapılandırır.
}
void loop() {
// LED Parlaklığı kademeli olarak artıyor
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
analogWrite(ledPin, dutyCycle);
delay(5); // Yumuşak geçiş için kısa bekleme
}
// LED Parlaklığı kademeli olarak azalıyor
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
analogWrite(ledPin, dutyCycle);
delay(5);
}
}Kod Analizi: Sinyal çıkışı yapacağımız pini tanımlayarak başlıyoruz. Biz bu uygulamada dahili mavi LED’e de doğrudan bağlı olan GPIO 2 (D4) pinini kullandık. loop() döngüsü içerisinde ilk for döngüsü dutyCycle değerini 0’dan 255’e kadar birer birer artırarak LED parlaklığını maksimuma çıkarır. İkinci for döngüsü ise 255’ten geriye doğru sıfıra inerek parlaklığı tamamen söndürür.
Çıplak ESP-01 Kullanacaklar İçin Programlama Notu
Eğer geliştirme işlemlerini NodeMCU yerine minimalist ESP-01 modülüyle gerçekleştiriyorsanız, kart üzerinde dahili programlayıcı bir çip yer almadığı için harici bir USB-to-TTL seri dönüştürücüye (FTDI) ihtiyacınız olacaktır. Bağlantı şemasını aşağıdaki tabloya göre kurup kartı flash moduna (GPIO0 -> GND) almanız gerekir:

| ESP-01 Modülü Pinleri | FTDI Seri Dönüştürücü Pinleri |
|---|---|
| RX | TX |
| TX | RX |
| CH_PD (EN) | 3.3V |
| GPIO 0 | GND (Flash Modu için) |
| VCC | 3.3V |
| GND | GND |
Ölçüm ve Sonuç Analizi
Yazılımı karta yüklediğinizde, çıkış pinine bağlı LED parlaklığının periyodik olarak yumuşak bir şekilde kısılarak sönüp parladığını gözlemleyeceksiniz:

Oluşturulan PWM dalga formunun görev döngüsündeki değişimi ve anahtarlama frekansını fiziksel olarak gözlemlemek için çıkış pinini osiloskoba bağlayarak sinyal grafiğini inceleyebilirsiniz:

2. Bölüm: MicroPython ile ESP8266 PWM Kontrolü
MicroPython platformunda analog kontrol işlemleri nesne yönelimli olarak son derece güçlü kütüphanelerle yönetilir. Bu aşamaları uygulayabilmek için kartınızda güncel MicroPython belleniminin (firmware) yüklü olması gerekir. Kurulum adımları ve IDE yapılandırması için hazırladığımız kapsamlı kılavuzlardan yararlanabilirsiniz:
- Thonny IDE Kurulumu ve Kullanımı
- esptool.py ile MicroPython Firmware Flashlama
- uPyCraft IDE Kurulum Kılavuzu
- uPyCraft ile Yazılım Flaşlama Aşamaları
MicroPython Devre Şeması
Bu uygulamada, LED anot bacağını 330 Ohm sınır direnciyle birlikte kart üzerindeki GPIO 5 (D1) pinine bağlayacağız. Kullandığınız kartın pin özelliklerine ve kısıtlamalarına göz atmak için ESP32 Pinout Rehberi veya ESP8266 Bacak Bağlantıları içeriklerimizi inceleyebilirsiniz.
Gerekli Donanımlar
- ESP8266 veya ESP32 Geliştirme Kartı
- 5mm veya 3mm LED
- 330Ω Direnç (Akım sınırlayıcı)
- Breadboard ve Jumper Kablolar
ESP32 Bağlantı Şeması

ESP8266 Bağlantı Şeması

MicroPython Kaynak Kodu
Görev döngüsünü dijital çözünürlük limitlerinde değiştirerek LED parlaklığını kontrol eden evrensel MicroPython betiği. Bu kod hem ESP32 hem de ESP8266 mimarileri üzerinde doğrudan çalıştırılabilir:
from machine import Pin, PWM
from time import sleep
frequency = 5000
led = PWM(Pin(5), freq=frequency)
while True:
for duty_cycle in range(0, 1024):
led.duty(duty_cycle)
sleep(0.002)
for duty_cycle in range(1023, -1, -1):
led.duty(duty_cycle)
sleep(0.002)MicroPython Kodunun Detaylı Analizi
İlk aşamada donanımsal yönetim için machine modülünden Pin ve PWM sınıflarını dahil ediyoruz. Zaman gecikmeleri için de time modülünden sleep metodunu çağırıyoruz:
from machine import Pin, PWM
from time import sleepArdından GPIO 5 pinini 5000 Hz (5 kHz) frekans değerinde çalışacak şekilde bir PWM nesnesi olarak tanımlıyoruz:
frequency = 5000
led = PWM(Pin(5), freq=frequency)Frekans Parametresi: Donanım limitleri dahilinde 0 ile 78125 Hz arasında yapılandırılabilir. LED parlaklığı kontrolü için insan gözünün kırpışmaları algılayamayacağı 5 kHz seviyesi son derece kararlıdır.
Görev Döngüsü (Duty Cycle) Çözünürlüğü: MicroPython üzerinde donanımsal PWM 10-bit çözünürlük limitlerine sahiptir. Yani 0 (tamamen kapalı / %0 görev döngüsü) ile 1023 (tam parlaklık / %100 görev döngüsü) aralığında değerler alır.
Görev döngüsünü ayarlamak için PWM nesnesi üzerinden duty() metodu çağrılır ve parametre aktarılır:
led.duty(duty_cycle)Sonsuz döngü içerisinde 0’dan 1023’e ve ardından 1023’ten 0’a doğru azalan for döngüleriyle yumuşak geçiş efektini (fading) gerçekleştiriyoruz:
for duty_cycle in range(0, 1024):
led.duty(duty_cycle)
sleep(0.002)Burada kullanılan Python range(start, stop, step) parametre yapısı şu şekildedir: start başlangıç konumunu (0), stop bitiş limitinin bir öncesini (1024 yani 1023’te durur) ve step ise döngünün artış miktarını belirler.
Sonuç
Yazdığınız bu betiği Thonny veya uPyCraft IDE kullanarak kartınızın hafızasına (Örn: main.py olarak) kaydedip çalıştırın. GPIO 5 pinine bağlı LED’in parlaklığının kararlı bir fading efektiyle çalışmaya başladığını göreceksiniz:

Genel Özet
Bu rehberimizde, gömülü sistem tasarımlarında analog sinyal taklidi yaparak LED parlaklığı, servo motor ve DC motor hız kontrolü gibi pek çok uygulamada kullanılan PWM mimarisini tüm teknik detaylarıyla inceledik. Hem Arduino IDE hem de MicroPython geliştirme platformları üzerinden donanımsal register ayarları, anahtarlama frekansları ve görev döngüsü (duty cycle) çözünürlük limitlerini (Arduino 8-bit, MicroPython 10-bit) pratik devre uygulamalarıyla doğruladık.
Resmi ESP8266 veri sayfasına buradan ulaşabilirsiniz.
Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.

