Die Aufzeichnung von Debug-Daten eines Mikrocontrollers auf einem Laptop ist nicht immer bequem. Entweder steht gerade kein Laptop für diesen Zweck zur Verfügung oder das Entwicklungsboard befindet sich an einem schwer zugänglichen Ort. Dieses enorm erweiterbare Projekt von Elektor Labs löst dieses Problem mit einem gigantischen Pufferspeicher für die Debug-Meldungen, der in einem 3D-druckbaren Gehäuse untergebracht ist, und einer WLAN-Verbindung.
 

Von Laurent Labbe (Hongkong)

Die Entwicklung von Software für Mikrocontroller ist oft eine Herausforderung. Bis auf wenige Ausnahmen bieten Mikrocontroller eine Art Debugging-Lösung, mit der der Prozessor gestartet und gestoppt werden kann und bei der Variablen- und Registerinhalte untersucht werden können. Dies hilft bei der Ermittlung der Ursache eines Problems. Viele Maker-Boards wie der Arduino Uno oder der micro:bit der BBC bieten jedoch von Haus aus keine derartige Unterstützung, so dass der Entwickler den Code wiederholt bearbeiten und herunterladen muss, bis die Ursache eines Problems gefunden ist.

Aber Debugger sind auch nicht immer das Allheilmittel, das sie zu sein scheinen. Bei der Entwicklung von Echtzeitcode für Ethernet, WLAN oder USB oder bei Anwendungen wie einer Motorsteuerung können Sie den Mikrocontroller nicht einfach mitten im Ablauf anhalten. Dies führt zu einer Unterbrechung der Kommunikation und kann sogar Schäden an der Stromversorgung verursachen, wenn etwa ein MOSFET im eingeschalteten Zustand gestoppt wird.

Glücklicherweise ist es bei Maker-Boards einfach, eine serielle Ausgabe zu initiieren: Die meisten Entwickler fügen deshalb ihrem Code eine textbasierte Debug-Ausgabe hinzu, indem sie Nachrichten über USB an ein Terminal auf einem PC senden. Nach einem Testlauf kann der Entwickler bei der Analyse der Ausgabe den vom Code eingeschlagenen Weg zurückverfolgen, weshalb diese Methode des Debuggens von Code auch als „Software-Trace“ bezeichnet wird. Dies ermöglicht auch das Debugging von Anwendungen, die während des Betriebs nicht angehalten werden können.
 

Das Projekt

So verwendet auch Laurent Labbe, Mitarbeiter des Elektor-Labors, häufig die serielle Schnittstelle, um die Ausführung von eingebettetem Code zu verfolgen. Er hat aber leider nicht immer einen Laptop zur Verfügung, um die Nachrichten aufzuzeichnen. Das brachte ihn dazu, über einen alternativen Ansatz nachzudenken: Not macht erfinderisch! Mit einem ESP32, einem OLED-Display und einem 3D-Drucker bewaffnet, entwickelte er das Projekt “Wireless trace for debug”.

Bild 1. Diese vereinfachte Blockschaltung zeigt, wie eingehende serielle Daten im Ringpuffer gespeichert werden. Auf Anfrage werden die Daten über die WLAN-Schnittstelle als Webpage abgerufen.

Der Ansatz verwendet einen ESP32 als Puffer für die Debug-Meldungen, der über eine serielle Schnittstelle mit dem Ziel-Controller verbunden ist. Der Puffer wird dann über WLAN und einen Webserver zugänglich gemacht (Bild 1).

Die enorme Menge an SRAM auf dem ESP32 ermöglicht es, einen riesigen Ringspeicher zu implementieren. Laurents Projekte verwenden typischerweise eine niedrige Baudrate von 9600, was aber leicht geändert werden kann. Jedes Mal, wenn ein Zeichen empfangen wird, wird es in den „Kopf“ des Ringspeichers geschoben. Der Puffer hat eine Größe von 65530 Bytes (unsigned char), so dass genügend Platz zum Sammeln von Trace-Nachrichten vorhanden ist. Serial1 wird für die Datenerfassung über Pin 25 (TX) und Pin 26 (RX) initialisiert, obwohl eigentlich nur der RX-Pin benötigt wird. Da der ESP32 ein 3,3-V-Baustein ist, hat Laurent einen aus einem Widerstand und einer Dioden bestehenden Pegelwandler hinzugefügt, damit auch 5,0-V-Mikrocontroller an die serielle Schnittstelle angeschlossen werden können (Bild 2).

Bild 2. Auch wenn der ESP32 über 3,3-V-Pins verfügt, kann mit dieser Beschaltung ein 5-V-Mikrocontroller angeschlossen werden.

Wie bereits erwähnt, nutzt das Projekt die WLAN-Konnektivität des ESP32. Nach der Registrierung im Netzwerk (im Code definiert), kann jeder lokale Laptop oder jedes mobile Gerät auf eine vom ESP32 angebotene Webseite zugreifen. Der ESP32 zeigt dann eine einfache Webseite an, die den aktuellen Inhalt des Ringspeichers enthält (Bild 3).

Bild 3. Beispiel für die Ausgabe in einer Webseite.
 

Zweites Netzwerk, serielle Schnittstelle und Display

Es gibt noch ein paar andere coole Funktionen, die in den Code eingebaut sind. Zum Beispiel werden eine zweite SSID und ein Passwort für einen alternativen WLAN-Router unterstützt. Sollte die erste Verbindung aus irgendeinem Grund ausfallen, versucht der ESP32 automatisch, sich mit dem Backup zu verbinden. Da möglicherweise Stunden oder Tage an Daten auf dem Gerät gespeichert sind, bietet dies mehr Sicherheit beim Abrufen der Trace-Meldungen. Der Webserver verwendet standardmäßig Port 80, aber bei der Initialisierung kann auch ein alternativer Port definiert werden.

Der kreisförmige Puffer ermöglicht auch ein Wrap-around, einen Umgriff: Sollte der Puffer vollständig gefüllt sein, überschreiben neu eingehende Nachrichten die ältesten Daten. Der Übersichtlichkeit halber wird auf der Webseite eine entsprechende Meldung eingeblendet, bevor der Inhalt des Ringspeichers von der ältesten zur neuesten Nachricht angezeigt wird.

Der ESP32 gibt auch Nachrichten über das Serial-Interface (über USB) aus, so dass auch der Code dieses Projekts getestet werden kann. Debug-Meldungen, die über Serial1 empfangen werden, werden auf Serial ausgegeben und sofortig sichtbar. Alle Daten, die über das Serial-Interface empfangen werden, werden ebenfalls in den Ringpuffer eingefügt.

Informationen über die IP-Adresse und andere relevante Details werden an ein OLED-Display mit I2C-Schnittstelle ausgegeben, das an Pin 4 und Pin 5 angeschlossen ist. Hier wird das Display SSD1306 von Adafruit zusammen mit den entsprechenden Adafruit-Treiber- und GFX-Grafikbibliotheken verwendet.

Bild 4. Der ESP32 komplett mit der Beschaltung, die den Anschluss einer 5-V-Schnittstelle ermöglicht.

Laurent hat für sein Gerät ein Board mit der Bezeichnung WeMos Lolin32 OLED (Bild 4) eingesetzt, das auf dem ESP32-WROOM-32-Modul basiert und einige zusätzliche Schaltkreise besitzt, um die USB-zu-UART-Schnittstelle zu implementieren und gleichzeitig einen LiIon/LiPo-Akku anschließen und laden zu können. Zusammen mit seinem 3D-gedruckten Gehäuse, für das eine CAD-Datei zur Verfügung steht, kann dieses drahtlose Debug-Trace-Tool fast überall eingesetzt werden, um autonom Daten von Ihrem Zielsystem zu sammeln (Bild 5).

Bild 5. Eine drahtlose serielle Debug-Einheit im 3D-gedruckten Gehäuse.
 

Optionen

Das Schöne an diesem Projekt ist die Kombination aus Einfachheit und Erweiterbarkeit. Die Arbeitsweise des Codes ist klar, so dass es für erfahrene Entwickler einfach ist, dieses Projekt zu erweitern und zu ändern. So wäre es beispielsweise nicht schwierig, den verfügbaren SRAM-Speicher mit externen Bausteinen weiter zu erweitern, und man könnte die Trace-Meldungen sogar auf einer SD-Karte speichern. Die Geschwindigkeit der seriellen Schnittstelle für die Datenerfassung kann ebenfalls angepasst werden, oder es können stattdessen Daten von einer I2C- oder SPI-Schnittstelle gesammelt werden. Sollten Ihre Meldungen ein wenig Farbe oder ein eleganteres Aussehen benötigen, können Sie während die Webseite mit entsprechendem HTML oder CSS aufpeppen.

(200223-02)
 

Haben Sie Fragen oder Kommentare?

Haben Sie technische Fragen oder Kommentare zu diesem Artikel? Schicken Sie eine E-Mail an Elektor unter redaktion@elektor.de.