Dostikrat moramo posredovati bolj zahtevne informacije, kot jih lahko prikažemo s prižiganjem določene kombinacije svetlečih diod razvojnega sistema Shield-A. V takih primerih imamo na razpolago kar nekaj načinov, ki jih bomo spoznali v naslednjih nadaljevanjih.
Povezava Shield-A s PC-jem preko terminala
USB kabel, s katerim je Arduino Uno povezan z osebnim računalom, ima večkratno vlogo (slika 23): poleg tega, da prek njega dovajamo napajalno napetost za Arduino Uno in Shield-A ploščici in programiramo mikrokontroler ATmega328P, lahko prek njega vzpostavimo tudi komunikacijo med računalnikom in mikrokontrolerjem. V ta namen je na Arduino Uno ploščici vgrajen čip, kot sta na primer ATmega8U2 ali CH340G, ki bo TX in RX signala s priključkov PD1 in PD0 mikrokontrolerja posredoval osebnem računalniku. Na osebnem računalniku potrebujemo ustrezni program, emulator terminala, ki bo v svojem oknu prikazal sporočila, ki prihajajo od mikrokontrolerja, pritiske na tipke tipkovnice pa bo posredoval mikrokontrolerju. V naslednjih programskih primerih bomo pokazali, kako to praktično uresničiti. V teh primerih bomo uporabljali potenciometer RV1, ki je povezan na priključek PC0, oziroma “A0” po Arduino označevanju (poglejte sliko 21 v prejšnjem nadaljevanju).
Ta vsebina je samo za naročnike
- programska naloga: Izmeriti moramo napetost na drsniku potenciometra RV1 in izmerjeno vrednost prikazati na emulatorju terminala.
Prva rešitev z Bascom-AVR (program Shield-A_8a.bas)
Najprej bomo definirali spremenljivko Napon in nastavili delovanje A-D pretvornika:
Dim Napon As Long ... ConfigAdc = Single , Prescaler = Auto , Reference = Avcc
V ukazu za nastavitev A-D pretvornika smo izbrali, da se vhodna napetost primerja z napajalno napetostjo (Reference = Avcc), ker bo napetost na drsniku potenciometra prav tako ena izmed vrednosti med 0 in 5V. Ostale nastavitve določajo način delovanja A-D pretvornika in nam bodo v takšni obliki, kot so tu navedene, ustrezale v večini primerov.
V glavni programski zanki beremo napetost na priključku PC0 (A0) in vrednost, ki jo dobimo z A-D pretvornikom, shranimo v spremenljivko Napon.
Do Napon = Getadc(0) Napon = Napon * 5000 Napon = Napon / 1023
Že iz preteklih primerov vemo, da nam A-D pretvornik daje vrednosti v razponu od 0 do 1023; če pa jih želimo pretvoriti v razpon 0-5000, ki ustreza izmerjeni napetosti v milivoltih, moramo vrednost iz A-D pretvornika pomnožiti s faktorjem 4,888. Ker uporabljamo celoštevilčno aritmetiko, smo iskani faktor dobili najprej z množenjem, potem pa še z deljenjem z ustreznim koeficientom. Pri teh operacijah lahko vrednost spremenljivke Napon začasno dobi vrednost, ki je lahko tudi večja od 5 milijonov, zato je tip spremenljivke Napon v tem programu nastavljen kot Long.
Vrednost spremenljivke Napon skupaj z ustreznimi komentarji pošljemo emulatorju terminala z ukazom Print:
Print "U = " ; Napon ; " mV" Wait 1 Loop
Emulator terminala v programskem razvojnem okolju Bascom-AVR odpremo s kombinacijo tipk Ctrl+T ali klikom na ikono, ki je označena s puščico na sliki 24. Vsak Print ukaz bo izpisal eno vrstico v oknu emulatorja terminala. Tako lahko spremljamo zgodovino sporočil; na sliki so prikazani rezultati meritev napetosti, ko se je os potenciometra RV1 postopno obračala iz enega v drug skrajni položaj. Da posamezna sporočila ne bi prehitro “divjala” po oknu emulatorja terminala, smo izvajanje programa upočasnili z ukazom Wait 1.
Opomba: Bascom-AVR privzeto uporablja hitrost komunikacije 9600 Baudov, ki jo pa lahko spremenimo z nastavitvenim ukazom $baud. Izbrani hitrosti je treba prilagoditi tudi parametre za delovanje emulatorja terminala; če bomo vse pustili na privzetih vrednostih, bo vse začelo delovati že “na prvo žogo”. Enostavno, kajne!?
Prva Arduino rešitev (program Shield-A_8a.ino)
Za razliko od programa Bascom AVR, ima Arduino že nastavljen A-D pretvornik, zato moramo nastaviti le še serijsko komunikacijo. Za njeno nastavitev uporabljamo ukaz Serial (ali bolj natančno, razred programskega jezika C++ sa pripadajočimi funkcijami). V funkciji setup() bomo definirali uporabo serijske komunikacije z ukazom Serial.begin() in določili hitrost te komunikacije, na primer 9600 Baudov.
voidsetup() { Serial.begin(9600); }
V glavni programski zanki loop() beremo napetost na priključku PC0 (A0) in vrednost, ki jo dobimo z A-D pretvornikom, shranimo v spremenljivko vrijednostPotenciometra. Že iz prejšnjih primerov vemo, da za pretvarjanje vrednosti spremenljivke vrijednostPotenciometra v razponu od 0 do 1023 v razpon od 0 do 5000, ki ustreza vrednosti izmerjene napetosti v milivoltih, lahko uporabimo funkcijo map(). Novo vrednost bomo shranili v spremenljivko napon.
Za izpis podatkov prek serijske komunikacije lahko uporabimo dve funkciji, Serial.print() in Serial.println(). Funkcija Serial.print() bo izpisala tekst ali vrednost spremenljivke, vendar na koncu ne bo dodala znakov za prehod v novo vrstico. Funkcija Serial.println() naredi enko kot Serial.print(), vendar na koncu doda tudi znake za prehod v novo vrstico. Zato bomo najprej izpisali besedilo “U = “, potem vrednost spremenljivke napon in na koncu še besedilo ” mV”. Z zadnjim ukazom delay() upočasnimo izvajanje programa s pavzo 1000 milisekund, da sporočila ne „drvijo“ prehitro prek zaslona.
voidloop() { intvrijednostPotenciometra = analogRead(A0); int napon = map(vrijednostPotenciometra, 0, 1023, 0 , 5000); Serial.print("U = "); Serial.print(napon); Serial.println(" mV"); delay(1000); }
Monitor serijske komunikacije v Arduino integriranem razvojnem okolju (IDE) odpremo s kombinacijo tipk Ctrl+Shift+M ali s klikom na ikono, ki je s puščico označena na sliki 25. Ukaza Serial.print() in Serial.println() bosta izpisala eno vrstico v oknu monitorja serijske komunikacije in tako lahko vidimo zgodovino sporočil. Na sliki so prikazani rezultati merjenja napetosti, medtem, ko se os potenciometra RV1 postopno obrača iz enega v drug skrajni položaj.
Opomba: Najbrž ste opazili, da smo v funkciji setup() določili hitrost serijske komunikacije 9600 Baudov, zato moramo tudi monitorju serijske komunikacije določiti enako hitrost komunikacije z izborom hitrosti v spodnjem desnem delu okna s pomočjo padajočega izbirnega okna (na sliki 25 je označen z rdečim pravokotnikom). Če hitrosti nista usklajeni, bomo na zaslonu videli “čudne znake” ki spominjajo na hieroglife. Če na zaslonu opazite takšne “čudne znake”, je dovolj, da pravilno določimo hitrost komunikacije monitorja serijske komunikacije in že prva naslednja vrstica bo pravilno prikazana.
***
Včasih je bolj priročno, če v oknu emulatorja terminala spremljamo samo eno sporočilo, ki se vsebinsko spreminja. V našem primeru bi potem okno emulatorja terminala delovalo kot zaslon merilnega instrumenta. Za takšno obliko prikaza je potrebno preprečiti premikanje vsebine, oziroma moramo zagotoviti, da se novo sporočilo izpiše prek prejšnjega. Kako to doseči, bomo videli v naslednjem primeru:
Druga rešitev z Bascom-AVR (program Shield-A_8b.bas)
Najprej moramo malo bolje spoznati ukaz Print, ki deluje takole:
- Če zapišemo ukaz v obliki Print “ABC”, bo Bascom AVR na emulator terminala poslal besedilo “ABC” in zatem še dva kontrolna znaka, CR in LF. Prvi povzroči premik na začetek vrstice, drugi pa začne novo vrstico, zato se bo naslednje sporočilo začelo na začetku nove vrstice.
- Če zapišemo ukaz v obliki Print “ABC”;, (tu je pomemben znak “;” na koncu ukaza), bo Bascom AVR na emulator terminala poslal samo besedilo “ABC”, brez kontrolnih znakov, zato se bo naslednje sporočilo začelo v isti vrstici, pravzaprav se bo kar “prilepilo” na konec prej izpisanih znakov “ABC”.
Nam ne ustreza nobena od teh oblik, saj bi se moralo vsako naslednje sporočilo začeti v isti vrstici, vendar na njenem začetku. Rešitev ponujamo v programu Shield-A_8b.bas, ki je enak prej analiziranemu programu 8a, razen v tistem delu, kjer pošiljamo sporočilo o izmerjeni napetosti na emulator terminala. Najprej bomo poslali sporočilo, ki vsebuje samo kontrolni znak CR (v Bascomu je to Chr(13)), s katerim ukažemo, naj se naslednji izpis začne na začetku tekoče vrstice,
Print Chr(13);
potem pa sporočilo, ki ga želimo izpisati:
Print "U = " ; Napon ; " mV ";
Vidimo, da se obe sporočili zaključita z znakom “;”, s čimer onemogočimo premik v novo vrstico. Pri tem je treba poudariti še eno pomembno podrobnost: kadar pišemo sporočilo prek drugega sporočila, moramo zagotoviti, da novo sporočilo popolnoma prekrije prejšnjega. V našem primeru je dolžina posameznega sporočila odvisna od izmerjene napetosti, katere vrednost je lahko eno-, dvo-, tri- ali štiri-mestno število, zato se tudi dolžine sporočil lahko razlikujejo za največ tri znake. Zato smo za zadnjimi znaki besedila “mV” dodali še tri razmake (prazna mesta) in tako se zdaj celotno sporočilo zaključi z nizom “mV “. Ti trije razmaki ne bodo vidni, bodo pa izbrisali zaključek prejšnjega sporočila, če je bilo daljše od novega.
Druga Arduino rešitev (program Shield-A_8b.ino)
Arduino IDE monitor serijske komunikacije na žalost popolnoma ignorira kontrolni znak CR in vedno izpiše sporočilo v novo vrstico. Zato bomo v tem primeru uporabili drug program s funkcijo emulatorja terminala. Program se imenuje putty in je namenjen uporabi na operacijskih sistemih Windows in Linux.
V operacijskem sistemu Linux program putty zaženemo z ukazom v ukazni vrstici, ko so izbrana serijska komunikacijska vrata ttyUSB0:
putty -serial /dev/ttyUSB0 -sercfg 9600
V operacijskem sistemu Windows program putty poženemo z ukazom v ukazni vrstici, spodnji primer prikazuje odpiranje komunikacijskih vrat COM1:
putty.exe -serial com1 -sercfg 9600
Da bi se s programom putty sploh lahko povezali na izbrana serijska komunikacijska vrata, moramo po prevajanju programa in prenosu programske kode v mikrokontroler zapustiti program Arduino IDE (operacijski sistem preverja, če kateri od programov uporablja določena serijska komunikacijska vrata in če ugotovi, da so uporabljena, ostalim programom onemogoči njihovo uporabo).
V programskem jeziku C++ lahko kontrolni znak CR (ASCII koda 13) prikažemo s posebnim nizom znakov r , ki ju dodamo na konec želenega izpisa. Tudi tu lahko opazite, da se pred znakoma r nahaja nekaj znakov presledka, razlog pa je enak kot pri Bascom-AVR rešitvi. Prav tako ne bomo uporabili ukaza Serial.println(), s čimer se bomo izognili dodanemu znaku za prehod v novo vrstico.
voidloop() { intvrijednostPotenciometra = analogRead(A0); int napon = map(vrijednostPotenciometra, 0, 1023, 0 , 5000); Serial.print("U = "); Serial.print(napon); Serial.print(" mV r"); delay(1000); }
Opomba: Programe Shield-A_8a.bas, Shield-A_8b.bas, Shield-A_8a.ino in Shield-A_8b.ino lahko brezplačno dobite v uredništvu revije Svet elektronike.
Avtorja: Vladimir Mitrović in Robert Sedak
Email: vmitrovic12@gmail.com
20201/293
Shield-A_8a