Elektroniikka ja ohjelmointi

Johdanto

Tehtävä: rakenna valoon reagoiva soitin ja keksi hyvä tapa soittaa sitä

Luvun 3 teemana on havaitseminen - ja tätä onkin oikeastaan jo harjoiteltu aiemmissa tehtävissä, joissa olet käyttänyt arkiympäristön esineitä ja materiaaleja hyväksi. Nyt tutustutaan siihen, kuinka Arduinolla havainnoidaan ympäristön tapahtumia - antureiden avulla!

Tällä viikolla tehdään elektroninen soitin, jota soitetaan valolla ja varjolla. Samalla harjoitellaan anturien kytkemistä ja ohjelmointia, selvitellään mitä ovat muuttujat ja kuinka Arduinosta saadaan ääntä ulos. 

Kun soitin toimii, jatketaan vielä havainnoinnin parissa.  Millaiset ilmiöt ympäristössäsi tuottavat soittimen soitteluun sopivia varjoja? Millaiset valon ja varjon vaihtelut tuottavat kiinnostavaa ääntä?

Huom: Tässä tehtävässä voit itse päättää, haluatko painottaa ratkaisussasi ohjelmointia, rakentelua vai molempia. Hyödynnä soittimen viimeistelyssä sitä osa-aluetta joka sinua kiinnostaa eniten! 

Tiesitkö että...
Tämäntapainen, kuuluisa soitin on nimeltään Theremin, keksijänsä Leo Thereminin (1896-1993) mukaan. Alkuperäisessä thereminissä käden paikka vaikutti antennien vastaanottamaan sähkömagneettiseen säteilyyn.
Alexandra Stepanoff soittamassa thereminiä NBC:n radio-ohjelmassa vuonna 1930 (CC 0)

Alexandra Stepanoff soittamassa thereminiä NBC:n radio-ohjelmassa vuonna 1930 (CC 0)

Tältä theremin kuulostaa:

the swan (theremin) from gu@n on Vimeo. CC-BY-3.0


Tarvikkeet

Arduino UNOn / Mehackit Maker boardin, kytkentälevyn, kytkentäjohtojen ja USB-johdon lisäksi tarvitset:

OsaKuvaSelitys
Piezo-kaiutin
Piezoa käytetään äänten tuottamiseen. Jotkut piezot voivat myös toimia mikrofonina. Huom: Mehackit Maker Kitin piezo on harmaa pyörylä.
Vastus 10 kΩVastus vastustaa sähköenergian virtausta virtapiirissä. Vastuksen arvo eli sähkövastus mitataan ohmeissa (Ω) ja ilmoitetaan komponentissa eri värisinä raitoina. 10 kilo-ohmin vastuksessa on ruskea, musta, oranssi ja kullanvärinen raita
LDR eli valovastusLDR (Light-dependent resistor) eli valovastus vastustaa virran kulkua sitä enemmän, mitä pimeämpää on.
Joissain kiteissä on LDR:n sijaan komponentti nimeltä fototransistori (phototransistor). Tämä komponentti toimii harjoituksessa yhtä hyvin kuin LDR! Fototransistorissa on pitkä jalka ja lyhyt jalka: pitkä kytketään kohti 5V jännitettä ja lyhyt kohti maata eli GND-porttia.

Kytkentä

Vaihe 1
  • Yhdistä 5V jänniteportti sekä GND-portti kytkentäalustan ylimpiin vaakariveihin johdoilla 
  • Kytke piezokaiuttimen toinen puoli GND-porttiin ylärivin välityksellä. Kytke toinen puoli porttiin 9. Jos piezossasi on johtojen sijaan metallipiikit jalkoina, kytke piezo suoraan alustaan kiinni. 
  • Kytke valovastuksen toinen jalka viiden voltin jännitteeseen eli 5V-porttiin toiseksi ylimmän rivin kautta.
  • Kytke valovastuksen toinen puoli 10 kilo-ohmin vastuksen kautta maahan. Kytke johto portista A0 samaan riviin, jossa on jo yksi vastuksen ja yksi valovastuksen jalka.
kytkentä
  • Portit A0-A5 ovat antureille tarkoitettuja portteja, joiden kautta luetaan anturien välittämää tietoa ympäristöstä.
  •  Valovastuksen resistanssi on iso kun on pimeää, ja pieni kun on valoisaa. Arduino mittaa portista A0, kuinka virtapiirin jännite vaihtelee valon mukaan.
  • Portti 5V syöttää koko ajan 5 voltin jännitettä virtapiiriin: anturin täytyy saada jännitettä, jotta se toimii.
  • Myös piezo tarvitsee jännitettä, jotta se toimii. Piezon tarvitsema jännite otetaan portista 9, jota voi laittaa ohjelmoimalla päälle ja pois.

Tältä kytkentä näyttää piikkijalkaisen piezon kanssa:

kuva kytkennästä

Ohjelmointi 1/4

Vaihe 2
Tutki anturilukemia Kirjoita alla oleva koodi Arduino IDE:en. Tutki tämän jälkeen valovastuksen lukemia sarjamonitorin avulla (ohje alempana).

Lataa ohjelma Arduinolle ja tutki, millaisia lukemia sarjamonitoriin ilmestyy kun liikutat kättä LDR:n edessä tai kohdistat LDR:ään kirkasta valoa.
Sarjamonitorin saa auki suurennuslasista ikkunan oikeassa yläkulmassa:

Mitä uutta ohjelmassa on?

  • int valo; 
    Tässä luodaan *muuttuja, *jonka nimeksi on annettu valo. Muuttujat ovat varastoja, joihin talletetaan tietoa kuten numeroita. Int tarkoittaa muuttujan *tyyppiä - *tämä muuttuja on integer (int) eli kokonaisluku. Arduinolla muuttujat luodaan usein heti ohjelman alussa, jolloin niitä voi käyttää ihan missä kohtaa ohjelmaa vain. Voit itse päättää muuttujan nimen, mutta jotenkin kuvaava nimi on fiksu. Muuttujaa tarvitaan, jotta valoanturin lukemaa on helppo käsitellä eri kohdissa ohjelmaa.
  • Serial.begin(9600); Komento käynnistää sarjaliikenteen Arduinon ja tietokoneen välillä. Tämä tehdään vain kerran, eli komennon paikka on setup-osassa. Nyt tietokoneella voidaan tarkastella Arduinosta saatavaa tietoa. Tällä kertaa halutaan tutkia valovastuksen arvoja. 
  • valo = analogRead(A0);  analogRead-komennolla luetaan anturidataa. Käytännössä Arduino mittaa portista A0 jännitteen vaihtelua. Arduino esittää anturidatan numerolla, joka voi saada arvoja välillä 0-1023. 
  • Serial.println(valo);Tällä komennolla muuttujan valo arvo tulostetaan sarjamonitoriin, jotta sitä voi tarkastella tietokoneella. Lukemia tulee koko ajan lisää. Tämä johtuu siitä, että komento on loop-osassa, jota suoritetaan tosi nopeasti uudelleen ja uudelleen. 

Ohjelmointi 2/4

Vaihe 3
Ohjelmointi 2/4: Ääntä! Nyt napataan valoanturin eli LDR:n lukema ja hyödynnetään sitä äänenkorkeuden muuttelemiseen.  Äänenkorkeutta varten tehdään oma muuttuja, jotta ääntä voi muutella pienillä laskutoimituksilla.

Lataa ohjelma Arduinolle ja tutki, kuinka valo vaikuttaa äänenkorkeuteen.

Mitä uutta ohjelmassa on?

  • int aani; 
    Soittimen sävelkorkeudelle luodaan kokonaislukumuuttuja ohjelman alussa.
  • pinMode(9, OUTPUT); Määritellään portti 9 ulostuloksi setup-osassa.
  • aani = valo-100; Annetaan aani-muuttujalle arvo, joka riippuu valon määrästä. valo-muuttujan arvosta vähennetään 100, jotta ääni olisi vähän matalampi.
  • tone(9, aani);
    Tone-komentoa käytetään, kun Arduinolla halutaan soittaa ääntä piezo-kaiuttimesta. Komennossa kerrotaan, mikä portti on käytössä sekä kuinka korkea ääni soitetaan. 
    Jos aani-muuttujan arvo on vaikkapa 440, Arduino laittaa portin 9 päälle ja pois 440 kertaa sekunnissa. Tällöin piezo-kaiutin värähtelee 440 hertsin (Hz) taajuudella ja tuottaa kuultavan äänen. Ihmisen kuuloalue on oikein hyväkuuloisella n. 20-20 000 Hz.
    Lue halutessasi lisää tone-komennon toiminnasta Arduino Referencestä

Kokeile seuraavia juttuja:

  • Liikuttele kättäsi LDR:n edessä, kohdista kirkasta valoa LDR:ään.
  • Muuttele aani-muuttujaa -  vaihda kohtaan valo-100 esimerkiksi jokin seuraavista laskukaavoista:
    valo+500
    valo
    valo*0.1
    valo*2
    valo/4
    Kun muutat aani-muuttujaa, muista ladata ohjelma uudelleen Arduinolle, jotta muutos tulee voimaan! Huom. Jos vähennät valosta kovin ison luvun, saatat saada ohjelman jumiin. Arvaatko miksi? Saa kokeilla! 
  • Nykäise piezon johto tai USB-johto irti kun ääni alkaa ärsyttää :)

Ohjelmointi 3/4

Vaihe 4
Vähemmän rasittavaa ääntä! Lisää loop-osaan komentoja, joilla voit muutella kuuluvaa ääntä. Käytä kytkinharjoituksesta tuttua if-lausetta ja määrittele, miten varjoisaa täytyy olla jotta soittimesta alkaa kuulua ääntä. Lisää delay-arvoja rytmittämiseen ja komentoja, joilla piezon saa myös vaiennettua.

Lataa ohjelma Arduinolle ja tutki, kuinka soitin toimii nyt.

Mitä uutta ohjelmassa on?

  • if (valo < 600)If-lauseessa määritellään kynnysarvo: ääntä kuuluu vain, kun valoa on alle 600. Arduino suorittaa if-lauseen sisällä (eli { ja } merkkien välissä) olevia, ääntä tuottavia komentoja niin kauan kuin ehto pitää paikkansa. Huom: Katso sarjamonitorista, millaisia valolukemia juuri sinun ympäristössäsi tulee ja muuta kynnysarvoa sopivaksi! 
  • noTone(9);Tämä käsky vaientaa Arduinon portin 9. Se on laitettu kahteen paikkaan: sitä käytetään taukojen tekemiseen kun soitinta soitellaan varjoilla, ja koko soittimen vaientamiseen silloin kun valoa on kynnysarvoa enemmän (eli ohjelman else-osassa).
  • delay(50);
    Delay aiheuttaa ohjelman suoritukseen viivettä, ja sitä voi käyttää nuottien keston ja nuottien välisten taukojen määrittelyyn. Delayn arvot ovat millisekunteja. 

Kokeile seuraavia juttuja:

  • Muuttele delay-arvoja, varjosta ja valaise LDR:ää.
    Kokeile esim. miltä kuulostaa kun molemmat delay-arvot ovat alle 10, toinen on 1000 ja toinen alle 10 - yritä saada aikaan oikein nopeita sekä hitaampia rytmejä!
  • Muuta if-lauseen kynnysarvoa tarvittaessa. Ehkä haluat kääntää ehdon päinvastoin: valo > 600?
  • Muista ladata ohjelma Arduinolle, kun olet muuttanut koodia, jotta kuulet muutokset äänessä.

Extra (kokeile jos haluat):

  • Saatko muutettua myös delay-arvoja niin, että ne riippuvat valon määrästä? 

Ohjelmointi 4/4

Vaihe 5
Säädetään äänenkorkeuksien vaihtelua laajemmaksi  Pienin mahdollinen anturilukema Arduinolla on 0 ja suurin 1023. Piezo puolestaan voi tuottaa äänenkorkeuksia paljon laajemmalla skaalalla. Map-komennolla voidaan s[kaalata valon lukemat isommalle välille, jotta äänenkorkeus vaihtelee enemmän.

Lataa ohjelma Arduinolle ja testaa kuinka se toimii nyt.

Mitä uutta ohjelmassa on?

  • map(valo, 0, 1023, 50, 3000); Map-komennolla muutetaan jokin arvo yhdeltä lukuasteikolta toiselle.  Tässä anturilukema muutetaan väliltä 0-1023 välille 50-3000 hertsiä. Komento tarvitsee 5 lukemaa, jotta se toimii:
    • arvon joka skaalataan (valo-muuttuja),
    • pienimmän arvon joka valo-muuttujalla voi olla,
    • suurimman arvon joka valo-muuttujalla voi olla,
    • pienimmän hertsiluvun, joka äänelle halutaan antaa sekä
    • suurimman hertsiluvun, joka äänelle halutaan antaa.

Kokeile:

  • Muuta äänenkorkeuksien ylä- ja alarajaa.
    Jos haluat että soitin soi matalammalta, kokeile esim:
    map(valo, 0, 1023, 30, 800); // 30 - 800 hertsin ääni
  • Anturit eivät välttämättä tuota ihan kaikkia arvoja välillä 0-1023. Katso sarjamonitorista, mitkä näyttäisivät olevan  valon pienin ja suurin arvo, noin suurin piirtein.  Jos et esim. saa anturista pienempiä lukemia kuin 100 tai suurempia kuin 900, kannattaa kirjoittaa
    map(valo, 100, 900, 50, 2000);
  • Voit myös kääntää skaalan toisin päin - isoista anturilukemista skaalataan pieniä hertsilukuja ja päin vastoin:
    map(valo, 100, 900, 2000, 50);

Soittotekniikka haltuun!

Vaihe 6
Millä tätä soitinta soitetaan? Tutki ympäristöäsi ja mieti, voiko soitinta soittaa muutenkin kuin kädellä. Saatko soittimen toimimaan välkkyvällä valolla? Mitä varjostavaa liikettä voisit tuottaa? Tai saatko muutettua jonkin luonnonilmiön ääneksi?

Look Mum No Computer käyttää samaa LDR-komponenttia omassa syntetisaattorissaan, ja soittaa sitä fidget spinnerillä (spinner toimii muuten Arduino-soittimen kanssa myös!):

Mitä voi kokeilla:

  • isot valon vaihtelut: jos näet selvästi soittimeen osuvat varjot, vaihtelua on helpompi ennakoida ja aiheuttaa. Kokeile kohdevaloa!
  • voiko soitinta soittaa luonnonilmiöillä - paistaako aurinko, heiluuko oksa tuulessa sopivasti?
  • Valoa tuottavat laitteet - kuinka soitin toimii jos sen vie lähelle telkkaria? Entä kännykkää? LED-kynttilää? Huom: jos haluat, että soitin soi kirkkaassa valossa eikä varjossa, käännä if-lauseen ehto: valo 600. Tarkista myös sarjamonitorista, millaisia lukemia kirkas valo tuottaa ja muuta kynnysarvoa tarvittaessa.
  • Jos kytket Arduinoon 9V pariston, voit liikutella soitinta paikasta toiseen helpommin! Ehkä soitin voisikin olla kiinni repussa tai polkupyörässä?

Huom: Tässä tehtävässä voit valita, satsaatko ohjelman hienosäätöön vai rakenteluun ja materiaaleilla värkkäykseen - kunhan kokeilet muutamia vaihtoehtoisia soittelutekniikoita.  


Lisätietoa

Vieläkö haluaisit kehitellä soitinta? Lisää potentiometri ja muuttele sillä vaikkapa delay-arvoja!

Jos taas piipitys ottaa pannuun, kytke potentiometri piezon ja portin 9 väliin. Potentiometrin resistanssi muuttuu nuppia kääntämällä, ja sillä saa vaimennettua piezon ääntä ihan ilman ohjelmointia.

Vinkkejä syventävää materiaalia kaipaaville

Voit tutustua Mehackitin kurssimateriaalin Arduino-projekteja Maker kitillä haastavampiin tehtäviin. Mm. seuraavat tehtävät  laajentavat viikkotehtävän aihepiiriä:

Luku 4: Koko maailman aistiminen

  • Hämäräkytkin
  • Sähkönjohtavuustesti
  • Etäisyyteen reagoiva soitin
  • Kädellä ja kosketuksella ohjattava valo

Jos et koe olevasi valmis hyppäämään suoraan näihin tehtäviin, voit käydä pohjustukseksi läpi myös luvun 3 materiaaleja.


Ongelmanratkaisu

Eikö Arduino toimi niin kuin halusit? Ei hätää - tämä on ihan tavallista myös kokeneille Arduino-värkkääjille. Käy läpi seuraava tarkistuslista, yleensä vika on jokin näistä!

  • Onko Tools- eli Työkalut-valikossa, kohdassa Port (Portti) valittuna se Arduinoon viittaava portti?
  • Onko Tools- eli Työkalut-valikossa, kohdassa Board valittuna Arduino/Genuino UNO?
  • Onko koodissa ja kytkennöissä varmasti käytetty samaa Arduino-porttia?
  • Ovatko puolipisteet oikeilla paikoillaan?
  • Onko jokaisella kaarisulkeella ja tavallisella sulkeella pari?
  • Jos kopioit koodia IDEen: onko koodiin tullut vahingossa 2 setup- tai loop-osaa? Niitä saa olla vain yksi kumpaakin.
  • Koodissa saa olla vain oikeinkirjoitettuja komentoja sekä kommentteja ( //mitä vain tekstiä kahden kauttaviivan jälkeen). Oletko vahingossa poistanut kauttaviivoja kommenttien edestä?
  • Oletko kirjoittanut isot ja pienet kirjaimet kuten esimerkissä?
  • Oletko käynyt läpi kytkemäsi johdot - että johdot on kytketty samalle kytkentäalustan riville kuin komponentit?
  • Oletko kokeillut irrottaa USB-johdon ja kiinnittää sen uudelleen? Oletko kokeillut kytkeä Arduinon eri USB-porttiin? Huom: tämän jälkeen tarkista portti Tools-valikosta.
  • Oletko resetoinut Arduinon pienestä napista laitteen päällä? Tämä käynnistää laitteelle ladatun ohjelman alusta.
  • Eihän sinulla ole komponentteja kytkettynä portteihin 0 tai 1? Nämä portit tarvitaan joskus Arduinon ja tietokoneen väliseen tietoliikenteeseen, mikä voi välillä sotkea asioita.
  • Kokeilitko etsiä Arduino IDE:n tuottamalla virheilmoituksella ohjeita netistä?