Spoznavamo module iz kompleta “37-in-1” in predstavljamo ustrezne Bascom-AVR programe. V tem nadaljevanju bomo predstavili module, ki jih bomo uvrstili v skupino “moduli z digitalnimi vhodi”. Tukaj se nahajajo moduli z LEDicami in piskači ter modul z relejem.
Modul z relejem se od ostalih modulov iz skupine razlikuje po tem, ker ima tudi priključek za napajalno napetost in digitalni vhod, s pomočjo katerega se ga krmili; vsem ostalim je priključek za napajalno napetost hkrati tudi kontrolni vhod, in pričel bo delovati takoj, ko se poveže na ustrezno napetost. Tukaj je potrebno biti previden! Moduli so precej nepremišljeno projektirani in mnogi od njih (npr., večina modulov z LEDicami) nimajo vgrajenih uporov za omejitev toka in jih je potrebno predvideti pri povezavi na Arduino ploščico. Drugi moduli, kot piskač ali močnostne LEDice pri 5V napajalni napetosti porabijo več kot 40 mA, kar presega maksimalni dovoljeni izhodni tok, ki ga mikrokontroler ATmega328P zmore dati od sebe. Čeprav boste na spletnih portalih namenjenim uporabnikom Arduino platforme naleteli na sheme vezav, na katerih so te moduli vezani direktno na priključke Arduino ploščice, takšna rešitev ni priporočljiva ker preobremenjuje priključke mikrokontrolerja in lahko povzroči trajno okvaro! Primerni načini vezave vsakega posameznega modula bodo pojasnjeni v nadaljevanju.
Ta vsebina je samo za naročnike
Pregled modulov z digitalnimi vhodi
KY-019, rele (5V Relay Module, slika 97a)
Na modulu se nahaja rele z enim dvopoložajnim kontaktom (SPDT) in elektronskim vezjem za njegovo krmiljenje. Rele lahko preklaplja izmenične tokove in napetosti do 10A/250V in enosmerne tokove do 10A/30V. Priključki releja so vezani na vrstno sponko s standardnimi oznakami NC (Normally Connected: kontakt v mirovnem stanju) in NO (Normally Open: kontakt v aktiviranem stanju).
Modul se z Arduino UNO ploščico veže preko treh igličastih priključkov z oznakami “-“, “+” in “S” (razpored priključkov se lahko razlikuje od prikazanih na slikah!). Priključek “-” se veže na maso oziroma na GND priključek Arduino ploščice, priključek “+” se veže na 5 V, priključek “S” pa je krmilni vhod. Kadar je “S” v stanju “0” (= 0 V), tranzistor Q1 ne prevaja in rele ni aktiviran: kontakt se nahaja v položaju NC. Ko je “S” v stanju “1” (> 3 V), tranzistor Q1 prevaja in aktivira rele: kontakt se nahaja v položaju NO, LEDica ON_LED pa sveti.
Slika 97b prikazuje kako lahko povežemo KY-019 modul z Arduino UNO ploščico. Delo modulov preverimo s testnim programom 37in1_prog_4.bas, ki kot krmilni priključek uporablja priključek”12″na Arduino UNO ploščici. Preko USB kabla Arduino ustvari komunikacijo z osebnim računalnikom in hkrati dobiva napajanje z njega, tipka S1 iz KY-004 modulov pa služi za izbor opcij, ki jih program nudi.
Program 37in1_prog_4.bas
Program 37in1_prog_4.bas je napisan za preverjanje delovanja KY-019 in drugih modulov, ki se vključujejo in izključujejo z logičnima stanjema “1” in “0” na krmilnem priključku. Kot krmilni priključek se uporablja Arduino priključek “12” vendar bo z ustrezno prilagoditvijo programa enako dobro služil tudi vsak drugi priključek. S programom se krmili na dva načina: s tipko spojeno na priključek “2” in ukazi, ki jih pošiljamo preko USB priključka iz terminal emulatorja. Zato program v glavni zanki redno preverja stanje tipke S1 in ali 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 pridruženi podprogram S1_sub, v katerem se menja logično stanje priključka “12” med “1” in “0” in tako vključuje, oziroma izključuje, rele:
S1_sub: Arduino_port#12 = Not Arduino_port#12 If Arduino_port#12 = 0 Then Print "OFF" Else Print "ON" End If Return
Sporočila iz terminal emulatorja sprejmemo s pomočjo ukaza Inkey(). Če po komunikacijskem kanalu ni prišel noben znak, bo Inkey() vrnil binarno ničlo – takšna sporočila ignoriramo. Vse ostale znake program razume kot potencialne ukaze in jih analizira v podprogramu Cmd_sub:
Cmd_sub: If Chr(cmd) = "0" Then Arduino_port#12 = 0 Print "OFF" Elseif Chr(cmd) = "1" Then Arduino_port#12 = 1 Print "ON" Else Print "??" End If Return
Program prepoznava samo dva ukaza:
- znak “0” postavlja priključek “12” v stanje “0” in
- znak “1” postavlja priključek “12” v stanje “1”.
Vsi ostali znaki se ignorirajo. Vsako spremembo stanja priključka “12”, povzročeno z navedenim ukazom ali pritiskom na tipko S1, bo program sporočil v terminal emulatorju s sporočili “ON” (“12” = “1”) in “OFF” (“12” = “0”). Nepoznane ukaze program signalizira s sporočilom “??” (slika 97c).
KY-034, večbarvna utripajoča LEDica (7 Colour LED flash-module)
Na modulu se nahaja RGB LEDica z vgrajenim elektronskim vezjem, ki proizvaja svetlobne bliske različnih barv, intenzitete in trajanja (slika 98a zgoraj). Delovna napetost diode je 5 V, tok pa je odvisen od trenutne barve in intenzivnosti svetilnosti in v posameznih trenutkih presega vrednost 50 mA. Zaradi tega modulov ni priporočljivo direktno vezati na Arduino ploščico, ker lahko preobremeni in okvari mikrokontroler. Na sliki 98a predlagamo dva pravilna načina vezanja: z uporom, ki omejuje tok na manj kot 20 mA in s tranzistorjem, ki na sebe prevzema celotno tokovno obremenitev. Prva rešitev je dobra, če želimo preveriti, če modul pravilno deluje in če nam niso potrebne velike intenzivnosti svetilnosti; druga rešitev je bolj ugodna, če iz modulov želimo izvleči maksimum. V obeh primerih delo modulov lahko preverimo s programom 37in1_prog_4.bas, ki dela na prej opisani način.
Opomba: da bi program lahko delal pravilno, je Arduino ploščico potrebno povezati z osebnim računalnikom s pomočjo USB kabla in na ploščico spojimo tipko S1, kakor je prikazano na shemi s slike 97b; te detajli so izpostavljeni na sliki 98a.
KY-012, aktivni piskač (Active Buzzer Module)
Na modulu se nahaja piskač z vgrajenim oscilatorjem (slika 98b zgoraj), ki proizvaja glasen ton frekvence okoli 1 kHz takoj, ko se poveže na napajalno napetost. Delovna napetost piskača je 5 V, pri čemer piskač troši okoli 40 mA. To je mejna vrednost toka, ki ga lahko dal od sebeArduino priključek, zato iz varnostnih razlogov modula ni priporočljivo direktno vezati na Arduino ploščico. Na sliki 98a predlagamo dva pravilna načina vezanja: z uporom ki omejuje tok na okoli 20 mA in s tranzistorjem, ki na sebe prevzema celotno tokovno obremenitev. Prva rešitev je dobra, če želimo preveriti, če modul pravilno deluje in če nam niso potrebne velike intenzitete zvoka; druga je ugodnejša, če iz modulov želimo izvleči maksimum. V obeh primerih je delo modulov lahko preveriti s programom 37in1_prog_4.bas, ki dela na prej opisani način.
Opomba: da bi program lahko delal pravilno, 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 na sliki 97b; te detajli so izpostavljeni na sliki 98a.
KY-006, pasivni piskač (Passive Buzzer Module)
Na modulu se nahaja elektrodinamični piskač (slika 98c zgoraj) brez lastnega oscilatorja, zato mora za njegovo delovanje mikrokontroler generirati impulze želene frekvence. Modula ne smemo vezati direktno na Arduino ploščico, ker je upornost navoja piskača okoli 50 Ω; s serijsko vezanim uporom vrednosti 150 Ω bomo tok omejili na sigurnih 20 mA, lahko pa piskač krmilimo s tranzistorjem, ki na sebe prevzema celotno tokovno obremenitev. Za prvo rešitev je dobro, če želimo preveriti ali modul pravilno deluje in če nam niso potrebni velike intenzivnosti zvoka; druga je ugodnejša, če želimo iz modulov izvleči maksimum.
Ko piskač krmilimo s pravokotnimi impulzi pravzaprav zelo hitro puščamo in prekinjamo tok skozi ovoje njegovega elektromagneta. Vsaka prekinitev toka povzroči nastanek negativnega impulza na priključku “S”, katerega napetost znaša nekaj deset V. Te impulzi lahko trajno okvarijo mikrokontroler; zaščito predstavlja dioda 1N4148, ki prevaja med negativnimi impulzi in “reže” njihovo amplitudo na vrednost manjšo od 1 V.
Delo modulov bomo preverili s programom 37in1_prog_5.bas, ki na Arduino UNO priključku “~10” generira impulze frekvence 1 kHz, 2 kHz in 38 kHz. Zaradi tega je krmilni priključek “S” KY-006 modulov v obeh primerih vezan na priključek “~10”.
Opomba: da bi program lahko delal pravilno, 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 na sliki 97b; tedetajli so izpuščeni na sliki 98c.
Program 37in1_prog_5.bas
Program je napisan za preverjanje delovanja modulov KY-006 in drugih modulov, ki jih krmilimo z impulzi določene frekvence. Krmilni impulzi se vzamejo s priključka “~10” Arduino ploščice, ki se v Arduino terminologiji definira kot “analogni” izhod. Arduino ima šest takšnih priključkov, ki jih je programsko možno povezati z izhodi časovnih vezij – timerja. Z ustrezno konfiguracijo timerja bo mikrokontroler na izhodu generiral impulze določene frekvence in trajanja (pulzno-širinska modulacija – PWM). Te impulze se z ustreznim filtriranjem lahko “izravna” in “pretvori” v enosmerno napetost med 0 in 5 V – od tod ime “analogni izhod”. Mi bomo v testnem programu 37in1_prog_5.bas uporabili priključek “~10”, povezan z OC1B izhodom 16-bitnega timerja Timer1, s čemer smo dobili možnost generiranja impulzov v širokem razponu frekvenc. Program generira pravokotne impulze frekvence 1 kHz, 2 kHz in 38 kHz; prvi dve frekvenci sta primerni za preverjanje delovanja pasivnih piskačev, tretjo pa bomo uporabili pri modulih z lasersko in infrardečo diodo. Vsi impulzi imajo razmerje signala in pavze 1:1, zato je timer potrebno postaviti v CTC način:
Config Timer1 = Timer , Prescale = 1 , Compare_b = Toggle , Clear_timer = 1
Frekvenco določamo z vpisom ustrezne vrednosti v OCR1A (Compare1a) register, po formuli:
Tukaj je predpostavljeno, da mikrokontroler dela na 16 MHz, “n” pa je izbrani faktor deljenja (prescale factor). Npr., za signal frekvence 1 kHz moramo nastaviti Prescale = 1 in Compare1a = 7999.
Program krmilimo na dva načina: s tipko spojeno na priključek “2” in ukazi, ki jih pošiljamo preko USB priključka iz terminal emulatorja. Zaradi tega program v glavni zanki redno preverja stanje tipke S1 in ali 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 pridruženi podprogram S1_sub, v katerem se Timer1 izmenično zaganja in ustavlja, s tem se zaganja in ustavlja generiranje impulzov na priključku “~10”. Trenutno stanje timerja je zapisano v spremenljivki Timer_flag, in tako podprogram “ve” kaj mora napraviti:
S1_sub: If Timer_flag = 0 Then Start Timer1 Timer_flag = 1 Print "ON" Else Stop Timer1 ... Timer_flag = 0 Print "OFF" End If Return
Sporočila iz terminal emulatorja sprejemamo s pomočjo ukaza Inkey(). Če po komunikacijskem kanalu ni prišel noben znak, bo Inkey() vrnil binarno ničlo – takšna sporočila ignoriramo. Vse ostale znake program razume kot potencialne ukaze in jih analizira v podprogramu Cmd_sub. Tukaj ga bomo prikazali v skrajšani obliki:
Cmd_sub: If Chr(cmd) = "0" Then Stop Timer1 ... Timer_flag = 0 Print "OFF" Elseif Chr(cmd) = "1" Then Compare1a = 8000 - 1 Start Timer1 Timer_flag = 1 Print "1kHz" Elseif Chr(cmd) = "2" Then ... Elseif Chr(cmd) = "3" Then ... Else Print "??" End If Return
Program prepoznava štiri ukaze:
- znak “0” zaustavlja Timer1.
- znak “1” vpisuje v Compare1a 7999, s čemer prične generiranje signala frekvence 1 kHz,
- znak “2” vpisuje v Compare1a 3999, s čemer prične generiranje signala frekvence 2 kHz,
- znak “3” vpisuje v Compare1a 209, s čemer prične generiranje signala frekvence 38 kHz.
Vsi ostali znaki se ignorirajo. Vsako spremembo frekvence program sporoča terminal emulatorju s sporočili “1kHz”, “2kHz” in “38kHz”, če so zaustavljene in ponovno zagnane pa s sporočili “ON” in “OFF”. Nepoznane ukaze program signalizira s sporočilom “??”.
Tukaj moramo komentirati še en detajl v programu. Kadar se timer zaustavi, bo izhodni priključek “~10” lahko ostal v stanju “0” (= 0V) ali “1” (= 5V). Če se izhodni priključek “~10” trajno zadrži v stanju “1”, bo to predstavljalo problem za module kot KY-006, ker bo skozi njih nepotrebno tekel enosmerni tok vse do ponovnega zagona timerja. Npr, če je KY-006 vezan na enega od načinov prikazanih na sliki 98c, bo čez njega tekel tok okoli 25 mA za vezje z uporom, oziroma okoli 90 mA za vezje s tranzistorjem. Zaradi tega moramo po zaustavljanju timerja ugotoviti, če je izhodni priključek ostal v stanju “1” in ga postaviti v stanje “0”.
To seveda ni ravno tako enostavno: potem ko smo Timer1 konfigurirali na prej opisani način, Arduino priključek “~10” ni več povezan z bitom 2 porta B, ampak z izhodom OC1B timerja Timerja1 (OC1B i PORTB.2 delita isti priključek mikrokontrolerja, poglejte sliko 87). Zato se njegovo stanje več ne menja preko Arduino_port#10, z druge strani pa stanja OC1B ne moremo direktno prebrati iz programa, niti ga ne moremo enostavno postaviti v želeno stanje.
Za rešitev tega problema bomo uporabili majhno programsko čarovnijo! Čeprav je s konfiguracijo timerja prekinjena povezava priključka “~10” z izhodnim bitom 2 porta B, je on še dalje ostal povezan z vhodnim bitom 2 porta B. Tako posredno lahko ugotovimo v kakšnem stanju je ostal OC1B, mikrokontroler pa omogoča “forsirano” spremembo njegovega stanja z vpisom binarne “1” v bit FOC1B kontrolnega registra TCCR1C. Sliši se komplicirano, vendar je pravzaprav enostavno; če po vsaki zaustavitvi timerja napišemo ukaz
If Arduino_pin#10 = 1 Then Tccr1c.foc1b = 1 End If
bomo zagotovili, da se OC1B in priključek “~10” postavita v stanje “0”, če sta v trenutku zaustavljanja timerja ostala v stanju “1”.
KY-008, laserska dioda (Laser Transmitter Module)
Na modulu (slika 98d) se nahaja laserska dioda z uporom za omejitev toka (R2). Ko se modul veže na napajalno napetost (tipično 5 V), laserska dioda proizvaja ozek žarek rdeče svetlobe. Pazite! Ne glejte v ta vir, ker vam lahko povzroči trajno poškodbo vida!
Ta modul se sme direktno vezati na priključke Arduino UNO ploščice, ker upor R2 omejuje tok laserske diode na okoli 30 mA, to pa je vrednost katero mikrokontroler lahko dostavi brez nevarnosti za poškodovanje. Sheme na sliki 98d prikazujejo dva alternativna načina vezanja: upor vrednosti 51 Ω bo zmanjšal tok skozi diodo na okoli 20 mA, medtem, ko bo tranzistor popolnoma prevzel tokovno obremenitev.
Delo modulov lahko preverimo s pomočjo dveh programov, 37in1_prog_4.bas in 37in1_prog_5.bas. Če uporabimo prvi program, je krmilni priključek na “12”, vendar lahko lasersko diodo samo vključujemo in izključujemo. Če uporabimo drugi program, je krmilni priključek na “~10”, laserski žarek pa bomo lahko modulirali z različnimi frekvencami in tako lahko prenesemo neko informacijo.
Opomba: Da bi programi mogli delal pravilno, 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 na sliki 97b; te podrobnosti so izpuščene na sliki 98d.
KY-005, infrardeča dioda (Infrared Transmitter Module)
Na modulu (slika 98e) se nahaja infrardeča dioda brez upora za omejitev toka. Zaradi tega modul ni primerno direktno vezati na priključke Arduino ploščice, ker bo skozi diodo stekel prevelik tok ki lahko okvari ali diodo ali sam mikrokontroler. Tok lahko omejimo na sprejemljivih 20 mA z uporom vrednosti 180 Ω. Če uporabljamo vezje s tranzistorjem kot tistega na sliki 98e spodaj, lahko vrednost upora zmanjšamo do 47 Ω in tako povečamo intenzivnost in domet infrardečega žarka. Maksimalni dovoljen tok skozi infrardečo diodo je odvisen od vrste vgrajene diode; ker ti podatki niso znani priporočam, da se vrednost upora ne zmanjšuje pod 47 Ω.
Delo modulov lahko preverimo s pomočjo dveh programov, 37in1_prog_4.bas in 37in1_prog_5.bas. Če uporabljamo prvi program, je krmilni priključek na “12”, infrardečo diodo lahko samo vključujemo in izključujemo. Če uporabljamo drugi program, je krmilni priključek na “~10”, infrardeč žarek pa bomo lahko modulirali z različnimi frekvencama in tako prenesli neko informacijo. V programu 37in1_prog_5.bas je predvidena možnost izbora signala frekvence 38 kHz, ker daljinski krmilniki za prenos informacije običajno uporabljajo žarek infrardeče svetlobe modulirane ravno s to frekvenco.
Opombe: ker infrardeča svetloba ni vidna s človeškim očesom, bo za detekcijo potrebno imeti modul, kot prej opisani KY-026 (detektor plamena, Flame Sensor Module). Da bi programi lahko delali pravilno, 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 na sliki 97b; te podrobnosti so izpuščene na sliki 98e.
Z opisom modulov iz skupine “moduli z digitalnimi vhodi” bomo nadaljevali v naslednjem nadaljevanju.
Opomba: datoteku Arduino_pins.sub z definicijami Arduino UNO priključkov in programe 37in1_prog_4.bas ter 37in1_prog_5.bas lahko brezplačno dobite na spletni strani revije.
Avtor: mag. Vladimir Mitrović
E-pošta: vmitrovic12@gmail.com
2019_279_52
Barduino-20