Kallistusanturi
Tässä harjoituksessa yhdistät kaiken tähän mennessä oppimasi yhdeksi ohjelmaksi: rakennat kallistusanturin varoitusvalolla sekä summerilla. Ohjelman tulisi toteuttaa seuraavat toiminnot:
- Lukea tiedot kiihtyvyysanturista
- Laskea levyn kallistus ja nyökkäys (jotka molemmat ovat kulmia) asteina kiihtyvyystietojen perusteella
- Jos kallistus tai nyökkäys ylittää 20 astetta, sytyttää LED ja soittaa summeria
Tämän tehtävän ohjeet sisältävät ainoastaan kommentteja siitä, mitä ohjelman tulisi tehdä, ja sinun tehtäväsi on toteuttaa ne aiempien tehtävien ohjelmien avulla.
Vaihe 1 — Alustus
Aloittaaksemme meidän on jälleen sisällytettävä UKESF-kirjasto, jotta pääsemme käyttämään
kiihtyvyysanturia. Lisäksi haluamme alustaa tarvittavat muuttujat kuten harjoituksissa 1-3. Täytä
puuttuvat koodirivit kommenttien perusteella ennen loop()-funktiota:
// Sisällytä UKSEF-kirjasto
// Määritä LEDin nimi ja pinninumero// Määritä summerin nimi ja pinninumero// Määritä summerin taajuus Hertzeissä (Hz)// Luo kiihtyvyysanturin muuttuja ja nimiVaihe 2 — setup()
Seuraavaksi alusta ja käynnistä LED, summeri, sarjaliikenne ja kiihtyvyysmittari
setup()-funktiossa:
void setup() { // Määritä ledPin lähtöpinniksi (OUTPUT) // Määritä summeri lähtöpinniksi (OUTPUT) // Alusta sarjaliikenne (9600 baud) // Alusta kiihtyvyysanturi}Vaihe 3 — loop()
Lopuksi toteutamme pääohjelman loop()-funktiossa. Siinä haluamme tehdä kolme asiaa:
- Lukea kiihtyvyysanturin dataa
- Laskea kallistus ja nyökkäys asteina
- Sytyttää LED ja soittaa summeria, jos kallistus tai nyökkäys ylittää 20 astetta
Tutkitaan näitä kolmea vaihetta seuraavaksi erikseen.
1. Kiihtyvyysanturidatan lukeminen
Käytä harjoituksen 3 koodia avuksi tämän koodin kirjoittamisessa. Vaikka ohjelmamme ei edellytä kiihtyvyysdatan tulostamista sarjamonitoriin, se on hyvä tehdä virheenkorjausta varten. Voimme näin käyttää sarjamonitoria varmistaaksemme, että pystymme lukemaan dataa kiihtyvyysmittarista odotetulla tavalla.
void loop() { // Lue x-akselin kiihtyvyys // Lue y-akselin kiihtyvyys // Lue z-akselin kiihtyvyys
// Tulosta arvot Serial Monitoriin}2. Kallistuksen ja nyökkäyksen laskeminen kiihtyvyysdatan avulla
Tutustutaan ensin aiheeseen liittyvään teoriaan lyhyesti. Lentodynamiikassa puhutaan kolmesta perusliikkeestä lentävän aluksen asentoon liittyen:
- kääntyminen pituusakselin suhteen (englanniksi roll) eli kallistus
- kääntyminen pystyakselin suhteen (englanniksi yaw) eli kääntö
- kääntyminen poikkiakselin suhteen (englanniksi pitch) eli nyökkäys
Kallistus, kääntö ja nyökkäys ovat pyörimisvoimia eri akselien suhteen, kuten alla olevassa kuvassa on havainnollistettu, eikä niiden muuntaminen kiihtyvyysmittarin datasta kulmiksi ole yksinkertaista. Etsimällä apua netistä hakusanoilla “pitch and roll Arduino” tai “pitch and roll from acceleration”, löydät monia erinomaisia lähteitä siihen, kuinka nämä kulmat voi laskea kiihtyvyysanturin datan avulla. Kaksi hyvää selitystä löydät alla olevista linkeistä (englanniksi).
Vaikka kallistumisen ja nyökkäämisen koko johtaminen on liian pitkä aihe sisällytettäväksi tähän
harjoitukseen, suosittelemme, että tutkit yllä olevat linkit läpi saadaksesi käsityksen siitä, mitä
niissä tapahtuu ja miksi. Lopulliset yhtälöt on annettu alla olevassa koodipätkässä, ja vaativat
myös piin käyttöä, joka löytyy Arduinon ohjelmistoympäristössä nimellä M_PI.
void loop() { // Lue x-akselin kiihtyvyys // Lue y-akselin kiihtyvyys // Lue z-akselin kiihtyvyys
// Tulosta arvot Serial Monitoriin
// Laske kallistus ja nyökkäyskulma kiihtyvyysanturin datan perusteella, // katso yllä olevat linkit kaavojen johtamiseen float roll = (atan2(-y, z) * 180.0) / M_PI; float pitch = (atan2(x, sqrt(y * y + z * z)) * 180.0) / M_PI;}3. LEDin sytyttäminen ja summerin soittaminen
Lopuksi haluamme sytyttää LED-valon ja soittaa summeria, jos kallistus tai nyökkäys on yli (>) 20
astetta kumpaan tahansa suuntaan (tähän täytyy käyttää itseisarvofunktiota abs()). Meidän on myös
sisällytettävä ohjelmaan ehtolause (englanniksi if-else statement), sillä haluamme testata
syötemuuttujan, eli kulman, arvoa ehtoa vastaan.
Kallistusanturin tapauksessa haluamme tutkia ehtoa “onko kulma > 20 astetta?”, jonka tuloksen perusteella suoritettava polku valitaan. Ehtolause onkin ohjelmamme viimeinen komponentti, eli voimme nyt koota koko koodimallin. Yritä kirjoittaa se aikaisemmin tekemiesi ohjelmien avulla ja pyydä apua, jos tarvitset.
void loop() { // Lue x-akselin kiihtyvyys // Lue y-akselin kiihtyvyys // Lue z-akselin kiihtyvyys
// Tulosta arvot Serial Monitoriin
// Laske kallistus- ja nyökkäyskulma kiihtyvyysanturin datan avulla, // katso linkit ylempää kaavojen johtamiseksi float roll = (atan2(-y, z) * 180.0) / M_PI; float pitch = (atan2(x, sqrt(y * y + z * z)) * 180.0) / M_PI;
// Ehtolause yli 20 asteen kulman tarkistamiseen, huomaa abs() if(abs(roll) > 20) { // Kytke LED päälle (HIGH, 1, tai 5 V) // Soita summeria 200 Hz:n taajudella } else { // Kytke LED pois päältä (LOW, 0, tai 0 V) // Kytke summeri pois päältä }
delay(10); // Viivytä ohjelmaa 10 ms ajan loop()-funktion vakauden vuoksi}