4. Analogiainputit

Edellisessä osassa tutustuttiin hieman syvällisemmin Wiringiin ja Arduinon ohjelmointiin ja seliteltiin mitä käytetyt komennot tai funktiot tarkoittivat. Jatketaan tällä samalla linjalla tässäkin, mutta tietenkin uudella aiheella. Hyödynnetään edellisessä osassa jo kertaalleen tehtyä ja tutkitaan miten saadaan uutta aikaiseksi erilaisten komponenttien kanssa.

Tässä osassa tutkitaan LDR-vastuksen ja potentiometrin kytkemistä Arduinoon ja tehdään ns. hämäräkytkin sekä valon on/off säädin potentiometrin avulla. Ennen kytkennän tekoa selvennetään lyhyesti mitä käytetyt komponentit ovat.

Mikäli vastuksen merkitys on hukassa, voit perehtyä aiheeseen tarkemmin tästä.

LDR-vastus

LDR-vastus
Jalallinen valovastus

LDR eli Light Dependent Resistor on sananmukaisesti valosta (tai sen määrästä) riippuva vastus. Vastusta voi sanoa myös kansankielisemmin valovastukseksi tai fotovastukseksi - komponenteilla on usein monia nimityksiä.

LDR-vastusta käytetään yleisimmin hämäräkytkimissä, eli luonnon valon tai keinovalon tunnistuksessa tai valoa mittaavissa sovelluksissa. LDR-vastus reagoi siis valoon, mutta ei kovinkaan nopeasti. LDR-vastuksesta voit, mikäli kiinnostaa, lukea lisää tältä sivulta.

Potentiometri

Potikka

Potentiometri eli säädettävä vastus on komponentti, joka yleensä käsin ruuvaamalla tai muuten säätämällä muuttaa resistanssiarvoaan. Komponentilla on kolme jalkaa, joista laitimmaisten jalkojen välissä on kiinteä vastus ja keskimmäisessä vastus muuttuu (verrattuna laitimmaisiin) kun potentiometrin säätönuppia pyöritetään.

Kun potentiometrin laitimmaisten jalkojen päihin syötetään jännite ja maa, voidaan keskikarvaan nuppia pyörittämällä säätää jännite halutuksi. Tämä tulee esimerkissä varsin hyvin kyllä selväksi, joten jos asia ei mennyt vielä kupoliin niin älä huoli.

Analogiainputit Arduino Unossa

Ennen kuin päästään kytkentöjen kimppuun, selvennetään mitä analogiainputit tai oikeammin analogiset tulot tarkoittavat. Mietitäänpäs hetki tätä termiä itsessään.

Analogiatulon nimityshän kertoo meille jo sen, että siihen voidaan syöttää signaali, joka on analoginen eli verrattavissa oleva johonkin toiseen arvoon. Eli signaali on analoginen - verrattavissa oleva. Tässä tapauksessa arvo, mihin verrataan on analoginen jännitteen suhteen, eli analogiatuloon syötettyä signaalia verrataan johonkin jännitteeseen. Tästä seuraakin seuraava kysymys: mihin jännitteeseen? No tietenkin Arduinon käyttöjännitteeseen, joka on 5 V - tällöin puhutaan referenssijännitteestä. Käyttöjännite ei ole absoluuttisen tarkka, joten tarkkoja mittauksia Arduinolla ei ole hyvä tehdä, mutta yksinkertaisiin tutkimuksiin sitä voi varsin hyvin käyttää.

Arduino Unon piirilevylle on merkitty kirjain-numeroyhdistelmällä A0 - A5 analogiatulot, joita voidaan käyttää. Analogiatulot löytyvät fyysisesti eri laidalta kuin digitaalitulot/lähdöt.

Arduino Unon analogiamuunnin

Arduino Unossa on 6 kappaletta analogisia tuloja, mihin muuttuvia jännitteitä voidaan syöttää. Mikroprosessorin sisällä on muunninpiiri, joka muuntaa analogisen jännitteen digitaaliseen muotoon. Tätä muunninta kutsutaan nimellä AD-muunnin (Analogia-Digitaali-muunnin engl. Analog-to-Digital Converter).

AD-muunnin muuntaa syötetyn jännitteen (0 ... 5 volttia) lukuarvoon joka on välillä 0 ... 1023. Muunnetusta lukuarvosta voidaan laskea myös analogiatuloon syötetty jännite, jos tämä ei ole ennalta tiedossa - tämä muunnos on hyvinkin usein tarpeellinen, mutta monesti pärjää myöskin pelkillä lukuarvoilla 0 ... 1023. Tarkemmin ja syvällisemmin AD-muuntimesta voit lukea tästä linkistä.

Arduinossa analogiamuuntimen käyttö on yhtä helppoa kuin kytkimen lukukin ja seuraavassa perehdytäänkin siihen, miten näitä muuttuvia jännitteitä saadaan muunnettua. Mutta tehdään ensiksi kytkennät!

LDR-vastuksen kytkeminen Arduinoon

Kytketään LDR-vastus ja toinen vastus Arduinoon seuraavalla tavalla:

Arduino ja LDR

Arduino ja LDR

Kuvista huomataan, että LDR-vastuksen toinen pää on kytketty maahan ja toinen pää toiselle vastukselle (R4) ja näiden välistä viety hyppylanka Arduinon analogiatuloon 0. Toisen vastuksen (R4) toinen pää on puolestaan kytketty 5 volttiin ja tällä tavalla on saatu aikaiseksi jännitteenjakokytkentä.

Jännitteenjakokytkennässä yksinkertaisesti jaetaan jännite pienemmäksi jännitteeksi kahden tai useamman komponentin avulla. Ilman toista vastusta analogiatulossa olisi vain 5 voltin jännite, eikä se siitä miksikään muuttuisi vaikka mitä tekisi valon kanssa. Tämä riittää tästä asiasta kuitenkin tähän paikkaan, tarkemmin jännitteenjaosta voit lukea tästä linkistä.

LDR-vastuksen lukukoodi

Seuraavaksi voidaan tehdä koodi, millä LDR-vastuksen arvoa luetaan. Koska analogiatulot ovat Arduinossa erillään, niin niitä ei tarvitse erikseen alustaa, joten alustuskoodi on sama kuin edellisessä osassa:

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

Lisätään aikaisemman kytkimen lukemisen jälkeen koodi, missä luetaan analogiatulon 0 arvo analogLDR-nimiseen muuttujaan:

     /* Tutkitaan tuleeko varjo LDR-vastuksen eteen. 
        Kokeile peittää anturi sormella! 
     */
     int analogLDR = analogRead(0);
     if(analogLDR > 500)
     {
       digitalWrite(8,HIGH);
     }
     else
     {
       digitalWrite(8,LOW);
     }

Kommentissa onkin selitetty, mitä koodi tekee. Jos led palaa koko ajan, muuta arvo 500 hieman suuremmaksi, esimerkiksi 700. Suurempi arvo tarkoittaa hämärämpää ympäristöä. Kokonaisuudessaan LDR-esimerkkikoodi on tässä:

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

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);
     }
     
     /* Tutkitaan tuleeko varjo LDR-vastuksen eteen. 
        Kokeile peittää anturi sormella! 
     */
     int analogLDR = analogRead(0);
     if(analogLDR > 500)
     {
       digitalWrite(8,HIGH);
     }
     else
     {
       digitalWrite(8,LOW);
     }
}

Potentiometrin kytkeminen Arduinoon

Seuraavaksi kytketään 10 kilo-ohmin potentiometri Arduinon toiseen analogiatuloon 1:

Arduino ja potikka

Arduino ja potikka

Kytkennöistä huomataan, että potentiometrin laitimmaiset jalat on kytketty maan ja käyttöjännitteen väliin ja keskimmäisestä jalasta on viety vihreä hyppylanka Arduinolle. Tässä ylimääräistä vastusta ei tarvittu, koska potentimetri muodostaa jännitejaon sisäisesti. Kuvassa potentiometrin arvo on väärin, mutta se ei menoa haittaa.

Potentiometrin luku ja lopullinen koodi

Nyt voidaan tehdä lopullinen koodi, joka ottaa huomioon myös potentiometrin arvon. Edellistä koodia muokkaamalla saamme aikaiseksi toiminnallisuuden, missä tutkitaan niin painonappia, LDR-vastusta kuin potentiometriäkin. Alla koodi:

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

void loop() {
     /* Tutkitaan kaikki kolme asiaa yhtäaikaa:
        - Onko nappia painettu?
        - Onko LDR-vastuksen edessä varjo?
        - Onko potentiometriä väännetty yli puolen välin?
        - Jos mitään yllä olevaa ei tapahdu, sammutetaan LED. 
     */
     int analogLDR = analogRead(0);
     int analogPot = analogRead(1);
     bool digitalButton = digitalRead(7);
     
     if(digitalButton == HIGH) // Painonapin tutkiminen
     {
       digitalWrite(8,HIGH);
     }
     else if (analogLDR > 500) // LDR:n tutkiminen
     {
       digitalWrite(8,HIGH);
     }
     else if(analogPot > 512) // Potentiometrin tutkiminen
     {
       digitalWrite(8,HIGH);
     }
     else // muussa tapauksessa ledin sammutus
     {
       digitalWrite(8,LOW);
     }
     
     // Pieni viive lopuksi
     delay(100);
}

Koodissa käytetään, kuten varmaan huomasit analogRead(NUMERO) -metodia, minkä avulla analogiatulo saadaan luettua. Arduino Unolla on 6 analogiatuloa (0 - 5), joten suurin mahdollinen numero on 5. AnalogRead()-metodi palauttaakin lukuarvon, joka on välillä 0 - 1023. Jos numero on 512, niin jännite on "tasan" puolessa välissä, eli noin 2,5:ssä voltissa. Jos numero on 0, niin jännite on 0 volttia. Taas jos jännite on 5 volttia, niin lukuarvona on 1023.

Kyseisessä koodissa tuli lisää uusia asioita, kuten kaksi erilaista muuttujaa, erilaisia vertailuja sekä hieman erilainen if-else-rakenne kuin aikaisemmin. Koodia tutkimalla ja kokeilemalla pääset varmasti jyvälle mitä mikin tarkoittaa, mutta paneudutaan näihin asioihin tarkemmin seuraavassa osassa - tässä on varmasti sulateltavaa hetkeksi muutenkin.

Seuraavassa osassa tutkitaan aihetta nimeltä PWM-ohjaus, jos aihe kiinnostaa, voit lukea siitä enemmän tästä linkistä jo valmiiksi. Toteutetaan PWM-kirkkauden säätö käytetylle kytkennälle, eli jatketaan tästä mihin jäätiin, joten älä pura kytkentää!