9. Potentsiomeeter: töö-põhimõte, ühendamine, juhtkang (joystick)
<- eelmine peatükk
järgmine peatükk ->
9.0. Seosed eelmiste peatükkidega
Eelnenud peatükkides oleme tutvunud Serial monitori kasutamisega. Kuuendas peatükis juhtisime pulsilaiusmodulatsiooni võimekusega viigu abil RGB-LED-i. (vt Arduinol PMW tähistusega viigud.) Seitsmendas peatükis aga lugesime analoog-signaali, mis tuli valgustundlikult takistilt; kasutasime selleks Arduinol ANALOG IN tähistusega viiku; jäi meelde, et nende viikude tähistused algavad programmis tähega ’A’. Ka selles tunnis loeme infot läbi Analog-In viigu. Jälgime protsessi Serial monitori abil.
Toome siinkohal ära ka valgustundliku takistiga koostatud vooluahela skeemi—koostame midagi üsna sarnast selle vooluahelaga.
9.1. Eesmärk ja selgitused
Selles peatükis ehitame lihtsa vooluahela, mis sarnaneb valgustundliku takistiga kasutatule, ent valgustundliku takisti asemel kasutame signaali genereerimiseks potentsiomeetrit. Kui potentsiomeetrile rajatud mõttekäik on selge, siis toome mängu kaks potentsiomeetrit korraga—ühe juhthoova alla koondatud kahe potentsiomeetri tähistuseks on eestikeelses kirjanduses kasutatud sõna juhtkang (inglise keeles joystick).
Kaheksanda tunni järel õpilane
9.2. Töövahendid:
9.3. Tegevused
9.3.1. Potentsiomeeter
Teooria: Potentsiomeeter on lihtne meetod muuta käega manipuleerides (pikka väljaulatuvat nuppu keerates) vooluahela takistust: saame takistuse muutumise kaudu Arduinole infot teavitada. Seejuures on tegemist analoogväärtuse lugemisega Analog-in viigu kaudu. Nii saame ka midagi juhtida—näiteks saame juhtida LED käitumist.
Alustuseks koostame vooluahela, mis koosneb kolmest juhtmest ja ühest potentsiomeetrist. Seekord maketeerimislauda ei kasuta: lihtsuse ja kiiruse huvides ühendame juhtmed otse Arduinoga.
Ühendame GND-GND-ga (must juhe), toiteks anname 5V (punane juhe); analoog-signaali lugemiseks potentsiomeetri keskmiselt viigult aga ühendame selle Arduino A0 viiguga (kollane juhe).
Järgmisena katsume seda lihtsat skeemi vaadates ette kujutada veel kirjutamata programmi.
Mõtleme selle üle, mida vajame programmis:
a) soov on lugeda oma käega potentsiomeetri takistust muutes vastavaid näite Serial monitori ekraanilt;
b) takistuse kohta analooginfot saame lugeda Analog-in viigu kaudu—antud näites kasutame viiku A0.
Seega info Arduinole kättesaadavaks tegemiseks peame teavitama Arduinole alustuseks, et A0 annab infot. Serial Monitori töö tagamiseks peame aga void setup() osas teavitama, et Serial monitor peab alustama tööd: Serial.begin() sulgudesse paneme baudides väljendatud kiiruse—impulssi sekundis).
Kas tundub, et midagi sarnaneb fototakistit kästilenud 7. peatükis kasutatud programmile?
int analogInPin = A0; //int LDR = 0; int i = 1; void setup() { Serial.begin(9600); } void loop() { //LDR = analogRead(analogInPin); for ( i = 0; i = i +1;){ Serial.print(i); Serial.print(".mõõtmine: "); Serial.println(analogRead(analogInPin)); delay(2000); } }
Mõelge, millised muudatused on vajalikud, kohendage juba kasutuses olnud programmi—ent enne muutmise kallale asumist salvestage see vähemalt uue nime all, mis viitaks kas teemale või peatüki numbrile. Veel parem, kui teil on juba olemas iga õppetüki kohta oma folder.
Kas asi võiks välja näha selline?
int potentsiomeetriltLoetu = A0; void setup() { Serial.begin (9600); } void loop() { int i; for (i = 0; i = i +1;){ Serial.print(i); Serial.print(".mõõtmine: "); Serial.println(analogRead(potentsiomeetriltLoetu)); delay(2000); } }
Käivitame programmi ja jälgime, mis juhtub olema Serial monitoris kuvatud väärtuseks, kui potentsiomeeter on ühes äärmises positsioonis, seejärel aga keerame lõpuni kuni vastassuunas asuva äärmuspositsiooni lõpuni.
Mida näeme Serial Monitori ekraanil?
Kas märkate, et äärmuspositsioone markeerivad 0 ja 1023?
Kas saaksime edasi mõelda nii:
- 0 ja 1023 ning kõigi muude vahepealsete väärtuste korral, mida Serial monitorilt lugeda saime, on tegemist „näiduga“, mis esindab meie poolt potentsiomeetri abil takistuse muutmisega vooluahelas pinge mõjutamist.
- Vooluahela toitepingeks on 5V, seega maksimumpinge saab olla 5V.
- Maksimumpinge on võimalik siis, kui oleme potentsiomeetri viinud asendisse, milles me pinget ei mõjuta: see on üks äärmistest asenditest; selguse huvides saame seda nimetada „5V-asendiks“.
- Kui mõjutame pinget maksimaalselt—oleme viinud potentsiomeetri eespool „5V-asendiks“ nimetatud asendi suhtes vastas-asendisse. Sel juhul peaks pinge olema 0V—pinge puudub. Selguse huvides nimetame seda „0V-asendiks“.
- Kõik muud asendid jäävad aga „0V-asendi“ ja „5V-asendi“ vahele—andes väärtuseks midagi 0V ja 5V vahepealset.
Kas saaksime anda Arduinole programmis ette meetodi, mis võimaldaks a) koheselt välja arvutada tegelikult meid huvitavad ühikunäidud voltides ja b) panna Serial monitori seda eesti keeles meile esitama?
- Meie programmis kasutatud funktsioon analogRead() loeb ette antud Analog-in viigult (A0) väärtuse, mis jääb vahemikku 0-1023: millest 0 vastab „0V-asendile“ ja 1023 vastab „5V-asendile“. Saame siit leida mistahes 0 ja 1023 vahele jäävatel väärtustel esinevaid voltides väljendatavaid väärtusi näiteks ristvõrratuse abil.
- Arduino-plaadile sisse ehitatud 10-bitine ADC (Analog to Digital Converter) projitseerib meie poolt potentsiomeetrit pöörates muudetavad sisendvoolud, mis saavad olla (vt punane juhe!) vaid vahemikus 0-5V meile kergesti kasutatavateks täisarvulisteks väärtusteks: „Serial monitoril kuvatavateks ühikuteks“ vahemikus 0-1023.
- Kuna voltide arvestuses peame opereerima mitte-täisarvuliste väärtustega—peame opereerima komakohtadega arvudega, siis kasutame andmetüübina int asemel andmetüüpi float—eestikeelses kirjelduses kasutatakse terminit „ujukoma-arv“.
Kohendame programmi:
int potentsiomeetriltLoetu = A0; float SerialMonitorilKUVATAV = 0; float muutujaVoltideTarvis = 0; void setup() { Serial.begin (9600); } void loop() { int i; for (i = 0; i = i +1;){ Serial.print(i); Serial.print(".mõõtmine potensiomeetirlt on: "); SerialMonitorilKUVATAV = (analogRead(potentsiomeetriltLoetu)); Serial.print(SerialMonitorilKUVATAV); muutujaVoltideTarvis = SerialMonitorilKUVATAV * 5.0/1023.0; Serial.print(", mis voltidesse arvutatuna on: "); Serial.print(muutujaVoltideTarvis); Serial.println(" volti."); delay(2000); } }
Kindlasti tekkis küsimus, et miks on meil maksimumarvuks 1023?
Tegemist on arvuti jaoks tehte 2 astmel 10 = 1024 väljendusega—ent loendamist ei alustata arvust 1. Esimeseks arvuks on 0. Seega viimaseks peab olema 1023: kokku ikka endiselt 1024…
Ent miks kasutame nimelt arvu 2 astendamist?
Ikka seepärast, et arvutiga on meil vaid kaks võimalikku piisavalt eristatavat olekut, mille abil saame loendada. Ja astmetega on otstarbekas kirjeldada seda, kuidas saame kasutada rohkemat arvu loendatavaid-eristatavaid võimalusi. (Vt eespool: oleme uurinud binaarsüsteemi—kus seda kasutasime ja miks?)
9.3.2. Juhtkangi (joystick) vooluahel—kaks potentsiomeetrit ühe nupu all+ meie mudelil ka SW tähistusega surunupp-lüliti
Kõigepealt teeme vaatlusega kindlaks mitu viiku ja mille jaoks on juhtkangil—kokku loendame KY-23 puhul viis viiku:
- GND (Ground);
- +5V (5V);
- VRx (pingega edastava analoog-info x-telje juhtimiseks);
- VRy (pingega edastava analoog-info y-telje juhtimiseks);
- SW, mida me esialgu ei kasuta; on tegelikult seesama surunupp-lüliti, mida uurisime neljandas tunnis. Sedakorda ühendame selle vastavalt skeemile digitaalselt ja esimeses programmis jätame kasutamata. Peatüki viimases osas aga lisame ka SW oma programmile ja paneme juhtkangi tööle.
Koostame järgmise lihtsa vooluahela—sarnasus vaid ühte potentsiomeetrit sisaldanud vooluahelaga on suur.
Hetkel on meil sisuliselt vaja ühendada kaks potentsiomeetrit ühe kesta sees.
- x-telje potentsiomeetri tarvis ühendame—nii nagu tavalise potentsiomeetri näites, ühenduse juhtkangi VRx viigult Arduino peal asuvale A0 viigule (vt skeemil kollane juhe);
- y-telje potentsiomeetri tarvis aga ühendame juhtkangi peal asuva VRy viigu Arduinol asuva analoog-viiguga A1 (skeemil roheline juhe).
(Miks me ei ühenda neid digitaalinfole mõeldud Arduino viikude külge? Vastuse üle mõtlemisel pane tähele seda, mida peavad nad edastama ja miks—ning kuidas see võimalik on.)
(Miks me ei ühenda seda analoog-viigu külge? Vastuse üle mõtlemisel mõtle selle üle, et mitu asendit/olekut on võimalik lülitil, mis reageerib sellele, kui teda sisse surutakse ja kuidas seesama lüliti sisse-surutuna reageerib sisse-surumise lõpetamisele.)
Skeem on seega kokku pandud.
9.3.2.1. Juhtkangi mõlemat potentsiomeetrit kattev programm
Vaatame eelmist programmi—kirjutasime selle ühele potentsiomeetrile.
Uurime, kuidas saame seda programmi ära kasutada nüüd kahe potentsiomeetri tarvis.
Õppeainest arusaamise huvides tutvume veelkord selle peatüki osas 9.3.1 ühele potentsiomeetrile loodud programmiga, seejärel asume kirjutama sarnast programmi—ent kahele potentsiomeetrile.
int XpotentsiomeetriltLoetu = A0; //loeme X-potentsiomeetrit int YpotentsiomeetriltLoetu = A1; //loeme Y-potentsiomeetrit float X_muutujaVoltideTarvis = 0; // muutuja X-potentsiomeetrit arvutatud voltide tarvis float Y_muutujaVoltideTarvis = 0; // muutuja Y-potentsiomeetrit arvutatud voltide tarvis void setup() { Serial.begin (9600); } void loop() { int i; for (i = 0; i = i +1;){ Serial.print(i); Serial.println(".mõõtmine:"); Serial.print ("X-teljel: "); X_muutujaVoltideTarvis = (analogRead(XpotentsiomeetriltLoetu)) * 5.0/1023.0; Serial.print(X_muutujaVoltideTarvis); Serial.println(" volti."); Serial.print ("Y-teljel: "); Y_muutujaVoltideTarvis = (analogRead(YpotentsiomeetriltLoetu)) * 5.0/1023.0; Serial.print(Y_muutujaVoltideTarvis); Serial.println(" volti."); Serial.println(" "); delay(2000); } }
9.3.2.2. Programm: lisame surunupp-lüliti viigu—SW-viigu. Seejärel on juhtkang kui tervik kõigil viikudel tööle pandud:
Ja selle peatüki viimases osas lisame oma programmile ka juhtkangi surunupp-lüliti funktsiooni—ühendatav läbi viigu SW. Kuna me ei ole lisanud skeemi takistit, siis teeme pisut erinevalt ja ehk isegi lihtsamalt kui surunupp-lüliti teemal õppisime—ka niiviisi töötab:
int XpotentsiomeetriltLoetu = A0; //loeme X-potentsiomeetrit int YpotentsiomeetriltLoetu = A1; //loeme Y-potentsiomeetrit float X_muutujaVoltideTarvis = 0; // muutuja X-potentsiomeetrit arvutatud voltide tarvis float Y_muutujaVoltideTarvis = 0; // muutuja Y-potentsiomeetrit arvutatud voltide tarvis int SWviik = 10; //SW viigult signaal digitaal-viigule nr 10 void setup() { Serial.begin (9600); pinMode (SWviik , INPUT); //peame lisama ka selle, et juhtkangi pressimine on input viigule 10 digitalWrite (SWviik , HIGH); // HIGH: kui me ei suru SW viik i, siis annab tulemuseks 1, kui surume--siis 0. } void loop() { int i; for (i = 0; i = i +1;){ Serial.print(i); Serial.println(".mõõtmine:"); Serial.print ("X-teljel: "); X_muutujaVoltideTarvis = (analogRead(XpotentsiomeetriltLoetu)) * 5.0/1023.0; Serial.print(X_muutujaVoltideTarvis); Serial.println(" volti."); Serial.print ("Y-teljel: "); Y_muutujaVoltideTarvis = (analogRead(YpotentsiomeetriltLoetu)) * 5.0/1023.0; Serial.print(Y_muutujaVoltideTarvis); Serial.println(" volti."); Serial.print ("SW positsioon : "); Serial.println (digitalRead(SW_viik )); Serial.println(" "); delay(2000); } }
9.4. Kodutöö
Kordamisküsimus: mida saime teada juhtkangi (joystick) kohta?
Milliseid võimalusi see sisaldab?
Surfake kodus otsisõnaga ’joystick’: lööge arvutisse sisse märksõnadena ’joystick potentiometer’ ning ’joystick pushbutton’. Lisage neile märksõnadele ka Arduino ja uurige valikus leiduvat materjali. Pange järgmiseks tunniks kirja Teie arvates olulisim. Milleks on juhtkangi (joystick) vaja? Kas saaks ka ilma hakkama?
Kõige olulisem selles tunnis oli aga potentsiomeeter—lihtne võimalus takistust sujuvalt muuta. Mõtleme, et kas korjame sellisest sujuvast muutmisest tuleva signaali üles Analog-in viigu kaudu või Digital viigu kaudu? Mis moodi surunupp-lüliti erineb potentsiomeetrist? Kirjutage see teooriaosa enda jaoks lahti ja tutvustage seda kaasõpilastele, kes ei tegele robootikaga. Seejärel uurige, et kas ka neile sai digitaalse signaali ja analoog-signaali vahetegu veidi selgemaks?
Kui nad Teist aru ei saanud, siis üritage uuesti—mida selgitaksite teisiti? Kas pigem näitaksite Arduino peal kõik ette?