Tehtävä
Täydennä ensin ohjelman setup-osa koodissa olevien kommenttien mukaisesti.
Tässä harjoituksessa kasataan musiikin mukaan vilkkuvat discovalot. Maker kitin äänianturi soveltuu musiikin seuraamiseen, ja samalla selviää, kuinka Arduinolla voi vilkuttaa viittä lediä itsenäisesti.
Olemme ajastaneet Arduinon toimintaa käyttämällä delay-komentoa. Sitä on helppo soveltaa, mutta ongelmana on, ettei Arduino tee delay-viiveen aikana yhtään mitään muuta.
Entä jos halutaankin ohjata useita laitteita samaan aikaan toisistaan riippumatta? Fiksumpaa ajanhallintaa varten on funktio millis, joka pitää kirjaa siitä, kuinka kauan Arduinolla oleva ohjelma on ollut käynnissä.
Pienissäkin ledeissä on mukavasti valotehoa, mutta ne eivät paljaaltaan näytä kovin vaikuttavilta. Katso oheinen video - siinä ledit on upotettu pingispallojen sisään, joista valo siroaa jo vähän näyttävämmin.
Mehackit boardin (tai Arduinon), USB-johdon, koekytkentälevyn ja johtimien lisäksi tarvitset seuraavat komponentit.
Osa | Kuva | Kuvaus |
---|---|---|
Jatkojohtoja | ||
LED x 5 | Värittömällä kuvulla varustetut ledit ovat kirkkaampia kuin värillisellä kuvulla varustetut ledit. Ledin väri selviää kokeilemalla! | |
Vastus 330 Ω x 5 | Vastus vastustaa sähkövirran kulkua. Vastuksen arvo mitataan ohmeissa (Ω) ja ilmoitetaan komponentissa eri värisinä raitoina (tässä oranssi, oranssi, ruskea ja kulta). | |
Äänianturi | Yksinkertainen mikrofoni, joka reagoi äänen voimakkuuteen. |
Äänianturi reagoi äänen amplitudiin eli voimakkuuteen. Siitä sisään tuleva signaali on välillä 0-1023. Arvoväli jaetaan sopiviin osiin niin, että jokainen viidestä ledistä vilkkuu vain tiettyjen äänen voimakkuuksien mukaan.
Jokainen led on päällä tietyn aikaa. Kaikkia ledejä ohjataan itsenäisesti: jokainen niistä on jatkuvasti valmiina syttymään, eikä niiden toiminta riipu siitä, palavatko muut ledit vai eivät.
Tuttuja komentoja:
Uusia komentoja ja termejä:
int ledPin1 = 7;
// määrittele mallin mukaan kokonaislukumuuttujat
// ledPin2 - ledPin5
// ja aseta niiden arvoiksi
// portit joihin loput ledit on kytketty
void setup() {
pinMode(ledPin1, OUTPUT);
// määrittele mallin mukaan myös
// ledPin2-ledPin5
// ulostuloiksi
Serial.begin(9600);
}
void loop() {
// määrittele kokonaislukumuuttuja sensor ja lue sen arvoksi portin A0 lukema
// lisää 8 ms viive
// tulosta sensor serial monitoriin
}
Nyt kun anturi mittaa äänenvoimakkuutta, tämän datan perusteella voidaan määrätä jokaiselle ledille oma volyymikaista, joka saa valon syttymään. Pienellä säädöllä on mahdollista saada esimerkiksi yksi ledeistä reagoimaan bassorumpuun ja toinen lauluun.
void loop() {
// määrittele kokonaislukumuuttuja sensor ja lue sen arvoksi portin A0 lukema
// lisää 8 ms viive
// tulosta sensor serial monitoriin
if ((sensor > 50) && (sensor < 150)){
digitalWrite(ledPin1, HIGH);
}
// Kirjoita yllä olevan mallin mukaan ehtolauseet myös muille ledeille
delay(10);
digitalWrite(ledPin1, LOW);
// Ohjelmoi yllä olevan mallin mukaan muut ledit pois päältä.
}
Huomaat, että valot kyllä reagoivat ääneen - mutta vain yksi valo palaa kerrallaan. Tämä johtuu delay-komennosta: yhdellä loop-kierroksella vain yksi valo sytytetään, ja se on päällä delay-komennnossa määritellyn keston ajan. Vasta tämän jälkeen, uudella loop-kierroksella ohjelma voi sytyttää seuraavan valon.
Kuinka led saadaan syttymään, vaikka edellinen vielä palaa? Otetaan seuraavalla sivulla käyttöön uusi komento millis, jolla voi ajastaa samanaikaisia toimintoja.
Nyt ohjelmassa korjataan aiemmin ilmennyt haaste siitä, että ledien syttymistä ja sammumista oli vaikea ajastaa.
unsigned long interval = 200;
unsigned long currentMillis;
unsigned long previousMillis = 0;
int ledPin1 = 7;
// määrittele mallin mukaan kokonaislukumuuttujat
// ledPin2 - ledPin5
// ja aseta niiden arvoiksi
// portit joihin loput ledit on kytketty
void loop() {
currentMillis = millis();
// määrittele kokonaislukumuuttuja sensor ja lue sen arvoksi portin A0 lukema
// lisää 8 ms viive
// tulosta sensor serial monitoriin
if ((sensor > 50) && (sensor < 150)){
digitalWrite(ledPin1, HIGH);
}
// Kirjoita yllä olevan mallin mukaan ehtolauseet myös muille ledeille
// delay(10); Kommentoi tai editoi pois tämä delay.
if(currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
digitalWrite(ledPin1, LOW);
// Ohjelmoi yllä olevan mallin mukaan muutkin ledit pois päältä.
}
}
Ohjelma voi aluksi tuntua hankalalta ymmärtää. Muista, että Arduino suorittaa noin 500 loop-kierrosta sekunnissa, ja että se on jokaisella kierroksella valmiina sytyttämään jonkin ledeistä. Jokaisella kierroksella ei kuitenkaan sammuteta valoja, vaan ne sammutetaan aina 200 millisekunnin välein. Sammuttamista seuraava loop-kierros alkaa niin pian, että led ei välttämättä ehdi edes näyttää siltä, että se on ollut hetken sammutettuna.
Ledien valon häivyttäminen
for-looppia hyödyntämällä ledeille voi ohjelmoida häivytyksen, jolloin discovalot saavat analogista fiilistä.
Ledien korvaaminen muilla laitteilla
digitalWrite-komentoa ei kiinnosta, mikä laite siinä määriteltyyn porttiin on kiinnitetty. Allaoleva video on kuvattu Stadin ammattiopiston Mehackit-kurssilta, ja siinä on käytetty digitalWrite-komentoa auton releiden eli sähköllä ohjattavien kytkimien laittamiseen päälle ja pois. Videon lopussa käytetään aivan samanlaista ohjelmaa kuin discovaloharjoituksessa.