Language Switcher Fallback

analogRead ja analogWrite - harjutus koodiga

Sisukord

Skeem fototakisti (ehk valgustundliku takisti) ja RGB LEDiga.

 

RGB LEDid

RGB LEDisid on kahte tüüpi: "common cathode" ja "common anode". RGB LEDi sees on kolm eri värvi LEDi, aga sel on 4 jalga - kas plusspooled või miinus pooled on kokku ühendatud. Katood on miinus-pool, anood pluss-pool. Joonised panin mõlemat tüüpi LEDide kohta, aga koodinäited on "common anode" kohta, sest õppekomplektides tundusid olevat need.

LEDi neljast jalast ühine jalg (kas ühine pluss või ühine miinus) on kõige pikem jalg. Siin tavalise LEDi +/- pikkuste loogika ei kehti.

Kui paigutada LED nii, et ühine pikk jalg on vasakult paremale lugedes teine, siis ülejäänud jalad on järjekorras Red-common-Green-Blue (pilt).

Kui on tegemist "common anode" RGB LEDiga, siis ühine jalg ühendatakse +5V-ga. Iga värvi jala külge ühendatatakse takisti, ning sellest edasi Arduino väljund piniga. Kuna + toide on olemas ja Arduino asub miinuse poolel, siis LED lülitub sisse siis, kui Arduino pin läheb LOW ehk GND tasemele. Kui Arduino pin on HIGH ehk +5V tasemel, siis on LEDi mõlemal poolel +5V - ehk siis tegelikult pinget ei ole ja vool ei liigu ning LED ei sütti. Seda tuleb nüüd järgmistes näidetes tähele panna, et LOW peale lülitamine tähendab LEDi sisse lülitamist.

Kui oleks tegemist "common cathode" LEDiga, siis oleks ühine jalg ühendatud GND-ga, takistid LEDist "üleval pool" ning Arduino pini HIGH peale lülitamine lülitaks LEDi sisse.

Siit tasub ka tähele panna ja meelde jätta, et see, kummal pool LEDist on tema takisti, ei oma tähtsust - töötab mõlemat pidi. RGBde puhul on võimalik see ainult ühele poole panna, sõltuvalt tüübist.

Common anode RGB LEDiga skeem.
Common cathide RGB LEDiga skeem.

Pingejagur

Pingejaguri teooria oli varasemas peatükis.

Selles skeemis pingejagur koosneb foto- ehk valgustundlikust takistist ja tavalisest takistist. Kuna õppekomplektide fototakisti takistus lambivalguses oli 1-2 kilooomi vahel, siis tavalise takisti valime sarnase: 1 kilooomise.

Muide, fototaksiti jalad kipuvad olema pikad ja pehmed, jälgi, et need niiviisi kõveraks ei läheks, et omavahel kokku puutuma hakkaks.

Kui valgust on rohkem, muutub fototakisti takistus väiksemaks. Sellest tulenevalt pingejaguri "ülemise" takisti osakaal kogutakistuses väheneb (ja "alumise" osakaal suureneb), millega kaasneb, et pingejaguri väljund pinge muutub kõrgemaks.

Analoog sisend

Kõrgem pinge analoog sisendis annab kõrgema numbri. Analoog sisendi (analogRead) väärtused saavad olla vahemikus 0 - 1023. Aga selline muutuva ja muutumatu takistiga pingejagur ei saa katta kogu skaalat.

Ülesanne 3.1

Ehita skeem breadboardile.

Arvatavasti on tegemist common anode tüüpi RGB LEDiga (esimene skeem lehe alguses), aga kui koodi üleslaadimise järel, kontrollimise kiuste tuld põlema ei saa, siis asenda see juhe, mis LEDi ja 5V-d ühendab, sellise vastu, mis LEDi GNDga ühendab.

Kirjuta ümber kood, mis on kahe järgneva pildi peal. (Halli värvi koodikommentaare pole vajaümber kirjutada, ainult "värvilised" osad.)

Lae kood üles.

Proovi fototakistit vaheldumisi valguse eest kinni katta ja sellele lisa valgust anda (lambile lähemale liikudes või taskulambiga). Toimuma peaks selline asi, et tugevamas valguses LEDi värv läheb sinisemaks ja hämaramas punasemaks. Aga kahjuks ainult vaevumärgatavalt.

analogWrite-iga saame väljundisse kirjutada väärtusi vahemikus 0-255.

Et sisendist tulevate arvude skaalat (0-1023) viia väljundi lubatud arvude skaalale (0-255), kasutasin siin näites korrektset valemit:
output = (input+1)/4 - 1.

Aga kuna meie sensor ei täida analogReadi kogu skaalat, siis sellise valemiga saame kasutada samuti vaid osa analogWrite skaalast - ei saa ühtki LEDi korralikult põlema ega korralikult välja lülitada.

Ülesanne 3.2

Parandame selle proleemi, et kogu värviskaala pole kasutusel.

Ava seeriamonitor.

Vaata seeriamonitori ja samal ajal muuda valgusolusid sensori juures (seda kinni kattes või taskulambiga valgust juurde andes) - vaata, mis vahemikus numbrid varieeruvad. Jäta meelde miinimum ja maksimum, mida nägid.

Nüüd tee valem, kus kasutad oma sensori miinimumi ja maksimumi, et viia nende vahemik skaalasse 0-255.

Näiteks kui miinimum oleks 170 ja maksimum 900, siis mina tegin valemi nii:

Teen miinumumi veidi väiksemaks (150) ja maksimumi veidi suuremaks (950).
Leian nende vahele jääva vahemiku: 950-150 = 800
Jagan saadud vahemiku 255-ga: 800/255 = 3.137 ~ 3.15
Panen uude valemisse oma "vähendatud miinimumi" ja vahemiku 255-ga jagamisel saadud arvu:
outputRed = (reading-150) / 3.15;

Pane oma arvudega valem koodi vana valemi (outputRed = (reading+1)/4 - 1) asmele. Lae kood üles. Nüüd peaks värvimuutus valgusolude muutmisel nähtavam olema.

Kokkuvõtteks

Selles näites tegime maagiat, kus panime millegi (LEDi) reageerima millelegi tema keskkonnas (valguse tugevusele). Samal viisil saab teha igasugu huvitavaid asju. Näiteks robot, millel on põranda heleduse-tumeduse sensorid, panna juhul, kui tume joon nihkub tema parempoolse sensori alla, kiiremini liigutama oma vasakpoolset mootorit, et pöörata joone järgi paremale.