Der Flugrekorder arbeitet auf 400Hz!

Es ist einige Arbeit nötig gewesen, um den zuvor vorgestellten Flugrekorder schneller zu machen, aber nun arbeitet er mit einer meiner Meinung nach zufrieden stellenden Datenrate. Das grundsätzliche Funktionsprinzip des Programms ist folgendes:

  • Von einem Timerinterrupt gesteuert wird in einem festen Intervall der Beschleunigungssensor per I²C ausgelesen. Bei jedem zweiten Aufruf wird das Magnetometer ebenfalls ausgelesen. Dieses arbeitet also mit 200 Messungen pro Sekunde.
  • Die Werte werden gespeichert in einem Ringpuffer, der konstant neue Werte aufnehmen kann, auch wenn die SD Karte wieder Schluckauf hat und über 100ms Latenz bis zum Wegschreiben braucht. Der Puffer ist im Wesentlichen ein Array, das sich bewusst ist, in welchem Bereich Werte geschrieben wurden.
  • In der main loop, also immer dann, wenn die Ausleseroutine gerade nichts tut, wird der Inhalt des Ringpuffers in CSV formatiert und auf die SD Karte geschrieben.

Die Datenrate beim Auslesen beträgt etwa 6,6 KB/s die Schreibrate etwa 20KB/s. Der Unterschied erklärt sich mit der Formatierung in CSV, die es möglich macht die gewonnenen Daten direkt mit OpenOffice Calc oder MATLAB zu importieren. Letzte Nacht habe ich den Logger mal durchlaufen gelassen. Das Resultat waren 400MB Logdaten!

Windows Explorer Scrrenshot

Ich finde, das sind doch ganz erstaunliche Ergebnisse und bin sehr zufrieden mit dem Fortschritt bisher, auch wenn ich bisher nicht auf die maximale Sanplingrate des Beschleunigungssensors von 1 kHz komme. Im GitHub Repository ist als Beispiel ein Logfile zu finden.

Möglich ist das vor allem durch die SdFat Bibliothek von Bill und William Greiman. Zusätzlich benutze ich auch noch den Buffered Writer und TimerTwo von den beiden. Und auch noch die I2C Bibliothek von Wayne Truchsess. Alleine hätte ich das alles niemals hinbekommen. In diesem Sinne ein großer Dank an die Autoren! Im Wesentlichen habe ich nur viel Kleber zwischen die genannten libraries und die vorliegende Hardware geschrieben.

Screenshot einer CSV Datei aus dem Flugrekorder

Das Format ist folgendes: Spalte A: Aufnahmezeit in Mikrosekunden, Spalte B-D: Beschleunigungswerte, Spalte: E-G: Magnetometerwerte, Spalte H: Anzahl der Überläufe

Der Weg bis dahin war trotzdem recht lang. Man muss erstmal die richtigen Konzepte finden und das Debugging ist gerade bei Problemen mit dem Schreiben auf SD auch ziemlich aufwändig: FTDI Breakout an den Computer und den Arduino stecken, Kompilieren und Hochladen, laufen lassen, SD Karte rausziehen, in Adapter stecken, in den Computer, Dateien angucken, rumrätseln, Code umschreiben, alles von vorn!

Ein wichtiger Faktor ist noch die Notwendigkeit, das Schreiben auf SD auch tatsächlich zu erzwingen, was Zeit kostet. Bei der derzeitigen Messrate ist das jede Sekunde möglich, ohne einen überfüllten Puffer zu riskieren.  Abschließend sollte die Datei geschlossen werden. Wird ein Jumper auf zwei Pins gesetzt, so schlägt ein Interrupt an und beendet das Programm. Ich nenne den Jumper Flight Recording Termination System (FTS) – eine typische RBF Komponente.

Foto vom Flugrekorder beim Loggen

Bei seiner Lieblingsbeschäftigung erwischt: Datenlogger auf 400 Hz

Was ich noch vorhabe: Nach Fehlern neu starten, Einbau in die Rakete.

Und dann habe ich noch etwas anderes vor: Aus dem Programm eine eigene Library bauen, die ich der Arduino Community zur Verfügung stelle. Der Anwendungsfall wäre folgender: Nutzer sucht sich beliebige I²C Sensoren aus, trägt Anzahl der auszulesenden Werte und Messrate ein, definiert Ausleseregister und schreibt Konfigurationscode => und schon läuft sein Logger mit über 600 Hz bei einem Arduino pro mini @ 8 MHz und 3 Achsen mit 16 bit Genauigkeit. Aus diesem Grund trägt der hochgeladene Code schon eine Menge englischer Kommentare.

Und hier ist das Programm zu finden: GitHub

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s