Kolorowe jarmarki czyli 3 w 1
Nasz blog dostał wsparcie w postaci nowego autora (kto uważny ten pewnie już wie kto to :) ), także nowe ciekawe wpisy się szykują a ja tymczasem przygotowuję jak zwykle jakieś kolorowe światełka :)
Zacznijmy od końca, czyli krótki filmik. Dzieło nie jest pasjonujące, bo komórkowa kamerka kolorów zbyt dobrze nie oddaje:
Co zrobić… No to może zdjęcie zmontowanego układu:

Teraz już wiadomo co zacz – dioda RGB – czyli tytułowe trzy diody w jednej – Red, Green, Blue. Czerwona, Zielona, Niebieska. Wspólna katoda, czyli z Arduino będzie łatwo taką diodą sterować – wystarczy wyjście cyfrowe podłączyć (przez rezystor 220 ohm) do odpowiedniej nóżki i już można sterować jednym kolorem.
Która nożka jest która? Pomocny będzie ten obrazek:

Licząc od lewej mamy niebieski, zielony, masa, czerwony. Najdłuższa nóżka to właśnie masa i to pozwala się nam zorientować jak podłączyć diodę.
Co nam daje taka dioda? Otóż można nią uzyskać światło innych barw mieszając trzy kolory w różnym stopniu. Dla zilustrowania tego kod programu użytego w pierwszym przykładzie. Idea jest taka, że każdy z kolorów jest zapalany z różną intensywnością (korzystając z PWM) i różną częstotliwością. Uzyskujemy w ten sposób efekt mieszania się kolorów:
int LED1 = 9; int s1 = 255; int LED2 = 10; int s2 = 255; int LED3 = 11; int s3 = 255; unsigned long int tme; void setup() { pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); }; void loop() { analogWrite(LED1, s1); s1 = sin(tme*tme/50000.0)*128+128; analogWrite(LED3, s3); s3 = sin(tme*tme/100000.0)*128+128; analogWrite(LED2, s2); s2 = sin(tme*tme/70000.0)*128+128; delay(15); tme++; };
tme
jest zmienną reprezentującą upływ czasu. Dzielimy kwadrat tej zmiennej w loop przez różne wartości i z nich obliczamy sinus. Dzięki temu mamy trzy różne fale (o różnej częstotliwości) każda z nich służy do sterowania jednym kolorem. Ponieważ funkcja kwadrat jest funkcją rosnącą nieliniowo więc przesunięcie w fazie poszczególnych fal powinno się zmieniać z czasem (tak sądzę, choć pewnie sprawdzić by to trzeba dokładniej). Dzięki temu kolory mieszają się różnie a nie w jednym cyklu.
Skutek uboczny jest taki, że z czasem cykle zmiany stają się coraz krótsze i dioda zaczyna migać coraz szybciej…
Jeżeli ktoś potrzebuje takiej diody – od teraz jest dostępna na Nettigo.
Witam! W kodzie jest drobny błąd. Po prostu nie ma spacji tam gdzie powinna być :)
Wklejam tu poprawiony kod:
int LED1 = 9;
int s1 = 255;
int LED2 = 10;
int s2 = 255;
int LED3 = 11;
int s3 = 255;
unsigned long int tme;
void setup()
{
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
}
void loop()
{
analogWrite(LED1, s1);
s1 = sin(tme*tme/50000.0)*128+128;
analogWrite(LED3, s3);
s3 = sin(tme*tme/100000.0)*128+128;
analogWrite(LED2, s2);
s2 = sin(tme*tme/70000.0)*128+128;
delay(15);
tme++;
}
A możesz przybliżyć gdzie ta spacja została dodana? Bo nie bardzo widzę…
unsignedlongint tme; => unsigned long int tme;
voidsetup() => void setup();
voidloop() => void loop()