Language Switcher Fallback

Arduino algajatele (kevadsemester 2016)

Ainekaardile kantud informatsioon õppeaine kohta oli järgnev. Mõned kõrvalekaldumised sellest on ülimalt tõenäolised.

Aine eesmärk: Tutvuda elektroonika abil interaktiivsete esemete loomise võimalustega. Sissejuhatus programmeerimisse.

Aine sisu: Programeerimise algtõdede tutvustus visuaalse programeerimise keskkonnas S4A ("Scratch for Arduino"). Praktiline töö Arduino kontrolleri ja elektroonikakomponentidega nagu sensorid, valgusallikad, mootorid. Sissejuhatus Arduino programmeerimisse C-keeles, koodi libraryte kasutamine. Elektroonika montaaži algteadmised.

Õpiväljundid: Kursuse läbinud tudeng suudab ära tunda probleeme, mille lahendamiseks sobib elektroonika ja programmeeritavad kontrollerid. Teab, mis on kontroller, sisend, väljund. On tuttav lihtsamate programmeerimise baastõdedega: muutujad, valikulaused, korduslaused.

Tundide kava:

  1. Sissejuhatus ainesse - elektroonika ja mikrokontrollerid. Sissejuhatus programmeerimisse - S4A (http://s4a.cat/). Tarkvara installeerimine. Esimesed sammud visuaalses programmeerimises.
  2. Sissejuhatus elektroonikasse - LEDid, lülitid. Praktiline töö Arduino ja makettplaadiga.
  3. Väljundseadmed. Koormus ja transistorid. Pulse width modulation. DC mootorid. Servo mootorid. Praktiline töö.
  4. Sisendseadmed, sensorid. Digitaalne ja analoog sisend. Potentsiomeetrid, fototakistid. Praktiline töö.
  5. Arduino IDE ja Arduino C keel. Kirjutame koodi. Praktiline töö.
  6. Koodi libraryd, keerukamad sensorid ja seadmed. Praktiline töö.
  7. Elektroonika monteerimise põhitõed - jootmistehnika. Ülevaade toiteblokkidest ja akudest.
  8. Projektitöö ideede analüüs ja ettevalmistus teostuseks.
  9. Teema(d) tudengite valikul. Näiteks heliväljund või adresseeritavad RGB LEDid või midagi muud.
  10. Töö oma projektiga.
  11. Töö oma projektiga.
  12. Töö oma projektiga.

Töövahendid

Arduino

Arduino on mikrokontrolleri arendusplaat. Tunnis kasutame Arduino UNO nimelist mudelit, millega on lihtne teha ajutisi asju. Sellist saab kohalikult osta näiteks ITT Grupp või Oomipood, aga tunnis kasutamiseks on mõned kooli omad olemas. Oma projekti jaoks võib kasutada UNOt, aga mõõtmetelt väiksem ja püsivate ühenduste jaoks sobilikum mudel on näiteks Nano või Micro.

Erinevate Arduino mudelite kohta saab võrdlevalt infot https://www.arduino.cc/en/Main/Products.

Elektroonikakomponendid

Koolile on soetatud õppekomplekt, kus sisaldub makettplaat ja enamik komponente, millest tundides räägin.

Tarkvara

Alustame kursust kasutades visuaalse programeerimise keskkonda S4A (http://s4a.cat/). Aga selle tööle saamiseks on vaja Arduino drivereid, mida arvatavasti kõige lihtsam installeerida koos Arduino IDE ("integrated development environment") programmiga, mille mõned tunnid hiljem ka kasutusele võtame. Kui visuaalne mänguprogramm end varem ammendab, siis võimalik, et läheme päris koodi kirjutamise peale ka varem, kui tundide kavas märgitud.

Seega esiteks installeerida https://www.arduino.cc/en/Main/Software, juhised: Windows, Mac, Linux.
Ja siis http://s4a.cat/#downloads

Elektroonikakomponentide ostmisest

Kui ostmisega kiire ei ole, siis ebay.com, banggood.com jt kaudu saab väga odavalt hiina tooteid, millega on tilluke risk, et kvaliteedikontroll ei ole olnud korrektne või läheb postis kaduma, aga hinnavahe enamjaolt kompenseerib selle riski - juhul, kui kättesaamine ei ole ajakriitiline. Postiteenus võtab 2-4 nädalat. Sama kehtib paljude muude elektroonikakomponentide kohta. Aga TÄHELEPANU KALLIMATE TELLIMUSTEGA - käibemaksu ja tollimaksu kohustus algab 21,98 € maksumusest (https://www.omniva.ee/abi/tolliinfo). 

Kiirelt ja kindalt: Oomipood või ITT Grupp või muu kohalik pood. Odavalt ja mitme nädala pärast - ebay ja sellised.

Kasulikku ja huvitavat

Arduino koodi spikker: https://www.arduino.cc/en/Reference/HomePage

Elektroonikaskeemide sümbolid: https://learn.sparkfun.com/tutorials/how-to-read-a-schematic

Takistite värvikoodid: http://www.hobby-hour.com/electronics/resistorcalculator.php

Kondensaatorite tähistusest: https://learn.sparkfun.com/tutorials/capacitor-kit-identification-guide#capacitor-identification

LEDi takisti kalkulaator: http://www.oomipood.ee/page/ledtakisti, keerukamad skeemid: http://led.linear1.org/led.wiz . LEDi pinge värvi järgi http://led.linear1.org/vf-help.php

Elektriohutusest: http://libahunt.ee/et/elektriohutusest-algajale

Blokk diagrammid koodi planeerimiseks: https://youtu.be/IkZsQN3Dkxc

 

Väike (kaugelt mittetäielik) spikker - sisendite ja väljundite näited:

Komponent Märkused elektriühenduse ja muu koha Märkused koodi kohta

Sisendseadmed:

   
Nupp või lüliti pull up või pull down takistiga digitalRead
Potentsiomeeter üks äärmine jalg toitepingega, teine äärmine maaga ühendatud analogRead
Fototakisti pingejaguri osana ühendatud analogRead
Termotakisti pingejaguri osana ühendatud analogRead
Digitaalne temperatuuri ja suhtelise õhuniiskuse andur nt DHT11 või DHT22, ühendused googelda library, otsi vastavalt sensori nimele
Infrapuna sensor nt http://www.oomipood.ee/product/tcrt5000l/fotoelektriline-infrapuna-sensor&ac=1 väiksele distantsil eseme olemasolu või tumeduse tuvastamiseks, vajab LEDile toitepinget ja õiget takistit, ning väljundile (selle jupi väljund on see, mis ühendub Arduino sisendisse) pms-t pingejagurit analogRead
PING või HC-SR04 ultraheli kaugussensor 5cm .. 3m distantsi jaoks, ühendused googelda library http://playground.arduino.cc/Code/NewPing
     

Väljundseadmed:

Kõigile: guugelda ühendused  
LED vajab voolu piiramise takistit digitalWrite, analogWrite
Suuremat valgustit või muud elektriseadet saab juhtida releega vt nt http://www.instructables.com/id/Controlling-AC-light-using-Arduino-with-relay-modu/ NB - elektriohutus! digitalWrite
DC mootor, mis võib olla ka näiteks ventilaator või pump tuleb juhtida läbi transistori või relee, vastavalt voolutarbele digitalWrite, analogWrite
Servomootor ei vaja midagi peale toite ja ühe IO pini ühenduse library Servo (IDEga kaasas)
Stepper mootor vajab driverit või mitut tranistori library https://www.arduino.cc/en/Reference/Stepper või http://www.airspayce.com/mikem/arduino/AccelStepper/
LCD ekraan, palju erinevaid vt nt http://www.oomipood.ee/category/ardnaidk/ekraanid-ja-naidikud/ library otsi mudeli järgi
...    

 

Toimunud tunnid

1. tund (20. jaanuar)

Rääkisime õppeaine korralduslikest küsimustest, väike sissejuhatus mikrokontrolleri teemal ja kiire ülevaade mõnedest muudest elektroonikakomponentidest.

Näidatud slaidishõu teemal "Mis asi on mikrokontroller?" PDF-ina.

 

2. tund (27. jaanuar)

Skeemid tunnis jagatud prinditud lehelt on allpool.

Vabatahtlik kodune ülesanne neile, kes varustuse kaasa said:

Ühenda Arduinoga 3 LEDi. Kasutades üht "lõpmatult" blokki koosta kood, kus kõigepealt süttib esimene led, püsib sisselülitatuna 2 sek. Teine led süttib 1 sekundit esimesest hiljem ja püsib sees 3 sek. Kolmas süttib sekund enne teise kustumist ja püsib sees samuti 3 sek. Sekund enne kolmanda kustumist süttib teine 3-ks sekundiks. Ja sekund enne teise kustumist süttib esimene. (Seda protsessi saaks lihtsamalt kirjeldada, aga see ongi Sinu ülesanne koodi tehes :) ) Kui LEDid asuvad füüsiliselt samas järjekorras nagu koodis, siis tulemuseks peaksid saama midagi mini versioonis KITTi tulesid meenutavat. Proovida saad ka 4 LEDiga, kahjuks enamat S4A ei võimalda.

3. tund (3. veebruar)

Vahetasin tundide kavaga võrreldes järjekorda - sisuliselt tegime 4. tunni asju seekord, 5. tunni omad järgmine kord (Arduino IDE ja kood) ja kirjas olnud 3. tunni sisu võtame peale seda.

Piltidena allpool tunnis läbi tehtud koodijupid.

Lisalugemist huvi korral (inglise keeles):

Kodune S4A challenge:

Skeem on pildina allpool. Lisasin ka edevama pildi, aga kasutage seda pigem enesekontrolliks.
Eesmärk: Kui nuppu ei vajutata, siis LED, mis on D10 küljes vilgub. Kui nuppu vajutatakse, siis D10 LED ei põle; loetakse A5 küljes olevalt sisendilt väärtus ja sellega proportsionaalselt lülitatakse D9 küljes olevale LEDile pinge - ehk LEDi heledus sõltub potentsiomeetri asendist.
Analoogsisendilt (nt A5) loetavad väärtused on arvud skaalal 0-1023. Aga PWM (pulse width modulation, nt D9) väljundile saab anda väärtusi skaalal 0-255. Seega tuleb D9 lülitamiseks teha natuke matemaatikat.
D10 LEDi vilkumine tee küllaltki kiire (0.5sek pausidega), siis asi saab kiiremini reageerida nupu vajutusele.

Vihje: pilt klotsidest, mida on vaja kasutada. (Vihje oli vigane, kui vaatasid seda enne 5.02 kl 9.35 - üks korduv klots oli puudu.) Sama asja on võimalik saavutada ka teisel viisil, kindlasti on võimalik üks kontrolliklots teistsuguse vastu vahetada.
Üks võimalik lahendus: pildina.
 

 

4. tund (10. veebruar)

Sissejuhatus Arduino koodi kirjutamisse

Tunnis räägitust suurema osa panin eesti keeles kirja ja kolme .ino faili kujul saab selle alla laadida siit (zipituna). Laiskadele on ka pildi kujul allpool, aga soovitan ikkagi IDE lahti võtta ja seal veidi mängida.

Tunnis läbi tehtud ülesanded on ainult pildi kujul.

Kui koodi üleslaadimisega tekib probleeme, kontrolli siin https://www.arduino.cc/en/Guide/Environment#toc8 mainitud asju kõigepealt.

Edaspidiseks ja iseseisvaks tutvumiseks - Arduino IDE menüüs File -> Examples all leidub terve hulk koodinäited, mis tulevikus aitavad peamiselt meelde tuletada asju, millest midagi kuulnud, aga täpselt ei mäleta. Aga neid võib ka ajaviiteks läbi proovida. Tekstina on neis skeemi kirjeldus ka sees, aga https://www.arduino.cc/en/Tutorial/BuiltInExamples#basics leiab ka skeemid ning breadboardi joonised.

Vabatahtlikuks koduseks ülesandeks pakun välja, tehke eelmise kahe nädala S4A jaoks antud koduste ülesannetega sama asja, seekord koodina (KITTi tuled ja potentsimeetri ning nupuga LEDide oleku juhtimine. Viimasele on vajalikud käsud analogRead ja analogWrite).

 

 

5. tund (17. veebruar)

Täiendatud 20.02.2016 15:45

Seeriakommunikatsioon

Kui Arduino on arvutiga ühendatud, siis need kaks saavad omavahel suhelda. Rohkem läheb vaja Arduino poolt arvutisse info saatmist, praegu räägin ainult sellest.

Serial kommunikatsiooni  võimaldamiseks koodis tuleb setupis kindlasti anda käsklus Serial.begin(9600); Ilma selleta teised Serial käsklused ei tee midagi.

9600 on baud rate ja see võib vahel olla ka mingi muu number, aga enamasti kasutatakse 9600.

Millegi saatmiseks kasutatakse funktsioone Serial.print() ja Serial.println(). Need tahavad parameetriks saadetavat teksti või numbrit. Omavahel on neil erinevus, et println lisab ka reavahetuse, print laseb järgmisel saadetaval asjal kuvada samal real.

Tekst tuleb panna jutumärkidesse:

Serial.println(“Hello world!”);

Arv või muutuja nimi käib ilma jutumärkideta:

int someNumber = 42;

Serial.println(someNumber);

Arvutis tuleb seeriakommunikatsiooni nägemiseks avada serial monitor - luubiga nupust Arduino IDE paremal üleval nurgas. Kui Ardino peal on sketch, mis midagi saadab, siis see ilmub seeriamonotori aknasse. Kui ilmuvad segased tähemärgid, siis kontrolli kas baud rate akna allservas on sama, mis sa Serial.begin käsuga andsid.

 

Pingejagur ja analoog sisendi lugemine

Pingejagur on lihtsamal juhul kompunn, kus kaks takistit on ühendatud jadamisi toitepinge ja groundi vahele ning kahe takisti ühenduskohast loetakse (või kasutatakse millekski) pinget. Pinge selles kohas sõltub takistite väärtustest ja toitepingest järgmise valemi järgi:

Vpingejagur = Vtoide* R/ (R1+R2)

 

Potentsiomeeter on mõtteliselt kaks takistit. Nupu keeramisel muutuvad mõlema takisti väärtused korraga ja vahemikus 0-st kuni pote kogutakistuseni. Seetõttu on potentsiomeetrist pingejaguriga võimalik tekitada kõiki pinge väärtusi nullist kuni toitepingeni.

Kui üks takitsi on tavaline ja teine muutuva takistusega - näiteks valgustundlik - siis saab pingejaguri pinge järgi teada, mis oludes muutuv takisti parasjagu on - ehk kui palju valgust ta peale parasjagu langeb. On olemas ka näiteks temperatuuritundlikud takistid, mida samamoodi kasutatakse. “Anduriks” saab muutlik takisti alles pingejaguriks ühendatuna. Kuna siin on üks takisti püsiva takistusega ja valguse või temperatuuritundlikud takistid kunagi ei lähe nulli, siis pingejagur ei saa anda välja null ja maksimum pinget, muutlikkus toimub kusagil vahepeal. Näiteks 3.1 ja 3.9 V vahepeal.

Pingejagurite mõistmiseks on sellel lehel - http://www.allaboutcircuits.com/textbook/direct-current/chpt-6/voltage-divider-circuits/ - mõned päris head joonised. (Keri alla natuke enne lehe keskpaika, kus arvutused ära lõppevad).

Arduino loeb analoog sisendit ainult A-ga tähistatud pinidel A0...A5. Funktsioon analogRead() tahab argumendiks pini numbrit (koos A-tähega, nt analogRead(A2); ) ja tagastab väärtuse, skaalal 0-1023.

0 on 0V ehk GND ja 1023 on toitepinge. 3V oleks 613 (3 / 5 *1024 -1 = 613)

Kui oled pingejaguri ehitanud valgustundliku takistiga, siis katseta, mis numbreid see näitab - sketch koos selgitustega on pildina lisatud, palun kirjuta ise ümber, et kaasa mõelda korralikult.
 

PWM

PWM on lühend sõnadest pulse width modulation. See kujutab endast võimsuse reguleerimist toitepinge kiire sisse-välja lülitamise teel. Seda saab kasutada näiteks LEDide heleduse või mootori pöörlemiskiiruse reguleerimiseks. Võimsus sõltub sellest, kui pikk on sisselülitatud oleku aeg võrreldes väljalülitatud ajaga - nn duty cycle. Duty cycle-it tihtipeale määratakse protsentidega - kui suure osa tsükli ajast on olekuks sisselülitatud.

Illustreeriv pilt (ma ei taha võõrast materjali varastada, seetõttu ainult lingin.)

PWMi oskavad genereerida ainult osad Arduino pinid: 3, 5, 6, 9, 10, 11 - neil on UNO peal ka märgistus juures. Funktsioon, millega PWMi tehakse on analogWrite(). Tegelikult ei ole tegemist analoog signaaliga, aga kuna PWM teeb keskmiseks pingeks ka väärtusi 0 ja toitepinge vahepeal, siis selle effekt sarnaneb vahepealsete pinge väärtustega. Näiteks duty cycle 50% keskmine on 2,5V ja see on efektilt sarnane 2,5V pingele.

Meeldetuletuseks: Digitaalne tähenab opereerimist kahendsüsteemis: on või off, 1 või 0, toitepinge või null ehk GND. Arduino puhul on toitepinge 5V. Vahepealsete pinge väärtuste eristamine on niinimetatud analoog signaali valdkond.

analogWrite() funktsioon tahab kahte parameetrit: pin, millele kirjutada, ja duty cycle väljendatuna skaalal 0-255.

0 tähendab siis 0% ja 255 tähendab 100% duty cycle. 50% on umbes 128.

Kui PWM signaali andva pini külge on ühendatud transistor, siis see lülitub samuti kiirelt sisse välja ja efekt jõuab koormuseni, mida transistoriga juhitakse.

Veel teadmiseks:

  • Kuna LEDid vajavad põlema minekuks kindlat pinget ja alla selle ei juhtu suurt midagi, siis pinget analoog viisil muutes ei ole ledi põlemine sellega kooskõlas. Ettenähtud pingest allpool heledus tuhmub kiiresti ja nt 1 voldi juures ei põle mitte ükski LED. Aga PWM-ina antud 1 voldi ekvivalent - analogWrite(50) - paneb LEDi ilusti põlema, sest tegelikult töötab see 20% ajast täisheledusega ja 80% ajast on kustutatud, aga inimese silm ei erista 31250 Hz või 62500 Hz sagedusel toimuvat vilkumist. (Eristamise piiriks on vist ca 26Hz)
  • Mootori kiirust PWMiga juhtides tasub arvesse võtta, et väga madalate duty cycle-ite juures mootor ei jõua hõõrdumist ületada ja liikuma hakata. Katseta vajadusel järele konkreetse mootori toimiv miinimum.

 

Vabatahtlik sügavam info, pikemad aga tundusid selged ja asjalikud videod:

Back EMF ja dioodi vajadus mähistega skeemides

Kõige selgem selgitus, mille leidsin: http://www.douglaskrantz.com/ElecFlybackDiode.html

 

Kodune ülesanne

Parandatud skeem allpool.

On majaga ühendatud kasvuhoone, sellel on kaks ust - üks läheb tuppa, teine õue.  Kasvuhoonel on völjatõmbe ventilaator, mis üldjuhul tuleb tööle panna siis, kui päike paistab. On päike- ventileerime,  ei ole päikest - ei ventileeri.  Aga - kasvuhoone temperatuur on enamasti madalam kui toas ja kui toapoolne uks on lahti, siis me ei taha toast sooja õhku ära tõmmata. Ehk siis kui toapoolne uks on lahti, siis ventilaatorit tööle ei panda. Aga kui õuepoolne uks on lahti, siis see tekitab ise tuulutust ja ventileerida võib poole võimsusega.

 

Ventilaator on mootor, mida tuleb lülitada transistori abiga. Aga kuna meil tillukest mootorit komplektis ei olnud, siis me asendame selle LEDiga (koos takistiga), aga lülitame seda transistori abiga.

Päikese paiste tuvastamiseks on meil pingejagur, mille üks takisti on valgustundlik. Et teada saada, mis väärtusi sinu skeemis pingejagur Arduinole näitab, kasuta eespool seletatud Serial kommunikatsiooni. Vali “päikesepaiste” piiriks mingi number, millest mõlemale poole väärtusi saad valgustundliku takisti lambivalguses hoidmise ja kinni katmisega läbi mängida.

Uste andurid on lülitid. Testimise mugavuse huvides mõtle nii pidi, et kui nuppu vajutad, siis on uks lahti.

Sul on üks väljund - ventilaatori mootor - millel on kolm olekut: ei tööta, töötab 100% võimsusega ja töötab 50% võimsusega (PWM, analogWrite funktsioon).

Pead arvesse võtma kolme sisendit:

  • Toa ukse staatus (digitaalne input)

  • Õue ukse staatus (digitaalne input)

  • päikesepaiste (analoog input, analogRead funktsioon, suurem või väiksem võrdlus mingi arvuga, mille pead ise valima)

Mis järjekorras neid koodis arvesse võtad, sõltub sinust, saab peaaegu igat pidi.


PS. Loe ja arvesta järgnevaid asju alles siis, kui oled ülejäänud materjali läbi töötanud:

Lihtsuse huvides ma ei pannud ülesandesse kirja, mis peab juhtuma siis, kui mõlemad uksed on lahti. Kui oled koodi kokku kirjutanud, siis vaata, mispidi see sul jäi. Ja mõtle, kuidas oleksid küsimusele lähenenud, kui oleks mingi muu ventilaatori olek nõutud mõlema ukse lahtiolekul.

Seeriamonitoriga pingejaguri väljundi vaatamiseks on kiireim viis File->Examples->Basics->AnalogReadSerial sketch üles laadida, vajadusel pini numbrit enne muutes. Aga palun kirjuta korra ise selline sketch kokku, et sisust aru saaksid.

6. tund (2. märts)

Tehted ja tehete järjekord

Matemaatika tehete järjekord on C keeles põhimõtteliselt sama, nagu matemaatika tunnis - korrustused jagamised kõigepealt, siis liitmised-lahutamised jne. Kasuta sulgusid, et tehete järjekord vajalikul viisil korrastada.

Tehete järjekorras kõige viimasena tehtav on omistamine (=). Muutujale saab uut väärtust omistada ka tehtena tema olemasolevast väärtusest. Näiteks:

result = result*2;

või

result = result + result / divider;

Võrdlusteheteks nimetatakse avaldist, mille tulemuseks on true (=1) või false (=0) ja kasutada saab järgnevaid märke:

== on võrdne  
!= ei ole võrdne  
< väiksem kui  
<= väiksem või võrdne  
> suurem kui  
>= suurem või võrdne  

Loogikatehteid saab teha true/false väärtustega ja need on järgmised:

!

 loogiline eitus - pmst väärtuse pööramine !true => false ja !false => true.

Näiteks

!digitalRead(2)

annab tulemuseks 0, siis kui digitalRead(2) parasjagu annab 1.

 
||

VÕI (ehk loogiline liitmine, OR) - kui üks VÕI-st ühel või teisel pool olev osa on true, siis on ka koguvastus true.

Näiteks

digitalRead(2) || digitalRead(3)

avaldise tulemused:

digitalRead(2) väärtus digitalRead(3) väärtus avaldise digitalRead(2) || digitalRead(3) väärtus  
0 0 0  
1 0 1  
0 1 1  
1 1 1  
 
&&

JA (ehk loogiline korrutamine, AND) - annab tulemuseks true ainult siis, kui mõlemad JA-st ühel ja teisel pool olevad avaldised on true.

Näiteks

digitalRead(2) && digitalRead(3)

avaldise tulemused oleks:

digitalRead(2) väärtus digitalRead(3) väärtus avaldise digitalRead(2) && digitalRead(3) väärtus  
0 0 0  
1 0 0  
0 1 0  
1 1 1  
 

 

For korduslause

For korduslauset kasutatakse teadaoleva arvu korduste tegemiseks. For tahab sulgudesse kolme avaldist: loenduseks kasutatava muutuja algväärtus, jätkamise tingimus (mingi võrdlus loenduseks kasutatavast muutujaga) ja loenduseks kasutatava muutujaga iga korduse lõpus tehtav tehe.  Lihtsaim ja kõige tihedamini tarvitatav on :

int i;

for (i=0; i<10; i++) {

    ...

}

i väärtuseks saab esimeses avaldises määratud täisarv, selles näites 0. Kui keskmise avaldise, siin i<10, tulemus on tõene, siis loogelistes sulgudes olev koodiblokk tehakse ära. Seejärel teostatakse kolmas tehe, praeguses näites i väärtust suurendatakse 1 võrra. Kui i uus väärtus ei muutunud veel keskmist võrdlust vääraks, siis minnakse uuele ringile.

Pane tähele, et for-i sulgudes kasutatav muutuja tuleb ka eelnevalt deklareerida.

Traditsiooniliselt kasutatakse loendusmuutuja nimena i tähte. Kui for-kordusi on üksteise sees mitu, siis jägmistele j, k jne tähestikust. i++ on lühivorm kirjutamaks “suurenda ühe võrra”, samaväärne käsuga i=i+1; Seda nimetatakse inkrement tehteks ja eksisteerib ka dekrement tehe nt i--, mis on samaväärne i=i-1;

Mõnel juhul on koodi lühiduse huvides kasulik nullist ühe kaupa mingi arvuni loendamise asemel kasutada muud loogikat for korduse loendamiseks - kui loenduse muutujat saab millekski muuks kasutada. Näiteks LEDi heleduse vähendamiseks 5 sammuna:

int brightness;

for (brightness = 255; brightness>0; brightness = brightness - 51) {

    analogWrite(13, brightness);

    delay(1000);

}

analogWrite(13, brightness);

//kui brightness sai väärtuseks 0, siis for sisu enam ei läbitud,

//et LED päriselt välja lülituks, mitte 51 peale ei jääks, on siin vaja veelkord analogWrite teha

Sama asja on võimalik saavutada eelpool kirjeldatud tavapärase lähenemisega, aga see nõuab rohkem koodiridu:

int i;

int brightness = 255;

for (i=0; i<5; i++) {

    analogWrite(13, brightness);

    delay(1000);

    brightness=brightness - 51;

}

analogWrite(13, brightness);

While kordus

While kordus sarnaneb if lausega selle poolest, et sulgudesse pannakse üks avaldis, mille tõeväärtuse järgi otsustatakse, kas loogelistes sulgudes olevat koodi läbida või mitte. Kuid while sisemise koodiga lõpetamise järel kontrollitakse uuesti tingimust ja kui see on jätkuvalt tõene, siis korratakse. Tähendab järgneva koodini ei jõuta enne, kui while tingimus on vääraks muutunud.

While-i kasutatakse tihti selleks, et sisendist loetud tulemuse põhjal midagi teha, millegi järele oodata. Näiteks kui mootor liigutab kasvuhoone luuki ja seda, millal luuk on jõudnud täielikult lahtisesse asendisse, saab lugeda lüliti järgi:

int endSwitch = 4; //lõpu lüliti on ühendatud piniga 4

int motor = 6; //mootori relee ühendatud piniga 6

while ( !digitalRead(endSwitch) ) { //endSwitch näitab 0, kui luuk veel pole sinnani jõudnud, seetõttu “pöörame” väärtuse tõeseks !0 => 1

    digitalWrite(motor, HIGH); //kuni nupu vajutust ei tuvasta, lülitame mootori sisse

}

digitalWrite(motor, LOW); //nupp sai vajutatud, seetõttu kordus lõppes. Lülitame mootori välja.

(See on lihtsustatud näide, kahte pidi töötaval - kinni ja lahti kerival mootoril tuleb tegelikult lülitada mitut releed H-bridge formatsioonis.)

 

Library-te kasutamine

Library on koodikogum, millega tehakse teatud tegevused lihtsasti kasutatavaks ja taaskasutatavaks (minu definitsioon). Arduinoga tegeledes vajad sa library-sid enamasti siis, kui kasutad mõnd elektroonikakomponenti või moodulit, millega suhtlemine on keerukam, kui ühe pini lugemine või kirjutamine. Aga ka korduvate käskude automaatseks ja nähtamatuks tegemine ning välja kirjutatavate käskude inimkeelsemaks tegemine võib olla mõne library point. Näiteks servo puhul on tegemist ühe pini ühendusega, aga library abiga saad anda inimesele loetavat käsku myServo.write(angle), selle asemel, et iga kord teha oma koodis arvutusi ja mitmeid koodiridu ajastuste paika saamiseks, millist PWM-i laadset signaali peab soovitud asendi saamiseks servole saatma.

IDE-ga on kaasas enamlevinud komponentide libraryd, näiteks servo, LiquidCrystal tüüpilisemate LCD-de jaoks … (ma jään nende nimetamisega hätta, sest mul endal on neid palju juurde installitud ja ei tea, millised olid kaasas…).

Enne komponendi hankimist guugelda, kuidas seda kasutatakse - kuidas ühendatakse, kas koodi poolest on keeruline, kas keerukuse vähendamiseks on library olemas. Näiteks LCD-sid on olemas suures valikus, aga nendega suhtlemine võib olla erinev ja osade puhul peaksid tegema ise meeletu programmeerimise töö, et toimima saada. Algajana vali selline, millele on Arduino library olemas.

Library installimiseks lae see alla, paki lahti. Selles kataloogis, kuhu IDE tahab asju salvestada (nimega Arduino või sketchbook, oleneb süsteemist) peaks olema alamkataloog libraries. Paiguta uue library kataloog sinna. Kontrolli, et kataloogi ja seal sees olevate .h ja .cpp failide nimed oleks samad. Githubist saadud libraryte kataloogi nimele on tavaliselt lisatud “-master”, mis tuleb ära kustutada, et asjad toimima saada. Taaskäivita IDE. File -> Examples menüüsse peaks olema ilmunud uue library nimi ja mõned näited. Uuri näidete koodi ja kasuta seda oma koodi kokkupanekuks.

Olulised osad Servo libra näitel on:

#include <Servo.h>

See peab paiknema põhimõtteliselt sketchi kõige alguses ja selle rea lõpus ei käi semikoolonit. Kui kasutad mitut libraryt, siis mõnikord on järjekord oluline, mõnikord mitte. Kui library kaasas olevas näites on mitu #include rida, siis arvatavast vajad neid kõiki.

Servo myservo;

See on objekti loomine, mis tuleb teha enne setupi. Siin annad sa oma komponendile nime (myservo) ja ütled, et ta on Servo library objekt.

myservo.attach(9);

Üks library meetod, rakendatuna sinu loodud objektile myservo. Konkreetselt siin antakse objektile teada, et ta peab 9-nda pini kaudu signaale välja saatma.

myservo.write(180);  

Teine library meetod. Sellega ütled millisesse asendisse soovid servo keerata, nt 180 kraadi. myservo nime järgi saadetakse see signaal välja 9nda pini kaudu, sest eespool .attach() sidus nime myservo asukohaga 9.

Kui sul oleks mitu servot, siis peaksid tegema nii:

#include <Servo.h>

...

Servo myservo1;

Servo myservo2;

void setup() {

    myservo1.attach(9);

    myservo2.attach(10);

    ...

    myservo1.write(180);

    myservo2.write(90);

}

 

Kodune ülesanne

  1. Ühenda Arduinoga servo (guugelda üle, kuidas see käib) ja üks nupp (pulldown või pullup takistiga koos muidugi). Leia Servo library näide nimega “sweep” ja tutvu sellega veidi, proovi see oma servoga tööle saada.

    Kirjuta kood, kasutades while loopi ja if lauseid, mis teeb järgmist:
    Kui nuppu ei vajutata, siis servo liigub rahuliku kiirusega vasakusse äärmisesse asendisse. Äärele jõudes jääb seisma - nullist väiksemaid ega 180-st suuremaid arve mitte servo asendiks kirjutada.
    Kui nuppu vajutatakse, siis servo hakkab oma hetke asendist liikuma samasuguse rahuliku tempoga paremale poole. Äärde jõudes jääb sinna seisma. Ja eelnevast tulenevalt, kui nupp lahti lastakse, siis liigub hetke asendist uuesti vasakule.

  2.  Guugelda välja vajalik informatsioon ja ühenda arduinoga ultraheli kaugussensor HC-SR04. Kui libraryt nimega NewPing pole su IDEs, siis installi see. Proovi näite NewPingExample kood oma Arduino ja sensoriga tööle saada.*

    Kirjuta kood, mis teeb järgmist:
    Kui sensor tuvastab objekti 10cm ja 100cm vahepeal, siis hakka sisseheitatud 13. pini ledi sisse lülitama heledust tõstes nii aeglaselt, et seda mitme sekundi jooksul jälgida saab. Kasuta while lauset ja && tingimuste 10cm ja 100cm kontrollimiseks. Kui led jõuab täie heleduseni, siis jääb sellisena põlema, kuni kauguse tingimus on täidetud. Kui objekt lahkub vahemikust 10 ja 100cm vahel, siis vähenda ledi heledust alates sellest seisust, kus ta parasjagu oli, samuti rahuliku jälgitava tempoga.

* - NewPing näite koodis kasutatakse lauseid stiilis
#define TRIGGER_PIN  12
NewPing sonar(TRIGGER_PIN, ...

samahästi võid kasutada
int triggerPin = 12;
NewPing sonar(triggerPin, …

Erinevus on selles, et #define puhul pin ei ole muutuja ja salvestatakse teises mälu osas, mis mõnikord võib mälus ruumi optimeerimiseks vajalik olla. Aga hetkel muutuja kasutamine midagi katki ei teeks.

7. tund (9.märts)

Jupid, millest oli juttu:

 

Kella moodul - real time clock module, või lühend RTC. Kõige levinuma mikroskeemi nimi on DS1307, soovitan seda kasutada. Mooduleid on erineva kujuga, aga oluline on nimetusest leida DS1307 ja patarei pesa peaks ka olemas olema.

https://learn.adafruit.com/ds1307-real-time-clock-breakout-board-kit/arduino-library korralik tutorial.

Ultraheli kaugusmõõtja moodul, ultrasonic ranging module. Ebays levinum nimega HC-SR04, aga sarnane on ka viisakamate poodide asi, millel nimeks “PING)))”. Library http://playground.arduino.cc/Code/NewPing

Heli: kõrvaklapi seest pärinev element, kõlar takistusega vähemalt 8 oomi (väiksem takistus annab suurema võimsuse ja võimsus nõuab voolu, mille taluvusel on piirid - Arduino võib läbi põleda. Valjema heli vajaduse jaoks tuleb väiksema takistusega kõlarile lisada võimendi.) Arduino tekitatav heli on nelinurkse lainekujuga (naturaalsed helid on siinuse kujuga), ja kõlab mitte kõige pehmemalt. Aga veel hullemat piiksumist saab pieso elemendiga (piezo). Neid on kaht sorti - ühed sisaldavad kindla kõrgusega heli generaatorit ja neid tulen ainult “sisse lülitada”, teised vajavad sageduse juhtimist samamoodi kui kõlaridki. Vahet saab teha kijelduses sageduse (frequency) ja punase/musta (+/-) tähistusega juhtmete järgi - kui need on, siis on tegemist esimese variandiga, mis vaid kindlat häält teeb. Muudetava sagedusege piezot nimetatakse vahel ka “passive”.

Ebayst otsinguks nt “8 ohm speaker” ja “piezo buzzer”.

Tone library: https://www.arduino.cc/en/Tutorial/ToneMelody?from=Tutorial.Tone

 

LCD - neid on palju erinevaid, graafilisi ja tekstilisi, mustvalgeid ja värvilisi, erinevate suurustega. Isegi puutetundlikke on. Ma ei jõua piisaval hulgal informatsiooni siia kokku kraapida. Guugeldada võib midagi võrdlemisi üldist - “arduino LCD” - ja valida umbkaudu omadused välja. Seejärel kontrollida konkreetse mudeli tunnuse järgi, kas sellele on library olemas ja sulle arusaadav juhend. Veel teadmiseks, et värvilisele LCD-le enamasti saab saata teksti, joonistada lihtsaid geomeetrilisi kujundeid, aga bitmap graafikat (fotode jmt) enamasti kasutatakse SD kaardile salvestatuna, sest Arduino mälu on väike. Neil värvilise LCD moodulitel on tihti ka SD kaardi pesa küljes.

 

Reed switch on magneti lähedusele reageeriv lüliti, mida jalgratta spidomeetrid kasutavad kiiruse mõõtmiseks ja valvesüsteemide ukse andurid on ka nendega. Kui tegeist ei ole miskise komplektiga, vaid palja klaaskestas Reed’iga, siis juurde vaja magnetit, piisab suhteliselt väiksest, aga tugevast magnetist. Otsi nt neodymium magnet. Või lammuta vanad kvaliteetsed nööpkõrvaklapid ära.

Spidomeetri osas abiks, kui vaja on: http://www.instructables.com/id/Arduino-Bike-Speedometer/ , aga ägedam on ise asi läbi mõtelda.

 

Lülitite infos ette tulevad lühendid tähendavad järgmist:

N/O - normally open, kui keegi ei vajuta, (või Reed’i puhul, kui magnetit ei ole) siis lüliti on “välja lülitatud”,

N/C - normally closed, vastupidine eelmisele, läheb “väljalülitatuks” ainult vajutamise ajaks.

SPST - “single pole, single throw” - kõige tavalisem ühte juhet kokku ja lahti lülitav.

SPDT - “single pole, double throw” - lülitab üht “sissetulevat” juhet ühe või teise “väljuva” juhtmega kokku.

DPDT - “ dual pole, dual throw” - lülitab korraga kaht eraldi vooluahelat, ja kummalgi neist on 2 suunda, mille vahel vahetada. Pmst nagu oleks kaks SPDT lülitit kõrvuti ja nende nupud kokku liimitud, nii, et saab lülitada ainult korraga.

 

Thermistor ehk temperatuuritundlik takisti … panen ainult lingi tutorialile: https://learn.adafruit.com/thermistor/using-a-thermistor

 

 

Veel läheb teil arvatavasti vaja:

8. tund (16. märts)

Muutuja tüübid ja massiivid

Vaata https://www.arduino.cc/en/Reference/HomePage Variables -> Data types

Muutuja tüüp määrab ära, mis sorti väärtust saab sellesse muutujasse salvestada. Muutuja tüüp kirjutatakse muutuja deklareerimisel, nt:
int i;
Siiamaani oleme enamiku näiteid teinud int tüüpi muutujatega. Int võtab mälus 2 baidi jagu ruumi ja mahutab täisarvulisi (integer) väärtusi vahemikus -32 768 kuni 32 767. Sellest vahemikust väljaspool või komakohaga arvu int tüüpi muutujasse salvestada ei õnnestu.

4 baidi suurune täisarvuline muutuja on long, mis mahutab väärtusi -2 147 483 648 kuni 2 147 483 647.

Olemas on ka unsigned int ja unsigned long, mis salvestavad ainult positiivseid täisarve ehk vastavalt vahemikkudes: unsigned int 0 kuni 65 535 ja unsigned long 0 kuni 4 294 967 295.

Tegelikult muutujate suurus mälus ja seega salvestatava väärtuse vahemik varieerub mõnede Arduino kontrollerite vahel (C-keel ei esita piisavalt ühtseid nõudeid), aga siin räägitu kehtib enamlevinud boardidele.

Komakohaga muutujate jaoks on kaks tüüpi float ja double, aga enamiku Arduino kontrollerite puhul on nende maht ühesugune: 4 baiti ning täpsus väljendatud -3.4028235E+38 3.4028235E+38

Oluline meelde jätta arvuliste muutujate kohta:

  • Kui muutuja väärtus ei tule selline, nagu sa kavatsesid, kontrolli, kas muutuja on sellise tüübiga, mis võimaldab üldse soovitud väärtust salvestada. See kehtib nii arvu suuruse, kui ka komakoha suhtes. Komakohaga arvutuste jaoks deklareeri osalevad muutujad float tüüpi.

 

Boolean tüüpi muutuja salvestab binaarse väärtuse: true või false. Kuna see salvestatakse kujul 1 või null, siis on samaväärsed:

boolean myBool = true;
boolean myBool = 1;

Boolean muutujaid saab kasutada tingimuslausetes lühikeselt kirjutades:
if (myBool) , mis on samaväärne if (myBool == true)

Boolean väärtusi saab "pöörata" loogilise eituse tehtega:

boolean myBool = true;
byBool = !myBool;

annab tulemuseks et myBool on nüüd false.

Ning kuna keywordid HIGH ja LOW samuti tähendavad 1 ja 0, siis on ka need kasutatavad sarnaselt boolean muutujatele, näiteks:
if (digitalRead(2)) annab sama tulemuse, mis if (digitalRead(2) == HIGH) või if (digitalRead(2) == 1)

Ja HIGH ja LOW saab samuti pöörata loogilise eitusega:

ledState = LOW;
void loop() {
  digitalWrite(13, ledState);
  delay(1000);
  ledState = !ledState;
}

- tulemuseks on sekundi tagant sisse ja välja lülitumine.

 

Array ehk massiiv on ühise nime alla koondatud üht-sama tüüpi muutujate kogum. Massiivi deklareerimiseks on mitu võimalust, peamised neist:

int myArray1[4]; //tekitati 4 kohta int tüüpi muutuja salvestamiseks
float myArray[] = {0.5, 0.6}; //tekitati 2 kohta float tüüpi muutujate salvestamiseks ja sinna salvestati 0.5 ja 0.6

Nurksulud näitavad, et tegemist on massiiviga. Deklareerimisel arv nurksulgudes näitab, mitu "kohta" ehk muutujat massiivi sisse luuakse. Arvu võib (aga ei pea) ära jätta, kui väärtused omistatakse deklareerimisel ja seda saab teha loogelistes sulgudes komadega eraldatuna.

Massiivis salvestatud muutujate kasutamiseks ja neile uue väärtuse omistamiseks viidatakse neile masiivi nime ja indeksiga nurksulgudes. Indeksid algavad nullist.

int myVar = myArray[0] + myArray[3];

Massiivi pikkust hiljem muuta ei saa ja selle deklareerimisel ei saa pikkusena kasutada muutujat, aga saab kasutada konstanti.

Nullist algavad indeksid tähendavad, et viimane indeks on ühe võrra väiksem masiivi pikkusest. See tähendab, et for loopis saab kasutata indeksi jaoks loendajat 0-st kuni < massiivi pikkus:

const int arrayLength = 4;
float myArray[arrayLength];
...
for (int i=0; i<arrayLength; i++) {
  myArray[i] = 42; // kõik massiivi elemendid käiakse läbi ja omistatakse igaühele väärtuseks 42
}

 

Veel on olemas char tüüpi muutujad, mis salvestavad 1 baidina ASCII märke. Tähemärk pannakse ühekordsete jutumärkide vahele. Igale tähemärgile vastab mingi arv -127-st kuni 126 vahemikust.
char myChar = 'a';

Sõnade ehk stringide salvestamiseks saab kasutada massiivi char muutujatest, mille deklareerimiseks on jällegi mitu viisi, lihtsaim:
char myWord[] = "EKA";
Sõna pannakse kahekordsete jutumärkide vahele, erinevalt üksikust char-ist, millel käisid ühekordsed jutumärgid. Aga selliselt defineeritud char array tegelik pikkus ei ole 3 vaid 4 märki, sest sõnadel on null-termination - massiivi elemendid on 'E', 'K', 'A', '/0'.
Kus sellist char array-d või sõnade muutujasse salvestamist Arduino kontekstis kasutada, mina head näidet tuua ei oska. Aga teadmiseks, et lisaks char arrayle on olemas veel teine asi - String objekt, mis võimaldab tähemärkidega mõningaid trikke teha. https://www.arduino.cc/en/Reference/StringObject Kui õpite mõnd rohkem tekstiga tegelevat programeerimist, kui Arduino seda on, siis seal tuleb selliste asjadega tegemist.

 

Muutuja tüüpe on mõned veel, aga põhilise ja enamvajaliku katavad int, long, unsigned int, unsigned long, float, boolean ja char massiiv ära.

Massiividele ehk arraydele leiab programmeerimises tihti rakendust.

Järgmise teemaga haakuvalt on olemas veel üks eriline muutuja tüüp - void - mida saab kasutada ainult funktsiooni return type'i tähistamiseks.

 

 

Funktsioonid

Jutt sketchi screeshottidel allpool (ja samad sketchid ka allalaetavana: siin ). Seal on veidi enamat, kui tunnis rääkida jõudsin.
 

Ärajäänud tunni asemel (30.märts)

Kuidas alustada oma Arduino-projekti?

  1. Mõtle läbi, mida su seadeldis tegema hakkab, parem pane kirja. Kas teeb midagi niisama, kogu aeg? Kas teeb midagi kasutaja tegevusele reaktsiooniks? Kuidas kasutaja oma käsklused seadmele annab? Kas mõõdab midagi ja reageerib mõõtetulemustele?

  2. Mõtle läbi milliseid juppe nende interaktsioonide jaoks vajad, pmst kõik sisend ja väljund seadmed. Kontrolli, et kõigi vajalike kasutaja käskluste peale oled mõelnud, see kipub kergemini kahe silma vahele jääma.

  3. Kirjuta kõik need komponendid üles ja otsi netist kasutusnäited kõige kohta, mida sa varem läbi teinud ei ole. Pane kirja moodulite nõudmised ühendusele - mitu pini neil vaja on, kas need peavad olema “erilised” - PWM, analoog, interrupt pinid. Mitmed moodulid suhtlevad I2C nimelise protokolliga ja Arduinol asub see kindlatel pinidel (A4, A5 enamikul, Mega, Leonardo ja Due puhul erineb http://www.arduino.cc/en/Reference/Wire). Aga hea külg on see, et I2C lubab sinna ühendada mitu moodulit ühekorraga ja suhtleb nendega edukalt aadressi järgi. Mõtle läbi, kas mingid komponendid (nupud, andurid) vajavad pullup või pulldown takisteid. Pane oma uuringu tulemused kirja ja koosta plaan, millisele pinile midagi ühendad.

  4. Kui tegemist on projektiga, mis sisaldab suure voolu tarbega või Arduino viiest voldist erinevat toidet nõudvaid asju (mootoreid, heledamat valgustust või mooduleid, mis 3.3V-ga töötama mõeldud ja ei sisalda juba 5V sobitust), siis otsi netist, milliseid akusid või muud toidet on teised kasutanud. Samuti vaata teiste pealt, milliseid transitore on vooluahnete või kõrgemal pingel töötavate asjade jaoks kasutatud. 3.3V asjad tavaliselt vajavad pingeregulaatorit toitele ja pingejagureid mooduli sisenditele (st arduino väljunditele). Pane tähele, et eri pingega, näiteks eraldi akudelt, töötavate asjade puhul peavad nende GND-d olema kokku ühendatud.

  5. Joonista elektroonikaskeem. Selle võib vahele jätta lihtsa Arduino kaudu toidet saava projekti puhul, kui tunned ei kõik on ilmselge. Aga enamasti on kasulik joonistada. Paber ja pliiats on piisavalt kiired vahenid selleks.

  6. Koodi kirjutamine võib algul olla keerulisem osa. Soovitan siin alguses ja iga kord kui mõte kokku jookseb inimkeeles kirja panna, mida saavutada tahad. Leia oma jutus kohad “juhul kui …”  ja “seni kuni …”. Need viitavad vajalikele if ja while lausetele. Kui neid on rohkem kui 2, siis proovi need omakorda grupeerida, nt andur A seisu 1 korral andur B seis 1 ja seis 2 ja andur A seisu 2 korral anrudr B seis 1 ja seis 2.  

  7. Mõtle välja varukoopiate tegemise süsteem, sest vanemat töötavat versiooni võib mingi hetk vaja minna. Mulle on üks lihtsamaid olnud salvestada veidi harvem, aga failinimes kasutada kuupäeva ja kellaaega stiilis 160330-1317 (aasta|kuu|päev-tund|minut) - siis lähevad nad faililoendis õigesse järjekorda ka. Halb pool on see, et Arduino ide sketside menüü kaob nurga taha, kui seal liiga palju faile. (Kui kunagi tõsisemalt programeerimist õppida otsustad, siis õpi ka mõni versioonihaldus süsteem selgeks, näiteks GIT https://www.udacity.com/course/how-to-use-git-and-github--ud775)

  8. Lae alla kõik vajalikud libraryd ja soovitavalt proovi, kas saad moodulid library näidise koodiga tööle.

  9. Pane oma sketsi kondikava kirja koodikommentaaridena, see ei pea kohe täielikuks saama, aga aitab tervikule mõelda. Täienda neid märkmeid edasise töö käigus.

  10. Hakka koodi kirjutama ühe-kahe komponendi jaoks. Näiteks kui su projekt on keeruline äratuskell, mis muuseas näitab kellaaega minuti täpsusega, siis pane arduino mõistliku intervalli tagant kellamoodulilt aega küsima ja seda ekraanile kirjutama. Kui esimene jupp on tööle saadud, lisa järgmine jupp. Liiga pikalt pusida koodi kallal, kus kõik on alustatud, aga mitte midagi ei saa testida, sest kõik pole valmis, ei ole eriti efektiivne ega motiveeriv.   

  11. Testi breadboardil, monteeri hiljem, kui end elektroonika poolel väga tugevalt ei tunne. Selleks on hea omada Arduino Unot, kuhu kergem ajutiselt asju ühendada, testima ei pea sama Nano või Pro Miniga, mis projekti sisse paned, need on igati sarnased, ainult kompileerimisel vajalik õige nimi valida. Kui su projekt sisaldab vooluahneid või füüsiliselt suuri komponente, mis breadboardiga kokku ei sobi, siis võid need enne omamoodi mooduliks kokku monteerida.

  12. Kompileerimisvigade vastu esiteks loe veateadet tähelepanelikult. See ütleb ka reanumbri. Vahel on seal mitu reanumbrit, osad neist library failides, otsi seda, mis on sinu sketsi faili kohta. Arduino ide näitab reanumbrit, kus kursor parasjagu asub, akna allosas. Kui ei saa aru, mis valesti, siis guugelda veateadet.

  13. Kui kompileerimine korras, aga üles laetuna kood ei tee seda, mida ootasid, siis kirjuta Serial.print lauseid, et teada saada, kas if lausetes jõutakse õigesse kohta välja üldse, või kas muutujate väärtused on sellised nagu arvatud. Näiteks Serial.println(“nupu vajutus tuvastatud”); või buttonStatus = digitalRead(3); Serial.print(“D3: “); Serial.println(buttonStatus);

  14. Kui mitte kuidagi ise probleemist üle ei saa ja guugel ei aita, siis küsi abi. Abi küsimisel tasub ära aja pühendamine koodi treppimiseks ja koodi kommentaaride lisamiseks - mida see jupp koodi tegema peaks. Tegelikult neid algusest peale tehes, on endal nii palju lihtsam, et abi vajamise tõenäosus langeb.

  15. Elektriliste vigade kahtluse korral hangi multimeeter ja mõõda: kas kõik kohad, mis peavad olema omavahel ühenduses, on ühenduses - seda mõõda kui toide on väljas; kas kõik kohad, mis peavad saama toidet, on vastaval pingel GND suhtes.

  16. Monteeri kokku, korda elektriliste vigade väljaajamise protsessi, viimistle ilusaks.

  17. Ole enda üle väljateenitult uhke!