Kosketuksella ohjattava valo

Johdanto

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ää.

kapasitiivinen sensori
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.

OsaKuvaKuvaus
Alumiinifoliota, metalliesine, banaani, omena tms.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.
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.
Piezo-kaiutinElektroninen 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.

Tutut komennot

Uudet komennot

Uudet komennot perustuvat CapacitiveSensor-kirjastoon, jonka tarkempaan dokumentaatioon voit tutustua täällä.

  • #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.

  1. Lataa tästä linkistä koneellesi zip-tiedostopaketti, joka sisältää kirjaston.

  2. 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.
#include <CapacitiveSensor.h>

CapacitiveSensor sensor = CapacitiveSensor(4, 2);

void setup(){
  // käynnistä sarjaliikenne 
}

void loop() {
  long sensorValue =  sensor.capacitiveSensor(30);
  // tulosta sensorValue serial monitoriin
  // ohjelmoi 10 millisekunnin viive

  tone(7,sensorValue);

}

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);

void setup(){
  // käynnistä sarjaliikenne 
  // määrittele portti 9 ulostuloksi
}

void loop() {
  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.
void loop() {
  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
}

Tutustu map-komennon dokumentaatioon Arduino Referencessä.
Mitä map-komennon kolmas arvo merkitsee?

Ohjelmointi 3/3 - Kynnysarvo

Tehtävä
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!
void loop() {
  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

void setup(){
  // käynnistä sarjaliikenne 
}

void loop() {
  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);
  } else if {
  }
  
  // ohjelmoi jokaisen anturin arvoille omat toiminnot. 
  //noTone(7) viimeisessä ehdossa hiljentää summerin.
}
Kapasitiivisen soittimen koskettimet

Kuva: Kapasitiivisen soittimen koskettimet

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.

Kapasitiivisen anturin ja kirjaston toiminta