Hämäräkytkin

Johdanto

Äskeisessä harjoituksessa käytit inputtina antureita, joilla pystyit mittaamaan esimerkiksi ääntä, lämpötilaa ja etäisyyttä. Ulostuloina olet tähän mennessä käyttänyt kuitenkin lähinnä päälle tai pois päältä kytkettäviä asioita. Tämä ei kuitenkaan riitä, vaan monia laitteita täytyy voida ohjailla myös tarkemmin.

Esimerkkejä:

  • Valon himmentäminen ja kirkastaminen
  • Servomoottorin asennon määrääminen tarkasti
  • Sähkömoottorin pyörimisen hidastaminen ja nopeuttaminen
  • Kaiuttimesta tulevan äänen korkeuden muokkaaminen.

Arduinon portteihin A0-A5 kytkettävät anturit välittävät jatkuvaa tietoa, jonka Arduino muuttaa lukuarvoiksi 0-1023. Osa Arduinon porteista 0-13 pystyy välittämään niihin kytketyille laitteille muitakin arvoja kuin HIGH ja LOW, eli päälle ja pois: tällaiset portit on merkitty symbolilla ~ ja lukuarvot, joita laitteille voi syöttää, vaihtelevat välillä 0-255.

Esimerkiksi ledille syötetty arvo 0 tarkoittaa, että led on pois päältä, ja arvo 255 taas tarkoittaa, että led on kirkkaimmillaan. Arvolla 127 kirkkaus on puolivälissä.

Tässä harjoituksessa tehdään valon määrään reagoiva himmennin - mitä pimeämpää on, sitä kirkkaampaa valoa tarvitaan. Eikun testaamaan!

Tarvikkeet

Mehackit boardin (tai Arduinon), USB-johdon, koekytkentälevyn ja johtimien lisäksi tarvitset seuraavat komponentit.

OsaKuvaKuvaus
LEDPidempi jalka (kuvassa mutkallinen) eli anodi + -napaan eli Arduinon porttiin. Lyhyempi jalka eli katodi miinus-napaan eli maahan.
Vastus 330 ΩVastus vastustaa sähkövirran kulkua. Vastuksen arvo mitataan ohmeissa (Ω) ja ilmoitetaan komponentissa eri värisinä raitoina (tässä oranssi, oranssi, ruskea ja kulta.
Vastus 10 kΩVastus vastustaa sähkövirran kulkua. Vastuksen arvo mitataan ohmeissa (Ω) ja ilmoitetaan komponentissa eri värisinä raitoina (tässä ruskea, musta, punainen ja kulta.
LDR eli valovastusLDR (Light Dependent Resistor) eli valovastus vastustaa virran kulkua sitä enemmän, mitä pimeämpää on.

Virtapiiri

  • Kytke ledi porttiin 5 ja 330 ohmin vastuksen kautta maahan.
  • Kytke valovastuksen toinen jalka viiden voltin jännitteeseen.
  • Kytke valovastuksen toinen jalka analogiseen porttiin 0 sekä 10 kilo-ohmin vastuksen kautta maahan.

Ohjelman tavoite

Valo himmenee sitä mukaa, mitä kirkkaampaa tulee. Mitä pimeämpää, sitä kirkkaammaksi valo muuttuu. Toisessa vaiheessa ohjelmoidaan valolle raja-arvo: kun anturin havaitsemaa valoa on tarpeeksi paljon, led kytketään kokonaan pois päältä.

Tuttuja komentoja:

Uusia komentoja:

  • analogWrite(portti, arvo): Tällä komennolla voidaan syöttää arvo 0-255 digitaalisiin portteihin, jotka on merkattu symbolilla ~ . Arvo 255 vastaa digitalWrite-käskyllä annettua arvoa HIGH ja arvo 0 vastaavasti arvoa LOW. Arvot näiden väliltä vaikuttavat esimerkiksi lediin sitä himmentävästi.
  • map(arvo, arvoMin, arvoMax, tulosMin, tulosMax): Tällä komennolla voit muuntaa arvoja väliltä jollekin toiselle välille. Esimerkiksi arvon väliltä 0-1023 voi muuntaa välille 0-255, jolloin esimerkiksi alkuperäisestä arvosta 511 tulee arvo 127, koska molemmat ovat skaalan puolivälissä. Lisää tästä myöhemmin.

Ohjelmointi 1/3 - Valovastus

Tehtävä
Täydennä alla oleva ohjelma ohjeiden mukaan ja syötä se sitten Arduinollesi. Avaa Serial monitor ja katso, mitä lukuja valovastuksesta tulee, kun varjostat sitä tai kohdistat siihen kirkasta valoa. Vastaa lopuksi sivun alalaidassa olevaan monivalintaan.
int sensorValue;

void setup() {
  // määrittele pinMode-käskyllä ledin portti ulostuloksi
  Serial.begin(9600);
}

void loop() {
  sensorValue = analogRead(A0);
  Serial.println(sensorValue);
}
HUOM!
Nappeja ja muita kytkimiä testattaessa saatiin serial monitoriin vain lukuja 0 ja 1. Tämä johtui siitä, että anturi oli kiinni kytkimille ja erilaisille laitteille tarkoitetussa portissa (portit 0-13), ja sitä luettiin digitalRead-komennolla. Kun halutaan tarkempia anturilukemia, käytetään aina portteja A0-A5, sekä analogRead-komentoa.

Miten valovastus toimii?

Ohjelmointi 2/3 - Led

Aivan ensin ohjelmoidaan valo kirkastumaan valoisassa ja himmentymään pimeässä. Seuraavassa vaiheessa jatketaan ohjelmointia siten, että toiminta vastaa hämäräkytkintä ja tapahtuu siis päinvastoin.

Led ei tee ohjelmassa vielä yhtään mitään. Lisätään ohjelmaan komennot, jotka saavat anturin muuttamaan ledin kirkkautta.

Tehtävä

Täydennä ohjelma kommenteissa olevien ohjeiden mukaan ja syötä valmis ohjelma Arduinollesi. Loop-komennosta puuttuu nyt oleellinen osa tekstin int kirkkaus jälkeen. Tarvitset puuttuvan osan toteuttamiseen map-komentoa.

Vastaa sitten kahteen monivalintaan, joissa opit lisää uusista ohjelmointikomennoista!

int sensorValue;
int kirkkaus;

void setup() {
  // määrittele pinMode-käskyllä ledin portti ulostuloksi
  Serial.begin(9600);
}

void loop() {
  sensorValue = analogRead(A0);
  Serial.println(sensorValue);
  int kirkkaus = // Muunna analogisesta portista tuleva arvo väliltä 0-1023 välille 0-255 map-komennolla.
  //  Alla olevalla komennolla voidaan antaa LEDille muitakin ohjeita kuin päälle tai pois. Mahdolliset arvot ovat välillä 0-255. 
  analogWrite(5, kirkkaus);
}

Mitä erityistä on Arduinon tai Mehackit-boardin porteissa, jotka on merkattu symbolilla ~ ?

int kirkkaus = map(analogRead(0), 0, 1023, 0, 100);<<
Mitä saadaan aikaiseksi ylläolevalla map-komennolla?

Ohjelmointi 3/3 - Kunnollinen hämäräkytkin

Tällä sivulla pääset parantelemaan luomaasi ohjelmaa kahdella tavalla. Ensin muutat logiikan päinvastaiseksi: mitä kirkkaampaa on, sitä himmeämmin ledin tulee palaa. Tämän jälkeen ohjelmaan asetetaan vielä kynnysarvo: ledi syttyy vasta, kun valoa on tarpeeksi vähän.

Tehtävä
Syötä seuraava ohjelma Arduinolle. Mitä huomaat?
int sensorValue;
int kirkkaus;

void setup() {
  pinMode(5, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  sensorValue = analogRead(A0);
  Serial.println(sensorValue);
  kirkkaus = map(sensorValue, 0, 1023, 255, 0); // 255 ja 0 vaihtavat paikkaa!
  analogWrite(5, kirkkaus);
}

Vaihtamalla lukujen 255 ja 0 paikkaa, map-komento saadaan muuttamaan pienet sensorValuen arvot suuriksi kirkkauden arvoiksi ja päinvastoin. Kun testaat ohjelmaa, huomaat, että valo palaa päivänvaloa vastaavissa oloissa.

Tehtävä
Lisää ohjelmaan vielä ehtolause, joka pitää ledin poissa päältä silloin, kun valovastuksesta tuleva arvo on yli 200 ja kirkastaa lediä tasaisesti, jos arvo on alle 200. Ohjeet tähän löydät koodin kommentista. Tarvitset toteuttamiseen if/else -lausetta, josta else-osa onkin jo koodissa valmiina.
int sensorValue;
int kirkkaus;

void setup() {
  pinMode(5, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  sensorValue = analogRead(A0);
  Serial.println(sensorValue);
  
  //Jos sensorValue on yli 200, aseta muuttujan kirkkaus arvoksi 0. Tällöin lediä ei siis sytytetä. 
  else {
    kirkkaus = map(sensorValue, 0, 1023, 255, 0);
  }
 
  analogWrite(5, kirkkaus);
}
Tehtävä
Tutki valovastuksen arvoja Serial monitorin avulla ja säädä hämäräkytkimen kynnystä paremmaksi tarvittaessa. Kannattaa kiinnittää Arduinoon 9V paristo ja käydä testailemassa hämäräkytkintä eri valaistuksissa. Testaa eri arvoja osoittamalla kännykän taskulampulla valovastusta sekä pimentämällä vastus täysin.

Lisätietoa

PWM eli pulse width modulation

Symbolilla ~ merkittyja portteja voi käyttää ulostulona, jolla jäljitellään analogista signaalia. Porteille voi asettaa arvoja, jotka ovat välillä 0-255. Portteja kutsutaan lyhenteellä PWM (Pulse-Width Modulation eli pulssinleveysmodulaatio).

Arduinon ulostuloina käytettävät portit 0-13 pystyvät tuottamaan vain 5V tai 0 V jännitettä eli olemaan tilassa HIGH tai LOW.

Kuinka himmennin sitten oli mahdollista toteuttaa?

Käytännössä Arduinon pwm-portit ( ~ ) pystyvät jäljittelemään analogista signaalia vuorottelemalla 5V ja 0V välillä hyvin nopeasti. Arvolla 127 ajettu led on siis 10 millisekunnin aikana puolet ajasta päällä ja puolet pois päältä - vaihtelu on niin nopeaa, että ihmissilmään led näyttää himmeältä.

Voit lukea lisää pulssinleveysmodulaatiosta Arduinon sivulta.

Jännitteenjako
Valovastus on komponentti, jonka resistanssi muuttuu olosuhteiden mukana. Tällaiset komponentit täytyy aina kytkeä yhdessä kiinteän vastuksen, tässä tapauksessa 10 kilo-ohmin vastuksen kanssa. Kytkentätavan nimi on jännitteenjako (voltage divider). 10 kilo-ohmin vastuksen avulla valovastuksen antamat lukemat skaalautuvat järkevälle alueelle.