6. RGB LED-i ühendamine ja RGB võimaluste katsetamine analogWrite() abil
<- eelmine peatükk
järgmine peatükk ->
6.0. Seosed eelmiste peatükkidega
Kokku viies peatükis oleme uurinud LED-i vilgutamist. Oleme kasutanud for-tsükliga ja if/else abil LED-i vilgutamist.
LED-il on kaks „jalga“.
Pikem „jalg“ tuli ühendada plussi külge—Arduinol asuva ning meie koostatud programmiga määratud digitaal-viigu külge: Arduinolt juhitava toite külge.
Lühem „jalg“ tuli ühendada miinuse, st GND (ground) külge.
Et LED läbi ei põleks, lisasime juurde ka takisti. Mõtleme, et kuidas ühendanuks me skeemi, milles on kolm LED-i? Näiteks punane, roheline ja sinine LED? Mitu takistit oleks vaja, kui kõik kolm saavad oma signaali erinevatelt Arduino viikudelt?
6.1. Eesmärk ja selgitused
Selles tunnis liigume edasi LED keerukama tüübiga—RGB LED-iga.
RGB-LED-il on aga neli „jalga“: Red-ühenduseks, Ground- ühenduseks, Green- ühenduseks ja Blue- ühenduseks: RGB = Red-Green-Blue.
RGB-ga värvide miksimisele pühendatud osa omandamise järel õpilane oskab
6.2. Töövahendid on paljuski samad, mis teiseks tunniks, ent RGB LED nõuab kolme takistit.
6.3. Tegevused
6.3.1. Seame üles vooluahela: alustame sellest, et võtame RGB LED-i ette sellises asendis, et vasakult teine viik („jalg“) oleks pikim—see tuleb ühendada GND viiguga.
Ja selles asendis saame paika panna ka ülejäänud viigud:
- Vasakult esimene on vaja ühendada takistiga ning seejärel omal vabal valikul PWM tähistusega viiguga, mis hakkab juhtima punast valgus-laine-ala.
Nüüd jäävad paremale poole veel kaks viiku, millest kõige parempoolsem on lühem kui paremalt teine.
- Kõige parempoolsem on sinise laineala juhtimiseks, ka sellele on vaja PWM ühendust koos takistiga.
- Paremalt teine—kõige parempoolsemast veidi pikem, on rohelise valguse juhtimiseks. Samuti vajalik PWM ühendus ja takisti.
NB!
Nii punase, rohelise kui ka sinise juhtimiseks mõeldud viigud tuleb enne Arduinoga ühendamist ühendada takistiga. Vastasel korral riskime RGB LED-i läbipõletamisega.
NB!
Saame ühendada vaid nende viikudega, millel on PWM tähistus—laineline jooneke.
6.4. Järgmisena kirjutame Arduinole programmi.
Kõigepealt loome kõigi kolme OUTPUT-viigu muutujad, siis iga värvi intensiivsuse-muutujad. Määrame void setup() osas kõigi kolme OUTPUT-viigu muutujad OUTPUT-ina; void loop() osas aga sooritame analogWrite() abil kõigi kolme värvi segamise.
Harjutus A
Proovige ise programm kirja panna—võrrelge vajadusi kolmanda ja teise tunni programmeerimisega.
Mõelge sellele, et ei ole võimalik rakendada digitalWrite(). Selle asemel peate kasutama analogWrite(). Seega ei saa anda ette HIGH ja LOW vaid peab andma info numbrilisel kujul, katsetage numbritega vahemikus 0 kuni 255 .
Põhiline, et olete programmis kirja pannud kõigi kolme värvi kohta ettenähtud väärtused. Viigu-numbrid peavad vastama Teie vooluahelas kasutatud viikude numbritele ning iga värvitooni intensiivsus peaks olema selline, mis vastab Teie soovitud kogu RGB-LED-i värvitoonile. Kas saite midagi sarnast järgmisel lehel toodud programmiga?
1. Katsetage erinevate RGB värvitoonide kokkumiksimist erinevate punase, rohelise ja sinise väärtustega (vahemik endiselt 0-255). Tehke kindlasti ka puhast punast, rohelist ja sinist. (Puhas punane, roheline või sinine = vastava värvi-ala juhtimiseks mõeldud viik ainsana saab programmis sisendiks nullist erineva väärtuse, teised kaks on nullid.)
2. Mis tooni saate siis, kui kõik kolm on ühtlaselt tugeva intensiivsusega?
3. Selgitage, kuidas saada aga RGB LED-iga valget värvitooni. Surfake sellel teemal internetis ja leidke, mida tuleb kokku segada ja miks. Kas see on teistmoodi, kui värvide segamine värvipotis? Mis juhtub kui tavaline punane, roheline ja sinine vesivärv omaahel segada?
http://www.photonstartechnology.com/learn/how_leds_produce_white_light
4. Kasutage alljärgnevat programmi selleks, et kutsuda esile veel erinevusi värvitoonides—mida peate selleks muutma programmis, et saada lillat? Aga kollast? Helesinist? Kirjeldage toone—kas need tulid välja nii nagu ootasite?
6.4.1. Näidisprogramm RGB uurimiseks:
// määratleme värvid: int RED = 3; int GREEN = 9; int BLUE = 10; // määratleme iga värvi intensiivsuse: int intensiivsus_RED = 0; int intensiivsus_GREEN = 50; // Testimiseks: kui sees on vaid roheline, siis peaks särama roheline. int intensiivsus_BLUE = 0; void setup() { pinMode (RED, OUTPUT); pinMode (GREEN, OUTPUT); pinMode (BLUE, OUTPUT); } void loop() { analogWrite (RED, intensiivsus_RED); analogWrite (GREEN, intensiivsus_GREEN); analogWrite (BLUE, intensiivsus_BLUE); } // määratleme värvid: int RED = 3; int GREEN = 9; int BLUE = 10; // määratleme iga värvi intensiivsuse: int intensiivsus_RED = 50; int intensiivsus_GREEN = 10; int intensiivsus_BLUE = 50; void setup() { // put your setup code here, to run once: pinMode (RED, OUTPUT); pinMode (GREEN, OUTPUT); pinMode (BLUE, OUTPUT); } void loop() { // put your main code here, to run repeatedly: analogWrite (RED, intensiivsus_RED); analogWrite (GREEN, intensiivsus_GREEN); analogWrite (BLUE, intensiivsus_BLUE); }
Harjutus B
Näidisprogramm RGB uurimiseks erineb millegi olulise tunnuse poolest eelmistest LED vilgutamise programmidest. Kommenteerige seda erinevust.
6.5. Teooriapunkt: Analoog-signaal versus digitaalne signaal
Meie õppeaines tuleb töötada elektri vahendusel informatsiooni edasiandmisega.
Jagame sellise info edastamise kaheks erinevaks mooduseks:
- analoogsignaali edastamine
- versus
- digitaalsignaali edastamine.
Kindlasti jäi eelnenud peatükkides kasutatud programmilõikudest meelde, et void loop() osas kasutasime programmeerimiskeele käskluse edastamiseks funktsiooni digitalWrite(). Selle funktsiooni argumendis, st sulgudesse lisatavas täpsustavas osas, pidi järgnema viigu number ning info viigu oleku (HIGH või LOW) kohta: kas konkreetsele viigule antakse pinge või ei.
Digitaalsel edastusel ongi kaks olekut: aktiivne (HIGH) ja mitteaktiivne (LOW). Võime esimese neist lugeda ka väärtusega ’1’ ning teise väärtusega ’0’ signaaliks.
Selle peatüki programmis aga kasutasime funktsiooni analogWrite(). Vaatame selle funktsiooni argumente:
- Ka analogWrite() funktsiooni esimeseks argumendiks on viigu number—sest nii digitalWrite() kui ka analogWrite() puhul on oluline, et Arduino õige viigu üles leiaks.
- Ent teise argumendi osas näeme erinevust: kui digitalWrite() on kas HIGH või LOW, siis analogWrite peab saama arvulise väärtuse vahemikus 0-255.
Analoogtehnoloogias informatsioon töödeldakse varieeruva amplituudiga elektriimpulssideks. Meie näeme siin, et saame anda RGB LED-i punasele, rohelisele ja sinisele „jalale“ ette erineva suurusega väärtusi: kui tugevalt mingit värvi soovime särada lasta, selle defineerime analoogsignaali väärtusega.
Digitaaltehnoloogias aga informatsioon töödeldakse kahesesse ehk binaarsesse formaati, mida saame ka väljendada binaarsüsteemis kasutatavate numbritega null ja üks. Digitaalne—see tähendab, et kas elektri-impulss esineb (HIGH) või ei esine(LOW). Eelmistes tundides kasutasimegi tavalise LED-i jaoks binaarseid väärtusi—oli valgustatud olekus siis, kui oli HIGH ning oli kustunud olekus siis, kui oli LOW.
Surfake internetis märksõnadega „binaarsüsteem“, „digitaalne signaal“, „analoogsignaal“, „binary system“, „analog signal“, „digital signal“.
6.5.1. Sellest tunnist jätame meelde, et analoogsignaali saame töödelda digitaalsel teel vastuvõetavaks.
- Saame analogWrite() abil edastada signaali neile digitaal-viikudele, mis on võimelised sellist signaali vastu võtma.
- Need on markeeritud lainelise joone moodi kriipsukesega (˷) ning osadel Arduinodel on juures ka lühend PWM—esitähtedes Pulse Width Modulation—pulsilaius-modulatsioon.
- Seega: analogWrite() signaali me ei ühenda mitte kõigi digitaalsete viikudega vaid digitaalsete viikude reas asuvate PMW või lainelise joonekesega markeeritud viikudega.
6.7. Kodutöö
6.7.1.Tehke mingi katsetus ja dokumenteerige seda
Kui kõik peatükid siiani on läbi tehtud, siis saate luua õpitu kinnistamiseks midagi, mille programmis sisalduks võimalikult palju omandatud materjali. Hea on alustuseks võtta mõni eespool läbitehtud vooluahel ning selle juurde käiv programm ja neid siis täiendama asuda. Mängige. Kodutööna saab esitada programmi ja näiteks teha oma mobiiltelefoniga tehtud fotot või videot sellest, kuidas töötab.
Kas ka eelmistes tundides oleks saanud asju ajada digitalWrite() asemel hoopis analogWrite() abil?
6.7.2. Tõsisem harjutus
Siit tuleb keerukam kodune ülesanne, mille eesmärk eelnevalt õpitu kordamine.
- Sättige üles mõni eelmisel tunnil kasutusel olnud vooluahel ja avage selle tunni alla salvestatud Arduino-programm.
- Andke programmile uus nimi—pange nimesse kindluse mõttes sisse sõna ’analoog’ ning seejärel salvestage sellise uue nimega.
- Nüüd aga katsuge kirjutada programm ümber nii, et kasutate digitaalse asemel hoopis analoogset infoedastust.
Esitage see kodutööna õpetajale. Selle kodutöö sooritamise järel on selge, kas olete eelneva osa omandanud—hakkama saamise korral võite ennast tunda enesekindlalt—olete valmis järgnevateks tundideks.
Kui eelmise skeemi ja programmiga hätta jääte, siis kõigepealt surfake internetis.
Üks vihje veel:
Arduino IDE menüüst leiate ka File -> Examples -> 0.1Basics-> Fade. Uurige seda Arduino IDE-st kättesaadavat programmi ja konstrueerige sellele vastav vooluahel , siis pange programm käima.
Veelkord—ikka mängige ka oma looduga! Nii võite leida midagi enda jaoks uut ja põnevat.
- Kui selline moment leitud, pange see lühidalt kirja ka programmi: mida peate lisama rea ette, et arvuti Teie märkust uurima ei asuks?
- Aga nüüd proovige siin kuuendas tunnis RGB osas tehtut korrata digitalWrite() abil. Muutusi programmis on vähe. Mida peate muutma? Vaadelge tulemust, kirjeldage seda.
Kui aga eelmises osas jäi midagi arusaamatuks või on ununenud ja Te seda mitte kusagilt ei leia, siis on ilmselt vajalik teha üks kordamise tund—konstrueerida ja programmeerida veel läbi see, millest aru ei saanud. Pange oma küsimused kirja ja võtke see järgmisse tundi kaasa. Kui õpetaja on andnud Teile oma e-maili, siis saatke küsimused talle e-mailiga.