Johdanto
Tässä artikkelissa keskustelemme siitä, kuinka luodaan tiedonkeruuprojekti, joka ohjeistaa VEX-robottia keräämään tietoja VEX Brainin avulla ja tallentamaan ne CSV-tiedostoon SD-kortille tietojen analysointia varten.
Tiedon kirjaus on tehokas työkalu, jolla voimme auttaa tieteellistä tutkimusta, suorittaa omia kokeitamme ja ratkaista tiettyjä ongelmia. On olemassa erilaisia hauskoja ja jännittäviä tehtäviä, joita voimme ajaa VEX Robotilla suorittamaan tiedonkeruun avulla. Seuraavassa on joitain esimerkkejä:
- Tietojen kerääminen etäisyysanturilla robotin nopeuden laskemiseksi
- Robotin ajaminen luokkahuoneessa ja tietojen kerääminen optisella sensorilla valonmuutosten tarkkailemiseksi eri paikoissa.
- Robotin vieminen seikkailuun ja GPS-koordinaattitietojen tallentaminen kartan luomiseksi.
Tietojen kirjausprojektin kehittämiseen tarvittavat koodaustaidot
- Käytä erilaisia komentoja tietojen keräämiseen VEX Brain/Sensors -sovelluksella ja lisää ne tietorakenteeseen.
- Kirjoita tiedot SD-kortille CSV-tiedostoon (Comma-Separated Values).
Tietojen kirjaamiseen vaadittava laitteisto:
- VEX-aivot (IQ, V5, EXP)
- SD-kortti
- Anturi tai useita antureita (valinnainen, vaadittujen tietojen mukaan)
Tietojen hakeminen anturista
Voimme ohjelmoida VEX Robotin (IQ, V5, EXP) sieppaamaan tiedot seuraavista antureista:
- Inertia-anturi
- Etäisyys anturi
- Optinen anturi
- Vision anturi
- Pyörimisanturi (V5, EXP)
- GPS-sensori (V5)
Huomautus: VEX IQ (2. sukupolvi) Brainissa ja VEX EXP Brainissa on sisäänrakennettu inertia-anturi. Voimme kerätä inertia-anturin tiedot näillä VEX Brianilla.
Tässä artikkelissa kehitämme tiedonkeruuprojektin, joka kerää kiihtyvyystiedot VEX IQ Brainilla (2.) ja tallentaa ne SD-kortille.
Ensinnäkin meidän on kirjoitettava lyhyt ohjelma saadaksemme lukemat ajastimesta ja VEX IQ Brainiin (2.) rakennetusta inertia-anturista.
- Tämän ohjelman alussa meidän on tuotava Python-moduulit ohjataksemme VEX IQ Brain (2.) ja haettava tiedot siitä. Aloita siis lisäämällä nämä ohjeet projektiin.
-
# Kirjasto tuo
vex-kirjastosta import *
# Brainin pitäisi olla oletuksena määritelty
brain = Brain()
brain_inertial = Inertial() - Lisää seuraavaksi koodi, joka ilmoittaa muuttujan
numOfDataEntriestallentaaksesi datasyötteiden määrän, ilmoittaa muuttujapolling_delay_msectallentaaksesi aikavälin datan lukemista varten ja luo tyhjä merkkijonomuuttujadata_buffertallennettavaksi. anturin lukemat tiedot. -
numOfDataEntries = 100
polling_delay_msec = 50
data_buffer = "" - Koska käytämme ajastimen nykyistä arvoa aikaleiman lisäämiseen dataan, meidän on nollattava ajastimen arvo takaisin 0 sekuntiin ennen datan keräämisen aloittamista.
-
# Lisää ajastimen alustuskoodi
brain.timer.clear() - Ennen kuin käytät ohjetta, joka hakee tiedot VEX IQ Brainista (2.) ja tallentaa tiedot puskuriin, meidän on ensin ymmärrettävä se.
Seuraava ohje liittää nykyisen ajastimen arvondata_buffer-muuttujaan tietyssä muodossa.Puretaan muotomerkkijono
“%1.3f”:- "%": Esittelee muunnosmääritteen.
- "1": Ilmaisee merkkijonossa olevien numeroiden vähimmäismäärän
- ".3": Määrittää muotoiltuun numeroon sisällytettävien desimaalien määrän.
- "f": Ilmaisee, että muotoiltava arvo on liukuluku.
Näin ollen voimme käyttää muotomerkkijonoa “%1.3f” muotoillaksesi liukulukua, jonka leveys on vähintään 1 numero ja jonka tarkkuus on 3 desimaalia.
- Nyt voimme lukea VEX IQ Brainissa (2.) rakennetun inertia-anturin ajastimen ja kiihtyvyysarvon ja sitten liittää tiedot
data_buffer-muuttujaan määritetyssä muodossa. -
# Komennot datan kirjoittamiseksi puskuriin
data_buffer += "%1.3f" % brain.timer.value() + "\n"
data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n" - Huomautus: “\n” on uuden rivin merkki. Se osoittaa, että rivi päättyy tähän ja merkitsee uuden rivin alkua.
- Sitten, jotta voimme tallentaa tietyn määrän datasyötteitä muuttujaan
data_buffer, voimme käyttääfor silmukkaasuorittamaan toistuvasti käskyt, jotka hakevat tiedot, ja liittääksemme tiedotdata_buffer-muuttujaan useiden iteraatioiden ajaksi. Strategiamme on käyttää muuttujannumOfDataEntriesarvoa iteraatioiden määrän määrittämiseen. -
# Tiedon sukupolvi
kohteelle i alueella range(0, numOfDataEntries):
# Komennot tiedon kirjoittamiseksi puskuriin
data_buffer += "%1.3f" % brain.timer.value() + "\n"
data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n" - Toistaiseksi ohjelmamme tallentaa tiedot niin nopeasti kuin mahdollista. Haluamme kuitenkin tallentaa tietoja tietyin aikavälein. Siksi voimme käyttää
wait()-funktiotafor -silmukassakeskeyttääksemme ohjelman lisätäksemme tietyn aikavälin kahden lukeman välille. Käytämme muuttujanpolling_delay_msecarvoa määrittääksemme aikavälin arvon. -
# Tiedon sukupolvi
:lle alueella i (0, numOfDataEntries):
# Komennot tiedon kirjoittamiseksi puskuriin
data_buffer += "%1.3f" % brain.timer.value() + "\n"
data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
wait(polling_delay_msec, MSEC)
Onnittelut! Olemme saaneet ohjelman valmiiksi saadaksemme lukemat (kiihtyvyystiedot) VEX-aivoissa rakennetusta inertia-anturista. Seuraavaksi tutkimme, kuinka tiedot kirjoitetaan CSV-tiedostoon SD-kortille.
# Kirjasto tuo
vex-tiedostosta import *
# Brainin pitäisi olla oletusarvoisesti määritelty
brain = Brain()
brain_inertial = Inertial()
numOfDataEntries = 100
polling_delay_msec = 50
data_buffer = ""
# Lisää ajastimen alustuskoodi
brain.timer.clear()
# Tiedon luonti
kohteelle i range(0, numOfDataEntries):
# Komennot tiedon kirjoittamiseksi puskuriin
data_buffer += "%1.3f" % brain.timer.value() + "\n"
data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
wait(polling_delay_msec, MSEC)
SD-kortin kiinnittäminen VEX Brainiin
Ennen kuin kirjoitat tiedot SD-kortilla olevaan tiedostoon, aseta SD-kortti ensin VEX Brainin SD-korttipaikkaan.
Huomautus: Alusta SD-kortti FAT32-muotoon tietojen kirjoittamista varten. Suosittelemme käyttämään SD-kortteja, joiden koko on enintään 32 Gt.
Varmistaaksemme, että tietojen kirjoittaminen SD-kortilla olevaan tiedostoon voidaan suorittaa asianmukaisissa olosuhteissa, meidän on lisättävä koodi tarkistaaksemme, onko SD-kortti asetettu oikein VEX IQ Brainiin (2.).
- Käytä funktiota
brain.sdcard.is_inserted()tarkistaaksesi, onko SD-kortti paikallaan. Jos SD-korttia ei ole asetettu, näytä vastaava viesti VEX IQ Brain -näytössä ja pidä ohjelmaa. -
# Pysäytä ohjelma, jos SD-korttia ei ole asetettu
if not brain.sdcard.is_inserted():
brain.screen.set_cursor(1,1)
brain.screen.print("SD-kortti puuttuu")
while(True):
wait(5, MSEC) -
Huomautus: the
brain.sdcard.is_inserted()funktio palauttaa arvon True, jos SD-kortti asetetaan Brainiin.
Tietojen kirjoittaminen SD-kortilla olevaan CSV-tiedostoon
Toistaiseksi ohjelmamme voi kerätä tietoja VEX IQ Brainilla (2.). Tiedonkeruuprojektin viimeistelemiseksi meidän on kirjoitettava tiedot CSV-tiedostoon (Comma-Separated Values) SD-kortille myöhempää tarkastelua ja analysointia varten.
- Kun kirjoitetaan erityyppisiä tietoja CSV-tiedostoon, haluamme tietää, minkä tyyppisiä tietoja kukin sarake sisältää. Tätä varten voimme liittää CSV-otsikon tekstin muuttujaan
data_bufferennen tietojen tallentamista.
Näin ollen lisää koodi ilmoittaaksesi muuttujancsvHeaderTexttallentaaksesi CSV-otsikon tekstin määrittääksesi CSV-tiedoston sarakkeiden nimet ja ilmoittaaksesi muuttujansd_file_namesäilyttääksesi CSV-tiedoston nimen kirjoitettavaksi Sd-kortti. -
csvHeaderText = "aika, x, y, z"
sd_file_name = "myDataPY.csv"
Huomautus: Varmista, että otsikot ovat samassa järjestyksessä kuin data_buffer -muuttujaan tallennetut tiedot.
- Liitä seuraavaksi CSV-otsikon teksti
data_buffer-merkkijonoon ennenfor silmukkaatiedonkeruuta varten. -
# Luo CSV-otsikko
data_buffer = csvHeaderText + "\n"
# CSV-tiedon sukupolvi
kohteelle i range(0, numOfDataEntries):
# Komennot tiedon kirjoittamiseksi puskuriin
data_buffer += "%1.3f" % brain.timer.value() + "\n"
data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
wait(polling_delay_msec, MSEC) - Ennen kuin kirjoitat tietoja SD-kortilla olevaan tiedostoon, opimme ensin käyttämään funktiota
brain.sdcard.savefile().
Tämä ohje kirjoittaa muuttujaandata_buffertallennetut tiedot nimettyyn CSV-tiedostoon SD-kortilla.
Puretaan se:-
brain.sdcard.savefile(): Toiminto tallentaa tavujoukon nimettyyn tiedostoon SD-kortille. Funktio palauttaa tiedostoon kirjoitettujen tavujen määrän.
-
sd_tiedoston_nimi: funktion ensimmäinen parametri. Ilmaisee kirjoitettavan tiedoston nimen. Tässä projektissa tiedoston nimi on tallennettu muuttujaan
sd_file_name. -
bytearray(datat_buffer,'utf-8'): Funktion toinen parametri. Edustaa tiedostoon kirjoitettavaa tavutaulukkoa.
-
- bytearray(): Menetelmä luo muuttuvan tavutaulukon. Tässä ohjeessa käytämme sitä muuntamaan merkkijono tavutaulukoksi määrittämällä koodauksen.
- data_buffer: Menetelmän ensimmäinen parametri. Osoittaa lähteen, joka muunnetaan tavuryhmäksi. Tässä projektissa lähde on muuttujaan
data_buffer tallennettu data. - 'utf-8': Metodin toinen parametri. Ilmaisee määritetyn koodauksen, jota käytetään merkkijonon koodaamiseen. Koodaus on "utf-8" tässä ohjeessa.
-
-
- Tiedonkeruun silmukan
n jälkeen käytä funktiotabrain.sdcard.savefile()kirjoittaaksesi muuttujaandata_buffertallennetut tiedot SD-kortin CSV-tiedostoon. Lisää lisäksi koodi, joka tarkistaabrain.sdcard.savefile()-funktion paluuarvon varmistaakseen, onko tiedot kirjoitettu tiedostoon onnistuneesti, ja näyttää vastaavan viestin VEX IQ Brain -näytössä saadaksesi reaaliaikaista palautetta. Lopussa oleva if-lauseke lisää viestin, joka näyttää tiedoston tilan ja tulostaa jokoSD Write ErrortaiData Written. -
# CSV-tiedon sukupolvi
kohteelle i alueella range(0, numOfDataEntries):
# Komennot tiedon kirjoittamiseksi puskuriin
data_buffer += "%1.3f" % brain.timer.value() + "\n"
data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
wait(polling_delay_msec, MSEC)
# Kirjoita tiedot SD-kortille
brain.screen.set_cursor(4,1)
if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
brain.screen.print("SD-kortin kirjoitusvirhe")
muuten:
brain.screen.print("Data kirjoitettu") -
Huomautus: Funktio
brain.sdcard.savefile()palauttaa tiedostoon kirjoitettujen tavujen määrän. Tässä projektissa käytämme sitä kerättyjen tietojen kirjoittamiseen CSV-tiedostoon, joten tiedostoon kirjoitettavien tavujen määrän on oltava suurempi kuin nolla. Toisin sanoen, jos funktio brain.sdcard.savefile()palauttaa0, voimme päätellä, että tietoja ei ole kirjoitettu tiedostoon onnistuneesti. Muussa tapauksessa tiedot on kirjoitettu tiedostoon.
Onnittelut! Olemme kehittäneet tiedonkeruuprojektin, joka kerää kiihtyvyystiedot VEX IQ Brainilla (2.) ja tallentaa ne CSV-tiedostoon SD-kortille. Seuraavaksi tutkimme, kuinka CSV-tiedosto avataan tietojen analysointia varten.
# Kirjasto tuo
vex-tiedostosta import *
# Brainin pitäisi olla oletusarvoisesti määritelty
brain = Brain()
brain_inertial = Inertial()
csvHeaderText = "time, x, y, z"
sd_file_name = "myDataPY.csv"
polling_delay_msec = 50
numOfDataEntries = 100
data_buffer = ""
# Pysäyttää ohjelman, jos SD-korttia ei ole asetettu
if not brain.sdcard.is_inserted():
brain.screen.set_cursor(1,1)
brain.screen.print("SD-kortti puuttuu")
while(True):
wait(5, MSEC)
# Lisää mikä tahansa anturi & ajastimen alustuskoodi tähän
brain.timer.clear()
# Luo CSV-otsikko
data_buffer = csvHeaderText + "\n"
# CSV-tiedon luonti
kohteelle i alueella i (0, numOfDataEntries):
# Komennot tiedon kirjoittamiseksi puskuriin
data_buffer += "%1.3f" % brain.timer.value() + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
wait(polling_delay_msec, MSEC)
# Tietojen kirjoittaminen SD-kortille
brain.screen.set_cursor(4,1)
if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
brain.screen.print("SD-kirjoitusvirhe")
muuten:
brain.screen.print("Data kirjoitettu")
CSV-tiedoston avaaminen tietojen analysointia varten
Kun tiedot on kirjoitettu SD-kortilla olevaan CSV-tiedostoon, voimme taulukkolaskentasovelluksella avata tiedoston tietojen lukemista ja analysointia varten.
Huomautus: Kaksi yleisintä taulukkolaskentasovellusta ovat Google Sheets ja Microsoft Excel. Tässä artikkelissa käytämme Google Sheetsia (Web-pohjainen) SD-kortilla olevan CSV-tiedoston avaamiseen. Muiden sovellusten käyttöprosessi on samanlainen.
- Irrota SD-kortti VEX IQ Brainin SD-korttipaikasta. Jos tietokoneessa on sisäänrakennettu Micro SD -korttipaikka, voimme asettaa SD-kortin suoraan siihen. Muussa tapauksessa aseta SD-kortti SD-korttisovittimeen ja liitä sitten sovitin tietokoneeseen.
- Kirjaudu sisään Google-tiliimme ja avaa Google Sheets. Luo uusi laskentataulukko.
- Avaa laskentataulukossa "File" -valikko, valitse "Import" -> "Upload" -> "Selaa" ja valitse sitten CSV-tiedosto tietokoneelta. Kun olet ladannut CSV-tiedoston, napsauta "Import Data" -painiketta. Kun tiedot on tuotu, napsauta "Avaa nyt" nähdäksesi kerätyt tiedot CSV-tiedostossa.
- (Valinnainen) Yksi helppo tapa analysoida tietoja on piirtää kaavio ja etsiä sitten tiedoista suuntauksia. Avaa laskentataulukossa valikko "Insert" ja valitse "Chart" piirtääksesi kaavion käyttämällä CSV-tiedoston tietoja. Seuraava kaavio on VEX IQ Brainilla (2.) kerätyn kiihtyvyysdatan tulos.
Huomautus: Voimme käyttää kaavioeditoria valitaksemme eri kaaviotyypin tai muokataksemme kaaviota tarpeidemme mukaan.
Tähän mennessä olemme saaneet päätökseen tiedonkeruuprojektin, joka kerää tietoja VEX IQ Brainilla (2.) ja tallentaa ne CSV-tiedostoon SD-kortille. Olemme myös oppineet lukemaan SD-kortilla olevan CSV-tiedoston Google Sheetsin avulla ja jopa luomaan kaavion jatkoanalyysiä varten. Mitä seuraavaksi? Yritetään suunnitella jännittävämpiä kokeita VEX Robotin avulla tiedonkeruussa, tarkkailla kuinka muuttuvat ympäristötekijät vaikuttavat erityyppisiin tietoihin ja saada syvempää ymmärrystä ympäröivästä maailmasta.