Serwis Edukacyjny w I-LO w Tarnowie Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy
Wałaszek |
©2024 mgr Jerzy Wałaszek
|
Dioda RGB składa się z trzech diod LED umieszczonych w jednej obudowie:
LED RGB 5mm |
LED RGB SMD |
LED RGB SMD |
Na zewnątrz wyprowadzona jest wspólna katoda oraz anody poszczególnych diod (uwaga, możliwe jest również połączenie odwrotne, tzn. wspólna anoda i osobne katody, w diodach SMD wyprowadzane mogą być osobno katody i anody diod – informacji szukaj u producenta lub użyj multimetru do sprawdzenia wyprowadzeń):
Oprócz diod RGB produkowane są diody RG (ang. red, green), które w jednej obudowie zawierają diody LED czerwoną i zieloną (czasem spotyka się również inne zestawy). Na zewnątrz wyprowadzona jest wspólna katoda (lub anoda) oraz anody (katody) diod:
Przez regulację strumienia świetlnego diod uzyskuje się różne barwy pośrednie:
dioda RGB |
dioda RG |
Jasność świecenia poszczególnych diod LED będziemy regulować szerokością impulsów zasilających te diody, czyli tzw. trybem PWM. Tryb ten można uzyskać programowo na każdym wyjściu mikrokontrolera. Istnieje również możliwość sprzętowej regulacji PWM na portach P0, P1 i P4.
Przypomnijmy, tryb PWM (ang. Pulse Width Modulation = Modulacja Szerokości Impulsu) polega na tym, iż mikrokontroler generuje ciąg impulsów, których czas trwania (czyli szerokość) można zmieniać od 0% do 100% okresu:
Impulsy muszą być generowane z odpowiednio dużą częstotliwością, inaczej oko odbierze to jako mruganie. Im impuls szerszy, tym dłużej świeci dioda i oko odbiera to jako jaśniejsze światło (więcej energii dociera do receptorów oka).
Diody ze wspólną anodą i wspólną katodą różnią się sposobem sterowania:
Przy wspólnej katodzie diody LED są zaświecane stanem wysokim, przy wspólnej anodzie diody LED są zaświecane stanem niskim.
W projekcie płytki zastosuję diody o wspólnej anodzie. Dlaczego akurat takie? Ponieważ mam ich większą ilość i muszę je jakoś wykorzystać. To chyba dobry powód.
Płytkę wykonamy w dwóch wersjach: A i B. W wersji A będzie użyta dioda RGB, a w wersji B dioda RG.
DS004A |
DS004B |
Elementy | Ilość | Uwagi |
Dioda LED | 1 | RGB ze wspólną anodą |
Opornik 220Ω | 3 | 0,25W |
Przycisk TACT | 2 | |
Goldpiny męskie długie 1x3 | 1 | |
Goldpiny męskie 1x5 | 1 |
ds004_tht_a.sch | : | schemat ideowy w Eagle |
ds004_tht_a.brd | : | projekt płytki drukowanej w Eagle |
ds004_tht_aa.png | : | obrazek z widokiem elementów na płytce |
ds004_tht_ab.png | : | obrazek spodu płytki |
ds004.svg | : | plik Inkscape do wydruku na drukarce laserowej |
Uwaga: Na schemacie i na płytce drukowanej zamienione są katody diod zielonej z niebieską, ponieważ takie diody RGB miałem do dyspozycji. Sprawdź swoją diodę RGB miernikiem i w razie konieczności popraw schemat oraz projekt PCB.
Elementy | Ilość | Uwagi |
Dioda LED | 1 | RGB ze wspólną anodą |
Opornik 220Ω | 3 | 0805 |
Przycisk TACT | 2 | |
Goldpiny męskie długie 1x3 | 1 | |
Goldpiny męskie 1x5 | 1 |
ds004_smt_a.sch | : | schemat ideowy w Eagle |
ds004_smt_a.brd | : | projekt płytki drukowanej w Eagle |
ds004_smt_aa.png | : | obrazek z widokiem elementów na płytce |
ds004_smt_at.png | : | obrazek góry płytki |
ds004.svg | : | plik Inkscape do wydruku na drukarce laserowej |
Elementy | Ilość | Uwagi |
Dioda LED | 1 | RG ze wspólną anodą |
Opornik 220Ω | 2 | 0,25W |
Przycisk TACT | 2 | |
Goldpiny męskie długie 1x3 | 1 | |
Goldpiny męskie 1x5 | 1 |
ds004_tht_b.sch | : | schemat ideowy w Eagle |
ds004_tht_b.brd | : | projekt płytki drukowanej w Eagle |
ds004_tht_ba.png | : | obrazek z widokiem elementów na płytce |
ds004_tht_bb.png | : | obrazek spodu płytki |
ds004.svg | : | plik Inkscape do wydruku na drukarce laserowej |
Pierwszy program testuje wykonanie płytki. Kolory są włączane stanem niskim na wyjściu portu, a stan wysoki wyłącza kolor. Przyporządkowanie kolorów do portów jest następujące:
Program włącza kolejno kolory czerwony, zielony, niebieski na około 1 sekundę.
// RGB // Test // (C)2019 mgr Jerzy Wałaszek //--------------------------- // Konfigurujemy mikrokontroler //----------------------------- #define DG 0 // Dioda zielona #define DB 1 // Dioda niebieska #define DR 4 // Dioda czerwona void setup() { // Ustawiamy porty diody RGB jako wyjścia pinMode(DR,OUTPUT); pinMode(DG,OUTPUT); pinMode(DB,OUTPUT); // Gasimy RGB digitalWrite(DR,1); digitalWrite(DG,1); digitalWrite(DB,1); } // Pętla główna //------------- void loop() { digitalWrite(DR,0); // Zapalamy diodę czerwoną delay(1000); digitalWrite(DR,1); // Gasimy diodę czerwoną digitalWrite(DG,0); // Zapalamy diodę zieloną delay(1000); digitalWrite(DG,1); // Gasimy diodę zieloną digitalWrite(DB,0); // Zapalamy diodę niebieską delay(1000); digitalWrite(DB,1); // Gasimy diodę niebieską } |
Programem tym możesz również testować płytkę DS004B. Ponieważ nie ma na niej koloru niebieskiego, dioda RG gaśnie po kolorze zielonym na 1 sekundę.
Ten program symuluje światła radiowozów policyjnych przez szybkie mruganie kolorem czerwonym i niebieskim.
// RGB // Kojak // (C)2019 mgr Jerzy Wałaszek //--------------------------- // Konfigurujemy mikrokontroler //----------------------------- #define DG 0 // Dioda zielona #define DB 1 // Dioda niebieska #define DR 4 // Dioda czerwona // Zaświeca wybrany kolor na 0,05s, po czym gasi go i czeka 0,15s. void flash(char c) { digitalWrite(c,0); delay(50); digitalWrite(c,1); delay(150); } void setup() { // Ustawiamy porty diody RGB jako wyjścia pinMode(DR,OUTPUT); pinMode(DG,OUTPUT); pinMode(DB,OUTPUT); // Gasimy RGB digitalWrite(DR,1); digitalWrite(DG,1); digitalWrite(DB,1); } // Pętla główna //------------- void loop() { char i; for(i = 0; i < 3; i++) flash(DR); for(i = 0; i < 3; i++) flash(DB); } |
Kolejny program steruje diodą RGB w ten sposób, iż kolejno są wyświetlane kolory:
czerwony żółty zielony biały jasno-niebieski niebieski fioletowy czarny (brak świecenia) |
// RGB // Tęcza 1 // (C)2019 mgr Jerzy Wałaszek //--------------------------- // Konfigurujemy mikrokontroler //----------------------------- #define DG 0 // Dioda zielona #define DB 1 // Dioda niebieska #define DR 4 // Dioda czerwona void setup() { // Ustawiamy porty diody RGB jako wyjścia pinMode(DR,OUTPUT); pinMode(DG,OUTPUT); pinMode(DB,OUTPUT); // Gasimy RGB digitalWrite(DR,1); digitalWrite(DG,1); digitalWrite(DB,1); } // Tablica kolorów // R G B char ctab[8][3] = {{0,1,1}, // Czerwony - R.. {0,0,1}, // Żółty - RG. {1,0,1}, // Zielony - .G. {0,0,0}, // Biały - RGB {1,0,0}, // Jasno-niebieski - .GB {1,1,0}, // Niebieski - ..B {0,1,0}, // Fioletowy - R.B {1,1,1}};// Czarny - ... // Pętla główna //------------- void loop() { char i; for(i = 0; i < 8; i++) { digitalWrite(DR,ctab[i][0]); // Zapalamy/gasimy składnik czerwony digitalWrite(DG,ctab[i][1]); // Zapalamy/gasimy składnik zielony digitalWrite(DB,ctab[i][2]); // Zapalamy/gasimy składnik niebieski delay(1000); } } |
W tym programie wykorzystane zostały tryby PWM. Na wyjścia P0, P1 i P4 przesyłamy ciąg impulsów o różnych szerokościach, regulując w ten sposób jasność barw składowych.
// RGB // Tęcza 2 // (C)2019 mgr Jerzy Wałaszek //--------------------------- // Konfigurujemy mikrokontroler //----------------------------- #define DG 0 // Dioda zielona #define DB 1 // Dioda niebieska #define DR 4 // Dioda czerwona void setup() { // Ustawiamy porty diody RGB jako wyjścia pinMode(DR,OUTPUT); pinMode(DG,OUTPUT); pinMode(DB,OUTPUT); // Gasimy RGB digitalWrite(DR,1); digitalWrite(DG,1); digitalWrite(DB,1); } // Pętla główna //------------- int cr = 128, dr = -1; int cg = 80, dg = 1; int cb = 255, db = -3; void loop() { if(cr + dr > 255) { cr = 255; dr = - dr; } else if(cr + dr < 0) { cr = 0; dr = - dr; } else cr += dr; if(cg + dg > 255) { cg = 255; dg = - dg; } else if(cg + dg < 0) { cg = 0; dg = - dg; } else cg += dg; if(cb + db > 255) { cb = 255; db = - db; } else if(cb + db < 0) { cb = 0; db = - dr; } else cb += db; analogWrite(DR,cr); analogWrite(DG,cg); analogWrite(DB,cb); delay(25); } |
Poruszaj płytką szybko tam i z powrotem – zobaczysz, że poszczególne składowe RGB świecą z przerwami.
Ten program działa podobnie do poprzedniego, lecz wykorzystuje generator liczb pseudolosowych. Kolor docelowy jest losowany, a następnie w 255 krokach następuje przejście z bieżącego koloru do koloru wylosowanego, po czym losowany jest kolejny kolor. W programie wykorzystujemy liczby zmiennoprzecinkowe, aby uzyskać płynne przejścia kolorów.
// RGB // Aurora // (C)2019 mgr Jerzy Wałaszek //--------------------------- // Konfigurujemy mikrokontroler //----------------------------- #define DG 0 // Dioda zielona #define DB 1 // Dioda niebieska #define DR 4 // Dioda czerwona // Zmienne globalne float red, dr; float green, dg; float blue, db; int i; void setup() { // Ustawiamy porty diody RGB jako wyjścia pinMode(DR,OUTPUT); pinMode(DG,OUTPUT); pinMode(DB,OUTPUT); // Gasimy RGB digitalWrite(DR,1); digitalWrite(DG,1); digitalWrite(DB,1); red = green = blue = 255; i = 256; pinMode(3, INPUT); randomSeed(analogRead(3)); } // Pętla główna //------------- void loop() { if(i == 256) { i = 0; int Red = random(256); int Green = random(256); int Blue = random(256); dr = (Red - red) / 255.0; dg = (Green - green) / 255.0; db = (Blue - blue) / 255.0; } else { i++; analogWrite(DR,red); analogWrite(DG,green); analogWrite(DB,blue); red += dr; green += dg; blue += db; if(red > 255) red = 255; if(red < 0) red = 0; if(green > 255) green = 255; if(green < 0) green = 0; if(blue > 255) blue = 255; if(blue < 0) blue = 0; delay(10); } } |
Sam rozgryź zasadę działania tego programu
// RGB // Kolory podstawowe // (C)2019 mgr Jerzy Wałaszek //--------------------------- // Konfigurujemy mikrokontroler //----------------------------- #define DG 0 // Dioda zielona #define DB 1 // Dioda niebieska #define DR 4 // Dioda czerwona // Zmienne globalne float red, dr; float green, dg; float blue, db; int i; void setup() { // Ustawiamy porty diody RGB jako wyjścia pinMode(DR,OUTPUT); pinMode(DG,OUTPUT); pinMode(DB,OUTPUT); // Gasimy RGB digitalWrite(DR,1); digitalWrite(DG,1); digitalWrite(DB,1); red = green = blue = 255; i = 256; pinMode(3, INPUT); randomSeed(analogRead(3)); } // Pętla główna //------------- void loop() { if(i == 256) { i = 0; int rr,gg,bb; switch(random(5)) { case 0: rr = random(256); gg = 255; bb = 255; break; case 1: gg = random(256); bb = 255; rr = 255; break; case 2: bb = random(256); rr = 255; gg = 255; break; case 3: rr = 0; gg = 0; bb = 0; break; case 4: rr = 255; gg = 255; bb = 255; break; } dr = (rr - red) / 256.0; dg = (gg - green) / 256.0; db = (bb - blue) / 256.0; } else { i++; analogWrite(DR,red); analogWrite(DG,green); analogWrite(DB,blue); red += dr; green += dg; blue += db; if(red > 255) red = 255; if(red < 0) red = 0; if(green > 255) green = 255; if(green < 0) green = 0; if(blue > 255) blue = 255; if(blue < 0) blue = 0; delay(10); } } |
Napisz program, który losowo zmienia kolory RGB, natomiast przyciski regulują jasność świecenia barw składowych.
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2024 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.