Etäisyyteen reagoiva soitin

Johdanto

Tässä harjoituksessa rakennetaan soitin, jota soitetaan liikuttamalla kättä etäisyyssensorin edessä. Äänenkorkeus vaihtelee etäisyyden mukaan. Nuottien kestoa säädellään potentiometrillä.

etäisyyssensorilla toimiva theremin
Tiesitkö että...
Kuuluisin käden etäisyyteen reagoiva 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.
Kuva: Alexandra Stepanoff soittamassa thereminiä NBC:n radio-ohjelmassa vuonna 1930 (CC 0)

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

Tarvikkeet

Mehackit boardin (tai Arduinon), USB-johdon, koekytkentälevyn ja johtimien lisäksi tarvitset seuraavat komponentit.

OsaKuvaKuvaus
Piezo-kaiutinElektroninen komponentti, jota voi käyttää värähtelyn havaitsemiseen sekä äänten tuottamiseen.
Etäisyyssensori (infrapuna tai ultraääni)Maker kitistäsi löytyy näistä etäisyysantureista jompi kumpi. Ylempi anturi toimii infrapunan ja alempi ultraäänen avulla.
Kolmipaikkainen terminal block.Jos Maker kitistäsi löytyy tällainen, infrapunalla toimiva etäisyysanturi on helpompi liittää koekytkentälevyyn sen avulla.
PotentiometriPotentiometri on säätövastus, jota voidaan säätää pyörittämällä nuppia. Potentiometristä tulee Arduinon analogiseen porttiin säädöstä riippuva jännite..

Infarpunasensori koekytkentälevyyn

Jos Maker kitissäsi on infrapunalla toimiva etäisyyssensori, löydät alta vinkkejä sen liittämiseen koekytkentälevyyn. Jos sinulla on ultraäänellä toimiva etäisyyssensori, voit siirtyä eteenpäin ohjeissa.

Jos Maker kitistäsi löytyy kolmipaikkainen sokeripala ja talttapäinen ruuvimeisseli, ruuvaa etäisyyssensorin johtimien päät sokeripalan sisään ja paina sokeripala koekytkentälevyyn. Varmista, että johtimet on työnnetty oikealle puolelle sokeripalaa eli sinne, missä on isommat reiät. Varmista tukeva kiinnitys vetämällä piuhoja kevyesti, jolloin niiden pitäisi pysyä paikallaan.

Jos Maker kitissäsi ei ole sokeripalaa, vuole saksen terällä varovasti johtoa ytimen ympäriltä pois siten, että saat taitettua noin 1 cm pätkän johdinta ulos. Pyöritä varovasti johtimen säikeet yhteen sormenpäittesi välissä.

Kytke johtimen päät koekytkentälevyyn. Mustan ja punaisen johtimen voit kytkeä levyn vaakariveille ja keltaisen johtimen pystyriville. Voit vahvistaa kytkennät sinitarralla tai teipillä, kuten alla olevassa kuvassa. Näin johtimet eivät varmasti irtoa kovassakaan käytössä!

Virtapiiri

Kaavio 1: Infrapunasensori

  • Kytke potentiometri analogiseen porttiin 1, viiden voltin jännitteeseen ja maahan.
  • Kytke piezo-summeri porttiin 9 ja maahan.
  • Kytke etäisyyssensorin punainen johdin 5V jännitteesee, keltainen johdin analogiseen porttiin ja musta johdin maahan.

Kaavio 2: Ultraäänisensori

  • Kytkentä on potentiometrin ja piezon osalta sama.
  • Kytke etäisyyssensorin VCC-pinni 5V-jännitteeseen, Trig-pinni porttiin 11, Echo-pinni porttiin 12 ja GND-pinni maahan.

Ohjelman tavoite

Kun käden etäisyys anturista kasvaa, piezon soittama äänenkorkeus madaltuu. Mitä lähempänä sensoria käsi on, sitä korkeampi ääni piezosta kuuluu. Potentiometrillä säädetään nuotin kestoa: mitä pienempi potentiometristä tuleva arvo, sitä lyhyempi nuotti.

Tuttuja komentoja:

Infrapunasensorin lukemia luet komennolla analogRead(portti)

Ultraäänisensorin käyttämiseen tarvitset seuraavia komentoja

Ohjelmointi 1/3 - Etäisyysanturi

Aluksi pääset testaamaan etäisyyssensorin toimintaa. Piezo-summeri ja säätövastus otetaan mukaan vasta seuraavassa vaiheessa.

Tee TEHTÄVÄ 1, jos sinulla on infrapunalla toimiva etäisyyssensori. Jos sinulla on ultraäänellä toimiva etäisyyssensori, tee TEHTÄVÄ 2

Tehtävä 1 - infrapunasensori
Täydennä ohjelma ohjeiden mukaan ja syötä se Arduinollesi. Tutki Serial monitorin avulla, millaisia arvoja infapunasensori tuottaa. Jos Serial monitorin lukemat eivät muutu liikuttaessasi kättä anturin edessä, tarkista kytkennät!
void setup() {
  // määrittele portti 9 ulostuloksi
  // käynnistä sarjaliikenne 
}

void loop() {
  int sensorValue = analogRead(A0);
  // tulosta sensorValue serial monitoriin

}
Tehtävä 2 - ultraäänisensori
Tee aluksi ohjeistetut määrittelyt alla olevan ohjelman ylälaidassa ja setup-osassa. Kirjoita sitten myös loop-osaan kommenteissa ohjeistetut komennot. Tutki Serial monitorin avulla, millaisia arvoja ultraäänisensori tuottaa. Jos Serial monitorin lukemat eivät muutu liikuttaessasi kättä anturin edessä, tarkista kytkennät!

Ohjelmassa on käytetty pulseIn-komentoa ja delayMicroseconds-komentoa.

// Luo kokonaislukumuuttujat "duration" ja "distance"

void setup() {
  pinMode(11, OUTPUT);// määrittellään portti 11 (trigPin)  ulostuloksi
  pinMode(12, INPUT); // määrittellään portti 12 (echoPin) sisääntuloksi
  // käynnistä sarjaliikenne.
}

void loop() {
  //Seuraavat rivit käyttävät portin 11 tilassa HIGH muutamien mikrosekuntien ajan.	
  digitalWrite(11, LOW);
  delayMicroseconds(2);
  digitalWrite(11, HIGH);
  delayMicroseconds(10);
  digitalWrite(11, LOW);
  duration = pulseIn(12, HIGH); //Tämä komento tallentaa muuttujaan "duration" 
  //ajan, joka portilla 12 (echoPin) kestää muuttua tilaan HIGH. 
  distance = duration*0.034/2; //Tämä komento muuttaa ajan senttimetreiksi.
  // Tulostetaan muuttuja "distance" serial monitoriin.
  Serial.print("Distance: ");
  Serial.println(distance);
}

Ohjelmointi 2/3 - Ääntä piezosta

Ensin pääset tutkimaan, kuinka eri taajuuksia voi soittaa piezolla etäisyyssensorin lukemiin perustuen. Säätövastus otetaan mukaan vasta seuraavalla sivulla.

Jos sinulla on käytössä infrapunasensori, tee TEHTÄVÄ 1 Jos käytössäsi on ultraäänisensori, tee TEHTÄVÄ 2.

Tehtävä 1 - infrapunasensori
Kirjoita koodiin kommenteissa ohjeisetut käskyt, joilla etäisyysanturin lukema muutetaan ääneksi. Syötä sitten ohjelma Arduinollesi.
void setup() {
  //määrittele portti 9 ulostuloksi
  //käynnistä sarjaliikenne 
}

void loop() {
  int sensorValue = analogRead(A0);
  //tulosta sensorValue serial monitoriin  

  int aani = map(sensorValue, 0, 1023, 100, 3000);
  //tone-komennossa on nyt parametria: piezon portti (9), 
  //soitettava äänenkorkeus ja nuotin kesto (1000 millisekuntia)
  tone(9, aani, 1000);
  //300 millisekunnin viive.
  delay(300);
}
Tehtävä 2 - ultraäänisensori

Lisää ohjelmaasi mukaan rivit, joissa muuttujaan aani tallennetaan map-komennon avulla arvo, joka soitetaan piezosta tone-komennolla.

Käytä map-komennon muunnoksessa distance-muuttujaa. Pohdi, mikä on järkevä vaihteluväli distance-muuttujalle, joka periaatteessa ilmoittaa etäisyyden senttimetreinä. 0-1023 ei ole tällöin välttämättä paras väli.

// Luo kokonaislukumuuttujat "duration" ja "distance"

void setup() {
  pinMode(11, OUTPUT);// määrittellään portti 11 (trigPin)  ulostuloksi
  pinMode(12, INPUT); // määrittellään portti 12 (echoPin) sisääntuloksi
  // käynnistä sarjaliikenne.
}

void loop() {
  //Seuraavat rivit käyttävät portin 11 tilassa HIGH muutamien mikrosekuntien ajan.	
  digitalWrite(11, LOW);
  delayMicroseconds(2);
  digitalWrite(11, HIGH);
  delayMicroseconds(10);
  digitalWrite(11, LOW);
  duration = pulseIn(12, HIGH); //Tämä komento tallentaa muuttujaan "duration" 
  //ajan, joka portilla 12 (echoPin) kestää muuttua tilaan HIGH. 
  distance = duration*0.034/2; //Tämä komento muuttaa ajan senttimetreiksi.
  // Tulostetaan muuttuja "distance" serial monitoriin.
  Serial.print("Distance: ");
  Serial.println(distance);
  //pohdi, mitka ovat järkeviä vaihteluvälejä map-komentoon.
  int aani = map(distance, 0, 1023, 100, 3000);
  //tone-komennossa on nyt parametria: piezon portti (9), 
  //soitettava äänenkorkeus ja nuotin kesto (1000 millisekuntia)
  tone(9, aani, 1000);
  //300 millisekunnin viive.
  delay(300);
}
Tehtävä 3 - molemmat sensorit

Muuta map-komennon taajuusaluetta (100-3000) esimerkiksi väleille 100-800 tai 1000-3000.

Kokeile myös erilaisia arvoja loopin lopussa olevan delay-komennon sisällä. Voit muuttaa myös tone-komennon viimeistä arvoa eli nuotin kestoa!

Tiesitkö että...
Ihmiset voivat kuulla taajuuksia välillä 20 - 20 000 Hz, mutta taajuudet välillä 100-3000 Hz riittävät tässä soittimessa hyvin.

Ohjelmointi 3/3 - Rytmin muuntelu potentiometrillä

Tehtävä - molemmat sensorit
Lisää koodin loop-osan loppuun ohjeistetut komennot. Testaa soitinta ja muuttele soitettujen nuottien välistä taukoa potentiometrin avulla. Vastaa lopuksi monivalintaan sivun alalaidassa.
void loop() {
  //...aiempi ohjelma
  //...aiempi ohjelma

  // luo kokonaislukumuuttuja potValue ja anna sen arvoksi analogiportin A1 lukema
  delay(potValue); // muuttujaa potValue käytetään viiveen kestona
}

Miksi infrapunasensori ja säätövastus täytyy yhdistää Arduinon viiden voltin jänniteporttiin?

Lisätietoa

Etäisyysanturin toiminta

Infrapunalla toimiva etäisyyssensori eli IR-sensori (Infra Red) toimii lähettämällä infrapunasäteilyä ja mittaamalla säteiden heijastumista takaisin. Infrapunasäteily on samankaltaista sähkömagneettista säteilyä kuin näkyvä valo, mutta sen aallonpituus on niin suuri, että ihmisen silmä ei havaitse sitä.

Koska IR-sensori mittaa säteilyn heijastumista eikä suoraan etäisyyttä, voi kohteen materiaali (kyky heijastaa) vaikuttaa mitattuihin arvoihin. Jotkin materiaalit heijastavat infrapunaa paremmin kuin toiset. Voit kokeilla tätä omalla IR-sensorillasi, joka nyt on kiinni piirissä.

Tehtävä

Pidä samalla etäisyydellä sensorin edessä ensin tummaa kirjaa tai muuta objektia. Pidä tämän jälkeen sensorin edessä samalla etäisyydellä valkoista paperia. Tarkkaile analogiseen porttiin tulevia arvoja serial monitorista. Antaako sensori samanlaisia arvoja samalla etäisyydellä? Saatat havaita pientä vaihtelua.

Jos luokassa on tarpeeksi pimeää, voit myös havaita sensorista lähtevän infrapunasäteilyn kännykkäsi kameralla. Infrapunan pitäisi näkyä violettina väreilynä sensorin pinnalla.

Tutki täältä löytyvää kuvaajaa infrapunasensorin mittaaman etäisyyden ja jännitteen välisestä suhteesta.

Sensorista tuleva jännite kasvaa välillä 0-5 cm (tai 0-10 cm, riippuu hieman sensorista) Tämä jälkeen se alkaa taas pienentyä. 5 cm etäisyydellä sensori antaa siis suurimman arvon, joka on jännitteenä noin 3 V ja muunnettuna välille 0-1023 noin 630. Tätä “raja-arvoa” voi hyödyntää osana erilaisia projekteja: esimerkiksi auto voi kääntyä aina, kun etäisyyssensorista tuleva arvo on yli 600 eli etäisyys edessä olevaan kohteeseen noin 5 cm.

Tiesitkö että...
Etäisyyssensori löytyy esimerkiksi itseohjautuvista imureista ja julkisten vessojen kraanoista.