Kolorowe jarmarki czyli 3 w 1

niedziela, kwiecień 25, 2010 22:48 by netmaniac | Filled in arduino

Wygląda na to, że jesteś tutaj nowy(a) jeśli zapiszesz się do mojego RSS feed w prosty sposób otrzymasz informacje o nowych materiałach tutaj.

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:

RGB LED

RGB LED

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:

Wyprowadzenia diody RGB

Wyprowadzenia diody RGB

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.

You can leave a response, or trackback from your own site.

Komentarze: 3 to Kolorowe jarmarki czyli 3 w 1

  1. perry says:

    sierpień 18th, 2010 at 20:17

    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++;
    }

  2. netmaniac says:

    sierpień 18th, 2010 at 21:02

    A możesz przybliżyć gdzie ta spacja została dodana? Bo nie bardzo widzę…

  3. perry says:

    sierpień 19th, 2010 at 00:17

    unsignedlongint tme; => unsigned long int tme;
    voidsetup() => void setup();
    voidloop() => void loop()

Dodaj komentarz