Lekcja 11: Shine on You Crazy Diamond - tęczowe rozbłyski.

Każdy z nas zastanawiał się jak to jest, że ozdoby świąteczne w postaci diód świecą różnymi kolorami. Oczywiście jest na to proste wyjaśnienie: dioda LED RGB, czyli element, który potrafi świecić trzema podstawowymi barwami czerwoną (R - red), zieloną (G - green) i niebieską (B - blue).
Z teorii barw wiemy, że jest to jeden z modeli (oprócz CMYK), który wynika z możliwości ludzkiego oka. Każda barwa widziana przez człowieka może być mieszanką trzech podstawowych barw, czyli właśnie RGB.


Wartości poszczególnych barw zmieniają się od 0 do 255 i aby otrzymać zadany kolor można skorzystać ze wzoru:
kolor = R * 65536 + G * 256 + B.


My wykorzystamy przyrząd, którego specyfikacja jest poniżej:
Kolor czerwony:
  • Długość fali: 625 nm
  • Jasność: 100 mcd
  • Kąt świecenia: 30°
  • Prąd If: 25 mA
  • Napięcie Vf: 2,0 V
Kolor zielony:
  • Długość fali: 525 nm
  • Jasność: 800 mcd
  • Kąt świecenia: 30°
  • Prąd If: 25 mA
  • Napięcie Vf: 3,5 V
Kolor niebieski:
  • Długość fali: 470 nm
  • Jasność: 20 mcd
  • Kąt świecenia: 30°
  • Prąd If: 25 mA
  • Napięcie Vf: 3,5 V

Dioda RGB (jak widać na zdjęciu) posiada cztery wyprowadzenia. Trzy z nich sterują trzema kolorami, zaś czwarte jest masą (najdłuższa nóżka). W celu obniżenia napięcia podawanego na poszczególne nóżki zastosujemy oporniki 220 Ohm.
Wykorzystamy diodę do generowania tęczowych rozbłysków przechodzących z jednego koloru w drugi. Będzie to bardzo efektowne i projekt można wykorzystać do dekoracji na najbliższe święta;)


Kod:

             int Rpin = 9;
             int Gpin = 10;
             int Bpin = 11;
             void blysk(float r1, float g1, float b1, float r2, float g2, float b2, float t){
                      float grad_r, grad_g, grad_b;
                      float out_r, out_g, out_b;
                      grad_r = (r2-r1)/t;
                      grad_g = (g2-g1)/t;
                      grad_b = (b2-b1)/t;
            for ( float i=0; i<=t; i++ ){
                        out_r = r1 + grad_r*i;
                        out_g = g1 + grad_g*i;
                        out_b = b1 + grad_b*i;
                        out_r = map (out_r,0,255,255,0);
                        out_g = map (out_g,0,255,255,0);
                        out_b = map (out_b,0,255,255,0);
                        analogWrite(Rpin, (int)out_r);
                        analogWrite(Gpin, (int)out_g);
                        analogWrite(Bpin, (int)out_b);
                        delay(1);
                        }
                    }
            void setup(){
                }
            void loop(){
                blysk(255,0,0,0,255,0,500);
                blysk(0,255,0,0,0,255,500); 
                blysk(0,0,255,255,0,0,500); 
                }

W liniach 1 - 3 deklarujemy piny odpowiadające za włączanie poszczególnych barw.
W linii 4 zadeklarowana jest nowa funkcja o nazwie blysk, której argumentami są początkowe i końcowe wartości poszczególnych barw oraz czas trwania przejścia.
Zmienne grad_r i pozostałe będą przechowywać wartość pośrednią koloru (r3-r1/t). W linii 10 zaczyna się pętla for, w której będą liczone poszczególne wartości wyjściowe kolorów out_r przez dodanie do wartości początkowej koloru r1 iloczynu obliczonej wyżej wartości grad_r i zmiennej iteracyjnej i. W linii 14 wykorzystujemy funkcję mapowania map, której zadaniem jest ustalenie zakresu zmian danej wartości. Składnia tej funkcji to: map(value, fromLow, fromHigh, toLow, toHigh), co można przetłumaczyć: zmapuj wartość value w zakresie od fromLow do toLow i od fromHigh do toHigh.
Poszczególne parametry oznaczają odpowiednio:

  • value - wartość,
  • fromLow - najniższa granica obecnego zakresu,
  • fromHigh - najwyższa granica obecnego zakresu,
  • toLow - najniższa granica zakresu docelowego,
  • toHigh - najwyższa granica zakresu docelowego.
W linii 17 kojarzymy obliczoną wartość wyjściową out_r z danym pinem.
W linii 26 mamy wywołanie funkcji blysk dla danego przejścia kolorów (z zielonego do niebieskiego w pół sekundy).

Więcej informacji na temat funkcji map można znaleźć na stronie Arduino.

Powrót do spisu materiałów

Nowy zakup

Zakupiliśmy nowy moduł Arduino Leonardo i Yun z obsługą sieci przez Ethernet i WiFi.

Nowe czujniki

Mamy nowe czujniki żyroskopowe. Możemy kontrolować położenie robota.

Zajęcia otwarte

Zapraszamy na zajęcia otwarte uczniów klas SP, które odbywają się w każdy poniedziałek w godz. 15.00-16.00 (Prosimy o kontakt w celu zebrania grupy).