arduinon ohjelmointi - mycourses · arduinon ohjelmointi 24. syyskuuta 2016 17 globaali vs lokaali...

67
Arduinon ohjelmointi Sami-Petteri Pukkila sami-petteri.pukkila@aalto.fi 26. syyskuuta 2016

Upload: hadat

Post on 19-Oct-2018

222 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointiSami-Petteri [email protected]

26. syyskuuta 2016

Page 2: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

2

Arduino-ohjelman rakenne

int ledpin = 13;

void setup()

pinMode(ledpin , OUTPUT);

void loop() digitalWrite(ledpin , HIGH);delay (1000);digitalWrite(ledpin , LOW);delay (1000);

Page 3: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

3

Muuttujathttps://www.arduino.cc/en/Tutorial/Variables

int︸︷︷︸tyyppi

omenamaara︸ ︷︷ ︸nimi

= 5︸︷︷︸arvo

;

I Tyyppi (kokonaisluku, kirjain, ...)I Jokainen muuttuja on jonkin tyyppinen.I Vrt. esim Python missä muuttujalla on vain nimi ja arvo

I ArvoI Mikäli muuttujalle ei luomishetkellä anneta arvoa, se voi olla

mitä tahansaI Muuttujan arvo ei siis oletuksena ole nolla!

Page 4: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

4

Tärkeimmät muuttujatyypithttps://learn.sparkfun.com/tutorials/data-types-in-arduino

I Kokonaisluku (int, long) int muuttuja = -4;I Liukuluku (float, double) float muuttuja = 4.0;I Merkki (char) char muuttuja = ’a’;

I Vain ASCII-järjestelmän merkitI Aakkoset ja numerot löytyvät, ääkköset eivät

I Totuusarvo (boolean) boolean muuttuja = true;I Tosi (true) tai epätosi (false)

Page 5: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

5

Muuttujatyypit

I Kieli on vahvasti tyypitettyI Jokaisen muuttujan tyyppi on siis määritelty

luomisvaiheessaI Tyyppi määrää:

I Millaisia arvoja muuttuja voi sisältääI Mitä muuttujalla voi tehdäI Paljonko muuttuja vie tilaa ohjelman muistissa

Page 6: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

6

Muuttujatyypit laskutoimituksissa

Arduino ei automaattisesti muunna muuttujatyyppejä ihmisenmieleen sopiviksi.

int kokonaisluku = 2;float muuttuja1 = 3/ kokonaisluku; // 1float muuttuja2 = 3.0/2.0; // 1.5float muuttuja3 = 3.0/( float)kokonaisluku; // 1.5

I (tyyppi)muuttuja-notaatio muuntaa muuttujan tyypinI Muunnos isommasta tyypistä pienempään aiheuttaa

ongelmia jos muunnettava arvo on liian iso. (long→ int)

Page 7: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

7

Lukutyypit

Laskutoimituksissa ja sijoituksissa voi merkitä lukuja erilukujärjestelmissä

I 0123 (oktaali)I 0b10100011 (binääri)I 0xA3 (heksadesimaali)I 3.4e3 (3.4 ∗ 103)

Myös muuttujatyypin voi erikseen määrätä. Hyödyllistäesimerkiksi laskutoimituksissa.

I 7U (unsigned)I 11L (long)I 15UL (unsigned long)I 12.3f (liukuluku)

Page 8: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

8

Tärkeimpiä operaattoreita

summa 1+2 = 3erotus 1-2 = -1tulo 1*2 = 2osamäärä 1.0/2.0 = 0.5jakojäännös 5%3 = 2

Page 9: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

9

Muutama oikotie

summa a += 2 a = a+2erotus a -= 2 a = a-2tulo a *= 2 a = a*2osamäärä a /= 2.0 a = a/2kasvata yhdellä a++ a = a+1vähennä yhdellä a−− a = a-1

Page 10: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

10

Under-/overflow

I Mikäli muuttujan arvo menee muuttujatyypin alueen yli,"pyörähtää muuttuja yli"

byte c = 0; // c = 0--c; // c = 255c = c + 1; // c = 0

Page 11: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

11

TaulukotI Hyvä väline esimerkiksi useamman ledin nastanumeroiden

säilömiseen.

int led_pin [3] = 3, 5, 6;// led_pin [0] on nyt 3// led_pin [1] v a s t a a v a s t i 5

I Taulukon jäseniä kutsutaan alkioksi.I Alkioon pääsee käsiksi syntaksilla nimi[alkio]I Indeksointi alkaa nollasta

led_pin [1] = 2;// led_pin vastaa nyt määritelmää 3 , 2 , 6

Page 12: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

12

Tekstihttps://www.arduino.cc/en/Reference/String

I C-kielessä ei ole erillistä muuttujatyyppiä tekstille, vainmerkeille (char)

I Merkkijonot esitetään char-taulukkona

char materiaali [] = "puu";// materiaali-muuttuja vastaa nyt// määritelmää ’ p ’, ’u ’, ’u ’, ’\0 ’

I Merkkijonon lopussa ns. nollatavuI Työkalut pystyvät päättelemään mihin merkkijono loppuu.I Kolmen merkin merkkijonon tallentamiseen tarvitaan siis

neljä merkkiä!

Page 13: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

13

Merkkijonojen käsittely

Merkkijonojen käsittelyyn on C-kielessä olemassaapufunktioita. Esimerkkejä

I strcpyI Kopioi osa merkkijonosta toiseen merkkijonoon

I strcatI Yhdistä kaksi merkkijonoa toisiinsa

I strcmpI Vertaile kahta merkkijonoa toisiinsa

I itoa ja atoiI Muunna kokonaisluku merkkijonoksi tai toisin päin

Page 14: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

14

Vaikeaa?https://www.arduino.cc/en/Reference/StringObject

I Merkkijonojen käsittely C-kielen työkaluilla voi olla hiemanhaastavaa.

I Arduino sisältää String-nimisen olennon joka tekee tekstinkäsittelystä hieman helpompaa.

I Merkkijonoja voi helposti yhdistää ja muokata.

S t r i n g merkki jono = " e la im ia on " + S t r i n g ( 3 ) + " kp l " ;/ / merkkijono on nyt muotoa " elaimia on 3 kpl "

Page 15: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

15

String-objektin muuntaminen

I Jotkut funktiot palauttavat tai vaativat c-tyylisiächar-taulukoita.

I Muuntaminen onnistuu kuitenkin helposti.

String nimi = "EsimErkki";nimi.c_str () // vastaa c-tyylistä char-taulukkoa.

// Tätä pystyy vain lukemaan,// ei muokkaamaan.

char merkkijono [] = "testausteksti";String muunnettu = String(merkkijono);

Page 16: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

16

Muuttujien näkyvyys

int koira = 1;

void setup()

int kissa = koira + 2; // Toimii

void loop()

kissa = koira + 2; //Ei toimi, kissa näkyy//vain setup-funktiossa

Page 17: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

17

Globaali vs lokaali muuttujaGlobaali (esimerkissä koira)

I Voidaan käyttää kaikkialla ohjelmassaI Hyviä kun samaa muuttujaa käytetään kaikkialla

ohjelmassa. Esim. Arduinoon kytketyn ledin pinninumeroI Vältä mikäli mahdollista. Hankala tutkia mitkä kaikki

ohjelman osat vaikuttavat muuttujaan.

Lokaali (esimerkissä kissa)

I Voi käyttää vain niiden aaltosulkeiden välissä jossamääritetty

I Laitteen tarvitsee säilöä tieto ainoastaan pienessä osassaohjelmaa→ tehokkaampaa

I Vaikeampi tehdä mokia

Page 18: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

18

Funktiot

paluutyyppi funktionimi(parametri)

return paluuarvo;

Funktio ottaa sisäänsä parametreja, tekee niillä jotakin ja antaajonkinlaisen paluuarvon.

I PaluutyyppiI Muuttujan palauttaman arvon tyyppi.

I FunktionimiI Pitää alkaa kirjaimella.

I ParametriI Parametrit joita funktio ottaa vastaan. Voi olla useampia ja

jokaisella pitää olla tyyppi.I Pilkulla voi erottaa useampia parametreja.

Page 19: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

19

Funktioesimerkki

int laskeYhteen(int numero1, int numero2)

return numero1 + numero2;

int a = laskeYhteen (1, 2); //a:n arvo on nyt 3

Page 20: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

20

Ehtolauseet

if (false)

// Mikäli ehto on true, hypätään koodissa tänne.// Näin ei kuitenkaan ole, eli täällä ei käydä.

else

// If-lauseen ehto oli epätosi.// Hypätään siis tänne, eli else-lohkoon.

I Else-lohkon voi myös jättää pois. Tällöin ei tehdä mitäänjos lauseen ehto on epätosi.

Page 21: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

21

Else if – mutta entä jos?

if (5 > 10)

//Ei ole, eli tänne ei päädytäelse if (6 > 10)

//Ei ole sekään, eli tännekään ei päädytäelse

//Päädytään siis tänne

Page 22: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

22

Mielekkäitä totuuksia – Vertailu

a == b a yhtä suuri kuin ba != b a eri suuruinen kuin ba < b a pienempi kuin ba > b a suurempi kuin ba <= b a pienempi tai yhtäsuuri kuin ba >= b a suurempi tai yhtäsuuri kuin bI Kaikki yllä olevat vertailut muuttuvat suorituksen jälkeen

jompaan kumpaan kahdesta:I true jos ehto täyttyyI false jos ehto ei täyty

Page 23: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

23

Boolen operaattorit

a && b tosi jos a ja b ovat molemmat tosia (and)a || b tosi jos jompikumpi, a tai b ovat tosia (or)!a tosi jos a on epätosi (not)I Kaikki yllä olevat ehdot muuttuvat suorituksen jälkeen

jompaan kumpaan kahdesta:I true jos ehto täyttyyI false jos ehto ei täyty

Page 24: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

24

Boolen logiikka

int a = 15;

if ( (a > 10) && (a < 20) )

Serial.println("a on 10:n ja 20:n valissa");

Page 25: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

25

Boolen logiikka

if ( true && true )

Serial.println("a on 10:n ja 20:n valissa");

Page 26: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

26

Boolen logiikka

if ( true )

Serial.println("a on 10:n ja 20:n valissa");

Page 27: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

27

Helpot asiat mokata!

I Varoitus! a=b ja a==b ovat eri asioita!I a = b; sijoita b:n arvo a:hanI a == b; tarkista ovatko a ja b saman arvoiset

I C-tyylisiä merkkijonoja ei voi vertailla ==-operaattorilla.Arduinon String-olioita voi!

Page 28: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

28

Silmukat, eli toistorakenteet

I Silmukoita käytetään kun samankaltaisia asioita pitäätehdä useita kertoja peräkkäin.

I Silmukoita käytetään kun samankaltaisia asioita pitäätehdä useita kertoja peräkkäin.

I Silmukoita käytetään kun samankaltaisia asioita pitäätehdä useita kertoja peräkkäin.

Page 29: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

29

While ja for

int i=0;while (i <= 5)

Serial.println(i);i++;

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

Serial.println(i);

012345

Page 30: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

30

ForKäyttökohteita esimerkiksi taulukoiden läpikäynti.

for (alkuarvo; ehto; askel)

//Todo: mitä tähän voisi laittaa

I Alkuarvo (int i = 0;)I Luodaan loopin sisällä käytettävä muuttuja ja annetaan sille

alkuarvo.I Ehto (i <= 5;)

I Ennen jokaista loopin suorituskertaa tarkistetaan että ehtototeutuu. Mikäli ei, koko looppi ohitetaan.

I Askel (i++)I Jokaisen loopin suorituskerran viimeiseksi suoritetaan tämä

käsky. Tässä tapauksessa kasvatetaan luotua i-muuttujaayhdellä.

Page 31: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

31

For esimerkki

int ledpin [3] = 3, 5, 6;

void setup()

for (int i=0; i<3; i++) //i=0, 1, 2

pinMode(ledpin[i], OUTPUT);

Page 32: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

32

While

Hieman geneerisempi toistorakenne kuin for.

while (ehto)

//Todo: mitä tähän voisi laittaa

I Ehto (i <= 5)I Ennen jokaista loopin suorituskertaa tarkistetaan että ehto

toteutuu. Mikäli ei, koko looppi ohitetaan.I Huom! Mikäli ehto toteutuu joka kerta, looppi ei lopu

koskaan.

Page 33: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

33

While esimerkki

I Odotetaan minuutti ja joka sekunti tulostetaan kauankoaikaa on vielä jäljellä.

I millis() kertoo montako millisekuntia sitten Arduinokäynnistettiin.

long nowplusminute = millis () + 60000;

while (millis () < nowplusminute)

Serial.println(nowplusminute - millis ());delay (1000);

Page 34: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

34

For vs while

I Oikeastaan for-silmukan voi ajatella "hienompana"versionawhile-silmukasta

I alkuarvo on vain lause joka ajetaan ennenwhile-silmukkaan siirtymistä

I ehto on while-silmukan ehtoI askel on lause joka sijoitetaan viimeiseksi while-silmukan

sisälle.

Page 35: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

35

Break ja continue

I Silmukoiden kulkuun voidaan vaikuttaa kahdellakomennolla:

I breakI Lopeta silmukan suoritus heti ja siirry siitä ulos

I continueI Hyppää välittömästi takaisin silmukan alkuun.I For-silmukassa suoritetaan lisäksi askel-vaihe.

Page 36: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

36

Break ja continue -esimerkki

int i=0;

while (true)

Serial.println(i);

i++;if (i < 3)

continue;break;

0123

Page 37: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

37

Arduino

Page 38: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

38

Arduino UNO:n pääpiirteet

I Flash-muistia 32 kilotavua, josta 0,5 KB varattu Arduinonbootloaderille

I Tähän tilaan ohjelman pitää siis mahtuaI 2 kilotavua SRAM-muistia

I Käyttömuisti. Esim muuttujat asuvat täälläI Tieto häviää kun virrat katkeavat

I 1 kilotavu EEPROM-muistiaI Muisti joka ei häviä virtojen katketessaI Esimerkiksi laitteen asetusten säilöminenI Vrt. tietokoneen kovalevy

Page 39: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

39

Arduino UNO vs teensy 2.0

I Arduino UNO perustuu ATmega328P-piiriinI Teensy ATmega32U4-piiriin.I Piirissä on tuki USB:lle. Teensy voi esimerkiksi esittää

USB-näppäimistöäI Flash-muistia 32 kilotavua

I Teensyssä n. 32kBI 2 kilotavua SRAM-muistia

I Teensyssä n. 2,5kBI 1 kilotavu EEPROM-muistia

I Teensyssä 1kBI Käytännössä eroja siis on, mutta kumpikin ovat

"tyhmiä"mikrokontrolloreita

Page 40: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

40

digitalWritehttps://www.arduino.cc/en/Tutorial/DigitalPins

I Asettaa pinnin arvon LOW tai HIGH.I LOW, "pois päältä"I HIGH, "päällä"

Esimerkiksi ledin vilkutus

void setup()

pinMode (13, OUTPUT);void loop()

digitalWrite (13, HIGH); //LED päällädelay (1000); //Odota sekuntidigitalWrite (13, LOW); //LED pois päältädelay (1000); //Odota sekunti

Page 41: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

41

digitalRead

I Lukee pinnin tilanI LOW, pinni kytketty maahan (GND)I HIGH, pinni kytketty jännitteeseen. (3-5 volttia)

void setup()

pinMode(3, INPUT);

void loop()

int arvo = digitalRead (3);

Page 42: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

42

Ylös-/Alasvetovastuksethttps://learn.sparkfun.com/tutorials/pull-up-resistors

I Mikäli pinniä ei ole kytketty mihinkään, sanotaan että sekelluu

I digitalRead palauttaa satunnaisesti HIGH tai LOWI Ratkaisuna alasvetovastus

I Kytketään pinni vastuksella (n. 10KΩ) GND:henI Pinnin arvo on nyt LOW kunnes se kytketään myös +5V:iin

I Ylösvetovastus lähes sama asia:I Kytketään pinni vastuksella (n. 10KΩ) +5V:iinI Pinnin arvo on nyt HIGH kunnes se kytketään myös

GND:iin

Page 43: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

43

INPUT_PULLUPI Arduinosta löytyy sisäänrakennettuna ylösvetovastusI Aktivoidaan määrittämällä pinnin modeksi INPUT_PULLUPI Yksinkertainen nappula voidaan nyt kytkeä suoraan

GND:in ja halutun pinnin välille. Mitään ylimääräistävastusta ei tarvita kytkennässä!

void setup()

pinMode(3, INPUT_PULLUP);

void loop()

int nappula = digitalRead (3);

Page 44: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

44

analogReadI analogReadilla voidaan lukea pinnin jänniteI Onnistuu vain pinneistä jotka on nimetty A0, A1...

I Kyseisten pinnien takana on 10-bittinenanalogidigitaalimuuntaja (AD)

I Arvo 0-5V väliltä saadaan lukuna väliltä 0-1023. (2,5V siisvastaisi lukua 512)

I Kyseisiä pinnejä voi käyttää myös digitaaliseen I/O:hon

void setup()

pinMode(A1 , INPUT);

void loop()

int arvo = analogRead(A1);

Page 45: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

45

analogWriteI Arduinossa ei ole DA-muunninta→ analoginen ulostulo

pitää tehdä "keinotekoisesti"I PWM, eli Arduino kytkee pinniä nopeasti 0V ja 5V välillä.

(kanttiaalto)I "Teho"määräytyy kauanko pinniä pidetään HIGH- ja

kauanko LOW-tilassaI Esimerkiksi LEDien himmentämisessä ja normaalien

moottorien tehon säädössä riittäväI Vain tildellä (∼) merkittyjä pinnejä voi käyttää

void setup() pinMode(3, OUTPUT);

void loop() //Ledi palaa "puolella teholla"

analogWrite (3, 127);

Page 46: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

46

Esimerkki: Monen ledin vilkutusBlinkkiesim.ino

Ongelma: Halutaan saada useampi kuin yksi ledi vilkkumaantietyllä taajuudella.

I Arduinon tutussa Blink-esimerkissä vilkutetaan yhtä lediäkytkemällä sitä päälle sekä pois, välissä odottaen sopivaaika.

I Odottelun aikana ei voida tehdä mitään muuta, eikäkahden ledin vilkuttaminen eri taajuuksilla ole tällä tavallamielekästä.

Page 47: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

47

Esimerkki: Monen ledin vilkutus

Esimerkkiä varteen tarvitaan Arduino tai teensy jossa

I Pinniin 9 on kytketty etuvastuksen kanssa sarjaan lediI Pinniin 10 on kytketty etuvastuksen kanssa sarjaan ledi

Page 48: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

48

Esimerkki: Monen ledin vilkutus

BlinkLed led1(10, 1000);BlinkLed led2(9, 500);

void setup()

void loop() led1.update ();led2.update ();

I BlinkLed on luokka josta luodaan oliot led1 ja led2.I led1 ja led2 sisältävät .update()-metodin jonka kutsuminen

pitää huolen että ledi on oikeassa tilassa

Page 49: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

49

Luokka ja olio?

I Luokka kuvaa miten asia toimii.I Sillä on omia sisäisiä muuttujia.I Sillä on omia funktioita jotka vaikuttavat sen muuttujiin.I Esim. servo, näyttö, ihminen.

I Olio on luokan pohjalta luotu itsenäinen eliö.

Esimerkissämme on siis kaksi BlinkLed-tyyppistä oliota.I led1 on pinniin 10 kytketty ledi joka vilkkuu 1s sykleissä.I led2 on pinniin 9 kytketty ledi joka vilkkuu 0,5s sykleissä.

Page 50: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

50

Esimerkki: Monen ledin vilkutus

class BlinkLed

public:BlinkLed(int pin , int blink_time);void setDelay(int blink_time);void update ();

private:int _pin; //Pin johon led on kytkettybool _state; //Onko ledi nyt päällä vai ei

int _blink_time; //Kauanko pidetään lediä päällä/poislong _last_cycle; //Milloin viimeksi tehtiin ledille jotakin

;

Page 51: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

51

Public- ja private-lohkothttps://fi.wikipedia.org/wiki/Luokka_(ohjelmointi)

I Public-lohkon alla olevat asiat näkyvät ulkomaailmaan.I Tämän vuoksi esimerkin led1:n update()-funktiota voidaan

kutsua ohjelman pääloopissa.I Private-lohkon asioita voi käyttää luokan sisällä olevissa

funktioissa, mutta niitä ei voi käyttää ulkopuolella.I Esimerkiksi led1:n pinniä ei voi selvittää lukemalla

muuttujaa led1._pin.I Tapana on erottaa private muuttujat alaviivalla alkavalla

nimellä, mutta tämä ei ole pakollista.

Page 52: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

52

Esimerkki: Monen ledin vilkutus

BlinkLed(int pin , int blink_time)

_pin = pin;_blink_time = blink_time;_state = LOW;

pinMode(_pin , OUTPUT);_last_cycle = millis ();

I Ns. konstruktori. Suoritetaan silloin kun luodaan uusi olio.I BlinkLed led1(10, 1000); käyttää tätä osaa luokasta.

Page 53: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

53

Esimerkki: Monen ledin vilkutus

void setDelay(int blink_time)

_blink_time = blink_time;

I Public-blokissa oleva funktio joka muokkaaprivate-muuttujaa.

Page 54: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

54

Esimerkki: Monen ledin vilkutushttps://www.arduino.cc/en/Reference/Millis

void update ()

if (millis ()-_last_cycle >= _blink_time)

_state = !_state;_last_cycle = millis ();

digitalWrite(_pin , _state);

I millis() – aika Arduinon käynnistymisestä millisekunteina.I Funktio tarvittaessa kääntää ledin päälle tai pois. Tämän

jälkeen voidaan odottamisen sijaan tehdä jotakin muuta.

Page 55: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

55

Ohjelma laitteelle

Page 56: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

56

Esimerkki: Monen ledin vilkutus

Jatketaan esimerkkiä hieman lisää.I Uusi ongelma ledin vilkkumisnopeutta halutaan muuttaa

lennosta.

Page 57: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

57

Esimerkki: Monen ledin vilkutus

void setup() Serial.begin (9600);

void loop() led1.update ();led2.update ();

update_speeds ();

I setup-funktiossa alustetaan sarjaporttiyhteys.I pääloopissa kutsutaan yhtä uutta funktiota.

Page 58: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

58

Esimerkki: Monen ledin vilkutus

void update_speeds ()

if (Serial.available ())

long new_delay = Serial.parseInt ();led2.setDelay(new_delay);

Serial.println("Set new delay for led2:"+String(new_delay));

I Nyt Arduinosta voi avata Serial monitorin ja lähettääArduinolle halutun viiveen numerona.

Page 59: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

59

Serial monitorin avaaminen

Varmista että tools→ port on valittu oikein.

Page 60: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

60

Serial monitor

Page 61: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

61

Sarjaporttihttps://www.arduino.cc/en/Reference/Serial

I Arduino osaa USB:n kautta esittää sarjaporttiaI Helpoin tapa tietää mitä Arduinossa tapahtuuI Kun ohjelma ei toimi kuten sen pitäisi, kannattaa

sarjaporttiin tulostaa eri muuttujien arvoja ja tutkia niidenjärkevyyttä

I Tekstin tulostaminen ennen ja jälkeen jonkin ohjelmanosan auttaa selvittämään, jääkö ohjelma jumiin johonkinkohtaan.

I Huom! jos käytät sarjaporttia, pinnejä 0 ja 1 ei voi enääkäyttää muuhun!

Page 62: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

62

Enum

enum OhjelmanTila kysyy_nimea ,sanoo_moi

;OhjelmanTila tila = kysyy_nimea;

void loop()

String nimi;

if (tila == kysyy_nimea)nimi = kysy_nimi ();

if (tila == sanoo_moi)sano_moi(nimi);

Page 63: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

63

Vinkit ohjelmointiin: SisennysI Sisennetty koodi on helppolukuista sillä lohkot erottuvat

visuaalisesti toisistaanI Koodia saa sisennettyä painamalla tab-nappulaa kursorin

ollessa rivin alussa

void loop()String nimi;if (tila == tila1)nimi = kysy_nimi ();if (tila == tila2)sano_moi(nimi);

void loop()

String nimi;

if (tila == tila1)nimi = kysy_nimi ();

if (tila == tila2)sano_moi(nimi);

Page 64: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

64

Vinkit ohjelmointiin: Manuaalien lukeminen

I Arduinon sivuilla hyvät on ohjeet useimpien funktioidenkäyttöön.

I Kannattaa aina lukea funktion manuaali kun käyttää sitäensimmäistä kertaa.

I Tiettyjen kirjastojen käyttäminen saattaa asettaa rajoituksiaesimerkiksi tiettyjen pinnien toimintaan.

I Myös komponenttien käyttöön löytyy hyviä ja huonojaohjeita Googlella.

Page 65: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

65

Vinkit ohjelmointiin: Google

I Lähes kaikki kääntäjän ilmoittamat virheet googlautuvathyvin.

I Maailmassa on tehty paljon asioita jo ennestään: how to *with arduino/c

I Englannin kielellä parhaat hakutuloksetI Tällä pääsee yllättävän pitkälle kaikkeen ohjelmointiin

liittyvässä!

Page 66: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

66

Ohjelman debuggaus: kumiankka

Page 67: Arduinon ohjelmointi - MyCourses · Arduinon ohjelmointi 24. syyskuuta 2016 17 Globaali vs lokaali muuttuja Globaali (esimerkissä koira) I Voidaan käyttää kaikkialla ohjelmassa

Arduinon ohjelmointi24. syyskuuta 2016

67

Linkkejä

I Arduinon oppaat ja esimerkitI https://www.arduino.cc/en/Tutorial/HomePage

I Arduinon kielen referenssiI https://www.arduino.cc/en/Reference/HomePage

I Atmega328P-piirin datasheet. Kertoo kaiken mitä kyseinenpiiri osaa, kannattaa lukea lähinnä mielenkiinnosta – opuson todella pitkä.

I http://www.atmel.com/images/atmel-8271-8-bit-avr-microcontroller-atmega48a-48pa-88a-88pa-168a-168pa-328-328p_datasheet_complete.pdf