Tiedon kirjaus VEX-aivoilla/sensoreilla (Python-versio)

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 numOfDataEntries tallentaaksesi datasyötteiden määrän, ilmoittaa muuttuja polling_delay_msec tallentaaksesi aikavälin datan lukemista varten ja luo tyhjä merkkijonomuuttuja data_buffer tallennettavaksi. 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 arvon data_buffer -muuttujaan tietyssä muodossa.

    Python-koodirivi on korostettu palasina sen selittämiseksi yksityiskohtaisesti. Koodirivi lukee data_buffer += 1.3f % brain.timer.value() + pilkku. Ensin +=-operaattori korostetaan ja siihen merkitään Lisää tiedot data_buffer-merkkijonoon. Seuraavaksi 1.3f-merkkijono korostetaan ja sille annetaan merkintä Muotoile merkkijono. Seuraavaksi prosenttimerkki korostetaan ja nimetään Merkkijonomodulo-operaattoriksi. Seuraavaksi komento brain.timer.value() korostetaan ja nimetään nimellä Ajastimen nykyinen arvo. Lopuksi pilkkumerkkijonon lisääminen loppuun korostetaan ja siinä lukee Lisää pilkku loppuun erottaaksesi tiedot.

    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"

    Edellinen koodi selitetään yksityiskohtaisesti. Ensimmäinen data_buffer-rivi, jossa käytetään brain.timer.value()-funktiota, on merkitty nimellä Add Timestamp to buffer. Seuraavien kolmen rivin nimi on Lisää kiihtyvyysarvo X-, Y- ja Z-akseleiden suuntaisesti puskuriin.

  • 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 silmukkaa suorittamaan toistuvasti käskyt, jotka hakevat tiedot, ja liittääksemme tiedot data_buffer -muuttujaan useiden iteraatioiden ajaksi. Strategiamme on käyttää muuttujan numOfDataEntries arvoa 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() -funktiota for -silmukassa keskeyttääksemme ohjelman lisätäksemme tietyn aikavälin kahden lukeman välille. Käytämme muuttujan polling_delay_msec arvoa 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.

IQ (2. sukupolvi) -aivot näkyvät SD-korttipaikka korostettuna. SD-korttipaikka on Brainin sivulla, sen USB-C-portin oikealla puolella.

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_buffer ennen tietojen tallentamista.
    Näin ollen lisää koodi ilmoittaaksesi muuttujan csvHeaderText tallentaaksesi CSV-otsikon tekstin määrittääksesi CSV-tiedoston sarakkeiden nimet ja ilmoittaaksesi muuttujan sd_file_name sä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 ennen for silmukkaa tiedonkeruuta 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().

    Python-koodirivi on korostettu palasina sen selittämiseksi yksityiskohtaisesti. Koodirivi lukee brain.sdcard.savefile(sd_file_name, bytearray(data_buffer, 'utf-8')). Ensin brain.sdcard.savefile-osio korostetaan ja siihen lisätään merkintä Tallenna bytearray nimettyyn tiedostoon SD-kortille. Seuraavaksi sd_file_name-osio korostetaan ja siihen lisätään nimi Tiedostonimi. Lopuksi, lopussa oleva bytearray(data_buffer, 'utf-8') korostetaan ja nimetään Bufferiksi.


    Tämä ohje kirjoittaa muuttujaan data_buffer tallennetut 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ä funktiota brain.sdcard.savefile() kirjoittaaksesi muuttujaan data_buffer tallennetut tiedot SD-kortin CSV-tiedostoon. Lisää lisäksi koodi, joka tarkistaa brain.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 joko SD Write Error tai Data 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() palauttaa 0, 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.

    Projektin CSV-tiedot avattu Google Sheets -dokumentissa. Aika, X, Y ja Z on luettavissa neljässä sarakkeessa. Kunkin aikaleiman kiihtyvyyttä dokumentoivia tietoja on useita rivejä.

  • (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.

    Chart of the data is opened in Google Sheets, showing the acceleration of the X, Y, and Z axes over time. The Z value stays near negative one, and the X and Y values stay near zero.


    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.

For more information, help, and tips, check out the many resources at VEX Professional Development Plus

Last Updated: