Dataloggning med VEX Brain/Sensors (Python-version)

Introduktion

I den här artikeln kommer vi att diskutera hur man skapar ett dataloggningsprojekt som instruerar VEX-roboten att samla in data med VEX Brain och spara den i en CSV-fil på SD-kortet för dataanalys.

Dataloggning är ett kraftfullt verktyg som vi kan använda för att underlätta vetenskaplig forskning, genomföra våra egna experiment och lösa specifika problem. Det finns olika roliga och spännande uppgifter som vi kan köra VEX-roboten att utföra med dataloggning. Följande är några exempel:

  • Samlar in data med avståndssensorn för att beräkna robotens hastighet
  • Köra roboten runt i klassrummet och samla in data med den optiska sensorn för att observera ljusförändringar på olika platser.
  • Ta med roboten på ett äventyr och registrera GPS-koordinatdata för att skapa en karta.

Kodningsfärdigheter som behövs för att utveckla ett dataloggningsprojekt

  • Använd olika kommandon för att samla in data med VEX Brain/Sensors och lägga till den i en datastruktur.
  • Skriv informationen till en kommaseparerad fil (CSV) på SD-kortet.

Hårdvara som krävs för dataloggning:

  • En VEX-hjärna (IQ, V5, EXP)
  • Ett SD-kort
  • En eller flera sensorer (valfritt, beroende på vilka data som krävs)

Hämta data från sensorn

Vi kan programmera VEX-roboten (IQ, V5, EXP) att samla in data från följande sensorer:

  • Tröghetssensor
  • Avståndssensor
  • Optisk sensor
  • Synsensor
  • Rotationssensor (V5, EXP)
  • GPS-sensor (V5)

Obs: VEX IQ (2:a generationen) Brain och VEX EXP Brain har en inbyggd tröghetssensor. Vi kan samla in tröghetssensordata med dessa VEX Brians.

I den här artikeln kommer vi att utveckla ett dataloggningsprojekt som samlar in accelerationsdata med VEX IQ Brain (2:a) och lagrar den på ett SD-kort. 

Först behöver vi skriva ett kort program för att hämta avläsningar från timern och tröghetssensorn som är inbyggd i VEX IQ Brain (2:a).

  • I början av det här programmet behöver vi importera Python-modulerna för att styra VEX IQ Brain (2:a) och hämta data från den. Börja därför med att lägga till dessa instruktioner i projektet.
  • # Bibliotek importerar
    från vex import *

    # Hjärnan ska definieras som standard
    brain = Brain()
    brain_inertial = Inertial()
  • Lägg sedan till koden för att deklarera variabeln numOfDataEntries för att lagra antalet dataposter för inspelning, variabeln , polling_delay_msec för att lagra värdet på tidsintervallet för att läsa data, och skapa en tom strängvariabel , data_buffer för att lagra data som lästs från sensorn.
  • numOfDataEntries = 100
    polling_delay_msec = 50
    data_buffer = ""
  • Eftersom vi kommer att använda timerns aktuella värde för att lägga till tidsstämpeln till data, måste vi återställa timervärdet till 0 sekunder innan vi börjar samla in data.
  • # Lägg till timerinitialiseringskod
    brain.timer.clear()
  • Innan vi använder instruktionen som hämtar data från VEX IQ Brain (2:a) och registrerar data i bufferten, måste vi först förstå den.
    Följande instruktion lägger till det aktuella timervärdet till variabeln data_buffer i ett specifikt format.

    En rad Python-kod är markerad i bitar för att förklara den i detalj. Kodraden läser data_buffer += 1.3f % brain.timer.value() + komma. Först markeras operatorn += och märks Lägg till data i strängen data_buffer. Därefter markeras 1.3f-strängen och märks Formatera sträng. Därefter markeras procenttecknet och märks String modulo-operator. Därefter markeras kommandot brain.timer.value() och märks med Timerns aktuella värde. Slutligen markeras tillägget av kommateckensträngen i slutet och det står Lägg till ett kommatecken i slutet för att separera data.

    Låt oss bryta ner formatsträngen “%1.3f”

    • "%": Introducerar konverteringsspecifikationen.
    • "1": Anger det minsta antalet siffror som får finnas i strängen
    • ".3": Anger antalet decimaler som ska inkluderas i det formaterade talet.
    • ”f”: Indikerar att värdet som ska formateras är ett flyttal.

    Således kan vi använda formatsträngen "%1.3f" för att formatera ett flyttal med en minsta bredd på 1 siffra och en precision på 3 decimaler.

  • Nu kan vi läsa timern och accelerationsvärdet för tröghetssensorn som är inbyggd i VEX IQ Brain (2:a) och sedan lägga till data till variabeln data_buffer i det angivna formatet.
  • # Kommandon för att skriva data till bufferten
    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"

    Den föregående koden förklaras i detalj. Den första raden data_buffer som använder brain.timer.value() är märkt Lägg till tidsstämpel i buffern. De nästa tre raderna är märkta Lägg till accelerationsvärdet längs X-, Y- och Z-axlarna för att buffra.

    Obs: "\n" är tecknet för ny rad. Det indikerar att raden slutar här och början på en ny rad.
  • För att sedan registrera ett visst antal dataposter i variabeln data_buffer kan vi använda en för loop för att upprepade gånger exekvera instruktionerna som hämtar data och lägger till data i variabeln data_buffer under ett antal iterationer. Vår strategi är att använda värdet på variabeln numOfDataEntries för att bestämma antalet iterationer.
  • # Datagenerering
    för i inom intervall(0, numOfDataEntries):

    # Kommandon för att skriva data till bufferten
    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"
  • Hittills registrerar vårt program data så snabbt som möjligt. Vi vill dock registrera data med specifika tidsintervall. Därför kan vi använda en wait() funktion i for-loopen för att pausa programmet och lägga till det specifika tidsintervallet mellan två avläsningar. Vi använder värdet på variabeln polling_delay_msec för att bestämma värdet på tidsintervallet.
  • # Datagenerering
    för i inom intervall(0, numOfDataEntries):

    # Kommandon för att skriva data till bufferten
    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)

Grattis! Vi har avslutat programmet för att hämta avläsningar (accelerationsdata) från tröghetssensorn som är inbyggd i VEX Brain. Härnäst ska vi utforska hur man skriver data till en CSV-fil på SD-kortet.

# Bibliotek importerar
från vex import *

# Brain ska definieras som standard
brain = Brain()
brain_inertial = Inertial()

numOfDataEntries = 100
polling_delay_msec = 50
data_buffer = ""

# Lägg till timerinitialiseringskod
brain.timer.clear()

# Datagenerering
för i inom intervallet(0, numOfDataEntries):

# Kommandon för att skriva data till bufferten
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)

Ansluta SD-kortet till VEX Brain

Innan du skriver data till en fil på ett SD-kort, sätt först in SD-kortet i SD-kortplatsen på VEX Brain.

EXP Brain visas med SD-kortplatsen markerad. SD-kortplatsen sitter på sidan av Brain, till höger om dess USB-C-port.

Obs: Formatera SD-kortet till FAT32 för dataskrivning. Vi rekommenderar att du använder SD-kort som är 32 GB eller mindre i storlek.

För att säkerställa att skrivning av data till en fil på SD-kortet kan utföras under lämpliga förhållanden måste vi lägga till kod för att kontrollera om SD-kortet är korrekt isatt i VEX IQ Brain (2:a).

  • Använd funktionen brain.sdcard.is_inserted() för att kontrollera om SD-kortet är isatt. Om SD-kortet inte är isatt, visa motsvarande meddelande på VEX IQ Brain Screen och håll programmet i väntläge.
  • # Pausa programmet om SD-kortet inte är isatt
    om inte brain.sdcard.is_inserted():
    brain.screen.set_cursor(1,1)
    brain.screen.print("SD-kort saknas")
    while(True):
    wait(5, MSEC)
    Obs: funktionen brain.sdcard.is_inserted() returnerar True om ett SD-kort sätts in i Brain.

Skriva data till en CSV-fil på SD-kortet

Hittills kan vårt program samla in data med VEX IQ Brain (2:a). För att slutföra dataloggningsprojektet behöver vi skriva data till en kommaseparerad fil (CSV) på SD-kortet för framtida granskning och analys.

  • När vi skriver olika typer av data till en CSV-fil vill vi veta vilken typ av data varje kolumn innehåller. För att göra detta kan vi lägga till CSV-rubriktexten till variabeln data_buffer innan vi registrerar data.
    Lägg därför till koden för att deklarera en variabel csvHeaderText för att lagra CSV-rubriktexten för att ange kolumnnamnen för CSV-filen och deklarera en variabel sd_file_name för att lagra namnet på CSV-filen som ska skrivas till SD-kortet.
  • csvHeaderText = "tid, x, y, z"
    sd_filnamn = "myDataPY.csv"

Obs: Se till att rubrikerna är i samma ordning som data som lagras i variabeln data_buffer.

  • Lägg sedan till CSV-rubriktexten i strängen data_buffer före för loop för datainsamling.
  • # Skapa CSV-rubrik
    data_buffer = csvHeaderText + "\n"

    # CSV-datagenerering
    för i inom intervallet(0, numOfDataEntries):

    # Kommandon för att skriva data till bufferten
    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
  • Innan vi skriver data till en fil på SD-kortet, låt oss först förstå hur man använder funktionen brain.sdcard.savefile().

    En rad Python-kod är markerad i bitar för att förklara den i detalj. Kodraden läser brain.sdcard.savefile(sd_file_name, bytearray(data_buffer, 'utf-8')). Först markeras avsnittet brain.sdcard.savefile och märks Spara en bytearray till en namngiven fil på SD-kortet. Därefter markeras avsnittet sd_file_name och märks Filnamn. Slutligen markeras bytearray(data_buffer, 'utf-8') i slutet och märks Buffer.


    Den här instruktionen skriver data som lagras i variabeln data_buffer till en namngiven CSV-fil på SD-kortet.
    Låt oss bryta ner det:
    • brain.sdcard.savefile(): Funktionen sparar en bytearray i en namngiven fil på SD-kortet. Funktionen returnerar antalet byte som skrivits till filen.

    • sd_filnamn: Funktionens första parameter. Anger namnet på filen som ska skrivas. I det här projektet lagras filnamnet i variabeln sd_filnamn.

    • bytearray(datat_buffer,'utf-8'): Funktionens andra parameter. Representerar bytearrayen som ska skrivas in i filen.

        • bytearray(): Metoden skapar en föränderlig bytearray. I den här instruktionen använder vi den för att konvertera en sträng till en bytearray genom att ange kodningen.
        • data_buffer: Metodens första parameter. Anger källan som ska konverteras till en bytearray. I det här projektet är källan data som lagras i variabeln data_buffer. 
        • 'utf-8': Metodens andra parameter. Anger den angivna kodningen som används för att koda strängen. Kodningen är 'utf-8' i den här instruktionen. 
  • Efter för loop för datainsamling, använd funktionen brain.sdcard.savefile() för att skriva data som lagrats i variabeln data_buffer till CSV-filen på SD-kortet. Lägg dessutom till koden för att kontrollera returvärdet från funktionen brain.sdcard.savefile() för att verifiera om data har skrivits till filen och visa motsvarande meddelande på VEX IQ Brain Screen för att få feedback i realtid.
  • # CSV-datagenerering
    för i inom intervall(0, numOfDataEntries):

    # Kommandon för att skriva data till bufferten
    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)

    # Skriv data till SD-kort
    brain.screen.set_cursor(4,1)
    if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
    brain.screen.print("SD-skrivfel")
    annars:
    brain.screen.print("Data skrivna")
    Obs: Funktionen brain.sdcard.savefile() returnerar antalet byte som skrivits till filen. I det här projektet använder vi den för att skriva insamlad data till en CSV-fil, så antalet byte som skrivs till filen måste vara större än noll. Med andra ord, om funktionen brain.sdcard.savefile() returnerar 0, kan vi dra slutsatsen att informationen inte har skrivits till filen utan problem. Annars har informationen skrivits till filen.

Grattis! Vi har utvecklat ett dataloggningsprojekt som samlar in accelerationsdata med VEX IQ Brain (2:a) och lagrar den i en CSV-fil på SD-kortet. Härnäst ska vi utforska hur man öppnar CSV-filen för dataanalys. 

# Bibliotek importerar
från vex import *

# Brain ska definieras som standard
brain = Brain()
brain_inertial = Inertial()

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

# Pausa programmet om SD-kortet inte är isatt
om inte brain.sdcard.is_inserted():
brain.screen.set_cursor(1,1)
brain.screen.print("SD-kort saknas")
while(True):
wait(5, MSEC)

# Lägg till valfri sensor & timerinitialiseringskod här
brain.timer.clear()

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

# CSV-datagenerering
för i inom intervall(0, numOfDataEntries):

# Kommandon för att skriva data till bufferten
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)

# Skriv data till SD-kort
brain.screen.set_cursor(4,1)
if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
brain.screen.print("SD-skrivfel")
annars:
brain.screen.print("Data skrivna")

Öppna CSV-filen för dataanalys

När informationen har skrivits till CSV-filen på SD-kortet kan vi använda ett kalkylprogram för att öppna filen för att läsa och analysera informationen. 

Obs: Två av de vanligaste kalkylprogrammen är Google Sheets och Microsoft Excel. I den här artikeln kommer vi att använda Google Sheets (webbaserat) för att öppna CSV-filen på SD-kortet. Processen för att använda andra applikationer är liknande.

  • Ta ut SD-kortet från VEX IQ Brains SD-kortplats. Om datorn har en inbyggd Micro SD-kortplats kan vi sätta i SD-kortet direkt i den kortplatsen. Annars sätter du in SD-kortet i en SD-kortadapter och ansluter sedan adaptern till datorn. 
  • Logga in på vårt Google-konto och öppna Google Sheets. Skapa ett nytt kalkylblad.
  • I kalkylbladet öppnar du menyn ”Arkiv” , väljer ”Importera” > Ladda upp” ”> Bläddra väljer sedan CSV-filen på datorn. När du har laddat upp CSV-filen klickar du påImportera data”. Efter att du har importerat data klickar du på “Öppna nu” för att se den insamlade datan i CSV-filen.

    Projektets CSV-data öppnades i ett Google Sheets-dokument. Det finns fyra kolumner som anger Tid, X, Y och Z. Det finns många rader med data som dokumenterar accelerationen vid varje tidsstämpel.

  • (Valfritt) Ett enkelt sätt att analysera data är att rita ett diagram och sedan leta efter trender i data. I kalkylbladet öppnar du menyn ”Infoga” och väljer ”Diagram” för att rita ett diagram med hjälp av data i CSV-filen. Följande graf är resultatet av accelerationsdata som samlats in med VEX IQ Brain (2:a plats).

    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.


    Obs: Vi kan använda Diagramredigeraren för att välja en annan diagramtyp eller redigera diagrammet baserat på våra behov.

Hittills har vi avslutat dataloggningsprojektet som samlar in data med VEX IQ Brain (2:a) och sparar den i en CSV-fil på SD-kortet. Vi har också lärt oss hur man läser CSV-filen på SD-kortet med hjälp av Google Sheets och till och med skapar ett diagram för vidare analys. Vad händer nu? Låt oss försöka planera fler spännande experiment med VEX-roboten för dataloggning, för att observera hur förändrade miljöfaktorer påverkar olika typer av data och få en djupare förståelse av världen omkring oss.

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

Last Updated: