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.
Tältä theremin kuulostaa:
Tarvikkeet
Arduino UNOn / Mehackit Maker boardin, kytkentälevyn, kytkentäjohtojen
ja USB-johdon lisäksi tarvitset:
Osa
Kuva
Selitys
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 valovastus
LDR (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.
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:
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!):
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ä?