Arduino ja anturit – painokytkimet

Artikkelissa esitellään lyhesti kuinka Arduino-alustalla voidaan lukea kytkimiä.

[size=150]Arduino ja anturit – painokytkimet[/size]
Painokytkin on yleensä rakenteeltaan hyvin yksinkertainen. Kytkimessä on kaksi johdinta tai pintaa joita pidetään jotenkin mekaanisesti erillään toisistaan, tällöin sähkövirta ei pääse kulkemaan kytkimen yli. Kun kytkin painetaan pohjaan liikkuvat johtimet tai pinnat yhteen jolloin sähkövirta pääsee kulkemaan kytkimen yli lähes ilman vastusta.

Lukkiutuvaksi painokytkimeksi kutsutaan sellaista kytkintä, joka painamisen jälkeen jää päälle asentoon kunnes kytkintä painetaan uudelleen.

Lukkiutuvan kytkintyypin vastakohta on nimeltään lukkiutumaton painokytkin, joka johtaa sähkövirtaa vain niin pitkään kuin nappia pidetään alas painettuna. Lukkiutumattomassa painokytkimessä on yksinkertaisimmillaan jousi joka palauttaa kytkimen johtimet tai kontaktipinnat erilleen katkaisten sähkövirran kulun.

kytkin gif.gif
[size=150]Yksinkertainen nappula esimerkki[/size]
Seuraavassa esimerkissä Arduinolla luetaan lukkiutumattoman painokytkimen tila ja se lähetetään tietokoneelle sarjaliikenteenä.

Ohjelmoi Arduinoon seuraava ohjelma ja valmistele sitten alla näkyvä kytkentä.

[code] //Nappula on kytketty arduinon digitaaliseen pinniin numero 3
#define Nappula 3

//Tähän muuttujaan tallennetaan nappulan tila
//LOW tarkoittaa että nappula ei ole painettu pohjaan
//HIGH tarkoittaa että nappula on painettu pohjaan
boolean edellinenTila = LOW;

void setup() {
//Komennolla alustetaan sarjaliikenne toiminnot
Serial.begin(9600);
//Komennolla kerrotaan arduinoalustalle että käytämme pinniä
//lukemiseen
pinMode(Nappula, INPUT);
}

void loop(){
//Luetaan nappulan tila muuttujaan
boolean nykyinenTila = digitalRead(Nappula);

//Tarkistetaan on nappulan tila muuttunut
if(nykyinenTila != edellinenTila){
//Jos tila on muuttunut lähetetään tieto siitä ja aikaleima
//sarjaliikenteenä tietokoneelle
Serial.print(millis());
Serial.println(“Nappulan tila on muuttunut!”);

//Päivitetään muuttunut tila edellinenTila muuttujaan
edellinenTila = nykyinenTila;

}
} [/code]
esimerkki1_kaavio.png
esimerkki1.jpg
Kun kytkin painetaan pohjaan lähettää Arduino tästä tiedon tietokoneelle. Sama tieto lähtee myös silloin kun kytkimestä päästetään irti.

Syy miksi kytkimen jälkeen digitaalisenpinnin puolella tarvitaan vastus ja yhteys piirin nollatasoon, on seuraava.

Jos emme olisi kytkeneet Arduinon digitaalistapinniä mihinkään ja lukisimme pinnin tilaa puolen sekunnin välein, vaihtelisi saamamme tulos satunnaisesti. Tämä johtuu siitä että pinniin siirtyy ja sieltä purkautuu sähköisiä varauksia ilman välityksellä, riippuen ympäristön sähköisistä ominaisuuksista. Tilanne vastaisi sitä että kytkin olisi kytketty suoraan ilman tietä nollatasoon digitaaliseen pinniin. Kun kytkin ei ole painettuna pohjaan, vastaa tilanne sitä kuin digitaalista pinniä ei olisi kytketty mihinkään. Kun kytkimen toiselle puolelle on kytketty sekä digitaalinen pinni että maataso, purkautuvat mahdolliset varaukset maatasoon, kun kytkin ei ole painettuna pohjaan.

Ohessa video jossa digitaalisen pinnin tila raportoidaan puolensekunnin välein, tilanteessa jossa digitaaliseen portin puolista puolta piiristä ei ole liitetty maatasoon. Ohjelma tulostaa tekstin >>>HIGH<<< kun portti on digitaalisessa 1-tilassa ja LOW kun portti on 0-tilassa.
[iframe=http://www.youtube.com/embed/ZYyLhXkHreQ]560,315,1[/iframe]

[code]
void setup() {
Serial.begin(9600);
pinMode(3, INPUT);
}

void loop(){
if(digitalRead(3)){
Serial.println(">>>HIGH<<<");
}else{
Serial.println(" LOW ");
}
delay(500);
} [/code]
Jos piirissä ei olisi vastusta nollatason ja kytkimen välillä, kytkimen ollessa painettuna pohjaan purkautuisi käytännössä kaikki sähkövirta suoraan maatasoon ja digitaalinen pinni näyttäisi aina 0-tilaa. Tämä siksi että sähkövirralla ei ole käytännössä vastusta kulkiessa maatasoon, taas kun sähkövirta joutuu kulkemaan mikrokontrolleriin sen sisäiset komponentit aiheuttavat kohtalaisen vastuksen sähkövirralle. Kun asetamme maatason eteen riittävän ison vastuksen (yleensä >1kOhm) aiheutamme riittävän suuren vastuksen sähköviralle maatasoa kohti että riittävä määrä sähkövirrasta haluaa kulkea digitaaliseen pinniin, jossa se voidaan tunnistaa mikrokontrollerin toimesta.

[size=150]Kytkin värähtelyt[/size]
Kytkin värähtelyllä tarkoitetaan kun kytkimen tila heittelee kytketyn ja ei-kytketyn välillä. Tämä johtuu yleisimmin kytkimen jousen värähtelystä kun kytkin vapautetaan. Kytkin saattaa tällöin ensin mennä vapautettuun tilaan muutamaksi millisekunniksi ja sitten jousen värähdellessä palata kytkettyyn tilaan joiksikin millisekunneiksi. Tämä toistuu joitain kertoja, kunnes jousi on menettänyt riittävästi värähtely energiaa jotta kytkin asettuu ei-kytkettyyn tilaan. Jos projektissa käytetään kytkimen painalluksia asettamaan jotain ohjelman arvoa, aiheuttaa kytkin värähtelyt sitä että mikrokontrolleri näkee yksittäiset painallukset moninkertaisina.

Kytkinvärähtelyt voidaan jättää huomiotta ohjelmallisesti suhteellisen helposti. Kun kytkin painetaan alas, tallennetaan muuttujaan aika kun kytkin painettiin alas. Kun kytkin vapautetaan, vähennetään tallennetusta ajasta sen hetkinen aika. Tämä erotus kertoo kuinka pitkään kytkin on ollut painettuna alas. Jos aika on tiettyä lyhyempi, jätetään painallus huomioimatta. Ohessa esimerkki.

[code] #define Nappula 3

void setup() {
Serial.begin(9600);
pinMode(Nappula, INPUT);
}

void loop(){
//Tarkistetaan onko kytkintä painettu
if(digitalRead(Nappula) == HIGH){
//Tallennetaan muuttujaan aika kun kytkin painettiin alas
unsigned long alkoi = millis();
//Seuraavaa looppia suoritetaan kunnes kytkimetä
//päästetään irti
while(digitalRead(Nappula) == HIGH){
delay(1);
}
unsigned long kesto = millis()-alkoi;
//Jos kytkin oli pohjassa pitempään kuin 0,1sekuntia
//rekisteröidään painallus
if(kesto > 100){
Serial.println(“Kytkintä on painettu!”);
}
}
} [/code]

[size=150]Useita kytkimiä yhdessä analogi-pinnissä[/size]
Edellä esitetyssä kytkentä tavassa jokaiselle kytkimelle tarvitaan oma digitaalinen pinninsä. Projekteissa joissa tarvitaan useita kytkimiä loppuvat digitaalipinnit nopeasti. Tämä voidaan ratkaista seuraavanlaisella ratkaisulla jossa useita nappuloita voidaan lukea yhdellä analogipinnillä.
ananlogread_piirikaavio.png
Analogipinnillä näkyvä jännite riippuu siitä mitä nappulaa painamme. Koska nappulalle 1 mennessä sähkövirran pitää vain ylittää yksi 10kOhmin vastus, on jännite suurempi kuin nappulaa 2 painaessa jolloin sähkövirran pitää ylittää kaksi 10kOhmin vastusta. Kolmatta nappulaa painaessa sähkövirran pitää ylittää kolme 10kOhmin vastusta jolloin analogipinnillä näkyvä jännite on kaikkein pienin. Piiriin voisi lisätä vielä monta nappulaa lisäämällä vain kytkimiä ja vastuksia. Vastusten arvoa kannattaisi tällöin pienentää 10kOhmista esimerkiksi 1kOhmiin.
kytkin2.gif

[code] void setup() {
Serial.begin(9600);
pinMode(A0, INPUT);
}

void loop(){
unsigned int pinninArvo = analogRead(A0);
//jos pinnin arvo on välillä 490-525
if((pinninArvo > 490) & (pinninArvo < 525)){
Serial.println(“Nappulaa yksi painettu”);
//seuraava looppi odottaa niin pitkään kuin
//nappulaa pidetään pohjassa
while((pinninArvo > 490) & (pinninArvo < 525)){
pinninArvo = analogRead(A0);
delay(10);
}
Serial.println(“Nappula yksi vapautettu”);

//seuraava komento kertoo että olemme tehneet
//kaiken haluamamme funktiossa ja voimme aloittaa
//loop-funktion alusta uudelleen
return;

}
//jos pinnin arvo on välillä 320-355
if((pinninArvo > 320) & (pinninArvo < 355)){
Serial.println(“Nappulaa kaksi painettu”);

while((pinninArvo > 320) & (pinninArvo < 355)){
  pinninArvo = analogRead(A0);
  delay(10);
}
Serial.println("Nappula kaksi vapautettu");
return;

}
//jos pinnin arvo on välillä 235-270
if((pinninArvo > 235) & (pinninArvo < 270)){
Serial.println(“Nappulaa kolme painettu”);

while((pinninArvo > 235) & (pinninArvo < 270)){
  pinninArvo = analogRead(A0);
  delay(10);
}
Serial.println("Nappula kolme vapautettu");
return;

}
delay(10);
} [/code]
Ohjelmassa olevat raja-arvot erinappuloille, on saatu kokeellisesti lukemalla analogipinnin arvoa kun nappuloita painetaan yksitellen ja katsomalla minkä arvojen välillä pinnin arvo vaihtelee.

[size=150]Loppusanat[/size]
Oppaassa esiteltiin kytkimien käyttäminen Arduino-alustoilla. Oppaassa ei esitelty nappula-matriiseja tai muita monimutkaisempia tekniikoita. Näistä tulee ehkä tulevaisuudessaan oma artikkelinsa.