8. Analogiset ja digitaaliset inputit Arduinossa - matpi/EmbeddedSystemsUTU GitHub Wiki
Analogiset inputit
Mikrokontrollerin input pinni ottaa vastaan piirille tulevaa informaatiota. Inputeilla luetaan pinniin kytketyn jännitteen taso. Analogiset inputit käyttävät erillista muunninpiiriä, joka muuntaa pinniin tulevan jännitteen arduinolle ymmärrettäväksi lukemaksi. Arduinolla pystyy lukemaan jännitettä välillä 0-5V. Digitaaliset inputit puolestaan tunnistavat vain kaksi tilaa; jännite joko on (1) tai ei ole (0).
Tehdäänpä kytkentä, jossa käytetään analogista inputtia. Tee seuraavanlainen kytkentä.
Koodi, joka mittaa LDR vastuksen avulla ympäristön valoisuutta
// Aluksi koodiin kirjoitetaan alustus, jossa määritellään mm. input/output pinnit
// ja nimetään muuttujat
int analoginput = A0; // LDR-vastuksen toinen jalka kytketään pinniin a0
int arvo = 0; // jännitteen arvo tallentaan arvo -nimiseen muuttujaan
// Tämän jälkeen seuraa setup-osio, joka tehdään aina koodiin yhden kerran
void setup()
{
Serial.begin(9600); // Komento avaa sarjaliikenteen tietokoneelle nopeudella 9600 bps
}
// Lopuksi kirjoitetaan loop-osio, jonka mukaiset toiminnot
// ohjelma suorittaa yhä uudelleen ja uudelleen
void loop()
{
arvo = analogRead(analoginput); // Luetaan jännite analogisesta inputista
Serial.print("LDR arvo = " ); // Tulostetaan haluttu teksti sarjaporttiin
Serial.println(arvo); // "Serial.println(arvo)" komento tulostaa
// muuttujan arvon ja vaihtaa riviä tulostuksen jälkeen
delay(100); // 100 millisekunnin tauko
}
If ja if else lauseet
Jos haluamme että mikrokontrolleri ohjaa LDR vastuksen avulla vaikkapa lediä valoisuuden muuttuessa, tarvitsemme if lausetta. Alustus osiossa pitää lisäksi määritellä muuttuja nimeltä ledi, ja setup osiossa puolestaan on määriteltävä ledi outputiksi.
if (arvo > 600 && arvo < 800)
{
digitalWrite(ledi, HIGH);
delay(1000);
digitalWrite(ledi, LOW);
delay(1000);
}
else if (arvo > 801)
{
digitalWrite(ledi, HIGH);
delay(100);
digitalWrite(ledi, LOW);
delay(100);
}
else if (arvo < 600)
{
digitalWrite(ledi, LOW);
delay(100);
}
Ledin "feidaaminen"
Kun halutaan saada LED kirkastumaan tai himmenemään tasaisesti hienostuneella ja lyhyellä koodilla, voidaan käyttää for rakennetta. Tällöin loopin sisällä nimetään uusi funktio nimeltä valoisuus.
void loop()
{
arvo = analogRead(analoginput); // Luetaan jännite analogisesta inputista
Serial.print("LDR arvo = " ); // Tulostetaan haluttu teksti sarjaporttiin
Serial.println(arvo); // "Serial.println(arvo)" komento tulostaa muuttujan arvon
if(arvo < 400)
{
for (int valoisuus = 0; valoisuus <= 255; valoisuus +=5) // tai valoisuus ++
{
analogWrite(ledi,valoisuus);
delay(30);
}
for (int valoisuus = 255; valoisuus >= 5; valoisuus -=5) // tai valoisuus --
{
analogWrite(ledi,valoisuus);
delay(30);
}
}
}
Digitaaliset inputit
Digitaalista inputtia käytetään silloin kun halutaan tietää vain tuleeko pinniin jännitettä vai ei. Esimerkkinä tästä voisi olla liikesensori. Kun liikesensori tunnistaa jonkun liikkuvan, se antaa signaalin siihen yhdistettyyn digitaaliseen input pinniin. Lisäksi digitaalisella inputilla voidaan lukea tarkasti pulssin pituus tai taajuus.
Voimme kokeilla digitaalista inputtia LDR kytkennän avulla. Muokataan edellistä koodia seuraavasti.
-
Lisätään ohjelman alkuun: int digitalinput = 4; ja int digiarvo = 0;
-
Lisätään setup-osioon pinMode(digitalinput,INPUT);
-
Lisätään loop-osioon koodin arvo = analogRead(analoginput); jälkeen
digiarvo = digitalRead(digitalinput);
-
Lisätään vastaavat tulostuskomennot digiarvolle kuin arvolla on jo koodissa:
Serial.print("Digiarvo = " ); // Tulostetaan haluttu teksti sarjaporttiin:
Serial.println(digiarvo); // "Serial.println(digiarvo)" tulostaa muuttujan arvon ja vaihtaa sen jälkeen riviä
-
Pidenetään taukoa loop-osion lopussa.
Nyt voit sarjaportista katsoa missä vaiheessa jännitteen muuttumista digitaalinen input kytkeytyy päälle. Analogiset arvot vaihtelevat välillä 0 - 1023, koska nämä luvut voi esittää muunninpiirin kymmenellä bitillä. Miten muunnamme nämä arvot jännitteeksi? Tiedämme että jännite vaihtelee välillä 0v-5v. Seuraava koodi skaalaa analogisen arvon tälle välille:
float voltit = arvo * (5.0 / 1024.0);
Tarvitaan float tyyppinen muuttuja, joka pystyy tallentamaan desimaalilukuja. Lisää tämä rivi ja tulostuskomento voltit-muuttujalle. Huomaa että muuttujia pystyy luomaan missä tahansa kohdin koodia, mutta nämän ovat vain sen ohjelman osan käytettävissä missä ne luodaan.
Voit halutessasi jatkaa harjoituksia. Kytke potentiometri kuvan mukaisesti ja lataa alla oleva koodi. Avaa sitten arduinon sarjaliikenneterminaali, johon arduino tulostaa inputilla lukemansa jännitteen arvon. Arvojen pitäisi vaihdella, kun vääntelet potentiometria.
Jos käytät Arduino Nano boardia, kytke potentiometri vastaavalla tavalla. Alkuperäisen Arduino Nanon pinnijärjestys saattaa poiketa muilla tuotemerkeillä valmistettujen vastaavien boardien pinnien järjestyksestä.
// Aluksi koodiin kirjoitetaan alustus, jossa määritellään mm. input/output pinnit ja nimetään muuttujat
int analoginput = A0; // Potentiometrin keskimmäinen jalka kytketään pinniin a0
int arvo = 0; // jännitteen arvo tallentaan arvo -nimiseen muuttujaan
// Tämän jälkeen seuraa setup-osio, joka tehdään aina koodiin yhden kerran
void setup()
{
// Seuraava komento avaa sarjaliikenteen tietokoneelle nopeudella 9600 bps:
Serial.begin(9600);
}
// Lopuksi kirjoitetaan loop-osio, jonka mukaiset toiminnot ohjelma suorittaa yhä uudelleen ja uudelleen
void loop()
{
// Sitten luetaan jännite analogisesta inputista:
arvo = analogRead(analoginput);
// Tulostetaan saalis sarjaporttiin:
Serial.print("Jännite = " );
Serial.println(arvo); // "Serial.println" komento vaihtaa riviä tulostuksen jälkeen
// pieni tauko:
delay(100);
}
Digitaaliset inputit
Digitaalista inputtia käytetään silloin kun halutaan tietää vain tuleeko pinniin jännitettä vai ei. Esimerkkinä tästä voisi olla liikesensori. Kun liikesensori tunnistaa jonkun liikkuvan, se antaa signaalin siihen yhdistettyyn digitaaliseen input pinniin. Lisäksi digitaalisella inputilla voidaan lukea tarkasti pulssin pituus tai taajuus.
Voimme kokeilla digitaalista inputtia potentiometrin avulla. Muokkaa edellistä koodia seuraavasti.
-
Lisää ohjelman alkuun: int digitalinput = 4; ja int digiarvo = 0;
-
Lisää setup-osioon pinMode(digitalinput,INPUT);
-
Lisää loop-osioon koodin arvo = analogRead(analoginput); jälkeen
digiarvo = digitalRead(digitalinput);
-
Lisää vastaavat tulostuskomennot digiarvolle kuin arvolla on jo koodissa.
-
Pidennä taukoa loop-osion lopussa.
Nyt voit sarjaportista katsoa missä vaiheessa jännitteen muuttumista digitaalinen input kytkeytyy päälle. Analogiset arvot vaihtelevat välillä 0 - 1023, koska nämä luvut voi esittää muunninpiirin kymmenellä bitillä. Miten muunnamme nämä arvot jännitteeksi? Tiedämme että jännite vaihtelee välillä 0v-5v. Seuraava koodi skaalaa analogisen arvon tälle välille:
float voltit = arvo * (5.0 / 1024.0);
Tarvitaan float tyyppinen muuttuja, joka pystyy tallentamaan desimaalilukuja. Lisää tämä rivi ja tulostuskomento voltit-muuttujalle. Huomaa että muuttujia pystyy luomaan missä tahansa kohdin koodia, mutta nämän ovat vain sen ohjelman osan käytettävissä missä ne luodaan.