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
numOfDataEntriesför att lagra antalet dataposter för inspelning, variabeln, polling_delay_msecför att lagra värdet på tidsintervallet för att läsa data, och skapa en tom strängvariabel, data_bufferfö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 variabelndata_bufferi ett specifikt format.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_bufferi 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"
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_bufferkan vi använda enför loopför att upprepade gånger exekvera instruktionerna som hämtar data och lägger till data i variabelndata_bufferunder ett antal iterationer. Vår strategi är att använda värdet på variabelnnumOfDataEntriesfö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 ifor-loopenför att pausa programmet och lägga till det specifika tidsintervallet mellan två avläsningar. Vi använder värdet på variabelnpolling_delay_msecfö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.
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
Obs: funktionen
om inte brain.sdcard.is_inserted():
brain.screen.set_cursor(1,1)
brain.screen.print("SD-kort saknas")
while(True):
wait(5, MSEC)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_bufferinnan vi registrerar data.
Lägg därför till koden för att deklarera en variabelcsvHeaderTextför att lagra CSV-rubriktexten för att ange kolumnnamnen för CSV-filen och deklarera en variabelsd_file_namefö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_bufferföreför loopfö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().
Den här instruktionen skriver data som lagras i variabelndata_buffertill 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 loopför datainsamling, använd funktionenbrain.sdcard.savefile()för att skriva data som lagrats i variabelndata_buffertill CSV-filen på SD-kortet. Lägg dessutom till koden för att kontrollera returvärdet från funktionenbrain.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
Obs: Funktionen
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")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 funktionenbrain.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.
- (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).
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.