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.
Adım adım kurulum
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.
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.
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.
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.
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.
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 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.
// 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
Beyaz renk pembemsi görünüyor
Sadece bir veya iki renk yanıyor
Seri porttan girilen renk uygulanmıyor
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.