Tehtävä: Aisti kosketusta ja etäisyyttä kapasitiivisella anturilla sekä testaa anturiin sopivia materiaaleja.
Arduinossa on sisäänrakennettu ominaisuus, jonka ansiosta on helppo
toteuttaa maagisia efektejä liikuttelemalla kättä esineiden lähellä ja
koskettamalla niitä eri voimakkuuksilla. Tässä tehtävässä tutustutaan
kapasitiiviseen anturiin!
Kapasitiivisuus tarkoittaa kykyä varata sähköä ja luovuttaa sitä
hitaasti. Tehtävässä kapasitiivisena sensorina voi käyttää
alumiinifoliota tai jotain sähköä johtavaa ainetta kuten
metalliesineitä, omenaa, sähköäjohtavaa muovailuvahaa tai pehmeän
lyijykynän grafiittia.
Tehtävä pähkinänkuoressa:
Kytke iso vastus (aluksi 1 megaohmia) sekä sähköäjohtava esine
virtapiiriksi. Kytke myös piezo ja LED.
Ohjelmoi Arduinon kapasitiivinen anturi toimintaan, jotta sillä voi
muutella ääntä ja LEDin kirkkautta. Saat käyttää valmista koodia
Testaa erilaisia sähköäjohtavia materiaaleja anturin kanssa -
millaisella materiaalilla syntyy mielenkiintoinen käyttötuntuma?
Vapaaehtoinen lisä: tutustu tehtävän lisämateriaaleihin ja kokeile
soveltuvilta osin. Voit muuttaa anturin herkkyyttä lisäämällä
vastusta, voit tuottaa valon ja äänen sijaan liikettä, tai voit
ottaa käyttöön monta kapasitiivista anturia.
Jaa koodi ja materiaalikokeilut vertaisarviointitehtävässä.
Alla olevassa videossa sählypallon sisään on laitettu led. Pallon pinta
on peitetty folioteipillä, joka on kytketty Arduinon virtapiiriin
johdoilla. Koko pallo toimii kapasitiivisena anturina.
Tiesitkö että...
Kondensaattori on komponentti, jonka toiminta perustuu kapasitiivisuuteen eli kykyyn varastoida sähkövarausta ja luovuttaa sitä hitaasti. Kondensaattoreita käytetään tämän vuoksi muun muassa virtapiikkien tasoittamiseen virtapiireissä.
Myös useimmat kosketusnäytöt perustuvat kapasitiivisuuteen. Kun painat näyttöä, sen kapasitanssi muuttuu ja siten painallus tunnistetaan.
Tarvikkeet
Mehackit-boardin tai Arduino UNOn, USB-johdon, kytkentäjohtojen ja -levyn lisäksi tarvitset:
Näitä käytetään tehtävässä sensorin tekemiseen! Voit
käyttää mitä tahansa esinettä aluksi, esimerkiksi avainta tai lusikkaa.
vastuksia, 1 MΩ / 10 MΩ
Harjoitukseen tarvitaan suuri vastus. Ohjeessa käytetään 1 megaohmin vastusta (ruskea,
musta, vihreä, kulta), ja sillä kannattaa aloittaa! Sopivia ovat myös muut vastukset
joiden resistanssi on yli 300kΩ. Arduino Starter Kitin 10 megaohmin vastukset sopivat
myös. Varaa lähelle useampia vastuksia, sillä näitä voi kytkeä
sarjaan.
LED
Alun esimerkissä on käytetty kirkaskupuista, sinistä lediä, josta lähtee
voimakas valo.
vastus, 330Ω tai 220Ω
Vastus suojaa Arduinon porttia liian suurelta virralta. 330Ω tai 220Ω vastus on sopiva LEDin
kanssa käytettäväksi
piezo-kaiutin
Yksinkertainen summerikaiutin
Kytkentä
Yhdistä portit 2 ja 4 yhden megaohmin vastuksella toisiinsa ( jos
mahdollista, aloita kokeilut juuri tällä vastuksella, vaikka sinulla
olisi muitakin 200kOhm-10MOhm vastuksia).
Kiinnitä johto vastuksen jalan ja porttiin 2 menevän johdon
välille. Yhdistä tämä uusi johto metalliesineeseen, alumiinifolioon
tai vaikka hedelmään. Esine voi olla iso tai pieni - alumiinifolion
kanssa voit testailla erikokoisia paloja. Käytä tarvittaessa
teippiä, jotta johdon metallipää on tiiviisti kiinni
esineessä.
Yhdistä piezo porttiin 7 ja maahan
Yhdistä LED porttiin 9 ja 330 ohmin vastuksella maahan.
Teippiä tai porkkanaa?
Folioteippi toimii tässäkin kokeilussa hyvin.
Johdonpään saa kätevästi työnnettyä vaikka porkkanaan.
Ohjelmointi 1/3: Kirjaston asentaminen
Vaihe 1
Ohjelmointi 1/3: Asenna tarvittava kirjasto
Lataa ja asenna kirjasto CapacitiveSensor, jotta saat kapasitiivisen
anturin käyttöön. Kopioi tehtävässä annettu koodinpätkä ja lataa se
Arduinolle. Kosketa virtapiiriin kiinnittämääsi esinettä ja kuuntele,
millaisia ääniä piezosta kuuluu. Katso myös sarjamonitorista,
millaisia arvoja kapasitiivisesta anturista tulee.
Lisää zip-kirjasto valikosta Sketch (tai Sketsi) > Include
library > Add .ZIP library... :
Etsi lataamasi zip-paketti koneelta (esim. kansiosta Lataukset tai
Downloads):
Kapasitiivinen anturi toimintaan
Maalaa ja kopioi allaoleva ohjelma. Mene Arduino IDEen
ja poista koodi-ikkunasta kaikki siellä mahdollisesti näkyvä koodi.
Liimaa tämä koodi tilalle.
//ks. koodin uusien osien selitys kurssimateriaalissa
#include<CapacitiveSensor.h>long lukema;
CapacitiveSensor anturi = CapacitiveSensor(4, 2);
voidsetup(){
Serial.begin(9600);
}
voidloop() {
lukema = anturi.capacitiveSensor(30);
Serial.println(lukema);
delay(10);
tone(7, lukema);
}
Lataa ohjelma Arduinolle ja koskettele virtapiiriin kiinnittämääsi
esinettä. Piezosta kuuluvien äänien korkeus nousee kun kosket
esineeseen. Äänenkorkeus muuttuu jo silloin, kun viet käden ihan lähelle
esinettä.
Avaa sarjamonitori (serial monitor) ja tarkastele anturin lukemia.
Lukemat nousevat aika korkeiksi kun anturiin kosketaan. Myös kosketuksen
voimakkuudella on väliä!
Mitä uutta ohjelmassa tapahtuu?
#include <CapacitiveSensor.h> Komennolla lisätään lataamasi ja asentamasi anturikirjasto tähän
ohjelmaan. Näin saat käyttöön valmiiksi ohjelmoituja komentoja,
joilla kapasitiivista anturia on helpompi koodailla. Joku (tarkemmin
sanoen Paul Badger ja Paul
Stoffregen)
on siis tehnyt paljon työtä jo valmiiksi, ja pyörää on turha keksiä
uudestaan.
long
lukema Tässä luodaan tuttuun tapaan muuttuja, johon on tarkoitus tallentaa
anturilukemia. Muuttujan tyyppi ei nyt olekaan kokonaisluku (int,
integer), vaan long! Tämä johtuu siitä, että anturilukemat saattavat
olla hyvin isoja, jolloin ne voivat ylittää int-muuttujien
maksimipituuden. Lisätietoa aiheesta linkin takana, Arduinon
sivuilla.
CapacitiveSensor anturi = CapacitiveSensor(4,
2); Komennolla
luodaan olio, jonka tyyppi on CapacitiveSensor ja nimi on
anturi. Suluissa
määritellään portit, joiden välistä mitataan anturilukemia (portit 4
ja 2). Olio-ohjelmointia ei tarvitse tällä kurssilla ymmärtää syvällisesti.
Älä siis stressaannu jos koodirivi ei ihan nyt aukene!
lukema =
anturi.capacitiveSensor(30) Tämä on eri komento kuin ylläoleva. Komento on peräisin
asentamastasi kirjastosta, ja sillä mitataan anturin lukema (eli
kapasitanssin suuruus). Mitattu arvo tallennetaan muuttujaan nimeltä
lukema. Suluissa
oleva numero kertoo mittauksessa otettavien näytteiden määrän - 30
on ihan hyvä ja riittävä.
tone(7,
lukema) Tone-komento on jo vanha tuttu, mutta kertauksena: tone soittaa
porttiin 7 kiinnitetyn piezo-kaiuttimen kautta sävelen, jonka
korkeuden määrää komennon toinen parametri. tone(7, 440) soittaisi
piezosta 440 Hz korkuisen äänen. Nyt äänenkorkeuden määrääkin
anturista mitattu arvo, joka tallennettu
muuttujaan lukema. Eli
mikä ikinä anturin mittaama lukema onkaan, tone-komento saa tuon
arvon ja käyttää sitä äänenkorkeutena.
Extra
Kokeile kertoa muuttuja
lukema desimaaliluvulla
väliltä 0-1 tai jollain kokonaisluvulla ennen kuin syötät sen
tone-komennolle, esim. näin:
Nyt säädetään LED kirkastumaan ja himmenemään kosketuksen mukaan!
Komennolla analogWrite voidaan antaa LEDillä kirkkausarvoja välillä
0-255. Jotta anturin lukemat voi syöttää LEDille, ne täytyy muuttaa
välille 0-255 map-komennon avulla. Kirjoita tai kopioi uusi
pätkä koodiin! Psst: Jos piezo alkaa jo ärsyttää, nykäise siitä johto irti tai
poista ääntä tuottavat komennot...
#include<CapacitiveSensor.h>long lukema;
CapacitiveSensor anturi = CapacitiveSensor(4, 2);
int kirkkaus;
voidsetup(){
Serial.begin(9600);
pinMode(9, OUTPUT);
}
voidloop() {
lukema = anturi.capacitiveSensor(30);
Serial.println(lukema);
delay(10);
tone(7, lukema);
kirkkaus = map(lukema, 0, 4000, 0, 255);
if (lukema >4000) {
kirkkaus =255;
}
analogWrite(9, kirkkaus);
}
Mitä uutta ohjelmassa tapahtuu?
kirkkaus = map(lukema, 0, 4000, 0, 255); Map-komennolla muunnetaan anturilukema sellaiselle välille, että
sitä voi käyttää valon kirkastamiseen ja himmentämiseen. Tällä
rivillä kerrotaan, että
lukema joka voi
olla välillä 0-4000, muunnetaan välille 0-255. Tämä uusi, muunnettu
arvo tallennetaan muuttujaan kirkkaus. Sarjamonitorista
kuitenkin näkyy, että anturilukemat voivat olla paljon isompia kuin
4000 - niillä ei ole selkeää ylärajaa. Jokin yläraja map-komennolle
kuitenkin on annettava, ja tässä on valittu luku 4000. Voit toki
testailla muillakin
lukemilla!
if (lukema > 4000) If-lause laittaa LEDin aina täydelle teholle (arvo 255), jos
kapasitiivisesta anturista tuleva arvo on yli 4000. Ilman tätä
if-lausetta LED voi palaa arvaamattomasti silloin, kun anturin
lukemat menevät yli map-komennossa määritellyn alueen 0-4000. Jos
tykkäät arvaamattomasta valosta, voit toki testata ohjelmaa ilman
if-lausetta!
analogWrite(9, kirkkaus) Tämä tosi hyödyllinen Arduino-komento sopii LEDin kirkkauden
vaihtelemiseen. Komennon ensimmäinen parametri on portti, ja toinen
on LEDille syötettävä kirkkauden arvo, jonka on oltava välillä
0-255. Jotta komentoa voi käyttää, LED täytyy olla kytkettynä
porttiin, jossa on merkki ~ (portit 3, 5, 6 sekä 9-11).
Arduino voi mallintaa näiden porttien kautta analogista eli jatkuvaa
signaalia. Mallintamismenetelmä on nimeltään pulssinleveysmodulaatio
eli PWM, joka on selitetty tarkemmin
Lisätietoa-osiossa
Lisää loop-osaan ehtolause, jonka avulla LED saadaan
pimeäksi ja ääni vaiennettua, kun sensorin lähellä ei ole kättä.
Seuraa sarjamonitorista anturisi arvoja ja muuta kynnysarvoa
tarvittaessa!
Mitkä esineet johtavat sähköä, hyvin tai huonosti? Tutki, millaiset
esineet ja materiaalit voi valjastaa antureiksi. Dokumentoi jokin
kokeilusi valokuvalla ja liitä se tehtävän palautukseen.
Vinkkejä:
tutki, tunnistaako anturi kosketuksen lasin, puun tai muovin läpi:
kokeile kiinnittää johdonpää folioteipillä tms. materiaalin toiselle
puolelle.
testaa nesteitä (varo kuitenkin kastelemasta Arduinoa) ja
nestepitoisia juttuja kuten huonekasveja, multaa, hedelmiä.
kiinnitä anturi toiseen ihmiseen ja kosketa häntä. Tähän kokeiluun
tarvitset kaverin, ei toimi yhdellä henkilöllä!
Tutki erikokoisia metalliesineitä. Miten anturi toimii jos sen
kiinnittää isoon metallipintaan?
Saat anturin herkemmäksi lisäämällä resistanssia - ks. seuraavan
sivun ohjeet. Tällöin anturi voi havaita kosketuksen vähän
paksummankin materiaalin läpi!
Seuraile sarjamonitorin arvoja ja muuta map-komennon ja if-lauseiden
lukemia tarvittaessa.
Johto ja sähköäjohtava folio on jemmattu kääntöpuolelle
Vapaaehtoisia lisäkokeiluja
Lisää herkkyyttä anturiin
Mitä suurempia vastuksia käytät, sitä kauempaa kapasitiivinen anturi
havaitsee käden. Voit kytkeä peräkkäin useampia 1 megaohmin vastuksia -
vaikka kaikki pakistasi löytyvät. Jos sinulla on 10 megaohmin vastuksia,
testaa ihmeessä myös niitä!
Saatat joutua muuttamaan ohjelmasi kynnysarvoa kun virtapiirin
resistanssi kasvaa - seuraile sarjamonitorin anturilukemia.
Useita vastuksia kytkettäessä Arduino saattaa alkaa toimia
kummallisesti, sillä kapasitiivinen anturi on aika herkkä häiriöille.
Kurkkaa täältä vinkit ongelmanratkaisuun.
Kokeile valon kirkastamista for-silmukalla
for-silmukka kuuluu
ohjelmoinnin peruskikkoihin milteipä kielessä kuin kielessä.
LMHI-elektroniikkapolulla for-silmukkaa ei käydä läpi, mutta voit tutkia
sen toimintaa ihan vain kopioimalla allaolevan koodin sekä kurkkaamalla
selitykseen linkin takana (johtaa Arduinon sivuille).
#include<CapacitiveSensor.h>long lukema;
CapacitiveSensor anturi = CapacitiveSensor(4, 2);
int kirkkaus;
voidsetup(){
Serial.begin(9600);
pinMode(9, OUTPUT);
}
voidloop() {
lukema = anturi.capacitiveSensor(30);
Serial.println(lukema);
delay(10);
if (lukema >100) {
tone(7, lukema);
kirkkaus = map(lukema, 0, 1200, 0, 255);
if (lukema >2000) {
kirkkaus =255;
}
for (int i =0; i < kirkkaus; i++) {
analogWrite(9, i);
delay(20);
}
analogWrite(9, 0);
delay(500);
} else {
noTone(7);
}
}
Useampia kapasitiivisia antureita samaan projektiin
Useamman kapasitiivisen anturin kytkeminen ja ohjelmointi on aika
suoraviivaista. Monella anturilla voi toteuttaa vaikka tällaisen
kosketinsoittimen:
Kosketinsoittimen kytkentä on seuraavanlainen:
Ohjelmoitaessa vain määritellään lisää CapacitiveSensor-antureita ja
tallennetaan jokaisen arvo omaan muuttujaan. Arvoja käytetään erilaisten
toimintojen käynnistämiseen.
#include<CapacitiveSensor.h>
CapacitiveSensor sensor1 = CapacitiveSensor(4,2);
CapacitiveSensor sensor2 = CapacitiveSensor(4,3);
CapacitiveSensor sensor3 = CapacitiveSensor(4,5);
// ja niin edelleen
voidsetup(){
// käynnistä sarjaliikenne
}
voidloop() {
long sensorValue1 = sensor1.capacitiveSensor(30);
long sensorValue2 = sensor2.capacitiveSensor(30);
long sensorValue3 = sensor3.capacitiveSensor(30);
// jne.
// tulosta sensorValue serial monitoriin
// ohjelmoi 10 millisekunnin viive
if (sensorValue1 >100) {
tone(7,440);
} elseif {
}
// ohjelmoi jokaisen anturin arvoille omat toiminnot. noTone(7); viimeisessä ehdossa hiljentää summerin.
}
Lisätietoa ja projektiesimerkkejä
Miten analogWrite toimii - eli mitä ihmettä PWM tarkoittaa?
Symbolilla (~) merkittyjä portteja voi käyttää ulostulona, jolla
jäljitellään analogista signaalia. Porteille voi asettaa komennolla
analogWrite arvoja, jotka ovat välillä 0-255.
Esim:
analogWrite(5, 155); // portti 5 saa arvon 155
Analogisen signaalin jäljittely on nimeltään PWM
(Pulse-Width
Modulation eli pulssinleveysmodulaatio).
Arduinon ulostuloina käytettävät portit 0-13 pystyvät tuottamaan vain 5V
jännitettä tai 0 volttia - olemaan vain tilassa HIGH tai LOW.
Kuinka sitten on mahdollista tuottaa vaihtelevaa valon kirkkautta?
Arduinon portit pystyvät vuorottelemaan 5V ja 0V välillä hyvin nopeasti
näin tapahtui, kun tuotettiin ääntä piezolla: äänenkorkeuden 440
Hz tuottamiseksi Arduino laittoi portin päälle ja pois 440 kertaa
sekunnissa. Portti on tällöin yhtä pitkään päällä ja pois päältä.
Tämä ei kuitenkaan riitä, kun tarvitaan vaihtelevaa kirkkautta. PWM (~)
-portit pystyvät paitsi menemään päälle ja pois hyvin nopeasti, myös
vaihtelemaan sitä, kuinka pitkään portti on täysillä.
Periaate tiivistettynä:
kun PWM-ominaisuutta käytetään analogWrite-komennolla, Arduino
laittaa kyseisen portin päälle ja pois tosi nopeasti (490-980 kertaa
sekunnissa)
Samalla Arduino päättelee analogWrite-komennon parametreista, kuinka
pitkään jännite pidetään täysillä jokaisen päälle ja pois
-kierroksen aikana. Kuten allaolevasta kuvasta näkyy, arvolla 64
portti on päällä 25% ajasta. Arvolla 127 portti taas on päällä
puolet ajasta, arvolla 191 75% jne.
Tällä systeemillä led näyttää sitä kirkkaammalta, mitä suurempi arvo
analogWrite-komennolle annetaan.
Jos käytät tone-funktiota, porttien 3 ja 11 PWM-signaali ei toimi
normaalisti (tone ja portit 3 + 11 käyttävät samaa sisäänrakennettua
ajastinta)
Jos käytät Servo-kirjastoa, porttien 9 ja 10 PWM-signaali ei toimi.
Kytke siis servot portteihin 9 ja 10, jos haluat hyödyntää
projektissasi myös PWM-toimintoa.
Porteissa 5 ja 6 on suurempi taajuus (980Hz) kuin muissa
PWM-porteissa (490Hz). Tästä voi seurata, että esimerkiksi
analogWrite(5, 0) ei pimennä lediä täysin vaan siitä voi vielä tulla
vähän valoa.
Kuinka kapasitiivinen anturi toimii?
Arduinon kapasitiivisessa anturissa yksi portti (esimerkeissä 4) toimii
lähettäjänä ja toinen vastaanottimena. Vastaanottajaportti mittaa,
kuinka kauan kestää, että lähettäjästä tuleva sähkövirta pääsee perille.
Signaalin kulkuun kuluva aika riippuu virtapiiriin kytketyn
sähköäjohtavan aineen ja sitä koskettavan käden aiheuttamasta
kapasitanssista, eli kyvystä varastoida sähkövarausta.
Jos käyttöön on otettu useita kapasitiivisia antureita, lähettäjäportti
voi olla sama näille kaikille.
Oheisessa työssä on yhdistetty sähköäjohtavalla maalilla tehty maalaus,
Arduinon kapasitiivinen anturi sekä maalaukseen projisoidut
Processing-animaatiot. Arduinon vastaanottama anturidata voi
ohjata Processing-ohjelmaa sarjaliikenteen avulla
Arduinon avulla on siis mahdollista toteuttaa aika hienostunutta
vuorovaikutusta!
Kapasitiivinen anturi on herkkä häiriöille. Joskus anturin arvot jäävät
kosketuksen jälkeen omituisen korkealle, esimerkiksi jos anturia koskee
pitkään tai jos kytkentöjä muutetaan virran ollessa päällä. Voit
kokeilla seuraavia toimenpiteitä:
resetoi Arduino tai ota siitä virrat pois
lisää setup-osaan komento: anturi.set\_CS\_AutocaL\_Millis(300); Tämä komento pakottaa anturin kalibroimaan itsensä 300
millisekunnin välein.
maadoita anturi: laita sen alle reilu pala foliota ja yhdistä
folio lattiaan tai esimerkiksi pöydänjalkaan johdolla. Laita
foliopalan ja anturina toimivan esineen väliin eristykseksi
paperia.
kommentoi Serial.begin ja Serial.println -komennot pois päältä
koodistasi
Anturi toimii eri lailla riippuen siitä, onko Arduino kiinni
ulkoisessa virtalähteessä vai tietokoneessa. Jos tietokoneen
virtalähde ei ole seinässä, kokeile kytkeä se!
Jos anturi ei toimi yhtään, tarkista kytkennät - esim. anturin johto
(kaaviossa lila) täytyy olla porttiin 2 menevän johdon kanssa samassa
rivissä.
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ä?