Einführung
In diesem Artikel besprechen wir, wie man ein Datenprotokollierungsprojekt erstellt, das den VEX-Roboter anweist, Daten mit dem VEX Brain zu sammeln und sie zur Datenanalyse in einer CSV-Datei auf der SD-Karte zu speichern.
Die Datenprotokollierung ist ein leistungsstarkes Werkzeug, mit dem wir wissenschaftliche Forschung unterstützen, eigene Experimente durchführen und spezifische Probleme lösen können. Es gibt verschiedene unterhaltsame und spannende Aufgaben, die wir mit dem VEX-Roboter mithilfe der Datenprotokollierung erledigen können. Nachfolgend einige Beispiele:
- Sammeln von Daten mit dem Distanzsensor zur Berechnung der Geschwindigkeit des Roboters
- Fahren Sie den Roboter durch das Klassenzimmer und sammeln Sie Daten mit dem optischen Sensor, um Lichtveränderungen an verschiedenen Orten zu beobachten.
- Nehmen Sie den Roboter mit auf ein Abenteuer und zeichnen Sie GPS-Koordinatendaten auf, um eine Karte zu erstellen.
Für die Entwicklung eines Datenprotokollierungsprojekts erforderliche Programmierkenntnisse
- Verwenden Sie verschiedene Befehle, um Daten mit VEX Brain/Sensors zu sammeln und sie einer Datenstruktur hinzuzufügen.
- Schreiben Sie die Daten in eine CSV-Datei (Comma-Separated Values) auf der SD-Karte.
Erforderliche Hardware für die Datenprotokollierung:
- Ein VEX-Gehirn (IQ, V5, EXP)
- Eine SD-Karte
- Ein Sensor oder mehrere Sensoren (optional, je nach den erforderlichen Daten)
Daten vom Sensor abrufen
Wir können den VEX-Roboter (IQ, V5, EXP) so programmieren, dass er die Daten der folgenden Sensoren erfasst:
- Trägheitssensor
- Abstandssensor
- Optischer Sensor
- Vision-Sensor
- Rotationssensor (V5, EXP)
- GPS-Sensor (V5)
Hinweis: Das VEX IQ Brain (2. Generation) und das VEX EXP Brain verfügen über einen integrierten Trägheitssensor. Mit diesen VEX-Brians können wir die Daten des Trägheitssensors sammeln.
In diesem Artikel entwickeln wir ein Datenprotokollierungsprojekt, das die Beschleunigungsdaten mit dem VEX IQ Brain (2.) sammelt und auf einer SD-Karte speichert.
Zuerst müssen wir ein kurzes Programm schreiben, um Messwerte vom Timer und dem im VEX IQ Brain integrierten Trägheitssensor zu erhalten (2.).
- Zu Beginn dieses Programms müssen wir die Python-Module importieren, um VEX IQ Brain (2.) zu steuern und die Daten daraus abzurufen. Beginnen Sie also damit, diese Anweisungen zum Projekt hinzuzufügen.
-
# Bibliotheksimporte
from vex import *
# Brain sollte standardmäßig definiert sein
brain = Brain()
brain_inertial = Inertial() - Fügen Sie als Nächstes den Code hinzu, um eine Variable
numOfDataEntrieszu deklarieren, um die Anzahl der Dateneinträge für die Aufzeichnung zu speichern, deklarieren Sie eine Variablepolling_delay_msec, um den Wert des Zeitintervalls zum Lesen von Daten zu speichern, und erstellen Sie eine leere Zeichenfolgenvariabledata_bufferzum Speichern die vom Sensor gelesenen Daten. -
Anzahl der Dateneinträge = 100
Abfrageverzögerung_msec = 50
Datenpuffer = "" - Da wir den aktuellen Wert des Timers verwenden, um den Zeitstempel zu den Daten hinzuzufügen, müssen wir den Timerwert vor Beginn der Datenerfassung auf 0 Sekunden zurücksetzen.
-
# Timer-Initialisierungscode hinzufügen
brain.timer.clear() - Bevor wir die Anweisung verwenden, die die Daten vom VEX IQ Brain (2.) abruft und die Daten im Puffer aufzeichnet, müssen wir sie zunächst verstehen.
Die folgende Anweisung hängt den aktuellen Timerwert in einem bestimmten Format an die Variabledata_bufferan.Lassen Sie uns die Formatzeichenfolge
„%1.3f“aufschlüsseln:- „%“: Führt den Konvertierungsspezifizierer ein.
- „1“: Gibt die Mindestanzahl an Ziffern an, die in der Zeichenfolge vorhanden sein müssen
- „.3“: Gibt die Anzahl der Dezimalstellen an, die in die formatierte Zahl einbezogen werden sollen.
- „f“: Gibt an, dass der zu formatierende Wert eine Gleitkommazahl ist.
Somit können wir mit der Formatzeichenfolge „%1.3f“ eine Gleitkommazahl mit einer Mindestbreite von 1 Ziffer und einer Genauigkeit von 3 Dezimalstellen formatieren.
- Jetzt können wir den Timer und den Beschleunigungswert des im VEX IQ Brain (2.) integrierten Trägheitssensors lesen und die Daten dann im angegebenen Format an die Variable
data_bufferanhängen. -
# Befehle zum Schreiben der Daten in Puffer
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" - Hinweis: „\n“ ist das Zeichen für die neue Zeile. Es zeigt an, dass die Zeile hier endet und den Beginn einer neuen Zeile markiert.
- Um dann eine bestimmte Anzahl von Dateneinträgen in der Variablen
data_bufferaufzuzeichnen, können wir einefor-Schleifeverwenden, um die Anweisungen, die die Daten abrufen und die Daten für eine Reihe von Iterationen an die Variabledata_bufferanhängen, wiederholt auszuführen. Unsere Strategie besteht darin, den Wert der VariablennumOfDataEntrieszu verwenden, um die Anzahl der Iterationen zu bestimmen. -
# Datengenerierung
für i in range(0, numOfDataEntries):
# Befehle zum Schreiben der Daten in den Puffer
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" - Bisher zeichnet unser Programm Daten so schnell wie möglich auf. Wir möchten jedoch Daten in bestimmten Zeitintervallen aufzeichnen. Daher können wir eine
wait()Funktion in derfor-Schleifeverwenden, um das Programm anzuhalten, um das spezifische Zeitintervall zwischen zwei Messwerten hinzuzufügen. Wir verwenden den Wert der Variablenpolling_delay_msec, um den Wert des Zeitintervalls zu bestimmen. -
# Datengenerierung
für i in range(0, numOfDataEntries):
# Befehle zum Schreiben der Daten in den Puffer
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)
Glückwunsch! Wir haben das Programm abgeschlossen, um Messwerte (die Beschleunigungsdaten) vom im VEX Brain integrierten Trägheitssensor zu erhalten. Als Nächstes erfahren Sie, wie Sie die Daten in eine CSV-Datei auf der SD-Karte schreiben.
# Bibliotheksimporte
from vex import *
# Brain sollte standardmäßig definiert sein
brain = Brain()
brain_inertial = Inertial()
numOfDataEntries = 100
polling_delay_msec = 50
data_buffer = ""
# Timer-Initialisierungscode hinzufügen
brain.timer.clear()
# Datengenerierung
for i in range(0, numOfDataEntries):
# Befehle zum Schreiben der Daten in den Puffer
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)
Anbringen der SD-Karte am VEX Brain
Bevor Sie die Daten in eine Datei auf einer SD-Karte schreiben, stecken Sie zunächst die SD-Karte in den SD-Kartensteckplatz des VEX Brain.
Hinweis: Formatieren Sie die SD-Karte zum Schreiben von Daten auf FAT32. Wir empfehlen die Verwendung von SD-Karten mit einer Größe von 32 GB oder weniger.
Um sicherzustellen, dass das Schreiben von Daten in eine Datei auf der SD-Karte unter geeigneten Bedingungen durchgeführt werden kann, müssen wir Code hinzufügen, um zu überprüfen, ob die SD-Karte ordnungsgemäß in das VEX IQ Brain (2.) eingelegt ist.
- Verwenden Sie die Funktion
brain.sdcard.is_inserted(), um zu überprüfen, ob die SD-Karte eingelegt ist. Wenn die SD-Karte nicht eingelegt ist, zeigen Sie die entsprechende Meldung auf dem VEX IQ Brain-Bildschirm an und halten Sie das Programm gedrückt. -
# Programm anhalten, falls keine SD-Karte eingelegt ist
falls nicht brain.sdcard.is_inserted():
brain.screen.set_cursor(1,1)
brain.screen.print("SD-Karte fehlt")
while(True):
wait(5, MSEC) -
Hinweis: Die Funktion () gibt True zurück
wenn eine SDKarte in das Brain eingelegt ist.
Schreiben der Daten in eine CSV-Datei auf der SD-Karte
Bisher kann unser Programm Daten mit dem VEX IQ Brain (2.) sammeln. Um das Datenprotokollierungsprojekt abzuschließen, müssen wir die Daten zur späteren Prüfung und Analyse in eine CSV-Datei (Comma-Separated Values) auf der SD-Karte schreiben.
- Wenn wir verschiedene Datentypen in eine CSV-Datei schreiben, möchten wir wissen, welche Datentypen jede Spalte enthält. Dazu können wir den CSV-Headertext vor der Datenaufzeichnung an die Variable
data_bufferanhängen.
Fügen Sie daher den Code hinzu, um eine VariablecsvHeaderTextzu deklarieren, um den CSV-Headertext zu speichern, um die Spaltennamen für die CSV-Datei anzugeben, und deklarieren Sie eine Variablesd_file_name, um den Namen der CSV-Datei zu speichern, in die geschrieben werden soll SD-Karte. -
csvHeaderText = "Zeit, x, y, z"
sd_file_name = "myDataPY.csv"
Hinweis: Stellen Sie sicher, dass die Header in derselben Reihenfolge sind wie die in der Variablen data_buffer gespeicherten Daten.
- Als nächstes hängen Sie den CSV-Headertext an die Zeichenfolge
data_buffervor der Zeichenfolgefür Schleifezur Datenerfassung an. -
# CSV-Header erstellen
data_buffer = csvHeaderText + "\n"
# CSV-Datengenerierung
for i in range(0, numOfDataEntries):
# Befehle zum Schreiben der Daten in den Puffer
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) - Bevor wir Daten in eine Datei auf der SD-Karte schreiben, wollen wir zunächst verstehen, wie die Funktion
brain.sdcard.savefile()verwendet wird.
Diese Anweisung schreibt die in der Variablendata_buffergespeicherten Daten in eine benannte CSV-Datei auf der SD-Karte.
Lassen Sie es uns aufschlüsseln:-
brain.sdcard.savefile(): Die Funktion speichert ein Bytearray in einer benannten Datei auf der SD-Karte. Die Funktion gibt die Anzahl der in die Datei geschriebenen Bytes zurück.
-
sd_file_name: Der erste Parameter der Funktion. Gibt den Namen der zu schreibenden Datei an. In diesem Projekt wird der Dateiname in der Variablen
sd_file_name gespeichert. -
bytearray(datat_buffer,'utf-8'): Der zweite Parameter der Funktion. Stellt das Bytearray dar, das in die Datei geschrieben werden soll.
-
- bytearray(): Die Methode erstellt ein veränderbares Bytearray. In dieser Anleitung verwenden wir es, um einen String in ein Bytearray umzuwandeln, indem wir die Codierung angeben.
- data_buffer: Der erste Parameter der Methode. Gibt die Quelle an, die in ein Bytearray konvertiert werden soll. In diesem Projekt sind die Daten, die in der Variablen
data_buffer gespeichert sind, die Quelle. - 'utf-8': Der zweite Parameter der Methode. Gibt die angegebene Codierung an, die zum Codieren der Zeichenfolge verwendet wird. Die Kodierung in dieser Anleitung ist „utf-8“.
-
-
- Verwenden Sie nach der
for-Schleifezur Datenerfassung die Funktionbrain.sdcard.savefile(), um die in der Variablendata_buffergespeicherten Daten in die CSV-Datei auf der SD-Karte zu schreiben. Fügen Sie außerdem den Code hinzu, um den Rückgabewert der Funktion(zu überprüfen und festzustellen, ob die Daten erfolgreich in die Datei geschrieben wurden. Zeigen Sie die entsprechende Meldung auf dem VEX IQ Brain Screen an, um Echtzeit-Feedback zu erhalten. Die if-Anweisung am Ende fügt eine Meldung hinzu, die den Status der Datei anzeigt und entwederSD Write ErroroderData Writtenausgibt. -
# CSV-Datengenerierung
für i in range(0, numOfDataEntries):
# Befehle zum Schreiben der Daten in den Puffer
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)
# Daten auf die SD-Karte schreiben
brain.screen.set_cursor(4,1)
if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
brain.screen.print("SD-Schreibfehler")
else:
brain.screen.print("Daten geschrieben") -
Hinweis:
Anzahl der in die Datei geschriebenen Bytes zurück. In diesem Projekt verwenden wir es, um die gesammelten Daten in eine CSV-Datei zu schreiben, daher muss die Anzahl der in die Datei geschriebenen Bytes größer als Null sein. Mit anderen Worten: Wenn die Funktion brain.sdcard.savefile()den0 zurückgibt, können wir daraus schließen, dass die Daten nicht erfolgreich in die Datei geschrieben wurden. Andernfalls wurden die Daten in die Datei geschrieben.
Glückwunsch! Wir haben ein Datenprotokollierungsprojekt entwickelt, das die Beschleunigungsdaten mit dem VEX IQ Brain (2.) sammelt und in einer CSV-Datei auf der SD-Karte speichert. Als Nächstes erfahren Sie, wie Sie die CSV-Datei für die Datenanalyse öffnen.
# Bibliotheksimporte
from vex import *
# Brain sollte standardmäßig definiert sein
brain = Brain()
brain_inertial = Inertial()
csvHeaderText = "time, x, y, z"
sd_file_name = "myDataPY.csv"
polling_delay_msec = 50
numOfDataEntries = 100
data_buffer = ""
# Programm anhalten, falls keine SD-Karte eingelegt ist
if not brain.sdcard.is_inserted():
brain.screen.set_cursor(1,1)
brain.screen.print("SD-Karte fehlt")
while(True):
wait(5, MSEC)
# Hier beliebigen Sensor- & Timer-Initialisierungscode hinzufügen
brain.timer.clear()
# CSV-Header erstellen
data_buffer = csvHeaderText + "\n"
# CSV-Datengenerierung
for i in range(0, numOfDataEntries):
# Befehle zum Schreiben der Daten in den Puffer
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)
# Daten auf SD-Karte schreiben
brain.screen.set_cursor(4,1)
if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
brain.screen.print("SD Write Error")
else:
brain.screen.print("Data Written")
Öffnen der CSV-Datei zur Datenanalyse
Sobald die Daten in die CSV-Datei auf der SD-Karte geschrieben wurden, können wir die Datei mit einem Tabellenkalkulationsprogramm öffnen, um die Daten zu lesen und zu analysieren.
Hinweis: Zwei der häufigsten Tabellenkalkulationsanwendungen sind Google Sheets und Microsoft Excel. In diesem Artikel verwenden wir Google Sheets (webbasiert), um die CSV-Datei auf der SD-Karte zu öffnen. Der Vorgang bei der Verwendung anderer Anwendungen ist ähnlich.
- Entfernen Sie die SD-Karte aus dem SD-Kartensteckplatz des VEX IQ Brain. Wenn der Computer über einen integrierten Micro-SD-Kartensteckplatz verfügt, können wir die SD-Karte direkt in diesen Steckplatz einlegen. Andernfalls stecken Sie die SD-Karte in einen SD-Kartenadapter und schließen Sie den Adapter dann an den Computer an.
- Melden Sie sich bei unserem Google-Konto an und öffnen Sie Google Sheets. Erstellen Sie eine neue Tabelle.
- Öffnen Sie in der Tabellenkalkulation das Menü „Datei“ , wählen Sie die Schaltfläche „Importieren“ -> „Hochladen“ -> „Durchsuchen“ und wählen Sie dann die CSV-Datei auf dem Computer aus. Klicken Sie nach dem Hochladen der CSV-Datei auf die Schaltfläche „Daten importieren“. Klicken Sie nach dem Importieren der Daten auf „Jetzt öffnen“ , um die gesammelten Daten in der CSV-Datei anzuzeigen.
- (Optional) Eine einfache Möglichkeit, die Daten zu analysieren, besteht darin, ein Diagramm zu zeichnen und dann nach Trends in den Daten zu suchen. Öffnen Sie in der Tabelle das Menü „Einfügen“ und wählen Sie „Diagramm“ aus, um ein Diagramm mit den Daten in der CSV-Datei zu zeichnen. Die folgende Grafik zeigt die mit dem VEX IQ Brain (2.) erfassten Beschleunigungsdaten.
Hinweis: Mit dem Diagrammeditor können wir einen anderen Diagrammtyp auswählen oder das Diagramm an unsere Bedürfnisse anpassen.
Bis zu diesem Punkt haben wir das Datenprotokollierungsprojekt abgeschlossen, bei dem Daten mit dem VEX IQ Brain (2.) gesammelt und in einer CSV-Datei auf der SD-Karte gespeichert werden. Außerdem haben wir gelernt, wie man die CSV-Datei auf der SD-Karte mit Google Sheets liest und sogar ein Diagramm zur weiteren Analyse erstellt. Was als nächstes? Versuchen wir, weitere spannende Experimente mit dem VEX-Roboter zur Datenprotokollierung zu planen, um zu beobachten, wie sich die sich ändernden Umweltfaktoren auf verschiedene Arten von Daten auswirken, und um ein tieferes Verständnis der Welt um uns herum zu erlangen.