Avtor: mag. Vladimir Mitrović
E-pošta: vmitrovic12@gmail.com
2019_280_49
V kompletu “37-in-1” se nahajata dva modula s tribarvno (RGB) in dva z dvobarvno (RG) svetlečo diodo; vse diode so s skupno katodo. V tem nadaljevanju bomo predstavili te module, pokazali kako jih je treba povezati z Arduino UNO ploščico in analizirali Bascom-AVR program, s katerim lahko preverimo kako delajo. Opomba: možno je, da se razpored priključkov na posameznem modulu razlikuje od prikazanih na slikah, oziroma da barve ne ustrezajo oznakam na priključku modula!
KY-016, RGB LEDica (RGB Full Color LED Module)
Na modulu se nahajajo RGB LEDica s skupno katodo in trije upori vrednosti 150 Ω, s katerimi je tok skozi posamezni segment omejen na okoli 20 mA. Zaradi tega se priključki modula lahko direktno vežejo na priključke Arduino UNO ploščice, kakor je tudi prikazano na shemi na sliki 99a. Izbrali smo “analogne” izhode “~3”, “~5” in “~6”, ker želimo iz modula izvleči maksimum: s pomočjo pulzno-širinske modulacije teoretično lahko dosežemo več kot16 milijonov različitih intenzitet in barv, mnogo več od tega, kar v realnosti lahko zaznamo.
Za preverjanje modula KY-016 je priročen testni program 37in1_prog_6.bas. Da bi program lahko pravilno deloval, je Arduino ploščico potrebno povezaQti z osebnim računalnikom s pomočjo USB kabla in na njo vezati tipko S1, kakor je prikazano na shemi na sliki 97b; te podrobnosti so izbrisani s slike 99a.
Ta vsebina je samo za naročnike
Program 37in1_prog_6.bas
Program 37in1_prog_6.bas je napisan za preverjanje dela KY-016 in ostalih modulov z večbarvnimi LEDicami, pri katerih se intenzivnost svetilnosti in stopnja mešanja barv določajo s pulzno-širinsko modulacijo (PWM). Z ustrezno konfiguracijo 8-bitnih timerjev Timer0 in Timer2 se bodo Arduino priključki “~3”, “~5” in “~6” interno povezali z njihovimi izhodi OC0A, OC0B in OC2B in na njih se generirajo impulzi frekvence 488 Hz:
Config Timer0 = Pwm , Prescale = 64 , Compare_a_pwm = Clear_up , Compare_b_pwm = Clear_up Config Timer2 = Pwm , Prescale = 64 , Compare_b_pwm = Clear_up
Konfiguracija Timera2 je enostavnejša, ker uporabljamo samo en njegov izhod. Frekvenca impulzov je določena s frekvenco na kateri dela mikrokontroler (16 MHz), z izbranim načinom dela (PWM) in faktorjem deljenja (64), in njuno širina z vrednostmi vpisanimi v Compare registre:
Compare0a = 0 Compare0b = 0 Compare2b = 0
Začetno vpisane vrednosti so 0, zato se niti na enem od izhodov na začetku programa ne generirajo impulzi (izhodno stanje je “0”). Z vpisom številke med 1 in 254 v Compare register, na ustreznem izhodu dobimo impulze širine 1/255 do 254/255, medtem ko 255 drži izhod v stanju “1”. Nam niso potrebne vse te možnosti, zato smo v tabeli vpisali vrednosti, ki povzročajo dovolj podrobne in spet dobro vidne spremembe intenzitete svetilnosti:
Int_table: Data 0 , 1 , 2 , 4 , 8 , 16 , 32 , 64 , 128 , 255
Program uporablja vrednosti iz tabele odvisno od sprejetega ukaza. Ukaze dajemo na dva načina: s tipko spojeno na pin “2” ali iz terminal emulatorja s serijsko komunikacijo preko USB priključka. Zaradi tega program v glavni zanki pogosto preverja stanje tipke S1 in če je preko komunikacijskega kanala prišel kakšen ukaz:
Do Debounce Arduino_pin#2 , 0 , S1_sub , Sub Cmd = Inkey() If Cmd <> 0 Then Gosub Cmd_sub End If Loop
Z vsakim novim pritiskom na tipko se izvrši ustrezen podprogram S1_sub, v katerem inkrementiramo spremenljivko RGB_s1:
S1_sub: Incr Rgb_s1
Najnižji trije biti te spremenljivke določajo, ali se bo ena od osnovnih barv vklopiti ali ne: Rgb_s1.0 določa rdečo, Rgb_s1.1 zeleno, Rgb_s1.2 pa modro barvo:
If Rgb_s1.0 = 0 Then Compare0a = 0 Print "R=0 "; Else Compare0a = 128 Print "R=128 "; End If If Rgb_s1.1 = 0 Then Compare0b = 0 Print "G=0 "; Else Compare0b = 128 Print "G=128 "; End If If Rgb_s1.2 = 0 Then Compare2b = 0 Print "B=0 " Else Compare2b = 128 Print "B=128 " End If
Končno, v spremenljivko Rgb se vpisuje “?”, da bi program vedel, da je ta sprememba barve povzročena s pritiskom na tipko in ne z ukazom iz terminal emulatorja:
Rgb = "?" Return
Ukazi iz terminal emulatorja so sestavljeni iz dveh znakov: prvi znak je črka “R”, “G”, “B” ali “Y” (za rdečo, zeleno, modro ali belo barvo; dovoljena so velike in male črke), drugi znak je številka 0-9 (“0” = ugasnjeno, “9” = maksimalna intenziteta). Tako, npr,. ukaz “R5” pomeni da bi rdeči segment LEDice moral zasvetiti s 16/255 intenzitete (vrednost 16 se prebere iz prej omenjene tabele intenzitet, Int_table). Vse druge kombinacije črk in številk program ignorira. Dobljene ukaze program obdeluje v podprogramu Cmd_sub. Najprej se preverja, ali je po komunikacijskem kanalu prišla številka “0” – “9” ali neki drugi znak:
Cmd_sub: If Chr(cmd) >= "0" And Chr(cmd) <= "9" Then ... Else Rgb = Chr(cmd) End If Return
Te “drugi znaki” se hranijo v spremenljivki Rgb in bodo v drugem koraku določili intenziteto barve, ki jo je treba spremeniti. V našem primeru se bo v Rgb vpisati “R”. Če je po komunikacijskem kanalu prišla desetiška številka, se bo pretvorila v indeks (binarna številka 0-9) in nato se z njegovo pomočjo iz tabele bere ustrezna intenziteta barve:
Cmd = Cmd - &H30 Cmd = Lookup(cmd , Int_table)
V našem je primeru uporabljena številka “5”, zato se bo prebrala šesta vrednost iz tabele, 16 (indeks prvog podatka v tabeli je 0). Sedaj preverjamo kateri znak je bil zapomnjen v spremenljivki Rgb (v našem primeru, “R”) zato intenziteto vpisujemo v Compare register, ki upravlja z intenziteto ustrezne barve:
If Rgb = "R" Or Rgb = "r" Then Compare0a = Cmd Print "R=" ; Cmd
Ista procedura velja za ostale barve; razlika je samo v Compare registru, kateremu se menja vsebina:
Elseif Rgb = "G" Or Rgb = "g" Then Compare0b = Cmd Print "G=" ; Cmd Elseif Rgb = "B" Or Rgb = "b" Then Compare2b = Cmd Print "B=" ; Cmd Elseif Rgb = "Y" Or Rgb = "y" Then Compare0a = Cmd Compare0b = Cmd Compare2b = Cmd Print "Y=" ; Cmd End If
Za vsako izbrano barvo se v terminal emulator z ukazom Print pošilja ustrezno sporočilo, s katerim potrdimo, da je ukaz izvršen. Konkretno, za ukaze “R5”, “G3” in “B4” bi program vrnil sporočila kot na sliki 99d: rdeča, zelena in modra barva so nastavljene na intenzitete 16, 4 in 8. Končno, z ukazom “Y0” so ugasnjene vse tri barve naenkrat.
KY-009, RGB SMD LEDica (RGB Full Color LED SMD Module)
Na modulu se nahaja RGB LEDica s skupno katodo v SMD ohišju, brez uporov za omejitev toka. Zaradi tega se modul sme vezati na priključke Arduino ploščice samo preko ustreznih uporov. Na shemi na sliki 99b so predvideni upori vrednosti med 150 Ω in 1 kΩ, odvisno od maksimalne intenzitete, ki jo želimo doseči. Modul testiramo s programom 37in1_prog_6.bas na prej opisani način. Da bi program lahko pravilno deloval je Arduino ploščico potrebno povezati z osebnim računalnikom s pomočjo USB kabla in na njo vezati tipko S1, kakor je prikazano na shemi s slike 97b; te podrobnosti so izbrisani s slike 99b.
KY-011, Dvobarvna LEDica premera 5 mm (Two Color LED Module)
in
KY-029, Dvobarvna LEDica premera 3 mm (2-Color Red+Green 3mm LED Module)
Na modulih se nahajata dvobarvni (rdeča + zelena) LEDici s skupno katodo, brez uporov za omejitev toka. Zaradi tega se modula lahko vežeta na priključke Arduino ploščice samo preko ustreznih uporov. Na shemi na sliki 99c so predvideni upori vrednosti med 150 Ω in 1 kΩ, odvisno od maksimalne intenzitete, ki jo kateri želimo doseči.
Module testiramo s programom 37in1_prog_6.bas na prej opisani način z omejitvijo, da moduli ne reagirajo na ukaze, ki se nanašajo na modro barvo. Da bi program lahko pravilno deloval, je Arduino ploščico potrebno povezati z osebnim računalnikom s pomočjo USB kabla in na njo vezati tipko S1, kakor je prikazano na shemi sa sliki 97b; te podrobnosti so izbrisane s slike 99c.
Moduli ki zahtevajo zahtevnejšo programsko podporo
KY-027, Čarobna svetloba (Magic Light Cup Module)
Modul vsebuje živosrebrno stikalo S1 s pull-up uporom in LEDico LD1 (slika 100). V 37 in1 kompletu se nahajata dva takšna modula in zamišljeno je, da se z nagibanjem modula katerega LEDica sveti svetlobo “čarobno” prenese na drugi modul. Da bi poizkus bil uspešen je od začetka nujno oba modula držati tako, da so njuni živosrebrni stikali v pokončnem položaju (zaprti), pri čemer bo ena LEDica svetila s polno svetilnostjo, druga pa bo ugasnjena. Ko premaknemo modul katerega LEDica sveti tako, da je njeno stikalo v horizontalnem položaju (odprto), se bo intenzivnost svetilnosti njene LEDice pričela zmanjševati, medtem ko se bo intenzivnost svetilnosti druge LEDice povečevala. Ko se proces “pretakanja svetlobe” zaključi, oba modula postavimo tako da sta njuni stikali v pokončnem položaju in nato lahko poizkus ponavljamo dokler nas bo to veselilo.
Program 37in1_prog_7.bas
Čarobno svetlobo krmili program 37in1_prog_7.bas, napisan za vezje po sliki 100b. Tukaj posebej opominjam na upore vrednosti 150 Ω, ki so nujni za omejitev maksimalnega toka skozi LEDice na spremenljivih 20 mA. Za nastavitev intenzitete svetilnosti LEDic so izbrani “analogni” izhodi “~5” in “~6”, na katerih Timer0 generira širinsko modulirane impulze frekvence 488 Hz:
Config Timer0 = Pwm , Prescale = 64 , Compare_a_pwm = Clear_up , Compare_b_pwm = Clear_up
Širina impulzov je določena z vrednostjo spremenljivke Brightness (0-255) na način, da so te impulzi komplementarni; bolj kot je eden ožji, bolj bo drugi širši:
Compare0a = Brightness Compare0b = 255 - Brightness
Ker je začetna vrednost spremenljivke Brightness = 0, bo LEDica “zgornjega” modula ugasnjena, medtem, ko bo LEDica “sponjega” modula svetila s polno svetilnostjo. V glavni Do-Loop zanki pogosto preverjamo stanja stikal vezanih na priključke “4” in “5”. Dokler sta oba modula v položaju v katerem sta njuni živosrebrni stikali sklenjeni, program ne bo menjal vrednost spremenljivke Brightness in se tudi stanje modula ne menjalo. Če nagnemo “spodnji” modul tako, da se njegovo stikalo odpre, bo program zažel postopno povečavati vrednost spremenljivke Brightness, in zato se bo intenzivnost svetilnosti “spodnje” LEDice začela zmanjševati, “gornje” LEDice pa povečavati:
Do If Arduino_pin#4 = 1 Then If Brightness < 255 Then Incr Brightness End If End If ... Compare0a = Brightness Compare0b = 255 - Brightness Waitms 10 Loop
Ta proces se konča, ko Brightness doseže vrednost 255, oziroma, ko se svetilnost popolnoma “prelije” s spodnje LEDice na gornjo. Ko gornja LEDica zasveti s polno svetlobo, vzravnamo spodnji in nagnemo gornji modul tako da se mu stikalo odpre; sedaj se bo vrednost spremenljivke Brightness zmanjševala do 0, gornja LEDica se bo ugašala, spodnja pa bo svetilo vedno bolj močno:
Do ... If Arduino_pin#7 = 1 Then If Brightness > 0 Then Decr Brightness End If End If Compare0a = Brightness Compare0b = 255 - Brightness Waitms 10 Loop
Opombe: proces prelivanja se prekinja takoj, ko vzravnamo nadgnjen modul in njegovo stikao se odpre; če upoštevamo pravila igre, bomo to naredili šele na koncu prelivanja. Če napajanje ploščice zagotovimo na drugačen način, med izvrševanjem programa ni nujna povezava Arduino ploščice z osebnim računalnikom preko USB kabla.
KY-039, Detektor impulzov (Detect the Heartbeat Module)
Modul vsebuje infrardečo LEDico T (transmiter) z uporom za omejitev toka R2 ter fototranzistor R (receiver) s pull-up uporom R1. Če se jagodica prsta postavi med LEDico in fototranzistor bo zgolj majhen del svetlobe, ki jo oddaja LEDica prišel do fototranzistorja. In vendar bo to dovolj, da občutljiv fototranzistor prične prevajati in bo, odvisno od tega, koliko je tranzistor pobujen, enosmerna napetost izhodnega priključka nekje med 100 mV in 4 V. Razen od debeline, položaju in konstituciji prsta, bo jakost svetlobnega žarka, ki prodira do tranzistorja, odvisna od trenutne količine krvi v prstu in se bo menjala v ritmu srčnega ustripa. Te spremembe svetlobne intenzitete niso velike, zato bo napetost na izhodu S v istem ritmu “poskakovala” za samo nekaj mV.
KY-039 modul bomo povezali z Arduino ploščico po shemi na sliki 101b. Poleg modula smo predvideli svetlečo diodo LED1, ki bo svetila v ritmu pulza in ga tako vizualizirala. Upor R1 izberemo glede na vrsto LEDice: 150 Ω bo ustrezalo LEDicam, ki za polno pobudo potrebujejo okoli 20 mA, medtem ko bo 1 kΩ bolj primeren za občutljive, low-current LEDice. Namesto diskretne LEDice lahko uporabimo kateri koli od modulov z LEDicami iz 37in1 kompleta; na shemi je prikazan KY-016, ker so na njemu že postavljeni tudi upori za omejitev toka. USB kabel služi za komunikacijo z osebnim računalnikom, preko njega pa hkrati Arduino ploščica in modul dobivata potrebno napajanje.
RGB LED, detektor srčnega utripa, čarobna svetilka – 37 zanimivih Arduino modulov (5)Za branje detektorja impulzov in obdelavo podatkov je napisan program 37in1_prog_8.bas. Program meri napetost izhodnega priključka “S” modula KY-039, detektira trenutke, v katerih se pojavljajo impulzi, ki jih povzroči utripanje srca, meri časovno periodo v kateri se ti impulzi ponavljajo, preračunava jo v frekvenco in pošilja ustrezna sporočila osebnemu računalniku. To je zelo zahtevna naloga, ker so impulzi zelo šibki in superponirani so na enosmerni prednaetosti, ki se premika v razponu nekaj voltov. Zaradi tega bo A/D pretvornik moral obvzeti celotno napetostno področje, vse do 5 V:
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Pri takšnih parametrih bodo slabi impulzi komaj prepoznavni in bodo rezultirali z minimalno razliko v branju v višini zgolj nekaj promilov. Problem fluktuacije prednapetosti je rišen tako, da približno vsakih 10 ms preberemo trenutno vrednost napetosti na priključku “S” in krožno pospravljamo ta branja v niz Pulse_levels(32). Nato, v podprogramu Calc_level izračunamo poprečno vrednost prednapetosti in prag, ki ga bomo uporabili za detekcijo impulzov:
Do Incr I1 I1 = I1 And &B00011111 Pulse_levels(i1) = Getadc(0) Gosub Calc_level ... Waitms 10 Loop
Vrednost praga je enaka poprečni vrednosti prednapetosti povečani za 2. Vrednost “2” ustreza napetosti 10 mV, ki smo jo dobili s poizkusom in se lahko se spremeni s spremembo konstante Pulse_th definirane na začetku programa:
Const Pulse_th = 2 'Pulse treshold in mV = 5*Pulse_th
Po vsaki izvršeni meritvi se trenutna vrednost izmerjene napetosti primerja s pragom. Če je višja, se vklopi LEDica LED1; če je nižja, se LEDica izklopi. S tem dosežemo, da LEDica utripa v ritmu impulzov. Število utripov srca v minuti dosežemo s pomočjo timerjev Timer1:
Config Timer1 = Timer , Prescale = 1024
Vrednost timerjev beremo, ko se pojavi vsak nov impulz in na osnovi tega v podprogramu Calc_pulse izračunavamo frekvenco srčnega utripa, ki jo preko serijske komunikacije pošljemo v osebni računalnik:
Print "pulse = " ; Pulse
Ta sporočila lahko sprejmemo in prikažemo s pomočjo terminal emulatorja (slika 101c). Program 37in1_prog_8.bas je zahtevnejši od tistega, ki smo ga prikazali; iz tega “skritega” dela programa izvira tudi sporočilo “pulse error”, ki se pošilje, kadar program ugotovi izostanek impulzov v času daljšem od 4 s. To se bo zgodilo npr. tudi takrat, ko umaknemo prst iz senzorja.
Na koncu moramo poudariti, kako je učinkovitost mjerenja utripa zelo odvisna od načina, na katerega smo postavili prst med LEDice in fototranzistorja in motnjam iz okolice (prvenstveno od razsvetljave). Najboljše rezultate sem dosegel s pomočjo kazalca v polmračnem ali mračnem prostoru. Seveda se je potrebno tudi tu potruditi, dokler se ne doseže dober rezultat. To ni pogojeno s programom, pač pa s samim modulom, ki je popolnoma nezaščiten od zunanjih vplivov in nima vgrajenega ustrezneja ojačevalnika za ojačenje impulzov. Dobra indikacija zanesljivega merenja je enakomerno utriupanje LED1 brez vidnih prekinjanj ali “pospešitve”; v takšnih pogojih se zaporedna branja ne bodo razlikovala za več od 1-2 utripa v minuti.
Opomba: datoteko Arduino_pins.sub z definicijami Arduino UNO pinov in programe 37in1_prog_7.bas in 37in1_prog_8.bas lahko brezplačno dobite na spletnih straneh revije.
https://svet-el.si
Barduino-21