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öä. Tehtävässä kapasitiivisena sensorina voi käyttää alumiinifoliota tai jotain sähköä johtavaa kappaletta kuten omenaa tai banaania. Kun virtapiiri suljetaan, sensori kerää sähkövarausta itseensä. Jos sensoriin koskee, sen varastointikyky eli kapasitanssi kasvaa entisestään. Tällöin kestää pidempään täyttää käden ja metallin muodostama systeemi sähkövarauksella.
Alla olevassa videossa sählypallon sisään on laitettu led, ja pinta on peitetty folioteipillä. Folio on osa Arduinon virtapiiriä ja koko pallo toimii kapasitiivisena anturina. Kun virtapiirissä on tarpeeksi paljon resistanssia, palloon ei tarvitse edes koskea vaan käden vieminen lähelle riittää.
Tiesitkö että...
Kondensaattori on komponentti, jonka toiminta perustuu kykyyn varastoida sähkövarausta ja luovuttaa sitä hitaasti. Kondensaattoreita käytetään tämän vuoksi muun muassa virtapiikkien tasoittamiseen virtapiireissä. Monet kosketusnäytöt perustuvat myös kapasitiivisuuteen. Kun painat näyttöä, sen kapasitanssi muuttuu ja siten painallus tunnistetaan.
Tarvikkeet
Mehackit boardin (tai Arduinon), USB-johdon, koekytkentälevyn ja johtimien lisäksi tarvitset seuraavat komponentit.
Tätä käytetään tehtävässä sensorin tekemiseen! Voit käyttää mitä tahansa esinettä aluksi, esimerkiksi avainta tai lusikkaa.
Vastuksia, 1 MΩ
Harjoitukseen tarvitaan suuri vastus, koska piirissä ei sen lisäksi ole muuta kuormaa. Mehackit Maker Kitin suurin vastus on 1 megaohmia (ruskea, musta, vihreä, kulta), mutta sopivia ovat myös muut vastukset joiden resistanssi on yli 300kΩ. Varaa lähelle useampia 1MΩ vastuksia, sillä näitä voi kytkeä sarjaan.
LED
Pidempi 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.
Piezo-kaiutin
Elektroninen komponentti, jota voi käyttää värähtelyn havaitsemiseen sekä äänten tuottamiseen.
Virtapiiri
Yhdistä portit 2 ja 4 vastuksella toisiinsa. Yhdistä portti 2 johtimella metalliesineeseen, alumiinifolioon tai vaikka hedelmään. Esine voi olla iso tai pieni. Käytä tarvittaessa teippiä, jotta saat kestävän kiinnityksen.
Yhdistä piezo porttiin 7 ja maahan.
Yhdistä led porttiin 9 ja 330 ohmin vastuksen kautta maahan.
Ohjelman tavoite
Ohjelma perustuu kapasitiivista anturia varten koodattuun kirjastoon Capacitive Sensing.
Yksi Arduinon sisäänrakennetuista kapasitiivisista antureista seuraa, kuinka suuri sähkövaraus varastoituu porttien 2 ja 4 välille. Kapasitanssiarvo muunnetaan äänenkorkeudeksi ja ledin kirkkausarvoksi. Lisäksi ohjelmoidaan kynnysarvo, jotta ääni ja valo eivät ole kaiken aikaa toiminnassa.
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.
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.
#include <Capacitive.Sensor.h>: Anturikirjaston asentaminen. Kirjasto on koodia, jossa määritellään komentoja. Tässä tapauksessa metodit on suunniteltu juuri kapasitiivisten sensoreiden kanssa puuhaamiseen. Joku on siis tehnyt paljon työtä jo valmiiksi, ja pyörää on turha keksiä uudestaan!
CapacitiveSensor(portti1, portti2): Komennolla luodaan uusi anturiolio, jolle määritellään parametreina portit, joiden välistä kapasitanssia mitataan.
capacitiveSensor(näytteet): Tämä on eri komento kuin ylläoleva! Komennolla luetaan kapasitanssin suuruus. Näytteiden lukuarvoksi sopii esimerkiksi 30.
Ohjelmointi 1/3 - Kirjaston asentaminen ja anturin testaus
Asenntaan kirjasto CapacitiveSensor, jotta saat kapasitiivisen anturin kätevästi toimintaan.
Lisää zip-kirjasto Arduino IDE:n valikosta Sketch (tai Sketsi) > Include library > Add .ZIP library… Etsi lataamasi zip-paketti tietokoneeltasi (esim. kansiosta Lataukset tai Downloads)
Tehtävä
Kun olet ladannut kirjaston ja paikantanut sen Arduino IDE:ssä, täydennä alta löytyvä ohjelma ja syötä se Arduinollesi.
Kun lataat ohjelman Arduinolle, kuulet matalia ääniä piezosta, kun kapasitiiviseen anturiin ei kosketa. Kosketus saa äänen nousemaan.
Lukemia Serial monitorista seuratessasi huomaat, että lukemat nousevat hyvin korkeiksi, kun anturiin kosketaan. Capacitive Sensor-kirjasto mittaa porttien 2 ja 4 välisen viestin kulkeutumiseen menevää aikaa. Siksi arvo ei ole automaattisesti väliltä 0-1023, kuten analogisten porttien kanssa työskenneltäessä.
tone-komento tarvitsee parametreiksi portin (jota ei tarvitse edes alustaa ulostuloksi) ja taajuuden. Kapasitanssin voi syöttää tone-komennolle sellaisenaan.
Tehtävä
Kokeile kertoa sensorValue desimaaliluvulla (väliltä 0-1) tai jollain kokonaisluvulla! Miten tämä vaikuttaa ääneen?
Minkälaisia arvoja kapasitiivisesta sensorista tulee Serial monitoriin?
Ohjelmointi 2/3 - Valo päälle
Ohjelmoidaan seuraavaksi lediä. Siinä missä tone-komennolle voi antaa parametrinä hyvinkin korkeita arvoja, ledin kirkkautta voi ohjata vain lukuarvoilla 0-255. Kapasitiivisen anturin arvoa ei voi siis syöttää ledille sellaisenaan.
Tehtävä
Täydennä alla oleva ohjelma ohjeiden mukaan ja syötä se Arduinolle.
#include<CapacitiveSensor.h>
CapacitiveSensor sensor = CapacitiveSensor(4, 2);
voidsetup(){
// käynnistä sarjaliikenne
// määrittele portti 9 ulostuloksi
}
voidloop() {
long sensorValue = sensor.capacitiveSensor(30);
// tulosta sensorValue serial monitoriin
// ohjelmoi 10 millisekunnin viive
tone(7,sensorValue);
int kirkkaus = map(sensorValue, 0, 2000, 0, 255);
// laita led päälle komennolla analogWrite. Käytä muuttujaa kirkkaus.
}
Koodin map-komennossa on laitettu anturin antamien arvojen ylärajaksi 2000, vaikka todellisuudessa lukemat voivat olla korkeampia. Voit myös kokeilla laittaa ylärajaksi suuremman luvun. Jos anturin koko arvoalue huomioidaan, led palaa suurimman osan ajasta hyvin himmeästi. Kun anturin arvot menevät yli map-komennossa määritellystä rajasta, led palaa arvaamattomasti.
Tehtävä
Lisää ohjelmaan vielä ehtolause, joka laittaa ledin aina täydelle teholle (arvo 255), jos kapasitiivisesta sensorista tuleva arvo kasvaa tarpeeksi suureksi.
voidloop() {
long sensorValue = sensor.capacitiveSensor(30);
// tulosta sensorValue serial monitoriin
// ohjelmoi 10 millisekunnin viive
tone(7,sensorValue);
int kirkkaus = map(sensorValue, 0, 2000, 0, 255);
if (sensorValue >2000) {
kirkkaus =255;
}
// laita led päälle komennolla analogWrite - käytä muuttujaa kirkkaus
}
Lisää loop-osaan ehtolause, jonka avulla led saadaan pimeäksi ja ääni vaiennettua, kun sensorin lähellä ei ole kättä. Seuraa Serial monitorista anturisi arvoja ja muuta kynnysarvoa tarvittaessa!
voidloop() {
long sensorValue = sensor.capacitiveSensor(30);
// tulosta sensorValue serial monitoriin
// ohjelmoi 10 millisekunnin viive
if (sensorValue >100) {
tone(7,sensorValue);
int kirkkaus = map(sensorValue, 0, 2000, 0, 255);
if (sensorValue >2000) {
kirkkaus =255;
}
// laita led päälle komennolla analogWrite - käytä muuttujaa kirkkaus
} else {
noTone(7);
// laita led pois päältä
}
}
Ongelmia?
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 seuraava komento, joka pakottaa anturin kalibroimaan itsensä 300 millisekunnin välein.
sensor.set_CS_AutocaL_Millis(300);
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. Kokeile myös käyttää Arduinoa 9V-pariston kautta.
Lisää herkkyyttä
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.
Saatat joutua muuttamaan ohjelmasi kynnysarvoa, kun virtapiirin resistanssi kasvaa!
Jatkokehittelyä
Kapasitiivisen anturin avulla voi kehitellä hyvin monenlaisia projekteja. Erityisen kätevä ominaisuus on, että anturi ei vaadi suoraa kosketusta metalliin! Voit siis tehdä anturin avulla “nappeja”, joita käytetään vaikkapa ikkunan, paperin tai muovin läpi.
Oheisia töitä ei ole tarkoitus toteuttaa juuri nyt, mutta ne voivat toimia ideoiden lähteenä kun suunnittelet projektityötäsi.
Videon esimerkissä on kytketty Arduinoon kuusi kapasitiivista anturia.
Mehackit: Capacitive Keyboard
Useamman kapasitiivisen anturin kytkeminen ja ohjelmointi on aika suoraviivaista. Videolla nähdyn 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,6);
CapacitiveSensor sensor3 = CapacitiveSensor(4,8);
// 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
Arduinon kapasitiivisessa anturissa toinen portti (esimerkeissä portti 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 folion ja sitä koskettavan käden aiheuttamasta kapasitanssista, eli sähkövarauksen varastointikyvystä.
Jos käyttöön on otettu useita kapasitiivisia antureita, lähettäjäportti voi olla sama näille kaikille.