V minulé lekci jsme se seznámili s RGB LED diodou. Naučili jsme se svítit několika základními barvami. RGB LED dioda toho ale umí mnohem více a tom bude řeč v této lekci. Napřed ale nějaké to povídání okolo, takže buďte trpěliví.
RGB barevný model
RGB Led dioda svítí podobně, jako třeba monitor u počítače v určitém barevném modelu (barevný model = systém zobrazení větší škály barev). V tomto systému se mísí barvy z několika světelných kanálů (RGB – červená – zelená – modrá) a výsledkem jsou různé odstíny barev.
Z předchozího obrázku, který zobrazuje náhled na RGB barevný model je jasné, že v tomto modelu je možné zobrazit velkou škálu barev. Abychom mohli tyto barvy matematicky vyjádřit (protože program v arduinu to potřebuje popsat čísly) musíme každou barvu popsat prostřednictvím poměru hodnot třech čísel (červeného, zeleného a modrého barevného kanálu). S podobným systémem funguje například i prostředí internetových stránek, kdy je možné poměrem RGB vyjádřit každou barvu (k vyzkoušení zde).
PWM piny a příkaz analogWrite()
Na začátku našeho povídání jsme si řekli, že arduino má dva druhy pinů – digitální a analogové. Analogové piny umí posílat jako výstup napětí o různé výši (konkrétně 255 různých úrovní od 0 do 5V). Digitální piny oproti tomu umí odesílat jen dvě úrovně – 0V, nebo 5V – 0, nebo 1 – LOW, nebo HIGH. LED didoda připojená na tyto piny tedy buď svítí, nebo nesvítí. My ale potřebujeme posílat různé hodnoty na výstupy RGB LED diody.
Technici jsou ale chytří chlapci a tak vymysleli jak na to. Digitálními piny je totiž třeba nejen svítit RGB LED diodou, ale třeba také regulovat otáčky motůrků, nebo řídit serva. Pro tento účel se využívá technika PWM (Pulse Width Modulation – modulace pomocí šířky pulsu).
Na obrázku PWM – modulace pulsu máte čtyři grafy. Jedná se o průběh napětí v čase. Rozdělíme-li si průběh v čase na stejné úseky (přerušované čáry). Kdybychom měli vyjádřit stav 0, kdy pin neposílá žádné napětí byla by výsledkem čára grafu bez modré plochy symbolizující napětí. Pokud bychom vysílali stav 1 – tudíž plné napětí byl by výsledkem poslední graf zobrazující 100% účinnost.
Pokud ale budeme posílat pulsy napětí přerušované (zbylé tři grafy) s rozdílnou šířkou pulsu získáme výsledek podobný jako když posílá analogový výstup napětí o různé výši. Tento jev se podobně projeví i při posílání pulsů na RGB LED diodu – projeví se, jako bychom na přívod posílali napětí o různé výši.
Jak ale vyjádřit programově pro desku arduina, že chceme aby na určitý pin poslala puls o určité šířce? Víme, že analogový pin posílá napětí od 0 do 5V ve 255 úrovních. Podobně to funguje i v případě digitálního pinu. Příkazem analogWrite([číslo pinu],[hodnota od 0-255]); můžete poslat tento příkaz.
Upozornění: PWM pin je k nalezení na digitálních pinech. Na desce jsou označeny vlnovkou. Na desce Arduino Uno jsou to piny č. 3, 5, 6, 9, 10, 11. Pro tyto piny je možné využít příkaz analogWrite() pro pulsní modulaci.
Program Puls
Zapojení použijte stejné jako v předchozí lekci, rozdíl je pouze v odlišném připojení jednotlivých barevných kanálů využijeme pwm piny 3,5 a 6. Opět použijeme RGB LED diodu se společnou katodou a ochranné odpory o velikosti 220 ohmů.
Program, který je třeba nahrát.
/* Světelný maják s RGB diodou Světelný maják pulsuje pomocí příkazu analogWrite */ //Nastavení desky – inicializace pinů – RGB int pin_r=3; //nastavení pinu pro kanál červené barvy int pin_g=5; //nastavení pinu pro kanál zelené barvy int pin_b=6; //nastavení pinu pro kanál modré barvy int pauza=60; //pauza mezi barevnými přechody v milisekundách void setup() { pinMode(pin_r, OUTPUT); pinMode(pin_g, OUTPUT); pinMode(pin_b, OUTPUT); } //Provedení programu – spuštění v nekonečné smyčce void loop() { //čistá modrá analogWrite(pin_r, 0); analogWrite(pin_g, 0); analogWrite(pin_b, 230); delay(800); //směsové barvy analogWrite(pin_r, 57); analogWrite(pin_g, 0); analogWrite(pin_b, 230); delay(pauza); analogWrite(pin_r, 115); analogWrite(pin_g, 0); analogWrite(pin_b, 230); delay(pauza); analogWrite(pin_r, 172); analogWrite(pin_g, 0); analogWrite(pin_b, 230); delay(pauza); analogWrite(pin_r, 230); analogWrite(pin_g, 0); analogWrite(pin_b, 230); delay(pauza); analogWrite(pin_r, 230); analogWrite(pin_g, 0); analogWrite(pin_b, 172); delay(pauza); analogWrite(pin_r, 230); analogWrite(pin_g, 0); analogWrite(pin_b, 115); delay(pauza); analogWrite(pin_r, 230); analogWrite(pin_g, 0); analogWrite(pin_b, 57); delay(pauza); //čistá červená analogWrite(pin_r, 230); analogWrite(pin_g, 0); analogWrite(pin_b, 0); delay(800); //směsové barvy analogWrite(pin_r, 230); analogWrite(pin_g, 0); analogWrite(pin_b, 57); delay(pauza); analogWrite(pin_r, 230); analogWrite(pin_g, 0); analogWrite(pin_b, 115); delay(pauza); analogWrite(pin_r, 230); analogWrite(pin_g, 0); analogWrite(pin_b, 172); delay(pauza); analogWrite(pin_r, 230); analogWrite(pin_g, 0); analogWrite(pin_b, 230); delay(pauza); analogWrite(pin_r, 172); analogWrite(pin_g, 0); analogWrite(pin_b, 230); delay(pauza); analogWrite(pin_r, 115); analogWrite(pin_g, 0); analogWrite(pin_b, 230); delay(pauza); analogWrite(pin_r, 57); analogWrite(pin_g, 0); analogWrite(pin_b, 230); delay(pauza); } |
Úkol:
Vytvořte nějaký pěkný světelný efekt s použitím příkazů analogWrite.