Tehtävä
Aloita uusi Arduino-ohjelma ja tallenna se (File > Save As) ennen kuin olet tehnyt koodiin mitään muutoksia. Anna ohjelmalle jokin tunnistettava nimi!
Harjoituksessa tehdään Star Warsista tuttu R2D2. Robotti päästelee normaalioloissa monenlaisia ääniä. Kun se kaatuu eikä enää pääse ylös, se alkaa päästellä avunpyyntöääntä. Kun R2D2 nostetaan takaisin pystyyn, se jatkaa taas tavallista pulinaansa.
Tätä harjoitusta voi oikein hyvin kehitellä eteenpäin vaikka loppuprojektiksi saakka - voit etsiä itseäsi kiinnostavia paperimalleja, lisätä työhön ledejä tai vaikka liikettä moottorien avulla.
Tehtävässä käsiteltäviä teemoja
Mehackit boardin (tai Arduinon), USB-johdon ja johtimien lisäksi tarvitset seuraavia asioita.
Osa | Kuva | Kuvaus |
---|---|---|
Naaras-naaras jatkojohto x 4 | ||
Tilt-kytkin | Tilt-kytkin toimii kuin painonappi, mutta se mittaa kallistumista. Kun kytkintä kallistaa, sen sisällä oleva pieni kuula vierii toiseen päähän ja yhdistää kytkimen jalat. | |
Piezo-kaiutin | Piezo on yksinkertainen kaiutin, jolla voi muuttaa jännitteen vaihtelun ääneksi. Monia piezoja voi käyttää myös anturina. Piezo-kaiuttimen ulkonäkö voi vaihdella paljon - kuvassa on Maker kitistä löytyvä piezo. | |
R2D2-paperimalli ja sakset | http://www.cubeecraft.com/cubee/r2-d2Voit tulostaa paperimallin ylläolevan linkin kautta. Kysy apua tulostamiseen ohjaajaltasi! | |
Kertakäyttömuki tai pahvia | ||
Teippiä |
Tulosta ensin malli osoitteesta.
http://www.cubeecraft.com/cubee/r2-d2
Kun olet leikannut ja kasannut tulostetun paperimallin, komponentit kiinnitetään mallin sisäpuolelle. Osat kannattaa teipata ensin kiinni pahviin tai sopivaksi leikattuun kertakäyttömukiin: näin niiden korjailu on helpompaa tarvittaessa, ja robotista tulee tukevampi. Jalkoja voi olla tarpeen vahvistaa lisäpahvilla.
Kun R2D2 on pystyssä, Arduino soittaa piezolla sattumanvaraisesti yhden kahdeksasta erilaisesta äänivaihtoehdosta. Jos R2D2 kaatuu, piezosta kuuluu tietty, hätätilaa ilmoittava ääni. Kun R2D2 nostetaan taas pystyyn, se jatkaa alkuperäisten äänten päästelyä.
Uudet komennot
Tässä ohjelmassa tarvitaan ylimääräinen tiedosto nimeltä musical_notes.h, jossa määritellään piezolla soitettavien nuottien nimet ja lukuarvot.
#include "musical_notes.h" // tässä liitetään luomasi nuottitiedosto varsinaiseen ohjelmaan
int speakerPin = 9; // portit määritellään muuttujina:
int tiltPin = 2; // niihin viitataan ohjelmassa hyvin monta kertaa
void setup() {
pinMode(speakerPin, OUTPUT); // portti 9 on piezo eli output
pinMode(tiltPin, INPUT_PULLUP); // portti 2 on tilt-kytkin eli input
Serial.begin(9600); // debuggaus on aina paikallaan
}
void loop() {
int which = random(9); // arvotaan kokonaisluku 0-8 ja tallennetaan se muuttujaan which
if (digitalRead(tiltPin) == HIGH) {
// muuta which-muuttujan arvoksi 9
}
// tulosta which-muuttuja serial monitoriin
// lisää 1-2 sekunnin viive, jotta arvot ehtii lukea monitorista
}
R2D2-robotilla tulee olemaan 9 erilaista, sattumanvaraista ääntä, kun se on pystyssä, sekä kymmenes hätähuutoääni. Ohjelma toteuttaa jo logiikan, jolla eri vaihtoehdot määräytyvät - kohta pääset ohjelmoimaan mukaan eri äänet!
void loop() {
int which = random(8);
if (digitalRead(tiltPin) == HIGH) {
// muuta which-muuttujan arvoksi 9
}
// tulosta which-muuttuja serial monitoriin
// tähän 1-2 sekunnin viive, jotta arvot ehtii lukea monitorista
} // loop loppuu tähän, uusi koodi liimataan alle:
void beep (int speakerPin, float noteFrequency, long noteDuration) {
// Tämä kohta suoritetaan aina, kun kutsutaan funktiota beep
}
void r2D2(){
// Tämä kohta suoritetaan aina, kun kutsutaan funktiota R2D2
}
// jne.
Kopioimasi funktiot tuottavat ääniä ja ovat nimeltään beep, r2d2, closeEncounters, ariel, laugh2, squeak, waka, catcall, ohhh, uhoh ja laugh.
Ääniä soitetaan kutsumalla funktioita loop-osan sisältä esimerkiksi alla olevalla tavalla. Beep-funktio on erikoistapaus - sitä ei kutsuta loopista, vaan muiden funktioiden sisältä - sen tehtävä on auttaa nuottien soittamisessa.
squeak();
Koodi jonka kopioit on Erik Kringenin kirjoittama ja julkaisema: https://blog.mycontraption.com/?s=sound+effects. Käytämme koodia työohjeessa Erikin luvalla.
void loop() {
int which = random(8);
if (digitalRead(tiltPin) == HIGH) {
// muuta which-muuttujan arvoksi 9
}
// tulosta which-muuttuja serial monitoriin
if (which == 0) {
r2d2();
}
if (which == 1) {
closeEncounters();
}
// Tee uusia if-lauseita, kunnes kaikilla which-muuttujan arvoilla 0-9 kutsutaan eri ääntä.
// Kutsu muuttujan arvolla 9 mielestäsi hätähuudoksi sopivaa funktiota!
// Kirjoita loppuun 1-2 sekunnin viive, jotta arvot ehtii lukea monitorista
}
Tätä tehtävää voi kehitellä edelleen, vaikka loppuprojektiksi saakka. Alla on ideoita tätä varten.