Arduino İle RGB Led Şeridi Ambiyans Efekti

Arduino ile 3 renkli RGB Led şeridi ile bilgisayar ekranındaki renk yoğunluğuan göre değişen ambiyans efektli Led uygulamasını anlatacağım.

Uygulamanın fikir vermesi açısından videosu:

Uygulamada kullanılacak ekipmanlar:

  • Arduino (Uno versiyonunu kullandım)
  • 3 Ana renge sahip 1m uzunluğunda RGB Led Şerit (Elektrikçilerden bile bulabilirsiniz.
  • ULN2003A Transistör. Led’lerin kontrolünü gerçekleştirecek transistör (Elektronikçilerde mevcut)
  • 12V adaptör. Arduino sadece 5V gerilim verdiği için Led şeridi dışardan beslemek için ihtiyaç duyacağız.
  • Arduino usb kablosu ve Renkli Jumper kablolar.
  • Arduino ve Processing yazılımı.

Öncelikle breadboard’un üzerine ULN2003A transistörü yerleştirip aşağıdaki şemadaki gibi bağlantıları yapalım. Dikkat edilmesi gereken adaptörden gelen 12V’luk gerilimi doğrudan arduinoya vermememiz. Arduinoda kalıcı hasara yol açacaktır.
rgb led

Bağlantıları breadboard’a yaptıktan sonrak görünüm şu şekilde:

rgb-led1

Görüldüğü gibi, Arduino’nun 9,10 ve 11 numaralı pinleri transistörün sol üst 3 pinine bağlı. Tam karşılarına ise sırasıyla şeridin kırmızı, yeşil ve mavi girişleri bağlı. Led şeridin güç kablosuna adaptörden gelen + ucu bağlayıp – ucu ise arduino’nun gnd pini ile transistörün soldaki 8 numaralı pinine paralel olacak şekilde bağlıyoruz.

Processing Programlama

Processing programı üzerinde, bilgisayarımızın ekranını anlık olarak takip edecek ve renklerin ortalamasını alarak seri haberleşme ile arduinoya gönderecek bir programa ihtiyacımız var. Açıklamalı olarak processing kodları:

/*
Arduino Monitor Ambians Şeridi
www.sezercoban.com
*/

//gerekli sınıfları
import java.awt.Robot;//ekran renklerini alan Robot sınıfı
import java.awt.AWTException;
import java.awt.event.InputEvent;
import java.awt.image.BufferedImage;
import java.awt.Rectangle;
import java.awt.Dimension;
import processing.serial.*; //Seri Haberleşme
Serial port; //Seri Haberleşme sınıfı
Robot robby; //Robot sınıfı

//----değişkenler
 String comport = "COM3"; //Arduino'nun bağlı olduğu com portu
 int r_width = 1600; //Ekran çözünürlüğünüzün
 int r_height = 900;
//----
void setup()
{

 port = new Serial(this, comport,9600);
 size(100, 100); //ortalama rengi gösterecek pencere
 try
 {
 robby = new Robot();
 }
 catch (AWTException e)
 {
 println("Robot sınıfı desteklenmiyor");
 exit();
 }
}

void draw()
{
 int pixel;
 float r=0;
 float g=0;
 float b=0;

 //robot sınıfı ile çözünürlüğe göre ekran resmi alınır
 BufferedImage screenshot = robby.createScreenCapture(new Rectangle(new Dimension(r_width,r_height)));
 int i=0;
 int j=0;
 for(i =0;i<r_width; i=i+2){
 for(j=0; j<r_height;j=j+2){
 pixel = screenshot.getRGB(i,j); //ekran resminin renkleri ayrılıp ortalamaları hesaplanır
 r = r+(int)(255&(pixel>>16)); //kırmızılar
 g = g+(int)(255&(pixel>>8)); //yeşiller
 b = b+(int)(255&(pixel)); //maviler
 }
 }
 r=r/(684*464);
 g=g/(684*464);
 b=b/(684*464);
 //processing konsoluna bilgi amaçlı arduinoya gönderilecek veriler yazdırılır
 println("r:" +r);
 println("g:"+g);
 println("b:"+b);

 port.write(0xff); //her bir veri paketi için senkronizasyon verisi
 port.write((byte)(r)); //kırmızı değeri
 port.write((byte)(g)); //yeşil değeri
 port.write((byte)(b)); //mavi değeri
 delay(10);

 background(r,g,b); //processing penceresi ortalama rengi alır
}

Processing kodlarında değişkenler bölümünde port ve çözünürlük kısmını kendinize göre ayarlamayı unutmayın.

Arduino Programlama

Processing’den gelen verileri işleyip led’e gönderecek kodlar:


/*
Arduino Monitor Ambians Şeridi
www.sezercoban.com
*/
int red, green, blue;
int RedPin = 9; //kırmızı rengin bağlı oldugu pin
int GreenPin = 10; //yeşil rengin bağlı oldugu pin
int BluePin = 11; //mavi rengin bağlı oldugu pin
void setup()
{

Serial.begin(9600);
 int red = 255;
 int blue = 255;
 int green = 255;
}

void loop()
{

/*
eğer seri haberleşme açıksa ve4 karakter geliyor ise,
senkronizasyo verisi her geldiğinde renkleri oku
*/
if (Serial.available()>=4) {
 if(Serial.read() == 0xff){
 red = Serial.read();
 green= Serial.read();
 blue = Serial.read();
 }
}
//okunan renkleri led e gönder
analogWrite (RedPin, red);
analogWrite (GreenPin, green);
analogWrite (BluePin, blue);
delay(10);
}

Arduino kodunuda gönderdikten sonra geriye processing programını çalıştırmak kalıyor. Bilgisayarınızın arkasına koyduğunuzda özellikle film izlerken ortamı oldukça etkikeyecektir.

Geliştirme

Processing ile monitörü 2 ya da daha fazla bölüme ayırarak her bölüm için ayrı bir renkte led yanmasını sağlayabilirsiniz.

Bir board üzerine transistör ve header lehimleyerek bu sistemi sabit hale getirebilirsiniz.

rgb-led-2

Nasıl  çalıştığına dair örnek bir video:

9 Comments

    1. BaglantilariniZda sorun olabilir. Rx yanıyor ise çıkış vardır. Doğru pinlere bagladiginiza emin olun.

  1. Devrenin tam şemasını verebilirmisiniz.
    Uln2003 e 5v elektriği hangi pininden verdiniz.
    Son olarak bu devre kaç metre şerit led çalıştırır.
    Teşekkürler.

  2. çok teşekkür ederim çalışıyor fakat yanan renklerle ilgili sıkıntım var kırmızı rengi çok az yanıyor genelde mani tonları daha çok belli oluyor sebebi ne olabilir ?

    1. bağlantılarınızı kontrol edin, kımızı renginin bağlı oldugu ayakta sıkıntı olabilir, yetersiz gerilim uygulanıyor olabilir. Ya da yazılımsal olabilir, ekrana kırmızı renk deseni actıgınızda da mı kırmızı cok az kontrol edin.

  3. Merhaba, bu güzel paylaşımın ve desteğin için öncelikle teşekkür etmek isterim. Yaşamış olduğum problemi paylaşmak isterim.
    5 adet 50cm uzunluğunda şerit ledleri birbirine seri bağladım ve ULN2003 üzerinden 7*5 = 35 şerit lede ayrı ayrı bacaklara girerek açma kapama işlemi yaptırıyorum.
    5 adet şerit led 2A çekiyor ve ULN2003’ün desteklediği bacak başına akım 400mA olarak görünmekte fakat ölçümlerimde 540mA akım çekiyor ve buda ledlerin parlaklığını kısıyor.Benim problemimde bu noktada başlıyor.Nasıl bir işlem yapmalıyım ki akımı artırıp parlaklığı sağlayabilirim. Bu konuda ki önerilerinizi sabırsızlıkla bekliyorum.Teşekkürler.

    Not : 35 adet led 7 bacak üzerinden 5’er li gruplar halinde çalışıyor.Ama parlaklıklar 550mA akımla sağlanıyor.

  4. Merhabalar ben iktisat öğrencisiyim ama elektroniğe fazlasıyle meraklı biriyim tek sıkıntı bu konuda kodlama arduino ile uzun bir süredir uraşıyorum ama processing mantığını çözemedim mönitör bölme konusunda yardımcı olursanız çok sevinirim.

  5. Arduino:1.8.5 (Windows 10), Kart:”Arduino/Genuino Uno”

    sketch_aug06a:7: error: ‘import’ does not name a type

    import java.awt.Robot;//ekran renklerini alan Robot sınıfı

    bu hatayı alıyorum sebebı nedır ?

    1. Processing programını arduinoya atmaya çalışıyorsunuz. Üstte paylaştığım Processing programı için yazılmış olan kod. Bu kodu Processing adlı programa yapıştırıp çalıştıracaksınız. Arduino kodunu arduinoda. Processing ekran renklerini arduinoya gondererek ışık renklerini ayarlayacak.

Bir cevap yazın

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