Arduino İle PWM Sinyal Kontrolü
Arduino ile pwm sinyal kontrolü yazımızda, PWM’in ne olduğunu ve Arduino’nun dijital pinlerinden PWM çıktısını nasıl alabileceğinizi öğreneceksiniz. İlk olarak LED’in parlaklığını kod aracılığıyla kontrol edeceğiz ve ardından potansiyometre ekleyerek manuel olarak kontrol edeceğiz.
PWM Nedir?
PWM, Darbe Genişliği Modülasyonu(Pulse Width Modulation) anlamına gelir ve LED parlaklığının kontrol edilmesinde, DC motorun hız kontrolünde, bir servo motorun kontrolünde veya dijital yollarla analog çıkış alınması gereken durumlarda kullanılan bir tekniktir.
Arduino dijital pinleri bize ya 5V ya da 0V verir ve çıkış bir kare dalga sinyalidir. Yani bir LED’i yakmak için istersek dijital pinden 0 ile 5V arası voltaj alamıyoruz ama sinyalin AÇIK ve KAPALI zamanını değiştirebiliriz. ON ve OFF zamanını yeterince hızlı değiştirirsek ledin parlaklığı değişecektir.
Daha ileri gitmeden önce, PWM ile ilgili bazı terimleri öğrenelim.
- TON (On Time): Sinyalin yüksek(5v,HIGH) olduğu zamandır.
- TOFF (Kapalı Zaman): Sinyalin düşük olduğu zamandır.
- Period(Periyot): Açık ve kapalı zamanların toplamıdır.
- Duty Cycle(Görev Döngüsü): Dönem boyunca sinyalin yüksek olduğu sürenin yüzdesidir.
Yani %50 Duty Cycle(görev döngüsü) ve 1Hz frekansında led yarım saniye yüksek, diğer yarım saniye düşük olacaktır. Frekansı 50Hz’e çıkarırsak (saniyede 50 kez AÇIK ve KAPALI), led’in yarı parlaklıkta yandığı insan gözü tarafından görülecektir.
Arduino ve PWM
Arduino IDE, bir PWM sinyali oluşturmak için kullanılabilen bir “analogWrite()” fonksiyonuna sahiptir. Çoğu pin için üretilen bu sinyalin frekansı yaklaşık 490Hz olacaktır ve bu fonksiyonu kullanarak 0-255 arası bir değer verebiliriz.
- analogWrite(0), %0 görev döngüsü sinyali anlamına gelir.
- analogWrite(127), %50 görev döngüsü sinyali anlamına gelir.
- analogWrite(255), %100 görev döngüsü sinyali anlamına gelir.
Arduino Uno’da PWM pinleri 3, 5, 6, 9, 10 ve 11’dir. 5 ve 6 pinlerindeki PWM sinyalinin frekansı yaklaşık 980Hz, diğer pinlerde ise 490Hz olacaktır. PWM pinleri ~ işareti ile gösterilmektedir.
Eğer başka kartlar kullanıyorsanız bu linkten kartınızı bulup pwm pinlerinizi öğrenebilirsiniz.
Bu yazımızda kullanılacak olan malzemeler:
- Arduino Uno
- Led
- 10k Potansiyometre
- 1 adet 220 Ohm direnç
- Breadbord
- Jumper Kablolar
Kod Aracılığıyla LED’in Parlaklığını Kontrol Etme
Uzun bacak olan LED’in pozitif ayağını Arduino’nun dijital pin 6’sına bağlayın. Ardından 220 ohm’luk direnci LED’in negatif ayağına bağlayın ve direncin diğer ucunu Arduino’nun toprak pinine bağlayın.
Ledi PWM Sinyali İle Kontrol Etme Kodu
Kodu Arduino IDE’ye yükleyin, LED yanıp sönmeye başlayacaktır.
//Led pinini tanımlıyoruz
int led_pin = 6;
void setup() {
//Led pinini çıkış olarak ayarlıyoruz.
pinMode(led_pin, OUTPUT);
}
void loop() {
//Ledin parlaklığının arttırılması
for(int i=0; i<255; i++){
analogWrite(led_pin, i);
delay(5);
}
//Ledin parlaklığının azaltılması
for(int i=255; i>0; i--){
analogWrite(led_pin, i);
delay(5);
}
}
LED Parlaklığını Manuel Olarak Kontrolü
Önceki bağlantılarda 10k ohm potansiyometreyi ekleyin ve potansiyometrenin iki ucunu Arduino’nun 5V ve GND’sine bağlayın ve ardından potansiyometrenin merkezini Arduino’nun A0 pinine bağlayın.
LED Parlaklığını Manuel Olarak Kontrol Kodu
Kodu Arduino IDE’ye yükleyin ve potansiyometrenin düğmesini hareket ettirdiğinizde LED’in parlaklığı değişecektir.
//Led pinini tanımlıyoruz
int led_pin = 6;
//Potansiyometre pinini tanımlıyoruz
int pot_pin = A0;
// potansiyometre verisini tutacak olan değişkeni tanımlıyoruz.
int output;
//potansiyometreden okunan değeri pwm siyali olarak tutulacak değişken tanımlıyoruz.
int led_value;
void setup() {
//led pinini çıkış olarak ayarlıyoruz
pinMode(led_pin, OUTPUT);
}
void loop() {
//potansiyometreyi okuyoruz
output = analogRead(pot_pin);
//Mapping fonksiyonu ile potansiyometreden okunan değeri 0-5V arası pwm siyaline çeviriyoruz.
led_value = map(output, 0, 1023, 0, 255);
//analogWrite fonksiyonu ile pwm siyanlini veriyoruz.
analogWrite(led_pin, led_value);
//10ms'lik bekleme yaptırıyoruz.
delay(10);
}