Datalogging met een VEX-brein en sensoren met behulp van Python

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. Met deze VEX Brains kunnen we de traagheidssensorgegevens verzamelen.

In dit artikel zullen we een dataloggingproject ontwikkelen dat de acceleratiegegevens verzamelt met de VEX IQ Brain (2e generatie) 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 generatie) zijn ingebouwd.

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

    # Bibliotheekimports
    from 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 de tijdstempel aan de gegevens toe te voegen, moeten we de timerwaarde terugzetten naar 0 seconden voordat we beginnen met het verzamelen van gegevens.

    # Voeg timer-initialisatiecode
    brain.timer.clear()
  • 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 in detail uit te leggen. De regel code luidt: data_buffer += 1.3f % brain.timer.value() + komma. Allereerst wordt de operator += gemarkeerd en voorzien van het label 'Gegevens toevoegen aan de data_buffer-string'. Vervolgens wordt de tekenreeks 1.3f gemarkeerd en gelabeld als 'Formaattekenreeks'. Vervolgens wordt het procentteken gemarkeerd en gelabeld als 'String modulo operator'. Vervolgens wordt de opdracht brain.timer.value() gemarkeerd en voorzien van het label "De huidige waarde van de timer". Tot slot wordt de toevoeging van de komma aan het einde gemarkeerd en staat er: 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 generatie) 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 in detail uitgelegd. De eerste regel in data_buffer die brain.timer.value() gebruikt, is gelabeld met "Add Timestamp to buffer". De volgende drie regels zijn gelabeld met "Voeg de versnellingswaarde langs de X-, Y- en Z-assen toe aan de buffer".

    Opmerking: “\n” is het teken Nieuwe regel. Het geeft aan dat de lijn hier eindigt en het begin van een nieuwe lijn is.

  • 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):
    
        # Commando's 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"
  • 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 bereik(0, numOfDataEntries):
    
        # Commando's 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)

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.

# Bibliotheekimports
from vex import *

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

numOfDataEntries = 100
polling_delay_msec = 50
data_buffer = ""

# Voeg timer-initialisatiecode toe
brain.timer.clear()

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

    # Commando's 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.

De V5 Brain wordt getoond met het SD-kaartslot gemarkeerd. Het SD-kaartslot 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 generatie) 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.

    # Stop het programma als de SD-kaart niet is geplaatst
    als 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 generatie). 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-headertekst toevoegen aan de variabele data_buffer voordat we de gegevens vastleggen.
    Voeg daarom de code toe om een ​​variabele csvHeaderText te declareren om de CSV-headertekst op te slaan en de kolomnamen voor het CSV-bestand te specificeren, en declareer een variabele sd_file_name om de naam van het CSV-bestand op te slaan dat naar de SD-kaart moet worden geschreven.

    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 variabele data_buffer.

  • Voeg vervolgens de CSV-headertekst toe aan de data_buffer string vóór de for loop voor gegevensverzameling.

    # Maak een CSV-header aan
    data_buffer = csvHeaderText + "\n"
    
    # Genereer CSV-gegevens
    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 in detail uit te leggen. De regel code luidt: brain.sdcard.savefile(sd_file_name, bytearray(data_buffer, 'utf-8')). Allereerst wordt het gedeelte brain.sdcard.savefile gemarkeerd en voorzien van het label 'Sla een bytearray op in een bestand met een bepaalde naam op de SD-kaart'. Vervolgens wordt het gedeelte sd_file_name gemarkeerd en gelabeld als Filename. Ten slotte wordt de 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 eens nader bekijken:

    • brain.sdcard.savefile(): De functie slaat een byte-array 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 code toe om de retourwaarde van de functie ( te controleren om te verifiëren of de gegevens succesvol naar het bestand zijn geschreven en om het bijbehorende bericht op het VEX IQ Brain Screen weer te geven voor realtime feedback.

    # Generatie van CSV-gegevens
    voor i in bereik(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() retourneert, kunnen we concluderen dat de gegevens niet succesvol naar het bestand zijn geschreven. Anders zijn de gegevens in het bestand geschreven.

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

# Bibliotheekimports
from vex import *

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

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

# Wacht het programma 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 een sensor toe & Timer-initialisatiecode hier
brain.timer.clear()

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

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

    # Commando's 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.

    De CSV-gegevens van het project werden geopend in een Google Sheets-document. Er zijn vier kolommen met de namen Tijd, X, Y en Z. Er zijn veel rijen met gegevens die de versnelling op elk tijdstip 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 toont het resultaat van de acceleratiegegevens verzameld met de VEX IQ Brain (2e generatie).

    In Google Sheets wordt een grafiek met de gegevens geopend, die de versnelling van de X-, Y- en Z-assen in de loop van de tijd weergeeft. De Z-waarde blijft in de buurt van -1, en de X- en Y-waarden blijven in de buurt van nul.


    Opmerking: We kunnen de Grafiekeditor gebruiken om een ​​ander grafiektype te selecteren of de grafiek aan te passen aan onze behoeften.

Tot nu toe hebben we het dataloggingproject afgerond, waarbij gegevens worden verzameld met de VEX IQ Brain (2e generatie) 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: