Merhaba arkadaşlar. Bugün sizlerle beraber Arduino ile RGB LED kontrolü yapacağız.

Gerekli malzemelerimiz:

BU DERSTEKİ TÜM ÜRÜNLERİ TEK SEPETE TOPLADIK!

Sepetten ihtiyacınız olmayanları çıkarabilirsiniz. Ya da ürün ekleyebilirsiniz. Stokta olmayan ürünler, sepette yer almaz.

RGB LED Nedir?

RGB LED’ler, normal LED’lerden farklı olarak tek paket içerisinde 3 farklı renk (kırmızı, yeşil ve mavi) LED’i bir arada bulundurur. LED yakıp söndürme dersimizden hatırlayacak olursak LED’lerin anot ve katot uçları bulunuyordu. RGB LED’lerde ise LED’in üretim şekline göre anot veya katot bağlantıları ortak olarak bulunmaktadır.

Bizim kullandığımız kitte bulunan RGB LED’imiz ortak anoda sahip. Bu yüzden Arduino için hazırlayacağımız kod ortak anoda göre çalışacak. Eğer ortak katot bir LED kullanmak istersek, kodumuzda ufak bir değişiklik yapmamız gerekecek.

PWM ve Dijitalden Analog’a Dönüşüm

Bildiğimiz gibi Arduino’muzun giriş/çıkış pinlerinde kullanılan voltaj 5V seviyesinde. Bir önceki dersimizde LED’imizi 5V gerilimde 20 mA akım çekecek şekilde kartımıza bağlamıştık. Bu şekilde bağladığımızda LED’imiz olabilecek en parlak şekilde yanmaktaydı. Peki parlaklığı değiştirmek istersek ne yapmamız gerekir?

Sorunun cevabı aslında basit: gerilimi düşürmek. Eğer 5V ile çalışan LED’imizi daha düşük bir gerilimle, örneğin 3V ile çalıştırırsak parlaklığı azalacaktır. Fakat bu sefer de şunu sorabilirsiniz: Arduino çıkış gerilimi 5V değil miydi? Nasıl 3V çıkış alabiliriz?

Burada darbe genişliği modülasyonu (PWM – pulse width modulation) tekniğini kullanmamız gerekiyor. Bu yazıda darbe genişliği modülasyonu yerine kısaca PWM olarak bahsedeceğim. PWM, çıkışta aldığımız 5V gerilimi belirli bir zaman aralığında (Arduino’da genellikle saniyenin 1/500’ü) açıp kapatarak 0 ile 5V arasında istediğimiz gerilimi Arduino’nun çıkış pininden almamızı sağlar. Şu şekilde düşünelim: eğer bir LED çok hızlı bir şekilde yanıp sönerse gözümüz bu yanıp sönmeyi tam olarak algılayamaz ve parlaklığı daha düşük olarak algılar.

 

Yukarıdaki görselde gördüğümüz üzere, 5V’u 2 milisaniyelik sürenin sadece %5’lik kısmında açık olacak şekilde verirsek, elde ettiğimiz değer 5V’un %5’i; yani 0,25V olacaktır. Aynı şekilde eğer 2 ms sürenin yarısında (%50) açık kalacak şekilde ayarlarsak 2,5V elde ederiz.

Arduino UNO kartımızın tüm pinleri PWM çıkış yeteneğine sahip değildir. Kartımızın dijital pinlerinde pin numarasının önünde ~ işareti olan bazı pinler mevcuttur. Eğer PWM çıkış almak istiyorsak, bu pinleri kullanmak zorundayız. Bu pinler Arduino UNO için 3, 5, 6, 9, 10 ve 11 numaralı pinlerdir.

 

 

RGB LED İçin Arduino Kodu

İlk dersimizde Arduino yazılımı içinde mevcut olan örnek kodu değiştirmiştik. Bu sefer kodumuzu kendimiz yazıyoruz:

int kirmiziPin = 9;
int yesilPin = 10;
int maviPin = 11;

void setup()
{
 pinMode(kirmiziPin, OUTPUT);
 pinMode(yesilPin, OUTPUT);
 pinMode(maviPin, OUTPUT);
}

void loop()
{
 renkAyarla(255, 0, 0); //kirmizi
 delay(1500);
 renkAyarla(0, 255, 0); //yesil
 delay(1500);
 renkAyarla(0, 0, 255); //mavi
 delay(1500);
 renkAyarla(255, 255, 0); //sari
 delay(1500);
 renkAyarla(80, 0, 80); //mor
 delay(1500); 
 renkAyarla(0, 255, 255); //acik mavi
 delay(1500);
 renkAyarla(255, 255, 255); //beyaz
 delay(1500);
}

void renkAyarla(int kirmizi, int yesil, int mavi)

{
 kirmizi = 255 - kirmizi;
 yesil = 255 - yesil;
 mavi = 255 - mavi;
 analogWrite(kirmiziPin, kirmizi);
 analogWrite(yesilPin, yesil);
 analogWrite(maviPin, mavi);
}

RGB LED’imizin kırmızı bacağını 9 numaralı pine, yeşil bacağını 10 numaralı pine ve mavi pinini 11 numaralı pine 220 Ω’luk dirençler ile bağlıyoruz. Kullandığımız LED ortak anot yapıya sahip olduğu için anot bacağını da kartımızın 5V pinine bağlıyoruz.

Devre şeması 17/01/2017 tarihinde güncellenmiştir.

Kodumuzun setup fonksiyonunda kullanacağımız pinleri çıkış olarak tanımlıyoruz. Ayrıca yazdığımız renkAyarla isimli fonksiyondaki analogWrite komutu, bize her bir PWM çıkış pininden alacağımız voltajın yüksekliğini ayarlamamızı sağlıyor. analogWrite komutu şu şekilde kullanılıyor:

analogWrite(PWM çıkış pin numarası, 0-255 arası sayısal değer);

analogWrite komutunda 255 değeri maksimum çıkış voltajını yani 5V’u temsil ediyor. 0 ile 255 arası tüm değerler 0 – 5V arası voltaj değerlerine denk düşüyor. Örneğin analogWrite(9 , 80) komutu, 9 numaralı pinden 5V x (80/255) = 1,57V geriliminde çıkış almamızı sağlıyor. Farklı parlaklıklardaki kırmızı mavi ve yeşil ışığı karıştırarak istediğimiz renkte ışık elde etmemiz bu sayede mümkün oluyor.

Eğer kullandığımız LED ortak anot yerine ortak katot yapıya sahipse, ortak bacağı +5V yerine GND pinlerine bağlamamız ve koddaki renkAyarla fonksiyonundaki

kirmizi = 255 - kirmizi;
yesil = 255 - yesil;
mavi = 255 - mavi;

kısmını silmemiz gerekiyor.

Devre şeması 17/01/2017 tarihinde güncellenmiştir.

loop fonksiyonunda ise kartımız, oluşturduğumuz renkAyarla kodunu tekrar tekrar çağırarak çıkışlara istediğimiz değerleri yazmamızı sağlıyor. delay fonksiyonu bildiğimiz üzere her komut arasında kartımızın işlem yapmadan beklemesini sağlıyor. Bu fonksiyonun değerini değiştirerek istediğimiz hızda renkler arası geçiş sağlayabiliriz. Sizler de farklı parlaklık değerleriyle oynayarak farklı renkler elde edebilirsiniz.

39 Yorumlar

  1. Merhaba Kerem bey;

    Arduino meraklıları için harika bir kaynak olmuş.

    Elinize sağlık.

    Derslerin devamını bekliyoruz.

    Saygılar & selamlar
    Gökhan Güler

  2. Teşekkürler 🙂 derslerinize yeni başladım ve gayet güzel bir kaynak. Neredeyse evdeki 2 Arduino kitabını aldığıma pişman oldum diyebilirim.

  3. buradaki olayın işleme tarzı şu şekilde mi ?
    ortak anottan 5v geliyor.
    pwm pininden örneğin 3 v çıkış aldık. 5-3=2v
    led 2v değerine göre yanıyor ?

    • renkAyarla() komutları arasındaki delay sürelerini değiştirerek veya her bir rengin değerini bir döngü içerisinde (örneğin for döngüsü) kademeli olarak arttırarak yapabilirsiniz.

  4. emeğinize sağlık hocam.sizden ricam ardunyo ile 2 eksen güneş takip sitemi gösterirmisiniz.şimdiden teşekkür ederim.
    saygılar

  5. Ben bu konularda daha çok yeniyim de size bir sorum olacaktı acaba ben arduino uno r3 yerine klon olanını kullansam sorun olur mu acaba cevap verirseniz sevinirim

    • Klon ürünler, orijinal ürünlerin farklı fabrikalar tarafından daha uygun maliyetlerde üretilmiş versiyonlarıdır. İşlevsel olarak hiçbir farkları yoktur. Gönül rahatlığıyla kullanabilirsiniz 🙂

  6. hocam iyi günler
    void renkAyarla(int kirmizi, int yesil, int mavi)

    {

    kirmizi = 255 – kirmizi;

    yesil = 255 – yesil;

    mavi = 255 – mavi;

    analogWrite(kirmiziPin, kirmizi);

    analogWrite(yesilPin, yesil);

    analogWrite(maviPin, mavi);

    } komutun buradaki işlevini çözemedim açıklayabilirmisiniz ?

    • Renk ayarlama; yani PWM çıkışına gerekli analog değeri yazma işlemini loop fonksiyonu yerine ayrı bir fonksiyon olarak yazdım. Böylelikle kodun loop kısmında gereksiz kalabalığın önüne geçerek daha net bir şekilde görülebileceğini düşündüm 🙂

  7. Hocam teşekkür ederim. Ancak anlamadığım bir nokta var. renkAyarla(255, 0, 0) verdiğimiz zaman,
    kirmizi = 0
    yesil = 255
    mavi = 255 oluyor.

    Bu durumda kirmiziPin’e 0V giderken diğerlerine 5V gidiyor. Sonuç olarak Mavi + Yeşil yanması gerekmiyor mu ? Neden kırmızı yanıyor ?

  8. Merhaba;
    Devrede 3 farklı direnci (-) kutuplara koymak yerine, bir tane direnci rgbnin artısına koysak aynı mantık olmaz mı?

    • Malesef hayır. Her bir LED üzerinden yaklaşık olarak 20mA değerinde akım geçmesi gerekli olduğundan (sebebini detaylı bir şekilde LED Yakıp Söndürme dersinde açıkladım) RGB LED’in içindeki her bir rengi ayrı bir LED olarak almamız gerekli. RGB LED’imizi farklı renklerde yakmak istediğimizde her üç rengin parlaklık değeri farklı olacağından, sadece ortak bacağa bağlayacağımız tek bir direnç yeterli akım sınırlamayı yapamayacaktır.

  9. ben mesela arduino veya fpga üzerinde bir 8.055ms lik bir kare dalga üretip led yakmak istiyorum bunu 255 üzerinden hesaplayamadım yardımı olursanız ok sevirim

    • Üreteceğiniz kare dalganın açık kaldığı süreyi (duty cycle) değiştirerek hesaplayabilirsiniz: %50 duty cycle yaklaşık olarak 127/255, veya %20 duty cycle 51/255 yapacaktır.

    • Kodun tamamını kopyalamamış olabilir misiniz? 🙂 loop fonksiyonunun altında renkAyarla isimli bir fonksiyon daha var, belki atlamış olabilirsiniz.

    • void renkAyarla(int kirmizi, int yesil, int mavi) komutunu void setup()dan sonraki satırda göster düzelir.

      int kirmiziPin = 9;
      int yesilPin = 10;
      int maviPin = 11;

      void setup()
      {
      pinMode(kirmiziPin, OUTPUT);
      pinMode(yesilPin, OUTPUT);
      pinMode(maviPin, OUTPUT);
      }

      void renkAyarla(int kirmizi, int yesil, int mavi)

      {
      kirmizi = 255 – kirmizi;
      yesil = 255 – yesil;
      mavi = 255 – mavi;
      analogWrite(kirmiziPin, kirmizi);
      analogWrite(yesilPin, yesil);
      analogWrite(maviPin, mavi);
      }

      void loop()
      {
      renkAyarla(255, 0, 0); //kirmizi
      delay(1500);
      renkAyarla(0, 255, 0); //yesil
      delay(1500);
      renkAyarla(0, 0, 255); //mavi
      delay(1500);
      renkAyarla(255, 255, 0); //sari
      delay(1500);
      renkAyarla(80, 0, 80); //mor
      delay(1500);
      renkAyarla(0, 255, 255); //acik mavi
      delay(1500);
      renkAyarla(255, 255, 255); //beyaz
      delay(1500);
      }

  10. Peki birden fazla Led varsa elimizde örnekğin 15 adet ? pin sayısı yetişmiyor böyle tek tek bağlarsak

  11. hocm merhabalar. benim anladığım konu şu. ortak ANOTlu RGB led’de kırmızı, yeşil ve mavi bacaklar eksi iken nasıl olurda bu bacaklara OUTPUT (5V) veriyorsunuz. Bu eksi olan bacaklara OUTPUT veriyorsunuz ve led yanıyor. BU NASIL OLUYOR? merakımdan çatlayacam

    • Ortak anot LED kullanıldığında, elektrik akımı anot bacağı (+) -> LED -> direnç ve en son olarak direnç üzerinden Arduino pini vasıtasıyla toprak (GND) yolunu izlemiş oluyor. Ortak katot (-) kullandığımızda akımı Arduino sağlamış oluyor (current source); ortak anotta ise akım Arduino üzerinden akıyor (current sink). Her bir mikrokontrolcü için giriş/çıkış pinlerine ait bu değerler datasheet’te belirtilir.

  12. rgb led ile ldr ve ses sensoru kullanımı nasıl olur bunla ilgili internette hic kaynak örnek yok örneğin gunduz ldr yandırmıyıcak rgb yi ama ses sensorunde tepki gelse bile yanmıyacak fakat gece olunca ldr ses sensorunden tepki bekliyicek sonra ldr rgb yi yakıcak bunu nasıl yapabiliriz yardımcı olursanız sevinirim.

  13. lojik VE kapısına ldr ve ses sensörü bağlarsanız çıkışıda ardunio a verirseniz devre çalışır.lojik VEYA kapısına bağlarsanızda sensörlerden biri aktif olunca ardunio çıkış verir ve rgb yanar.

    • 255 değeri, Arduino’nun PWM çıkışlarının hassasiyetinin 8-bit olmasından kaynaklıdır. 2^8 = 256 adım olduğundan, 0 değeri bize 0V, 255 değeri ise maksimum değer olan 5V’u verecektir. Aradaki değerler ise yazıda anlatıldığı gibi PWM sinyali olarak gerçekleşecektir.

  14. SA Kerem Bey
    Ben Arduino Kumanda ile RGB LED Kontrolü ödevim inernette bulduğum şu program ile;

    #define red_pin 6
    #define green_pin 5
    #define blue_pin 3
    #define RECV_PIN 11

    #include

    const int rgb_leds[] = { 6, 5, 3 };

    const long r_less = 16724175; // 1
    const long r_more = 16743045; // 3
    const long g_less = 16716015; // 4
    const long g_more = 16734885; // 6
    const long b_less = 16728765; // 7
    const long b_more = 16732845; // 9
    const long randcol = 16726215; //
    const long onoff = 16753245; //
    const long blinkrgb = 16718055; //

    const int interval = 10;

    int red = 255;
    int green = 255;
    int blue = 255;

    long ir_signal;
    boolean onoff_switch = true;
    boolean randcolor_switch = false;

    IRrecv irrecv(RECV_PIN);
    decode_results results;

    void blink_pin( int pin ) {
    analogWrite( pin, 100 );
    delay( 1000 );
    analogWrite( pin, 255 );
    delay( 1000 );
    }

    void blink_rgb() {
    for ( int led = 0; led <= 2; led++ ) {
    blink_pin( rgb_leds[ led ] );
    }
    }

    void dimm_all() {
    for ( int led = 0; led <= 2; led++ ) {
    analogWrite( rgb_leds[ led ], 255 );
    }
    }

    void random_color() {
    // Randomly draw a color each 500 ms
    int val;

    for ( int led = 0; led <= 2; led++ ) {
    val = random( 0, 255 );
    analogWrite( rgb_leds[ led ], val );
    }

    delay( 500 );
    }

    int inc_dec_val( char color, char action ) {
    int val = interval;
    if ( action == 'i' ) { val *= -1; }

    switch (color) {
    case 'r': val += red; break;
    case 'g': val += green; break;
    case 'b': val += blue; break;
    }

    if (val = 255 ) {
    val = 255;
    }

    switch (color) {
    case ‘r’: red = val; break;
    case ‘g’: green = val; break;
    case ‘b’: blue = val; break;
    }

    return val;
    }

    void setup() {
    pinMode( red_pin, OUTPUT );
    pinMode( green_pin, OUTPUT );
    pinMode( blue_pin, OUTPUT );

    dimm_all();

    Serial.begin(9600);
    irrecv.enableIRIn(); // Start the receiver
    }

    void loop() {
    if ( irrecv.decode(&results) ) {
    ir_signal = results.value;
    Serial.println( ir_signal );

    switch (ir_signal) {
    case r_less:
    analogWrite( red_pin, inc_dec_val( ‘r’, ‘d’ ) );
    break;
    case r_more:
    analogWrite( red_pin, inc_dec_val( ‘r’, ‘i’ ) );
    break;
    case g_less:
    analogWrite( green_pin, inc_dec_val( ‘g’, ‘d’ ) );
    break;
    case g_more:
    analogWrite( green_pin, inc_dec_val( ‘g’, ‘i’ ) );
    break;
    case b_less:
    analogWrite( blue_pin, inc_dec_val( ‘b’, ‘d’ ) );
    break;
    case b_more:
    analogWrite( blue_pin, inc_dec_val( ‘b’, ‘i’ ) );
    break;
    case randcol:
    randcolor_switch = ! randcolor_switch;
    break;
    case onoff:
    onoff_switch = ! onoff_switch;
    if (! onoff_switch) { dimm_all(); }
    break;
    case blinkrgb:
    blink_rgb();
    break;
    }

    ir_signal = 0;

    irrecv.resume(); // Receive the next value
    }

    if (randcolor_switch) { random_color(); }
    }
    Ödevi yapmaya çalışıyorum ama bir türlü bu programı arduino ya yükleyemiyorum IRremote.h kütüphanesini indirdim libary klasörüne attım bu sefer de

    Arduino:1.8.2 (Windows 7), Kart:”Arduino/Genuino Uno”

    Çalışmanız programın 1340 bayt (4 %) saklama alanını kullandı. Maksimum 32256 bayt.
    Global değişkenler belleğin 9 byte kadarını (0%) kullanıyor. Yerel değişkenler için 2039 byte yer kalıyor. En fazla 2048 byte kullanılabilir.
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x1c
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x1c
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x1c
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x1c
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x1c
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x1c
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x1c
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x1c
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x1c
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x1c
    Karta yüklenirken sorun oluştu. Tavsiyeler için http://www.arduino.cc/en/Guide/Troubleshooting#upload adresine göz atabilirsiniz.

    This report would have more information with
    “Show verbose output during compilation”
    option enabled in File -> Preferences.

    hatası alıyorum kafayı yiyecem sizce sorun nedir

    • Arduino’nuzda dijital 0 veya 1 numaralı pinlere herhangi bir bağlantı yaptınız mı? Yaptıysanız bu bağlantıları çıkartıp yükleme yapmayı deneyin.

CEVAP VER