BP–03 · Başlangıç projesi

RGB LED ile Renk Karışımı

Bir RGB LED'in içinde aslında üç ayrı LED vardır: kırmızı, yeşil ve mavi. Bu projede üçünü PWM ile farklı oranlarda yakarak istediğimiz rengi elde edecek ve yumuşak bir gökkuşağı geçişi yazacağız.

SeviyeBaşlangıç
Süre35 dk
Malzeme6 çeşit
RGB renk modelianalogWrite()Fonksiyon yazmafor döngüsüOrtak katot / anot

Proje hakkında

Ekranınızdaki her piksel, bu projede yapacağımız şeyi yapar: kırmızı, yeşil ve mavi ışığı farklı yoğunluklarda karıştırır. Buna eklemeli renk karışımı denir. Kırmızı ve yeşil birlikte sarıyı, üç renk tam güçte beyazı oluşturur.

Bu projede ayrıca ilk kez kendi fonksiyonumuzu yazacağız. renkAyarla(r, g, b) adlı fonksiyon sayesinde istediğimiz rengi tek satırla çağırabileceğiz. Kodu düzenli tutmanın ve tekrarı azaltmanın en iyi yolu budur.

  • RGB renk modelini ve eklemeli renk karışımını
  • Ortak katot ve ortak anot RGB LED farkını
  • Parametre alan kendi fonksiyonunu yazmayı
  • for döngüleriyle yumuşak renk geçişleri oluşturmayı

Malzeme listesi

Projeyi tamamlamak için aşağıdaki 6 çeşit malzemeye ihtiyacınız var. Parçaların çoğu Arduino başlangıç setlerinde hazır olarak bulunur.

Arduino Uno R3 1 adet

Projenin beyni. Nano veya Mega ile de aynı kod çalışır.

Breadboard 1 adet

Lehimsiz devre kurmak için yarım boy (400 delik) yeterlidir.

RGB LED (ortak katot) 1 adet

4 bacaklı, 5 mm. En uzun bacak ortak uçtur.

220 Ω direnç 3 adet

Her renk kanalı için ayrı direnç gerekir.

Jumper kablo (erkek-erkek) 5 adet

USB A-B kablosu 1 adet

Kodu yüklemek ve kartı bilgisayardan beslemek için.

Devre bağlantıları

Bağlantıları USB kablosu takılı değilken yapın. Her satır, bileşenin hangi bacağının Arduino'nun hangi pinine gideceğini gösterir; çizgi rengi önerilen kablo rengidir.

Kırmızı bacak (R)D9 (~)220 Ω direnç üzerinden
Ortak katot (en uzun bacak)GNDDoğrudan GND
Yeşil bacak (G)D10 (~)220 Ω direnç üzerinden
Mavi bacak (B)D11 (~)220 Ω direnç üzerinden
LED'i en uzun bacak soldan ikinci olacak şekilde tuttuğunuzda bacak sırası genellikle R – Ortak – G – B'dir. Ancak üreticiye göre değişebilir; emin değilseniz her bacağı tek tek test edin.

Adım adım kurulum

  1. LED tipini belirleyin

    Satın aldığınız LED'in ortak katot mu ortak anot mu olduğunu öğrenin. Bu kodlar ortak katot içindir; ortak anot kullanıyorsanız SSS bölümüne bakın.

  2. LED'i breadboard'a takın

    Dört bacağı dört ayrı sütuna yerleştirin. En uzun bacağın olduğu sütunu doğrudan GND hattına bağlayın.

  3. Dirençleri yerleştirin

    Diğer üç bacağın her birinin sütununa birer 220 Ω direnç takın. Dirençlerin diğer uçlarını breadboard'un karşı yarısına taşıyın.

  4. PWM pinlerine bağlayın

    Kırmızı kanalı D9'a, yeşili D10'a, maviyi D11'e bağlayın. Kablo renklerini kanal renkleriyle eşleştirmek işinizi kolaylaştırır.

  5. Kanalları tek tek test edin

    Kodu yükleyin. İlk saniyede kırmızı, sonra yeşil, sonra mavi yanmalı. Sıra karışıksa kablolarınızın yerini değiştirin.

  6. Renk geçişini izleyin

    Yedi temel renkten sonra LED gökkuşağı renkleri arasında yumuşakça geçiş yapacak. LED'in üzerine pinpon topu veya beyaz kâğıt koyarsanız renkler daha iyi karışır.

Arduino kodu

Kodları Arduino IDE'ye yapıştırıp yükleyebilirsiniz. Türkçe karakterler yalnızca yorum satırlarında kullanıldı; Seri Port Ekranına yazdırılan metinlerde bilerek kullanılmadı.

Temel renkler ve gökkuşağı geçişi.

rgb_led.ino
// RGB LED ile Renk Karışımı
// RobotikHocasi.com

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

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

// Üç kanalı tek seferde ayarlayan yardımcı fonksiyon
void renkAyarla(int r, int g, int b) {
  analogWrite(kirmiziPin, r);
  analogWrite(yesilPin, g);
  analogWrite(maviPin, b);
}

void loop() {
  renkAyarla(255, 0, 0);     delay(1000);  // Kırmızı
  renkAyarla(0, 255, 0);     delay(1000);  // Yeşil
  renkAyarla(0, 0, 255);     delay(1000);  // Mavi
  renkAyarla(255, 255, 0);   delay(1000);  // Sarı
  renkAyarla(0, 255, 255);   delay(1000);  // Camgöbeği
  renkAyarla(255, 0, 255);   delay(1000);  // Mor
  renkAyarla(255, 255, 255); delay(1000);  // Beyaz

  // Gökkuşağı geçişi: Kırmızı -> Yeşil -> Mavi -> Kırmızı
  for (int i = 0; i < 256; i++) {
    renkAyarla(255 - i, i, 0);
    delay(8);
  }
  for (int i = 0; i < 256; i++) {
    renkAyarla(0, 255 - i, i);
    delay(8);
  }
  for (int i = 0; i < 256; i++) {
    renkAyarla(i, 0, 255 - i);
    delay(8);
  }
}

Bonus: Seri Port Ekranından "255,100,0" gibi değer yazarak rengi kendiniz seçin.

rgb_seri.ino
// Seri Port Ekranından renk seçme
// Örnek giriş: 255,100,0  (Satır sonu: Yeni Satır)

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

void setup() {
  pinMode(kirmiziPin, OUTPUT);
  pinMode(yesilPin, OUTPUT);
  pinMode(maviPin, OUTPUT);
  Serial.begin(9600);
  Serial.println("Renk girin (R,G,B):");
}

void loop() {
  if (Serial.available() > 0) {
    int r = Serial.parseInt();
    int g = Serial.parseInt();
    int b = Serial.parseInt();

    if (Serial.read() == '\n') {
      r = constrain(r, 0, 255);
      g = constrain(g, 0, 255);
      b = constrain(b, 0, 255);

      analogWrite(kirmiziPin, r);
      analogWrite(yesilPin, g);
      analogWrite(maviPin, b);

      Serial.print("Yeni renk: ");
      Serial.print(r); Serial.print(", ");
      Serial.print(g); Serial.print(", ");
      Serial.println(b);
    }
  }
}

Kod açıklaması

void renkAyarla(int r, int g, int b)

Üç parametre alan ve geriye değer döndürmeyen (void) bir fonksiyon tanımlar. Fonksiyon loop() dışında yazılır ve istenildiği kadar çağrılabilir.

renkAyarla(255, 255, 0);

Kırmızı ve yeşil tam güçte, mavi kapalı: sonuç sarıdır. Değerleri değiştirerek turuncu (255, 80, 0) veya pembe (255, 20, 147) deneyin.

renkAyarla(255 - i, i, 0);

i arttıkça kırmızı azalır, yeşil artar. Toplam parlaklık sabit kaldığı için geçiş göze yumuşak görünür.

Serial.parseInt()

Gelen metinden bir sonraki tam sayıyı ayıklar. Virgüller otomatik olarak atlanır.

constrain(r, 0, 255)

Değeri belirtilen aralıkta tutar. Kullanıcı 300 yazsa bile 255'e sabitlenir.

Nasıl çalışır?

Bir RGB LED, tek bir kılıf içine yerleştirilmiş üç küçük LED'dir. Ortak katot tipte üç LED'in eksi uçları içeride birleştirilmiştir ve dışarı tek bacak olarak çıkar. Her renk kanalı ayrı bir PWM pininden sürüldüğü için her birinin parlaklığını 256 kademede ayarlayabiliriz: 256 × 256 × 256 ≈ 16,7 milyon renk kombinasyonu.

Gözümüzde kırmızı, yeşil ve maviye duyarlı üç tür koni hücresi bulunur. Üç ışık yeterince yakın olduğunda beyin bunları ayrı ayrı değil, tek bir karışım renk olarak algılar. LED'in üzerine bir difüzör (yarı saydam bir kapak) koyduğunuzda bu etki daha da belirginleşir.

Sorun giderme

Renkler ters çalışıyor, 255 verince sönüyor
Elinizdeki LED ortak anot tipindedir. Uzun bacağı 5V'a bağlayın ve fonksiyon içinde 255 - r, 255 - g, 255 - b yazın.
Beyaz renk pembemsi görünüyor
Kanalların parlaklıkları farklıdır. Kırmızı kanalın direncini 330 Ω yaparak veya kodda kırmızı değerini azaltarak dengeleyin.
Sadece bir veya iki renk yanıyor
İlgili kanalın direnci ya da kablosu yanlış sütunda olabilir. Her kanalı tek tek 255 vererek test edin.
Seri porttan girilen renk uygulanmıyor
Seri Port Ekranının sağ altındaki satır sonu ayarını "Yeni Satır" olarak seçin.

Geliştirme fikirleri

Projeyi tamamladıysanız, aşağıdaki fikirlerle bir adım öteye taşıyabilirsiniz.

Ruh hali lambası

Kodu yavaşlatıp LED'i bir kavanoz veya 3D baskı kılıfa koyarak gece lambası yapın.

Potansiyometreli renk seçici

Üç potansiyometre ile her rengi ayrı ayrı ayarlayın.

Sıcaklık göstergesi

Bir sıcaklık sensörü ekleyip soğukta mavi, sıcakta kırmızı yanan bir gösterge yapın.

Rastgele renkler

random(0, 256) ile her saniye rastgele bir renk üretin.

Sık sorulan sorular

Ortak anot LED ile bu kodu kullanabilir miyim?
Evet. Ortak bacağı GND yerine 5V'a bağlayın ve renkAyarla fonksiyonundaki üç satırı analogWrite(kirmiziPin, 255 - r) şeklinde değiştirin.
Neden üç ayrı direnç kullanıyoruz?
Tek direnç ortak bacağa takılırsa kanallar akımı paylaşır ve renkler birbirini etkiler. Ayrı dirençlerle her kanal bağımsız kontrol edilir.
WS2812 (NeoPixel) LED'ler ile farkı nedir?
NeoPixel'ler içinde kendi kontrol çipi bulunan adreslenebilir LED'lerdir ve tek bir pinle yüzlercesi kontrol edilebilir. Bu proje, onların temelindeki renk mantığını öğretir.

Bir sonraki projeye hazır mısınız?

Başlangıç serisindeki 10 projeyi sırayla tamamladığınızda sensör, motor ve ekran kullanımının temellerini öğrenmiş olursunuz.

Başlangıç projelerine dön