Datalogging met VEX Brain/Sensors (Python-versie)

Invoering

In dit artikel bespreken we hoe u een dataloggingproject kunt maken dat de VEX Robot de opdracht geeft gegevens te verzamelen met de VEX Brain en deze op te slaan in een CSV-bestand op de SD-kaart voor gegevensanalyse.

Datalogging is een krachtig hulpmiddel dat we kunnen gebruiken om wetenschappelijk onderzoek te ondersteunen, onze eigen experimenten uit te voeren en specifieke problemen op te lossen. Er zijn verschillende leuke en opwindende taken die we met de VEX Robot kunnen uitvoeren door middel van datalogging. Hier volgen enkele voorbeelden:

  • Gegevens verzamelen met de afstandssensor om de snelheid van de robot te berekenen
  • Rijd de robot door het klaslokaal en verzamel gegevens met de optische sensor om lichtveranderingen op verschillende locaties waar te nemen.
  • Door de robot mee te nemen op avontuur en GPS-coördinatengegevens op te nemen om een ​​kaart te maken.

Codeervaardigheden die nodig zijn voor het ontwikkelen van een dataloggingproject

  • Gebruik verschillende commando's om gegevens te verzamelen met VEX Brain/Sensors en deze toe te voegen aan een datastructuur.
  • Schrijf de gegevens naar een bestand met door komma's gescheiden waarden (CSV) op de SD-kaart.

Hardware vereist voor datalogging:

  • Een VEX-brein (IQ, V5, EXP)
  • Een SD-kaart
  • Een sensor of meerdere sensoren (optioneel, afhankelijk van de vereiste gegevens)

Gegevens van de sensor verkrijgen

We kunnen de VEX Robot (IQ, V5, EXP) programmeren om de gegevens van de volgende sensoren vast te leggen:

  • Traagheidssensor
  • Afstandssensor
  • Optische sensor
  • Visiesensor
  • Rotatiesensor (V5, EXP)
  • GPS-sensor (V5)

Opmerking: De VEX IQ (2e generatie) Brain en de VEX EXP Brain hebben een ingebouwde traagheidssensor. We kunnen de traagheidssensorgegevens verzamelen met deze VEX Brians.

In dit artikel zullen we een dataloggingproject ontwikkelen dat de acceleratiegegevens verzamelt met de VEX IQ Brain (2e) en deze opslaat op een SD-kaart. 

Eerst moeten we een kort programma schrijven om metingen te krijgen van de timer en de traagheidssensor die in de VEX IQ Brain (2e) zijn ingebouwd.

  • Aan het begin van dit programma moeten we de Python-modules importeren om VEX IQ Brain (2e) te besturen en de gegevens daaruit op te halen. Begin dus met het toevoegen van deze instructies aan het project.
  • # Bibliotheek importeert
    van vex import *

    # Brain moet standaard gedefinieerd zijn
    brain = Brain()
    brain_inertial = Inertial()
  • Voeg vervolgens de code toe om een ​​variabele numOfDataEntries te declareren om het aantal gegevensinvoer voor opname op te slaan, declareer een variabele polling_delay_msec om de waarde van het tijdsinterval voor het lezen van gegevens op te slaan, en maak een lege stringvariabele data_buffer om op te slaan de gegevens die van de sensor worden gelezen.
  • numOfDataEntries = 100
    polling_delay_msec = 50
    data_buffer = ""
  • Omdat we de huidige waarde van de timer gebruiken om het tijdstempel aan de gegevens toe te voegen, moeten we de timerwaarde terugzetten naar 0 seconden voordat we beginnen met het verzamelen van gegevens.
  • # Voeg timerinitialisatiecode
    brain.timer.clear() toe
  • Voordat we de instructie gebruiken die de gegevens van de VEX IQ Brain (2e) ophaalt en de gegevens in de buffer registreert, moeten we deze eerst begrijpen.
    De volgende instructie voegt de huidige timerwaarde toe aan de data_buffer variabele in een specifiek formaat.

    Een regel Python-code wordt in delen gemarkeerd om deze gedetailleerd uit te leggen. De coderegel luidt data_buffer += 1.3f % brain.timer.value() + komma. Eerst wordt de operator += gemarkeerd en gelabeld als Gegevens toevoegen aan de tekenreeks data_buffer. Vervolgens wordt de 1.3f-tekenreeks gemarkeerd en gelabeld als Opmaaktekenreeks. Vervolgens wordt het procentteken gemarkeerd en gemarkeerd met String modulo operator. Vervolgens wordt de opdracht brain.timer.value() gemarkeerd en gelabeld als De huidige waarde van de timer. Ten slotte wordt de toevoeging van de komma aan het einde gemarkeerd en wordt er weergegeven: Voeg een komma toe aan het einde om gegevens te scheiden.

    Laten we de formaatreeks “%1.3f”opsplitsen: 

    • “%”: introduceert de conversiespecificatie.
    • “1”: Geeft het minimumaantal cijfers aan dat in de string aanwezig moet zijn
    • “.3”: specificeert het aantal decimalen dat in het opgemaakte getal moet worden opgenomen.
    • “f”: geeft aan dat de op te maken waarde een getal met drijvende komma is.

    We kunnen dus de notatiereeks “%1.3f” gebruiken om een ​​getal met drijvende komma op te maken met een minimale breedte van 1 cijfer en een nauwkeurigheid van 3 decimalen.

  • Nu kunnen we de timer en de versnellingswaarde van de traagheidssensor lezen die is ingebouwd in de VEX IQ Brain (2e) en vervolgens de gegevens toevoegen aan de variabele data_buffer in het opgegeven formaat.
  • # Opdrachten om de gegevens naar buffer
    te schrijven 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"

    De voorgaande code wordt gedetailleerd uitgelegd. De eerste data_buffer-regel die brain.timer.value() gebruikt, heeft het label Voeg tijdstempel toe aan buffer. De volgende drie regels zijn gelabeld: Voeg de versnellingswaarde langs de X-, Y- en Z-assen toe aan de buffer.

  • Opmerking: “\n” is het teken Nieuwe regel. Dit geeft aan dat de regel hier eindigt en markeert het begin van een nieuwe regel.
  • Om vervolgens een bepaald aantal gegevensinvoer in de variabele data_buffer op te nemen, kunnen we een for lus gebruiken om herhaaldelijk de instructies uit te voeren die de gegevens ophalen en de gegevens gedurende een aantal iteraties toe te voegen aan de variabele data_buffer. Onze strategie is om de waarde van de variabele numOfDataEntries te gebruiken om het aantal iteraties te bepalen.
  • # Gegevensgeneratie
    voor i in bereik (0, numOfDataEntries):

    # Opdrachten om de gegevens naar buffer te schrijven
    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"
  • Tot nu toe registreert ons programma gegevens zo snel mogelijk. We willen echter gegevens op specifieke tijdsintervallen vastleggen. Daarom kunnen we een wait() functie gebruiken in de for-lus om het programma te pauzeren om het specifieke tijdsinterval tussen twee metingen toe te voegen. We gebruiken de waarde van de variabele polling_delay_msec om de waarde van het tijdsinterval te bepalen.
  • # Gegevensgeneratie
    voor i in range(0, numOfDataEntries):

    # Opdrachten om de gegevens naar buffer te schrijven
    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)

Gefeliciteerd! We hebben het programma voltooid om metingen (de versnellingsgegevens) te verkrijgen van de traagheidssensor die in de VEX Brain is ingebouwd. Vervolgens zullen we onderzoeken hoe u de gegevens naar een CSV-bestand op de SD-kaart kunt schrijven.

# Bibliotheek importeert
van vex import *

# Brain moet standaard gedefinieerd zijn
brain = Brain()
brain_inertial = Inertial()

numOfDataEntries = 100
polling_delay_msec = 50
data_buffer = ""

# Timerinitialisatiecode toevoegen
brain.timer.clear()

# Gegevensgeneratie
voor i in range(0, numOfDataEntries):

# Opdrachten om de gegevens naar de buffer te schrijven
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)

De SD-kaart bevestigen aan de VEX Brain

Voordat u de gegevens naar een bestand op een SD-kaart schrijft, plaatst u eerst de SD-kaart in de SD-kaartsleuf van de VEX Brain.

IQ (2e generatie) Brain wordt weergegeven met de SD-kaartsleuf gemarkeerd. De SD-kaartsleuf bevindt zich aan de zijkant van de Brain, rechts van de USB-C-poort.

Opmerking: Formatteer de SD-kaart naar FAT32 voor het schrijven van gegevens. We raden u aan SD-kaarten te gebruiken die 32 GB of minder groot zijn.

Om ervoor te zorgen dat het schrijven van gegevens naar een bestand op de SD-kaart onder de juiste omstandigheden kan worden uitgevoerd, moeten we code toevoegen om te controleren of de SD-kaart correct in de VEX IQ Brain (2e) is geplaatst.

  • Gebruik de functie brain.sdcard.is_inserted() om te controleren of de SD-kaart is geplaatst. Als de SD-kaart niet is geplaatst, geeft u het bijbehorende bericht op het VEX IQ Brain Screen weer en houdt u het programma vast.
  • # Houd het programma vast als de SD-kaart niet is geplaatst
    indien niet brain.sdcard.is_inserted():
    brain.screen.set_cursor(1,1)
    brain.screen.print("SD-kaart ontbreekt")
    while(True):
    wait(5, MSEC)
  • Opmerking: de brain.sdcard.is_inserted() functie retourneert True als er een SD-kaart in de Brain is geplaatst.

De gegevens naar een CSV-bestand op de SD-kaart schrijven

Tot nu toe kan ons programma gegevens verzamelen met de VEX IQ Brain (2e). Om het dataloggingproject te voltooien, moeten we de gegevens naar een door komma's gescheiden waardenbestand (CSV) op de SD-kaart schrijven voor toekomstig onderzoek en analyse.

  • Wanneer we verschillende soorten gegevens naar een CSV-bestand schrijven, willen we weten welk type gegevens elke kolom bevat. Om dit te doen, kunnen we de CSV-koptekst toevoegen aan de variabele data_buffer voordat we gegevens opnemen.
    Voeg dus de code toe om een ​​variabele csvHeaderText te declareren om de CSV-headertekst op te slaan om de kolomnamen voor het CSV-bestand op te geven en een variabele sd_file_name te declareren om de naam van het CSV-bestand op te slaan dat op het CSV-bestand moet worden geschreven SD-kaart.
  • csvHeaderText = "tijd, x, y, z"
    sd_file_name = "myDataPY.csv"

Opmerking: Zorg ervoor dat de headers in dezelfde volgorde staan ​​als de gegevens die zijn opgeslagen in de data_buffer variabele.

  • Voeg vervolgens de CSV-headertekst toe aan de tekenreeks data_buffer vóór de voor lus voor gegevensverzameling.
  • # CSV-header maken
    data_buffer = csvHeaderText + "\n"

    # CSV-gegevensgeneratie
    for i in range(0, numOfDataEntries):

    # Opdrachten om de gegevens naar de buffer te schrijven
    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)
  • Voordat we gegevens naar een bestand op de SD-kaart schrijven, moeten we eerst begrijpen hoe we de functie brain.sdcard.savefile() kunnen gebruiken.

    Een regel Python-code wordt in delen gemarkeerd om deze gedetailleerd uit te leggen. De coderegel luidt brain.sdcard.savefile(sd_file_name, bytearray(data_buffer, 'utf-8')). Eerst wordt de sectie brain.sdcard.savefile gemarkeerd en voorzien van het label Sla een bytearray op in een benoemd bestand op de SD-kaart. Vervolgens wordt de sectie sd_file_name gemarkeerd en gelabeld als Bestandsnaam. Ten slotte wordt bytearray(data_buffer, 'utf-8') aan het einde gemarkeerd en gelabeld als Buffer.


    Deze instructie schrijft de gegevens die zijn opgeslagen in de variabele data_buffer naar een benoemd CSV-bestand op de SD-kaart.
    Laten we het opsplitsen:
    • brain.sdcard.savefile(): De functie slaat een bytearray op in een benoemd bestand op de SD-kaart. De functie retourneert het aantal bytes dat naar het bestand is geschreven.

    • sd_file_name: De eerste parameter van de functie. Geeft de naam aan van het bestand dat moet worden geschreven. In dit project wordt de bestandsnaam opgeslagen in de variabele sd_file_name.

    • bytearray(datat_buffer,'utf-8'): De tweede parameter van de functie. Vertegenwoordigt de bytearray die in het bestand moet worden geschreven.

        • bytearray(): De methode creëert een veranderlijke bytearray. In deze instructie gebruiken we het om een ​​string naar een bytearray te converteren door de codering op te geven.
        • data_buffer: De eerste parameter van de methode. Geeft de bron aan die moet worden geconverteerd naar een bytearray. In dit project zijn de gegevens die zijn opgeslagen in de variabele data_buffer de bron. 
        • 'utf-8': De tweede parameter van de methode. Geeft de opgegeven codering aan die wordt gebruikt om de tekenreeks te coderen. De codering is 'utf-8' in deze instructie. 
  • Na de for lus voor gegevensverzameling gebruikt u de functie brain.sdcard.savefile() om de gegevens die zijn opgeslagen in de variabele data_buffer naar het CSV-bestand op de SD-kaart te schrijven. Voeg daarnaast de code toe om de retourwaarde van de functie brain.sdcard.savefile() te controleren om te verifiëren of de gegevens succesvol naar het bestand zijn geschreven en om het bijbehorende bericht weer te geven op het VEX IQ Brain Screen om realtime feedback te krijgen. De if-instructie aan het einde voegt een bericht toe om de status van het bestand weer te geven, waarbij SD Write Error of Data Writtenwordt weergegeven.
  • # CSV-gegevensgeneratie
    for i in range(0, numOfDataEntries):

    # Opdrachten om de gegevens naar de buffer te schrijven
    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)

    # Schrijf de gegevens naar de SD-kaart
    brain.screen.set_cursor(4,1)
    if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
    brain.screen.print("SD-schrijffout")
    anders:
    brain.screen.print("Gegevens geschreven")
  • Opmerking: De brain.sdcard.savefile() functie retourneert het aantal bytes dat naar het bestand is geschreven. In dit project gebruiken we het om de verzamelde gegevens naar een CSV-bestand te schrijven, dus het aantal bytes dat naar het bestand wordt geschreven, moet groter zijn dan nul. Met andere woorden: als de functie brain.sdcard.savefile() 0 retourneert, kunnen we concluderen dat de gegevens niet succesvol naar het bestand zijn geschreven. Anders zijn de gegevens al naar het bestand geschreven.

Gefeliciteerd! We hebben een dataloggingproject ontwikkeld dat de acceleratiegegevens verzamelt met de VEX IQ Brain (2e) en deze opslaat in een CSV-bestand op de SD-kaart. Vervolgens zullen we onderzoeken hoe u het CSV-bestand kunt openen voor gegevensanalyse. 

# Bibliotheek importeert
van vex import *

# Brain moet standaard worden gedefinieerd
brain = Brain()
brain_inertial = Inertial()

csvHeaderText = "time, x, y, z"
sd_file_name = "myDataPY.csv"
polling_delay_msec = 50
numOfDataEntries = 100
data_buffer = ""

# Houd het programma vast als de SD-kaart niet is geplaatst
if not brain.sdcard.is_inserted():
brain.screen.set_cursor(1,1)
brain.screen.print("SD-kaart ontbreekt")
while(True):
wait(5, MSEC)

# Voeg hier een sensor toe & timerinitialisatiecode
brain.timer.clear()

# Maak CSV-header
data_buffer = csvHeaderText + "\n"

# CSV-gegevensgeneratie
for i in range(0, numOfDataEntries):

# Opdrachten om de gegevens naar de buffer te schrijven
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)

# Schrijf de gegevens naar de SD-kaart
brain.screen.set_cursor(4,1)
if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
brain.screen.print("SD-schrijffout")
anders:
brain.screen.print("Gegevens geschreven")

Het CSV-bestand openen voor gegevensanalyse

Nadat de gegevens naar het CSV-bestand op de SD-kaart zijn geschreven, kunnen we een spreadsheetapplicatie gebruiken om het bestand te openen om de gegevens te lezen en te analyseren. 

Opmerking: Twee van de meest gebruikte spreadsheettoepassingen zijn Google Spreadsheets en Microsoft Excel. In dit artikel gebruiken we Google Spreadsheets (webgebaseerd) om het CSV-bestand op de SD-kaart te openen. Het proces voor het gebruik van andere applicaties is vergelijkbaar.

  • Verwijder de SD-kaart uit de SD-kaartsleuf van de VEX IQ Brain. Als de computer een ingebouwde Micro SD-kaartsleuf heeft, kunnen we de SD-kaart rechtstreeks in die sleuf plaatsen. Plaats anders de SD-kaart in een SD-kaartadapter en sluit de adapter vervolgens aan op de computer. 
  • Log in op ons Google-account en open Google Spreadsheets. Maak een nieuw werkblad.
  • Open in de spreadsheet het menu “Bestand” , selecteer “Importeren” -> “Uploaden” -> “Bladeren” en kies vervolgens het CSV-bestand op de computer. Na het uploaden van het CSV-bestand klikt u op de knop “Gegevens importeren”. Na het importeren van gegevens klikt u op “Nu openen” om de verzamelde gegevens in het CSV-bestand te bekijken.

    CSV-gegevens van het project geopend in een Google Sheets-document. Er zijn vier kolommen met de tijd, X, Y en Z. Er zijn veel rijen met gegevens die de versnelling bij elke tijdstempel documenteren.

  • (Optioneel) Een eenvoudige manier om de gegevens te analyseren is door een grafiek te tekenen en vervolgens naar de trends in de gegevens te zoeken. Open in de spreadsheet het menu “Invoegen” en selecteer “Grafiek” om een ​​grafiek te tekenen met behulp van de gegevens in het CSV-bestand. De volgende grafiek is het resultaat van de versnellingsgegevens verzameld met de VEX IQ Brain (2e).

    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.


    Opmerking: We kunnen de Grafiek-editor gebruiken om een ander grafiektype te selecteren of de grafiek te bewerken op basis van onze behoeften.

Tot nu toe hebben we het dataloggingproject afgerond, waarbij gegevens worden verzameld met de VEX IQ Brain (2e) en deze worden opgeslagen in een CSV-bestand op de SD-kaart. We hebben ook geleerd hoe we het CSV-bestand op de SD-kaart kunnen lezen met Google Spreadsheets en zelfs een grafiek kunnen maken voor verdere analyse. Wat nu? Laten we proberen meer opwindende experimenten te plannen met behulp van de VEX Robot voor datalogging, om te observeren hoe de veranderende omgevingsfactoren verschillende soorten gegevens beïnvloeden en een dieper inzicht te krijgen in de wereld om ons heen.

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

Last Updated: