Mein neuer Lieblingsmikrocontroller

Lieber Arduino, wir haben zusammen viele großartige Jahre miteinander verbracht, doch man entwickelt sich halt weiter und wer bei der Verwendung von ARM-Prozessoren immer noch von seinen Nutzern erwartet, über Serial.print() zu debuggen, der hat wohl einfach den Schuss nicht gehört.

Nun habe ich den Schritt getan und halte ab jetzt die Fahne hoch für einen bösen Megakonzern: STMicroelectronics. Dieser hält im Mikrocontrollermarkt Anteile von um die 50%! Der Verdacht, dass die Mikrocontroller von ST also was taugen, könnte also durchaus berechtigt sein. Es gibt für arme kleine Privatentwickler zwei Reihen von Evaluationsboards, die sehr interessant sind:

STM32F4-Discovery

Neben dem gezeigten Board, das einen Cortex-M4F besitzt, gibt es auch noch weitere Varianten mit anderen Prozessoren oder zusätzlicher Peripherie. Der Prozessor meines Boards trägt die Bezeichnung STM32F407VGT6 und beherbergt 1Megabyte Flash, 192KB RAM, 3 Analog-Digital Wandler, 2 Digital-Analog-Wandler und 14 Timer. Weiterhin sind auf dem Board noch ein Beschleunigungssensor, ein Mikrofon, eine Audioverstärker, vier LEDs und ein Taster, die für eigene Funktionen genutzt werden können, und ein USB on-the-go Anschluss. Das Wichtigste ist das obere Viertel der Platine; hier befindet sich der ST-Link/V2, ein Debugger, mit dem der Mikrocontroller nicht nur programmiert werden kann, sondern mit dem auch der Prozessor angehalten werden kann und alle Register ausgelesen werden können – ganz neue Dimensionen für Leute wie mich, die vorher tatsächlich mit der seriellen Schnittstelle versucht haben, Fehler zu finden 😀

Als Entwicklungsumgebung eignet sich die Coocox IDE sehr gut. Sie bindet die Bibliotheken von ST sowie akzeptable Dokumentation ein und ist komplett kostenlos.

Darüber hinaus gibt es aber noch eine zweite Möglichkeit, für den STM32F407 zu entwickeln, die es ansonsten in dieser Form für kaum einen anderen Mikrocontroller gibt: Mit Simulink! Leider erfordert das eine sündhaft teure Matlab Lizenz. Wäre ich nicht Student an einer Uni, die sechsstellig pro Jahr für eine ‘Total Headcount’-Lizenz löhnt, hätte ich diesen Weg wohl niemals ausprobiert. Das grafische Programmieren ist in ähnlichem Umfang auch mit Labview möglich, welches aber nur mit den eigenen Geräten von National Instruments gut funktioniert. Für Simulink gibt es eine Basisunterstützung vieler Geräte, z.B. für Arduino, Raspberry Pi, Lego NXT, etc. Richtig gute Unterstützung erhält man mit den C2000 DSPs von Texas Instruments, dem Mathworks-eigenen xPC-Target oder der dSpace Hardware.

Oder eben mit dem STM32F4-Discovery. Dafür sorgt das Blockset Waijung. Es scheint für Studenten in Thailand geschrieben zu sein und deckt nahezu jedes Feature des Prozessors ab. I²C, UART, SPI, CAN – alle wichtigen Busse sind da, die Timermodule können nicht nur PWM ausgeben, man kann auch Pulse einlesen und Inkrementalencoder anschließen. Bis zu 6 Encoder lassen sich auslesen! In Hardware!

Hier eine Linkliste zu Ressourcen, die ich noch nicht genannt hatte, die einem aber verdammt gut weiterhelfen beim Einarbeiten in die Materie:

  • mikrocontroller.bplaced.net: Große Sammlung an Libraries, sehr gute Anleitung zur Einrichtung der Coocox IDE
  • tkjelectronics.dk: Review des Discovery Boards mit ausführlichen Demos
  • Waijung: Auf der Seite des Projekts gibt es eine Installationsanleitung, einen Link auf das RapidSTM32-Paket und einen Hinweis auf den Shop, wo Erweiterungsmodule angeboten werden

Und last but definitely not least: Das Ding ist billig. Richtig billig, ST subventioniert das Board, um neue Entwickler an die eigene Plattform heranzuführen.

Kosten: 15€ (farnell, ebay)

 

 

Nucleo

Nucleo F401RE, Bild von STMicroelectronics

Nucleo F401RE, Bild von STMicroelectronics

Nach unten abgerundet wird das Evaluation Board Sortiment von ST durch die Nucleo-Serie. Hier sind schwachbrüstigere Mikrocontroller als bei den Discovery Boards und nochmal niedrigere Preise zu finden. Das Hauptaugenmerk möchte ich hier auf das F401RE, bzw. seinen Nachfolger F411RE legen, welches neben einem Arduino-kompatiblen Pinout auch kompatibel zur Entwicklungsumgebung mbed ist. Hier werden Programme im Browser geschrieben und das Kompilat (Kompilat, hihi :D) auf dem Mikrocontroller gespeichert, welcher sich als USB-Datenträger beim Computer anmeldet. Zusätzlich kann der verbaute ST-Link auch die klassische Debugfunktionalität übernehmen. Ich besitze bisher noch keinen Nucleo, aber das ist nur noch eine Frage der Zeit…

Kosten: ca. 12€ (farnell, ebay)

Advertisements

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