3. Digitaalitulot

Alunperin julkaistu: 12.2.2017

Viimeksi muokattu: keskiviikko 27.12.2017

Osassa 2 käytiin läpi Arduino IDE:n asentaminen ja ensimmäisen sketchin kirjoitus ja sen lataaminen mikroprosessorille. Tässä osassa näytetään kuinka kytkintä luetaan Arduinolla ja perehdytään asioihin hieman syvällisemmin.

Arduino ja Wiring

Arduinoa ohjelmoidaan open-source pohjaisessa Wiring-nimisessä viitekehyksessä (Framework), joka muistuttaa läheisesti C-kieltä. Wiring on kehitetty tukemaan laajaa joukkoa erilaisia mikroprosessoreita ja kehitysalustoja, kuten Arduino (AVR atmega), MSP430 (Launchpadit), PIC- ja ARM-pohjaiset mikroprosessorit (STM32 -tuki tulossa kirjoitushetkellä). Tarkemmin Wiringista voi lukea sen kotisivuilta osoitteesta http://wiring.org.co/.

Maallisemmassa ja ymmärrettävämmässä muodossa yllä olevan kappaleen voisi varmaankin sanoa näin: "Wiring on vain yksi tapa tehdä samaa koodia monelle eri laitteelle". Tietotekniikassa ja ohjelmoinnissa ei tietenkään ole yhtä ja ainoata oikeaa tapaa tehdä asioita, mutta Wiring ja Arduino mahdollistaa helpon liikkeelle lähdön.

No mitä tämä Wiring on sitten käytännössä?

Edellisen esimerkin mukaan, Wiringia käytettiin ledin vilkutukseen kutsumalla metodia digitalWrite(8, HIGH). Tässä annettiin yhdellä rivillä mikroprosessorille käsky asettaa Arduinon nasta 8 tilaan HIGH, joka on siis looginen "1". Tämä tarkoittaa täten sitä, että ledille asetettiin Arduinon käyttöjännite +5 V IO-pinnin kautta, jolloin led alkoi loistamaan. Parametri LOW puolestaan tarkoittaa loogista "0" -tilaa tai puhekielessä "nollaa", eli 0 volttia - ja silloin led sammuu.

Wiring siis koostuu tietynnimisistä metodeista (voi kutsua myös funktioiksikin), joita kutsumalla saadaan kehitysalusta (Arduino) suorittamaan haluttuja toimintoja.

Täydellinen lista Arduinon tukemista metodeista/funktioista löytyykin Arduinon kotisivuilta: http://www.arduino.cc/en/Reference/HomePage. Toisaalta tämän oppaan tarkoituksena on käydä asioita myös läpi suomeksikin, mikäli toinen kotimainen (eli englanti) on hieman ruosteessa.

Arduinon kytkeminen painonapille

Mikroprosessorien maailmassa on tärkeää pystyä ohjaamaan erilaisia laitteita haluamallaan tavalla, mutta aivan yhtä tärkeää on pystyä tutkimaan erilaisia tuloja ja saamaan sillä tavalla tietoa ympäröivästä maailmasta.

Jotta tietoa käyttäjän tekemisistä saadaan, aloitetaan painonapin kytkeminen Arduinolle. Pinnien ei ole pakko olla juuri samoja mitä tässä esimerkissä käytetään, mutta että kaikki menee oikein niin suosittelen tekemään omalla alustallasi juuri samoin kuin tässä.

Aloitetaanpa sitten kytkeminen (käytetään pinniä 7):

Arduino ja LED ja kytkin

Arduino ja LED ja kytkin

Kytkin vedetään vastuksella maahan, jolloin Arduinolle kytkettävä tulo ei ole kelluva (inputteja eli tuloja ei saa jättää kellumaan, eli kytkemättä). Nyt nappia painettaessa kytkin sulkeutuu ja yhdistää +5V Arduinon nastaan 7.

Edellisen esimerkin led on myöskin jätetty paikoilleen, koska sitä tarvitaan tässä vielä.

Kytkimen luku koodissa

Jälleen, kun fyysinen puoli on kunnossa (eli hardware tai suomeksi rauta on tehtynä), voidaan miettiä ohjelman tekoa.

Aivan aluksi täytyy käytetty pinni 7 alustaa setup-lohkossa tuloksi eli joudutaan käyttämään pinMode metodin kutsussa termiä INPUT:

void setup() {
  // LED on lähtönä
  pinMode(8,OUTPUT);
  // Alustetaan kytkin tuloksi
  pinMode(7,INPUT);
}

Kuten huomaat, koodiin on lisätty myös kommentit ja aikaisempaa ledin kytkentää on käytetty hyväksi. Omia kommentteja kannattaa silloin tällöin kirjoittaa ja yhden rivin kommentti alkaa aina kahdella kenoviivalla //. Useamman rivin kommentti näkyy seuraavan lohkon sisällä.

void loop() {
  /* Tutkitaan onko kytkintä painettu ja jos on niin 
     sytytetään LED. Muussa tapauksessa sammutetaan se.*/
     if(digitalRead(7) == HIGH)
     {
       digitalWrite(8,HIGH);
     }
     else
     {
       digitalWrite(8,LOW);
     }
}

Kommentti kertoo kuinka koodin tulee toimia joten sitä ei liene tarvista selitellä enempää. Huomion arvoista on kuitenkin se, että useamman rivin kommentti kirjoitetaan merkkien /* ja */ sisään tai väliin.

Kuten huomaat, niin seuraavana uutena asiana on if-lause. Itse asiassa, kyseessä on ennemminkin if-else-lauseke.

Tämä tarkoittaa sitä, että If-lause koostuu vertailuehdosta, joka kirjoitetaan sulkeiden sisään. Jos ehto on totta, niin suoritetaan hakasulkujen sisällä oleva asia. Mikäli asia taas ei ole totta, suoritetaan puolestaan else-hakasulkujen sisällä oleva asia. Eli asia mitä tässä tehdään tapahtuu aina jommin kummin. Led joko sytytetään tai sammutetaan.

digitalRead(7) tarkoittaa, että Arduinolle annetaan käsky lukea pinni numero 7, joka siis tässä tapauksessa on käyttämämme painokytkin. Koska painonappi on kytketty niin, että sitä painamalla ilmestyy 5 voltin jännite nastaan 7, niin vertailuarvona if-lauseessa käytetään arvoa HIGH. Vertailumerkkinä näiden arvojen välillä puolestaan on kaksi yhtäkuin merkkiä ==.

digitalRead() -funktio palauttaa näin ollen tiedon siitä, missä tilassa jokin nasta on; HIGH tai LOW.

digitalWrite(8,HIGH) -funktio kertoo Arduinolle, että pinni numero 8 asetetaan HIGH tilaan, jolloin siihen kytketty ledi syttyy. Ja varmaankin arvaat taikka tiedät, mitä tarkoittaa digitalWrite(8, LOW).

Kytkinpainalluksen odottaminen

Usein voi olla tarpeellista odottaa kytkimen painallusta ennen kuin koodia suoritetaan eteenpäin Arduinolla. Kytkimen painalluksen tai aktivoinnin ei välttämättä aina tarvitse tapahtua käyttäjän toimesta. Erilaiset laitteet hyödyntävän erilaisia kytkimiä ympäristön tilan havaitsemisesta tai laitteen itsensä ohjaamiseksi.

Tällaisia tapauksia voi olla esimerkiksi jonkin rajakytkimen asennon tunnistaminen. Jos halutaan, että ohjelma tekee jotain niin kauan, kunnes rajakytkin aktivoituu, voidaan kirjoittaa esimerkiksi do-while lauseke joka tarkkailee kytkimen tilaa jatkuvasti:

void loop() 
{
  do
  {
    ajaRobottia();
    // Suoritetaan koodia niin kauan kun 
    // ehto on tosi, eli rajakytkin on 0-tilassa.
  }
  while(digitalRead(rajakytkin) == LOW);
}

Tai sitten voi käyttää myös pelkästään while-lauseketta:

void loop()
{
// Odotellaan while-loopissa niin kauan kuin ehto on tosi 
     while(digitalRead(rajakytkin) == LOW);  // eli ohjelma "jumittaa täss' kohtaa
// kunnes kytkintä painetaan 

}

Seuraavassa osassa kytketään Arduinoon potentiometri ja LDR-vastus ja tutkitaan, miten potentiometriä tai LDR vastusta luetaan. Tutustutaan siis Arduinon analogiamuuntimen antamiin arvoihin ja tutkitaan näin ollen erilaisia jännitearvoja.

Seuraava osa: 4 analogiatulot.