Bir cümlelik özet
PWM (darbe genişlik modülasyonu), bir dijital pini çok hızlı açıp kapatarak ortalama gücü ayarlama yöntemidir; böylece bir LED'i kısabilir veya bir motorun hızını değiştirebiliriz.
Neden önemli?
Bir Arduino pini normalde yalnız iki şey yapabilir: ya 5 volt verir (HIGH), ya da 0 volt verir (LOW). Yani bir lamba ya tam yanar ya tamamen söner. Peki bir LED'i "yarı parlak" yakmak ya da bir vantilatörü "orta hızda" döndürmek istersek ne yaparız?
İşte PWM tam burada devreye girer. Pini o kadar hızlı açıp kapatırız ki gözümüz tek tek yanıp sönmeleri fark edemez; bunun yerine ortalama bir parlaklık görürüz. Aynı fikir robot tekerleklerinin hızını, bir sirenin sesini ve hatta bir RGB LED'in rengini ayarlamakta kullanılır.
Bu ders, önceki derslerde öğrendiğin dijital çıkışları bir üst seviyeye taşıyor: artık "açık/kapalı" yerine "ne kadar" sorusunu da yanıtlayabileceksin.
PWM nasıl çalışır?
Hızlı açıp kapama fikri
PWM'in tam açılımı Pulse Width Modulation, yani darbe genişlik modülasyonudur. Uzun isme takılma; mantığı çok basit.
Bir ışık düğmesini saniyede yüzlerce kez açıp kapadığını düşün. Düğme zamanın yarısında açık, yarısında kapalı olursa lamba sana "yarı parlak" görünür. Zamanın çoğunda açık kalırsa daha parlak, çoğunda kapalı kalırsa daha sönük görünür.
- Açık kalma süresi uzunsa → daha çok güç → daha parlak
- Açık kalma süresi kısaysa → daha az güç → daha sönük
Bu "açık kalma yüzdesine" görev döngüsü (duty cycle) denir. %0 tamamen kapalı, %100 tamamen açık, %50 ise yarı güç demektir.
analogWrite ve 0–255 ölçeği
Arduino'da PWM üretmek için analogWrite() komutunu kullanırız. Bu komut 0 ile 255 arasında bir sayı ister:
analogWrite(pin, 0)→ görev döngüsü %0 (kapalı)analogWrite(pin, 127)→ görev döngüsü ~%50 (yarı güç)analogWrite(pin, 255)→ görev döngüsü %100 (tam açık)
Neden 255? Çünkü Arduino bu değeri 8 bitlik bir sayı olarak tutar ve 8 bit ile en fazla 256 farklı değer (0'dan 255'e) sayabiliriz. İsmi "analog" olsa da pin hâlâ sadece açılıp kapanır; sadece çok hızlı yapar.
Hangi pinler PWM verir?
Her pin PWM veremez. Arduino Uno üzerinde PWM destekleyen pinlerin yanında bir tilde işareti (~) bulunur. Uno'da bunlar: 3, 5, 6, 9, 10 ve 11 numaralı pinlerdir.
Karta baktığında pin numarasının yanında ~3 gibi bir işaret görürsen, o pin PWM üretebilir demektir. İşareti olmayan bir pine analogWrite() verirsen ya hiçbir şey olmaz ya da sadece tam açık/tam kapalı gibi davranır.
Küçük kural:analogWriteiçinpinMode'uOUTPUTyapmayı unutma ve sadece~işaretli pinleri seç.
Günlük hayattan iki örnek
Telefon ekranının parlaklığı
Telefonunun parlaklık ayarını değiştirdiğinde ekranın arka ışığı aslında PWM ile kısılır. Işık o kadar hızlı yanıp söner ki sen sadece daha parlak veya daha sönük bir ekran görürsün. Karanlık odada kısık, güneşte tam parlak; hepsi görev döngüsü değişiminden ibarettir.
Fanlı bilgisayar veya klima
Bilgisayarın içindeki soğutucu fanlar da çoğunlukla PWM ile kontrol edilir. İşlemci ısındığında görev döngüsü artar, fan hızlanır; soğuduğunda döngü azalır, fan yavaşlar. Aynı mantıkla bir robotun tekerlek motorunu yavaşça hızlandırıp yavaşlatabiliriz.
Basit örnek: LED'i yavaşça parlat
Önce sabit bir yarı parlaklık deneyelim. 9 numaralı pine (PWM'li) bir direnç üzerinden LED bağlayalım.
Devre:
- LED'in uzun bacağı (+) → 220 ohm direnç → 9 numaralı pin
- LED'in kısa bacağı (−) → GND
int ledPin = 9; // PWM pini (~9)
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
analogWrite(ledPin, 64); // yaklasik %25 parlaklik
delay(1000);
analogWrite(ledPin, 255); // tam parlaklik
delay(1000);
}
Bu sketch LED'i bir saniye kısık, bir saniye tam parlak yakar. 64 yerine farklı sayılar deneyerek parlaklığın nasıl değiştiğini gözlemle.
Mini uygulama: Potansiyometreyle LED parlaklığı
Şimdi asıl projeye geçelim. Bir potansiyometreyi çevirerek LED'in parlaklığını elimizle ayarlayacağız. Potansiyometre, bir düğme çevirdikçe değişen ayarlanabilir dirençtir.
Devre:
- Potansiyometrenin orta bacağı → A0 (analog giriş)
- Potansiyometrenin bir yan bacağı → 5V
- Potansiyometrenin diğer yan bacağı → GND
- LED: uzun bacak → 220 ohm direnç → 9 numaralı pin, kısa bacak → GND
Sorun şu: analogRead() bize 0–1023 arası bir sayı verir, ama analogWrite() 0–255 ister. Bu iki ölçeği eşlemek için map() komutunu kullanırız.
int potPin = A0; // potansiyometre girisi
int ledPin = 9; // PWM cikisi (~9)
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
int okunan = analogRead(potPin); // 0 - 1023
int parlaklik = map(okunan, 0, 1023, 0, 255);
analogWrite(ledPin, parlaklik); // 0 - 255
Serial.println(parlaklik); // degeri izle
delay(50);
}
Potansiyometreyi çevirdikçe LED kısılıp parlar. Aynı anda Seri Monitör'ü açarsan gönderilen parlaklık değerinin 0 ile 255 arasında değiştiğini görürsün. map() komutu, 0–1023 aralığını orantılı biçimde 0–255 aralığına dönüştürür.
Uygulama laboratuvarı: PWM
PWM konusunu kalıcı hâle getirmenin en iyi yolu, kavramı küçük ve ölçülebilir bir göreve dönüştürmektir. Bu çalışmada PWM nasıl çalışır? ile analogWrite ve 0–255 ölçeği arasındaki ilişkiyi kullanarak bağlantı şeması, derlenebilen Arduino kodu, seri monitör kaydı ve test sonucu hazırlayacaksın. Amaç yalnız sonucun çalışması değil; hangi kararı neden verdiğini, neyi test ettiğini ve hangi durumda tasarımı değiştireceğini açıklayabilmektir.
Görev senaryosu
Şu senaryoyu ele al: mesafeye göre ses aralığı değişen park sensörü. Dersin ana hedefi “analogWrite ve PWM ile LED parlaklığını veya bir çıkışı ayarlamayı öğren” olduğuna göre önce problemi tek cümleyle tanımla. Ardından sistemin alacağı girdiyi, uygulayacağı işlemi ve üreteceği çıktıyı ayrı ayrı yaz. Bilmediğin bir ayrıntı varsa onu varsayım olarak işaretle; varsayımı gerçek bilgi gibi kullanma.
- Planla: Başlangıç durumunu, beklenen sonucu ve kullanacağın kavramları yaz.
- En küçük sürümü kur: Yalnız temel davranışı çalıştır; süsleme ve ek özellikleri sonraya bırak.
- Üç test hazırla: Normal bir durum, sınırda bir durum ve hatalı ya da beklenmeyen bir durum seç.
- Sonucu kaydet: Beklenen ile gerçekleşeni yan yana yaz; fark varsa olası nedeni belirt.
- Tek değişiklik yap: Aynı anda birçok şeyi değiştirmek yerine bir kararı düzeltip testi yeniden çalıştır.
Başarı ölçütleri
- Kartın 5 V veya 3,3 V çalışma sınırı doğru mu?
- Pin numaraları kod ve devrede eşleşiyor mu?
- Seri monitör ölçümü beklenen aralıkta mı?
- Motor veya servo karttan doğrudan aşırı akım çekiyor mu?
- Güç kesildiğinde sistem güvenli duruma dönüyor mu?
“PWM” çalışmasını bitirdiğinde ürünü bir arkadaşına yalnız bölüm başlıklarıyla anlat. Arkadaşın mesafeye göre ses aralığı değişen park sensörü senaryosundaki adımları ve karar nedenlerini takip edebiliyorsa anlatım yeterince açıktır. Anlaşılmayan noktayı daha fazla terim ekleyerek değil, PWM nasıl çalışır? ve analogWrite ve 0–255 ölçeği ilişkisini daha küçük adımlara bölerek düzelt.
Sık yapılan hatalar
PWM'siz pin seçmek
analogWrite() komutunu 7 gibi ~ işareti olmayan bir pine verirsen parlaklık ayarı çalışmaz. Her zaman 3, 5, 6, 9, 10 veya 11'i seç.
map aralıklarını karıştırmak
analogRead 0–1023, analogWrite 0–255 verir/ister. map(okunan, 0, 255, 0, 1023) gibi ters yazarsan değerler yanlış çıkar. Sıralamayı "kaynaktan → hedefe" olarak düşün: map(deger, 0, 1023, 0, 255).
255'in üstünde değer vermek
analogWrite'a 300 gibi bir sayı verirsen beklenmedik sonuçlar alırsın. Değeri 0–255 aralığında tut.
pinMode'u unutmak
LED pinini OUTPUT yapmayı unutursan çıkış zayıf ve kararsız olabilir. setup() içinde pinMode(ledPin, OUTPUT); satırını yazmayı ihmal etme.
Güvenlik notu
- Bu derste yalnız düşük gerilim kullanıyoruz: Arduino'yu USB kablosuyla ya da uygun bir pil paketiyle besle. Asla şebeke (priz) elektriğiyle deney yapma.
- LED'i doğrudan pine bağlama; her zaman 220 ohm gibi bir akım sınırlayıcı direnç kullan. Direnç olmadan hem LED hem pin zarar görebilir.
- Motorları asla doğrudan Arduino pininden sürme. Motor, pinin verebileceğinden çok daha fazla akım çeker ve kartı bozabilir. Motor için mutlaka bir motor sürücü (örneğin L298N) ve motorun ayrı bir güç kaynağı kullan.
- Motor veya fan denerken düşük görev döngüsüyle başla (örneğin 60–80) ki parça aniden fırlamasın; hızı yavaşça artır.
- Su pompası gibi ıslak ortamda çalışan parçalarda suyu elektronikten uzak tut ve tüm bağlantıları bir yetişkinle birlikte kontrol et.
Ders özeti
- PWM, bir pini çok hızlı açıp kapatarak ortalama gücü ayarlar; buna görev döngüsü denir.
analogWrite(pin, deger)0 (kapalı) ile 255 (tam) arasında bir değer alır.- Arduino Uno'da PWM yalnız
~işaretli pinlerde çalışır: 3, 5, 6, 9, 10, 11. - LED parlaklığı ve motor hızı PWM ile kademeli olarak ayarlanabilir.
map()komutu,analogRead'in 0–1023 aralığınıanalogWrite'ın 0–255 aralığına dönüştürür.
Kontrol soruları
- PWM'in açılımı nedir ve temelde ne yapar?
analogWrite()komutu hangi sayı aralığında değer alır?- Arduino Uno'da PWM destekleyen pinleri nasıl tanırsın ve hangileridir?
analogRead0–1023 verirken bunuanalogWriteiçin nasıl uygun hâle getiririz?- PWM ile hız kontrolü yaparken motoru neden doğrudan Arduino pininden sürmemeliyiz?
Cevaplar
- PWM, Pulse Width Modulation (darbe genişlik modülasyonu) demektir. Bir pini çok hızlı açıp kapatarak ortalama gücü, yani görev döngüsünü ayarlar.
analogWrite()0 ile 255 arasında bir değer alır: 0 tamamen kapalı, 255 tam açık, 127 yaklaşık yarı güçtür.- PWM pinlerinin yanında tilde (
~) işareti vardır. Uno'da bunlar 3, 5, 6, 9, 10 ve 11 numaralı pinlerdir. map()komutuyla ölçeği dönüştürürüz:map(okunan, 0, 1023, 0, 255)değeri orantılı biçimde 0–255 aralığına çeker.- Çünkü motor, pinin güvenle verebileceğinden çok daha fazla akım çeker; bu kartı bozabilir. Motor için ayrı güç kaynağı ve bir motor sürücü gerekir.
Kaynak ve doğrulama notu
“PWM” dersi için doğrulama odağı PWM nasıl çalışır? ile analogWrite ve 0–255 ölçeği arasındaki ilişkinin örnekler üzerinde tutarlı çalışmasıdır. Arduino uyumlu kartlarda pin, gerilim ve akım sınırları modele göre değişebilir. Kod derlense bile devre güvenli olmayabileceğinden, motor ve servo gibi yükler uygun sürücü ve harici besleme ile kullanılmalıdır.
Sonraki ders
Buton Debounce Mantığı: Bir butona bastığında sinyalin neden birden çok kez algılandığını ve bunu yazılımla nasıl temizleyeceğini öğreneceğiz.