Arduino #8 – PWM (Analog) Sinyal Üretme + (for Döngüsü)

Son Güncelleme

Arduino’nun bize 5V gerilim sağladığını biliyoruz ve bu 0V-5V gerilimlerini LOW ve HIGH deyimleriyle kullanmıştık. Yani kısacası herhangi bir elemana enerji vermiştik veya enerjisini kesmiştik. Fakat hiç bu gerilim değerleri (0-5V) arasında bir gerilim kullanan bir eleman ile çalışmamıştık. Çünkü her devre elemanı 0V veya 5V ile durup çalışacak diye bir kural yok. Bazı elemanlar 0V ve 5V arasındaki (örneğin 2.7V, 4.25V gibi) voltaj değerleri ile de çalışabilir veya çalışmaktadır. LED lambanın parlaklığının ayarlanmasından, motorların hız (veya servo motorun açı kontrolü) kontrolüne kadar çeşitli şekillerde kullanılmaktadır.

Arduino üzerinde PWM (Analog) sinyal üretebilmek için hazırlanmış belli pinler mevcuttur. Bunlar dijital giriş-çıkış pinlerinden 3, 5, 6, 9, 10 ve 11 pinleridir. Arduino üzerinde bu pinleri hatırlamanızı sağlayacak ~ (tilda) sembolü her PWM pininin yanında bulunmaktadır

PWM Pinleri (3, 5, 6, 9, 10 ve 11)

Bir PWM pininden analog sinyal üretmek için analogWrite() fonksiyonu kullanılmalıdır. Bu fonksiyona ait iki parametre değeri vardır. Birincisi PWM pin numarası, ikincisi 0-255 arası PWM değeridir.

analogWrite(PWM Pin No, PWM Değeri)
PWM Pin No – 3, 5, 6, 9, 10 ve 11 pinleri
PWM Değeri – 0-255 arası PWM değerleridir. 0 değeri ile 0V, 255 değeri ile 5V çıkış gerilimi alınır. Eğer 2V çıkış gerilimi elde edilmek isteniyorsa 102 ((255*2)/5=102) değeri yazılmalıdır.
Mesela 6 PWM pinine 2V çıkış gerilimi vermek istersek; analogWrite(6,102) şeklinde komut vermeliyiz.

arduino.cc

PWM (analog) sinyal olayını anlamak için basit bir uygulama yapalım. Breadboarda bağlı 3 LED lambanın parlaklığını PWM sinyali ile ayarlayalım.

Devremiz şu şekilde olacak;

Kırmızı en parlak haliyle(5V) yansın, sarı kırmızıya göre biraz daha az parlak(3V), yeşilin parlaklığı ise daha da az(1V) olsun.

void setup(){
  pinMode(3, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(11, OUTPUT);
}

void loop(){
  analogWrite(11,255); //255 PWM değeri karşılığı 5V'tur.
  analogWrite(6,153); //153 PWM değeri karşılığı 3V'tur. (255*3)/5=153
  analogWrite(3,51); //51 PWM değeri karşılığı 1V'tur. (255*1)/5=51
}

TINKERCAD üzerinden devreyi ve kodları inceleyerek, PWM değerlerini değiştirip çalıştırarak iyice anlamaya çalışın.


for DÖNGÜSÜ

Döngü kavramı sürekli tekrar eden şeyler için kullanılır. Bizde kodlamada aynen bu amaçla kullanacağız döngüleri. Sürekli tekrarladığınız şeyleri tekrar adedince art arda yazmaktansa, döngüyü kullanarak yapmak daha avantajlıdır. Hem zaman hemde kod tasarrufu sağlamaktadır.

Zamanı anladıkta kod tasarrufu nedir diyorsanız, şuan için şunu söylemem yeterli; Eğer döngü kullanarak yazacağınız kodları döngü kullanmadan tekrar tekrar yazarsanız (ki istediğiniz sayıda o kodların çalışmasını istiyorsanız yazmanız gerekir.) tüm satırlar çalışıp, kodlar işleneceği için programın çok yavaş çalışması, tepki gecikmesi gibi sıralayacağımız çeşitli sorunlarla karşılaşırsınız. Yani satır (veya kod) ne kadar az ise herşey o kadar hızlı olacaktır.

for döngüsünün yazılışı şu şekildedir;

for(döngü değişkeni, döngünün bitme kuralı, döngü değişkeni artış veya azalış miktarı){
//Döngü içinde çalışacak kodlar iki süslü parantez arasına yazılır.
}

Örneğin; Seri port ekranında 0’dan başlayıp 10’a kadar işleyen bir döngü kuralım.

void setup(){
    Serial.begin(9600);
    for(int x=0; x<10; x=x+1){
        Serial.print(x);
    }
}
void loop(){
} 

Ekran görüntüsü;

0123456789

for döngüsünde döngü değişkeni artış veya azalış miktarını yazarken x=x+1 veya x=x-1‘i;
– x+ +, x – –
– x + =1, x – =1
şeklinde de yazabilirsiniz.


UYGULAMA – for Döngüsü ve PWM ile LED Lamba Parlaklığını Ayarlama

for döngüsünü ve PWM sinyallerini kullanarak, bir LED lambanın parlaklığını en parlaktan en sönük hale gelecek şekilde kodlayalım. Devremiz aşağıdaki gibi olabilir. (LED lambanın uzun bacağının direnç ile birlikte PWM pinine bağlandığına dikkat edin.)

Kodlarımız ise şöyle olmalıdır;

void setup(){
  pinMode(9, OUTPUT);
}

void loop(){
  for (int x=255;x>=0;x--){
    analogWrite(9,x);
    delay(7);
  }
}

Kodları biraz inceleyelim;

  • int x=255 – for döngüsünü 255’ten(x değişkeni) başlattık. Çünkü döngüye ilk defa girdiğinde LED lambanın en parlak haliyle yanmasını istiyoruz. (255=5V)
  • x>=0 – Döngü şartını x değişkeni 0’dan büyük ve eşit olduğu sürece devam etmesi şeklinde ayarladık. Çünkü 255’ten başlayıp birer birer azalırken bu şekilde bir şart vermemiz gerekir. x<0 şeklinde bir şart yazsaydık döngü içine ancak x 0’dan küçük olduğunda girecekti.
  • x – – – Amacımız LED lamba parlaklığını en yüksekten düşüğe doğru indirmek olduğu için döngü her döndüğünde x’in birer birer azalmasını istiyoruz.
  • analogWrite(9 , x) – PWM sinyalini kullanmak için analogWrite() fonksiyonu ile komut verilmesi gerektiğini daha önce söylemiştik. Fonksiyondaki ilk parametre LED lambanın takılı olduğu PWM pin numarası, ikinci parametre olan PWM değerini ise döngü ile kontrol ettiğimiz için döngü değişkenini yazdık. Çünkü LED lambanın parlaklığını ayarlamak için kullandığımız değerler 255’ten başlayıp 0’a doğru inmesi gerekiyor ve bunu zaten döngüdeki x değişkeni ile elde edebiliyoruz.
  • delay(7) – LED lambanın parlaklığı azalırken aradaki geçişi görebilmek için kısa bir süre bekletmemiz daha güzel bir görüntü elde etmemizi sağlar.

TINKERCAD üzerinden devreyi ve kodları inceleyerek, kodlarda çeşitli değişiklikler yapıp çalıştırarak iyice anlamaya çalışın.

  • Sizde LED lambanın parlaklığını en düşükten, en yükseğe gelecek şekilde olması için gerekli kodları yazınız.

Devremizin çalışır hali aşağıdaki gibidir;


UYGULAMA 2 – Potansiyometre ile LED Lamba Parlaklığını Ayarlama

PWM sinyalinin kullanımını biraz daha pekiştirmek için sıklıkla kullanacağımız potansiyometreyide kullanarak bir uygulama daha yapalım. Bu sefer LED lambanın parlaklığını kodlar ile değil potansiyometre ile ayarlayalım.

Devremiz şu şekilde;

Kodlarımız ise şu şekilde;

void setup(){
  pinMode(6, OUTPUT);
}

void loop(){
  int pot=analogRead(A2);
  int pwm=map(pot,0,1023,0,255);
  analogWrite(6,pwm);
  delay(5);
}

Kodlarımızı inceleyelim;

  • int pot=analogRead(A2) – Kontrolü potansiyometre ile sağlayacağımız için öncelikle onun aldığı değeri öğrenmeliyiz.
  • int pwm=map(pot,0,1023,0,255)Bir önceki derste bu orantılama(çevirme) işini neden yaptığımızdan bahsetmiştik. Kısaca tekrar etmek gerekirse bizim kontrol etmek için aldığımız değerler 0-1023 arasındaki değerler fakat kontrol edeceğimiz elemanın alabileceği değerler 0-255 arasındadır. Bu yüzden kontrol için aldığımız değerleri orantılamamız gerekiyor.
  • analogWrite(6,pwm) – 6 nolu PWM pinine bağlı LED lambayı pwm değişkeninden gelen değer ile kontrol ediyoruz.
  • delay(5) – İki değer arasında geçiş yaparken küçük bir delay daha güzel görüntü elde etmemizi sağlar.

TINKERCAD üzerinden devreyi ve kodları inceleyerek, kodlarda çeşitli değişiklikler yapıp çalıştırarak iyice anlamaya çalışın.

Devremizin çalışır hali aşağıdaki gibidir;

Önemli bir konuyu daha bitirdik. Umarım faydalı olmuştur. 🙂

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.