Arvutiteaduse instituut
  1. Esileht
  2. Noored Koodi
EN
Logi sisse

Noored Koodi

<- Kõik kursused

  • Arduino kursus
  • 1. Sissejuhatus: millist Arduinot valida, programmeerimiskeskkond Arduino IDE
  • 2. Töötamine Arduino IDE-ga, Arduino ühendamine arvutiga ja sisseehitatud LEDi vilgutamine
  • 3. Vooluahela koostamine (LED, takistid, maketeerimislaud, juhtmed) ja värvikood
  • 4. LED-ide vilgutamine FOR tsükliga, lokaalmuutuja kasutamine
  • 5. Lüliti ühendamine ja LEDi vilgutamine vastavalt lüliti asendile: IF/ELSE tingimuse kasutamine
  • 6. RGB ledi ühendamine ja RGB võimaluste katsetamine analogWrite() abil
  • 7. Valgustundliku takisti ja ADC abil valguse mõõtmine ja kuvamine arvuti ekraanil—Serial monitor
  • 8. UART liidese abil andmete vahetamine Arvuti ja Arduino vahel, ASCII tabel
  • 9. Potentsiomeeter: töö-põhimõte, ühendamine, juhtkang (joystick)
  • 10. Servomootori juhtimine—pulsilaiusmodulatsioon ja joystick
  • 11. Ekraani ühendamine ja teksti kuvamine 1602 LCD ekraanil
  • 12. USART ja 1602 LCD: Serial monitorist ekraanile!

  • 13. IDE-s programmeerimisest kokkuvõtvalt
  • 14. LED heleduse muutmine vastavalt keskkonna valgustugevusele
  • 15. Ohmi seadus, multimeetri kasutamine

  • 16. Kordamisküsimused
  • 17. Kontrolltöö

  • 18. LED juhtimine infrapuna-saatjaga ja -vastuvõtjaga
  • 19. HC-SR04 ultrahelisensori ühendamine ja näitude kuvamine LCD ekraanil
  • 20. Joonistame ise programmi Fritzing abil korrektse vooluringi skeemi
  • 21. Sissejuhatavalt sünkroonsest ühendusest (I2C ning SPI) õhurõhu anduri BMP280 näitel
  • 22. CSV—Comma Separated Values
  • 23. Kujundite kuvamine 1602 LCD ekraanil
  • 24. Ekraani ühendamine ja teksti kuvamine 1602 LCD ekraanil
  • 25. Arduino ühendamine bluetooth seadmega
  • 26. Relee juhtimine

  • 27. Digispark: netist tarkvara leidmine, installeerimine ja esimese lihtsa programmi töölepanek
  • 28. ESP32: tarkvara ja lihtsa esimese programmi töölepanek
  • 29. ESP32: jõuame sisse-ehitatud LED vilgutamiseni

  • 30. Kordamine
  • 31. Teooria esitlus
  • 32. Projektiesitlus

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

a) oskab Arduino projektides loovalt mõelda potentsiomeetriga millegi lihtsama juhtimisest;
b) mõistab, kuidas saab rakendada info edastamiseks kahte potentsiomeetrit—ühe kesta sees ning ühe juhtimishoova alla tooduna—sellise terviku kohta võime öelda, et see on juhtkang (joystick).

9.2. Töövahendid:

1) Arduino Uno;
2) USB ühenduskaabel;
3) arvuti;
4) internetiühendus;
5) luup - kui ei ole palja silmaga selgelt näha viigud TX ja RX;
6) potentsiomeeter;
7) juhtkang (joystick)—mis on sisuliselt „kaheteljeline“ kaksik-potentsiomeeter—kaks potentsiomeetrit ühe juhtimishoova all;
8) juhtmed.

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.

a) Saame hakkama kahe potentsiomeetri kohta ühe GND (must) ja ühe 5V (punane—toide) juhtmega. Ühendame need eespool nimetatud GND ja 5V markeeringuga juhtkangi viikudega.
b)Kumbki juhtkangi potentsiomeetritest vajab aga oma analoog-viiguga ühendust:
  • 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.)

c) Lõpuks on meil jäänud veel üks viik , selle loogika sarnaneb varasemas õppetükis kasutatud surunupp-lülitile (inglise keeles push-button)—ühendame selle digitaalinfole mõeldud viigu külge.

(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?



<- eelmine peatükk järgmine peatükk ->

  • Arvutiteaduse instituut
  • Loodus- ja täppisteaduste valdkond
  • Tartu Ülikool
Tehniliste probleemide või küsimuste korral kirjuta:

Kursuse sisu ja korralduslike küsimustega pöörduge kursuse korraldajate poole.
Õppematerjalide varalised autoriõigused kuuluvad Tartu Ülikoolile. Õppematerjalide kasutamine on lubatud autoriõiguse seaduses ettenähtud teose vaba kasutamise eesmärkidel ja tingimustel. Õppematerjalide kasutamisel on kasutaja kohustatud viitama õppematerjalide autorile.
Õppematerjalide kasutamine muudel eesmärkidel on lubatud ainult Tartu Ülikooli eelneval kirjalikul nõusolekul.
Tartu Ülikooli arvutiteaduse instituudi kursuste läbiviimist toetavad järgmised programmid:
euroopa sotsiaalfondi logo