matpi / EmbeddedSystemsUTU

This repository concerns the course KSA4 Embedded Systems (craft, design and technology education) in the University of Turku, Department of Teacher Education, Rauma Unit in the academic year 2014
4 stars 5 forks source link

Koodiopas #29

Open matpi opened 9 years ago

matpi commented 9 years ago

Oheinen materiaali PDF-muodossa löytyy osoitteesta: http://arduino.karp.pw

Johdanto

Tämä materiaali on tarkoitettu muualta opitun tueksi ja ennen opitun kertaamiseksi. Siihen on kirjattu vain arduino-ohjelmoinnin perusasioita, joiden muistelemisesta voi olla kiperän tilanteen sattuessa hyötyä, eikä se näin ollen poista tarvetta opiskella ohjelmointia ruohonjuuritasosta alkaen. Yksinkertaisuudessaan ja monimutkaisuudessaan ohjelmointi on mukavaa aivopähkinää ongelmaratkaisuineen ja motivoivaa työskentelyä näkyvän lopputuloksensa vuoksi. Serial.println (”Hello World!”);

-Lauri ja Mikko

Ohjeita materiaalin käyttöön

Kun ohjelmointia teet ja tämä läpyskä on vieressäsi, istut luultavammin myös internetyhteyden vieressä. Kehotamme lämmöllä käyttämään hakukoneita, sillä niiden hakutulokset usein selventävät sinulle vaikeaksi jäävää asiaa. Materiaaliin on myös tiputeltu ohjelmoinnin komentoja ja termejä helposti erotellussa muodossa, ikään kuin hakuvinkkinä. Ne ovat vaikeita sanoja, jotka on merkitty sulkein ja kursiivilla. Esimerkiksi (muuttuja). Koska Arduinoa kuitenkin ohjelmoidaan C-kielien sukuisella ohjelmointikielellä, voi pelkkä merkitty sana tuottaa hakutuloksia hieman sivuun sinua koskevasta aiheesta, on hyvä lisätä hakuun myös sana ”arduino”. Tarkempaa tietoa saat myös kurssin GitHub-alustalta. Sen wiki-osio on kattava ja yksityiskohtainen, kun tämä vihkonen taas on vain ensihätään.

Esimerkkihaku boolean-muuttujasta: Google: Boolean

Saat yleislaatuista tietoa boolean-muuttujasta. Toki tämäkin voi olla hyödyllistä, mutta booleaninkin yksityiskohdat muuttuvat koodattavan kielen mukaan.

Google: Boolean arduino

Heti ensimmäinen hakutulos on arduinon oma sivunsa boolean muuttujasta. Tältä sivulta saat varmasti paikkaansa pitävää ja ajantasaista tietoa booleanista ja sen käytöstä.

Mikä on arduino?

Arduino on ohjelmoitava mikrokontrolleri, eli laite jolla voi tehdä kaikkea kivaa. Sillä voit esimerkiksi vilkuttaa ledejä ja ohjata erilaisia laitteita. Jotkut ovat jopa tehneet älypuhelimella ohjattavan tankin. Yksinkertaisesti sanottuna mikrokontrolleri on mikropiiri, pieni tietokone, jonka sisään- ja ulostuloja voidaan ohjelmoida tietokoneen avulla.

Arduino koostuu kahdesta osasta: Tietokoneella käytettävästä ohjelmointisovelluksesta ja fyysisestä mikrokontrollerista. Olipa kyseessä mikä tahansa arduino-alusta, sitä ohjelmoidaan samalla sovelluksella ja samalla tavalla kuin muitakin alustoja. Koska Arduino on avoin järjestelmä, laitteita on alkuperäisen Arduino-tuotemerkin lisäksi myös muiden valmistajien tekeminä. Nämä ovat usein kopioita ja paranneltuja versioita alkuperäisistä alustoista. Tunnettuja merkkejä ovat esim. Funduino ja Meduino.

ard_pin

Arduino-alustan pinnijaottelu

Kuvassa näkyy Arduino Uno:n tärkeimmät pinnit. Pinnien jaotteluperiaate on sama kaikissa arduinoissa: Digitaaliset sisään- ja ulostulot, analogiset sisääntulot, maapinnit ja jännitteen sisään ja ulostulot. Tarkemmat tiedot löydät aina valmistajan nettisivuilta, tässä tapauksessa http://arduino.cc/en/Main/arduinoBoardUno

Arduino-ohjelmoinnin aloittamiseksi on oltava seuraavat välineet:

o Arduinotulkki Arduinotulkki on ohjelma, jonka voi ladata ja asentaa maksuttomasti Arduinon kotisivuilta, Downloads-välilehden takaa osoitteesta: http://arduino.cc/en/Main/Software . Arduinotulkki on mahdollista asentaa sekää Windows, MacOS että Linux-ympäristöihin.

o Jokin Arduino-mikrokontrolleri Kurssin puitteissa harjoitusmateriaalina käytetään Arduino Uno ja Arduino Nano –malleja.

o USB-johto Sopiva USB-johto tulee yleensä ostetun Arduinon mukana ja koska USB sisältää yleiset liitinstandardit, saattaa sopivia johtoja olla myös muiden laitteiden ohessa.

Kun arduinotulkki on asennettu tietokoneeseen, voi aloittaa koodin tuottamisen vaikka heti. Koodaaminen tapahtuu hieman windowsin muistiota muistuttavassa ikkunassa, johon teksti joko kirjoitetaan näppäimistöllä tai se kopioidaan toiseesta lähteestä.

ikkun

Kun halutaan siirtää jo valmis koodi tietokoneelta Arduinolle, on ensin kytkettävä Arduino ja tietokone toisiinsa sopivalla USB-johdolla. Kun Arduino on kiinni ja siinä syttyy ledvalo käynnistymisen merkiksi, tulee valita tulkin tools-valikosta kohta ”Board”. Aukeavasta valikosta etsitään omaa Arduinoa vastaava alustamalli. Alustamallin valinnan jälkeen valitaan Serial Port-kohta. USB-väylä on aina merkinnältään COM-alkuinen, esimerkiksi COM24 ja jokainen USB-portti on merkitty eri numerolla. Ensimmäisillä kerroilla tai vieraalla koneella selkeää yhteyttä USB-portin fyysisen paikan ja Serial Port-tunnuksen kanssa ei ole havaittavissa, vaan Serial Port-tunnus on kokeiltava yrityksen ja erehdyksen kautta.

kytk

Kun Arduino on oikealla tavalla yhdistetty tietokoneeseen, on aika kokeilla koodin viemistä tulkilta mikrokontrollerille. Alla olevassa kuvassa näkyy tulkkiohjelman yläreunassa olevat kuvakkeet.

kuvakk

Kuvake yksi (1) ajaa koodin tarkastuksen, jossa tulkki tarkastaa koodista esimerkiksi kirjoitusvirheet. Tulkki ei kuitenkaan ymmärrä kaikkia mahdollisia virheitä!

Kuvake kaksi (2) ajaa koodin tulkin läpi ja jos tulkki ei löydä koodista virheitä, ajaa se sen myös mikrokontrollerille.

Kuvake kolme (3) luo uuden tyhjän koodiasiakirjan. Tämän saa tehtyä myös painamalla File ->New tai pikanäppäimellä Ctrl+N.

Kuvake neljä (4) aukaisee aiemmin tallentamasi koodiasiakirjan. Tämän saa tehtyä myös painamalla File -> New tai pikanäppäimellä Ctrl+O.

Kuvake viisi (5) tallentaa aktiivisen koodiasiakirjan myöhempää aukaisua varten. Tämän saa tehtyä myös valitsemalla File -> New tai pikanäppäimellä Ctrl+S.

Jos koodia mikrokontrollerille ajettaessa tulkki antaakin virheilmoituksen, pääsee parhaiten sen sisällöstä selville syöttämällä virheilmoituksen internetin hakukoneeseen. Virheilmoituksia on useita erilaisia ja tässä materiaalissa on käyty läpi vain muutama useimmin ongelmaksi muodostuvista. Vaikka tulkki olisikin päästänyt koodin lävitseen ja ajanut sen mikrokontrollerille, ei se tarkoita, että koodi toimisi niin kuin sen on tarkoitus. Näissä tapauksissa ei auta kuin koodin läpikäyminen tarkasti. Toimimattoman koodin korjaamiseen, kts. Koodin yleisimmät virheet.

Koodin rakenne

Koodin rakenne näyttää monimutkaiselta, mutta oikeastaan sen toiminta on yksinkertaista. Arduinon ohjelmista löytyvät aina kolme osaa: Määrittelyt, setup ja loop. Arduino-ohjelmassa voi olla myös muita osia, mutta nämä kolme löytyvät aina arduino-ohjelman rakenteesta.

koodirak

Esimerkkikuvassa määrittelyt ovat kaksi ensimmäistä riviä. Määritellään int-muuttujat kytkin ja led (kts. Muuttujat). Määrittelyjen jälkeen alkaa setup-osio, jossa pinnit kuusi (kytkin) ja seitsemän (led) määritellään kumpikin omaan käyttöönsä.

Loop-osiossa kerrotaan Arduinolle, mitä tehdä ja missä tilanteessa. Se on osio, jota arduino suorittaa loputtomasti, eli käytännössä niin kauan kuin virtaa riittää. Katso alta visualisoitu kuvio koodin kierrosta.

loop

Pinnin määrittely

Sen lisäksi, että on määriteltävä käytetyt muuttujat, on määriteltävä myös pinnin asetukset. Pinnien asetukset määritellään setup-osiossa. Setup-osiossa tulee määritellä, onko pinni sisääntulo (INPUT) vai ulostulo (OUTPUT). Esimerkkinä edellisen sivun kuvasta:

pinMode (led, OUTPUT);

Komennolla pinMode tapahtuva määrittely tehdään pinnille 7, koska määrittelyissä muuttujan led arvoksi on määritelty 7. Koska pinniin 7 on kytketty led, jolle halutaan antaa virtaa, on pinni määriteltävä ulostuloksi.

Digitaaliset pinnit (DigitalRead ja DigitalWrite)

Mallista riippuen näitä on eri määrä, mutta perus Arduino Unossa näitä on 14 ja ne on merkitty numeroilla 0 – 13. Digitaalinen pinni voi toimia sisääntulona (input), jolloin se vastaanottaa virtaa esimerkiksi painalluskytkimessä, jolloin se saa tiedon painonapin painamisesta. Se voi myös toimia ulostulona (output), jolloin se lähettää virtaa jollekin laitteelle tai komponentille, esimerkiksi ledille.

Analoginen sisääntulo (AnalogRead)

Arduino Unossa analogisia sisääntuloja on kuusi ja nämä pinnit on merkitty tekstillä ANALOG IN ja kirjain-numero yhdistelmillä A0 – A5. Nämä sisääntulot saavat analogisen arvon eri komponenteilta, kuten potentiometri tai ultraäänianturi. Arduino muuttaa tämän analogisen arvon numeroksi, jota voit käyttää ohjelmoidessasi.

Analoginen ulostulo (AnalogWrite)

Jotkin Arduinon digitaalisista pinneistä on merkitty numeron lisäksi myös viivalla. Unossa ne ovat pinnit 3,5,6,9,10,11. Näitä voi käyttää myös analogisina ulostuloina sen ollessa tarpeellista. Tämä johtuu siitä, että näissä pinneissä on pulssileveysmodulaatia (PWM tai Pulse width modulation).

Muuttujat

Muuttujatyyppejä on erilaisia ja tässä käydään läpi vain arduino-ohjelmoinnin kannalta yleisimmät ja tarpeellisimmat. Lisätietoja löydät etsimällä internetistä hakusanoilla muuttuja, muuttujat, variable tai variables. Voit myös pistää hakuun mukaan sanan arduino, jolloin saat ohjeita vain arduinolle kelpaavista muuttujista. Muuttujat on fiksua määritellä aina koodin alussa, määrittelyissä, jotta niiden kaikkien määrittelyt löytyvät samasta paikasta.

int = (interger) = kokonaisluku

Määrittely: int kytkin = 3; tai int kytkin = -3;

Intergermuuttuja tai int saa aina arvokseen numeraalisen kokonaisluvun. Int-muuttujaan ei voi tallentaa muunlaista arvoa. Int-muuttujan arvo voi kuitenkin olla sekä positiivinen, että negatiivinen. Int on muuttujista yleisin ja eniten käytetty.

float = (floating point) = desimaaliluku

Määrittely: float muuttuja = 3.345;

Samankaltainen, kuin interger ylempänä, mutta saa arvokseen desimaaliluvun. Huomioi, että floatissa käytetään desimaalipilkun sijasta pistettä. Tämä on yleistä useimmissa ohjelmointikielissä.

char = (character) = kirjain/kirjoitusmerkki ja Str = (String) = Merkkirivi

Määrittely: char merkki = ’a’; tai char Str1[8] = ”arduino”;

Char-muuttuja saa arvokseen aina yhden kirjaimen tai kirjoitusmerkin. Jos haluat siis muuttujaksesi yhden sanan, tarvitsee sinun tehdä char-muuttujastasi string. Stringin yhteydessä oleva hakasulkein suljettu numero tarkoittaa stringissä olevien merkkien määrää.

boolean = (boolean) =Tosi/epätosi

Määrittely: boolean kaynnissa = true; tai boolean kaynnissa = false;

Boolean-muuttujaan voidaan tallentaa tieto siitä, onko jokin tosi vai epätosi. Loput mahdollisuudet löydät totutusti arduinon verkkosivuilta: http://arduino.cc/en/Tutorial/Variables

Tyypillisimmät ohjelmointilauseet

Kaikkein tyypillisen ja useimmitten tarvittu lause ohjelmoinnissa on if-lause. Sen avulla saadaan aikaan linkki kahden asian välille. Esimerkkinä, jos muuttuja luku on suurempi kuin kolme, sytytetään ledi pinnissään. Tämä toimenpide tapahtuu tällaisella koodin pätkällä:

if (luku > 3); Tällä rivillä annetaan ehdot, joiden täyttyessä arduino suorittaa aaltosulkeisiin merkityt tehtävänsä.

{ Aaltosulkeet rajaavat komennot, jotka suoritetaan ehtojen täyttyessä. digitalWrite(led,HIGH); }

Toinen tyypillinen lause ohjelmoinnissa yleensä on for-lause, jonka ymmärtäminen on hieman monimutkaisempaa kuin if-lauseen ymmärtäminen ja käyttäminen. For-lauseen määrittelyissä on kolme osaa. Ensimmäisessä osassa määritetään lähtöarvo for-lauseessa käytettävälle muuttujalle. Esimerkissä määritetään muuttujalle luku lähtöarvoksi 1. Toisessa osassa testataan, onko muuttujan ehtojen mukainen. Esimerkissä kokeillaan, onko muuttujan luku arvo pienempi kuin 250. Kolmannessa kohdassa on toimenpide, joka muuttujalle tehdään for-lauseen jokaisen läpiajon jälkeen. Esimerkissä muuttujan luku arvoon lisätään joka kierroksen jälkeen 1

for ( int luku = 1; int luku <=250 ; luku++) { digitalWrite(led,HIGH); delay(100); digitalWrite(led,Low); delay(100); }

For-lauseen kolmannen kohdan hoxhox-pähkinä:

Esimerkkinä toimivan for-lauseen toimenpiteenä on erikoinen luku++, joka tarkoittaa sitä, että muuttujan luku arvoa muutetaan joka for-kierron jälkeen yhtä kokonaislukua suuremmaksi. Eli jos luku on ensimmäisellä kierroksella arvoltaan 1, on se ensimmäisen kierroksen jälkeen arvoltaan 2 ja for lähtee alusta.

For-lauseen kolmas kohta, eli muuttujan muokkaaminen voi sisältää monenlaisia laskutoimituksia ja siinä toimivatkin lähes kaikki matemaattiset toimenpiteet. Voit siis pistää esimerkin tilalle esimerkiksi ” luku * 5 ” jolloin tietenkin for-lause etenisi loppuunsa aikaisemmin kuin pelkällä luku++ -laskutoimituksella.

Koodin yleisimmät virheet

Tulkki päästää koodin lävitseen, vaikka se ei toimisikaan halutusti suorittaessa. Tästä löydät yleisimmät korjaustoimet koodin korjaamiseen.

Onko sinulla käytössä samat pinnit sekä fyysisesti, että koodissa?

Yksinkertaisimmillaan johdon on kytkenyt eri pinniin, kuin mihin mikropiiri koodin ohjaamana antaa virtaa. Tämä on helppo korjata joko koodista, tai johtoa siirtämällä.

Onko muuttujat kirjoitettu oikein?

Muuttujien pitää olla joka paikassa kirjoitettuna samalla tavalla, että mikropiiri ymmärtää ne oikein suorittaessaan. Katso muuttuja kerrallaan kirjoitusasu ensin määrittelystä ja sitten koodin keskeltä.

Sopivatko muuttujatyypit tehtäväänsä?

Int-muuttujaa ei voi käyttää kirjoitusmerkkiarvona, eikä char-muuttujaa kokonaislukuna.

Onko osilla aikaa suorittaa mikropiirin antama käsky?

Mikropiiri käy koodiloopin läpi sekunnin tuhannesosissa. Tällainen aika ei riitä esimerkiksi servomoottorin liikuttamiseen. Osille pitää antaa toimimisaikaa esimerkiksi delay-komennolla. (Googlaa delay, jos se on sinulle vieras.)

Onko kaikki sulkeet suljettu oikeassa kohtaa?

Sulkeita, lainausmerkkejä ja aaltosulkeita. Tulkki katsoo vain, että näitä on oikea määrä, eikä mikään näistä jää auki. Eli sulkeiden sisällä voi olla käytännössä mitä tahansa, mitä sinne olet kirjoittanut. Seuraa siis sulkeiden avausrivistä aina funktion sulkevaan sulkeeseen, että niiden välissä on oikeat asiat.

Onko koodisi vahingossa kommenttia?

Harvoin, mutta kuitenkin joskus käy niin, että kommentti onkin jäänyt auki ja kaikki sen jälkeinen teksti onkin kommenttia. Vilkaise siis myös, että kommenttisi on lopetettu siihen missä se loppuu. Jos ongelmaasi ei löytynyt näistä kohdista, käy oman tietotaitosi mukaan koodi läpi, osuiko silmiisi joku virhe? Käy myös läpi funktiosi. Toimiiko if tai while niin kuin meinasit vai pitäisikö sinun koittaa saavuttaa haluttu tulos toisella tavalla? Arduinon oma troubleshoot on myös erittäin laaja ja se löytyy verkosta: http://arduino.cc/en/guide/troubleshooting

Robojuchen commented 9 years ago

Loistavaa! Noihin virheisiin olisi ehkä hyvä saada ruudunkaapauksia yleisistä koodinkääntötilanteen vikailmoituksista ja selitykset. Näitä on nimittäin vaikea tulkita ja niihin törmätään jatkuvasti.

Sarjaporttia ei välttämättä tarvitse arvailla vaan sen voi katsoa laitehallinnasta (device manager). Tosin usein se on helppo arvata.

Ultraäänianturi ei anna analogista outputtia.

Analogisisia inputteja voi käyttää myös digitaalisina pinneinä, tämä olisi hyvä mainita.

Tästä voisi ehkä tehdä oman sivun wikiin? Voisi sitten muokkailla ja kehittää tätä?

matpi commented 9 years ago

Juu... Tämä on Laurin ja Mikon tekemä materiaali (viime vuosikurssin opiskelijoita). Se on ollut minulla Pdf- tiedostona, mutta en ole tullut jakaneeksi sitä. Täytyy vielä varmistaa, että pojat eivät pahastu tästä siirrosta tänne wikiin :) Alkuperäinen www-materiaali löytyy siis seuraavasta osoitteesta: http://arduino.karp.pw