Abschnitt 8.2, FlexiPlot für die Darstellung von Daten verwenden

FlexiPlot ist ein angenehmes Werkzeug zur Darstellung von Daten. Im Entwicklungsprozess ist es, wie auch in Kapitel 8.2, oft notwendig, sich ein Bild der Daten zu machen, um Trends festzustellen oder die Arbeitsweise der Datenverarbeitung mit Filtern zu visualisieren.

Besonders die einfache Verwendung machen FlexiPlot interessant. Nach dem Start erhält man eine Oberfläche, auf der man mit „Add Line Graph“ oder „Add Bar Graph“ Fenster für die beiden Graphentypen öffnen kann. Im „Settings“-Tab eines Graphen stellt man das visuelle Erscheinungsbild sowie den Namen der zugehörigen Daten ein.

Für Abb. 8.4 des Buchs wurde ein Liniengraph mit der ID P0 hinzugefügt. Als „Title“ wurde „ADC Voltage“, als „Name of X Axis“ „Zeit“, als „Name of Y Axis“ „mV“ gesetzt. Der Typ ist ein „Time Plot“. Wird das Tool mit dem seriellen Port des ESP32-C3 verbunden, wird dessen Ausgabe direkt im Graph angezeigt.

Das Beispiel servocontrol schreibt in der Codezeile

printf("{P0|RAW|0,255,0|%d|FIR2|0,0,255|%0.1f|FIR10|200,0,0|%0.1f|IIR|130,130,0|%0.1f}\n", voltage_mV, firValue_2, firValue_10, iirValue);

in den Graphen P0 die drei Einträge für voltage_mv, firValue_2, firValue_10 und iirValue (im Buch aus Übersichtlichkeitsgründen nicht iirValue). Ein Eintrag besteht aus einem Namen, beispielweise RAW, einer RGB-Farbe für die Darstellungen und dem Wert.

Im Beispiel Servocontrol werden zusätzlich die Graphen P1 und P2 verwendet, um den berechneten Widerstandswert und die berechnete Helligkeit anzuzeigen. Die Einstellungen für FlexiPlot sind dem Code des Beispiels im Verzeichnis flexiplot (servocontrol.dash) angefügt.

Über weitere Möglichkeiten des Werkzeugs gibt dessen Webseite Auskunft.

Buchprojekt Pulsoximeter

Poxi und Poxi2

Poxi

Poxi misst den Puls live

esp-dsp-Bibltiothek

Damit die esp-dsp-Bibliothek kompiliert werden kann, muss die in der Datei idf_component.yml im Verzeichnis main als dependency angegeben werden:

espressif/esp-dsp: "^1.2.0"

Außerdem kompiliert die Bibliothek in V 5.0 des ESP-IDF nicht mehr direkt. Zur Behebung kann der Compiler-Fehler in der Datei CMakeLists.txt im Projektverzeichnis abgeschaltet werden:

idf_component_get_property(lib espressif__esp-dsp COMPONENT_LIB)
target_compile_options(${lib} PRIVATE -Wno-error=format)

http://10.0.0.86/pulse

Poxi2

Poxi2 misst Puls und Sauerstoffstättigung mittels „Biometric Hub“

Abschnitt 8, „Analoge Werte verarbeiten“, Applikation servocontrol

Die Applikation servocontrol verwendet ein Potentiometer (mit 10 kOhm) und ein handelsübliches Modellbauservo: Über ein Drehen des Potentiometers wird die Helligkeit der LED und die Stellung des Servos verändert, wie im folgenden Video gezeigt.

Das Beispiel dient als Referenzimplementierung der Kapitel

  • Kapitel 8.1.3, „Messen am Spannungsteiler“
  • Kapitel 8.2, „Werte filtern“
  • Kapitel 8.5.4, „Pulsweitenmodulation (PWM)“

Schaltungsaufbau

Schaltungsaufbau am Steckbrett

Das Potentiometer links ist wie in Kapitel 8.1.3 besprochen über einen Spannungsteiler versorgt. Es wird GPIO2 als ADC-Eingang verwendet. Der Anschluss des Servos ist in Kapitel 8.5.4 mit der „Level Conversion“ durch den Transistor beschrieben. Als Pull-Up wird ein 10 kOhm-Widerstand verwendet, eine Strombegrenzung vom Ausgang GPIO3 zur Basis des Schalttransistors übernimmt ein 1 kOhm-Widerstand.

Schaltungsaufbau auf eine Lochrasterplatine gelötet

Sourcecode

components/ringbuffer

enthält die Implementierung eines Ringpuffers als abstrakter Datentyp, wie er in Kapitel 8.2.1 beschrieben wird.

components/filter

enthält Implementierungen eines allgemeinen Filters mit den polymorphen „Unterklassen“ FIRFilter und IIRFilter, wie er in Kapitel 8.2.1 beschrieben wird.

main

baut auf dem ADC-Beispiel des ESP-IDF auf. Kanal 2 von ADC 1, der auf GPIO 2 geleitet ist, wird in der Hauptschleife zyklisch mit einer Periode von 50 ms ausgelesen und in drei Filter, nämlich einen moving average FIRFilter 2. Ordnung, einen moving averge FIRFilter 10. Ordnung und einen IIRFilter 2. Ordnung geleitet. Über die Einstellung „use filter for servo control“ in der „servocontrol Configuration“ kann gewählt werden, welche Filterausgabe anschließend zum Stellen des Servos (und der LED-Helligkeit) verwendet wird.

Die Filterwerte werden per printf() auf der Konsole ausgegeben. Es ist nun möglich, die Daten per FlexiPlot auszuwerten (siehe Kapitel 8.2).

Bezugsquellen Entwicklungsboards

Das von Espressif hergestellte Board ESP32-C3-DevKitM-1 wird für die Beispiele des Buchs verwendet. Es kann beispielsweise bei Mouser, Digi-Key, Reichelt, Conrad und anderen Elektronikdistributoren bezogen werden.

ESP32-C3-DevKitM-1

Speziell für den Einstieg in das Buch und die Implementierung der Beispiele wurde das „Book Development Board“ entwickelt. Leichter kann als mit diesem Board kann der Einstieg nicht gemacht werden.

Das „Book Development Board“ wurde speziell als Begleitmaterial zum Buch entwickelt.

Es ist aber problemlos möglich, auch andere Boards zu verwenden. Espressif stellt auch das Board ESP32-C3-DevKitC-02 her, das ein Modul mit dem Formfaktor des ESP32-WROOM einsetzt, aber ansonsten kompatibel zum ESP32-C3-DevKitM-1 mit dem Modul im Mini-Format ist.

Interessant für das Prototyping sind die kleinen über Banggood vertriebenen Boards mit kleinem Display (ESP32-C3-0.42LCD) oder 5×5 LED-Matrix (ESP32-C3FH4-RGB).

Banggood Boards, mit Display links und 5×5 LEDs rechts. In der Mitte ist die Rückseite beider Boards zu sehen.

Die Boards sind mit einer USB-C-Buchse ausgestattet, über die der Code aufgespielt wird. Gleichzeitig dient diese Schnittstelle zum Debuggen. In der Mitte des obigen Bildes ist die Rückseite mit den zwei Tastern und dem ESP32-C3 zu sehen. Oben rechts ist die Chipantenne und links daneben ein Qwiic-Stecker, der von SparkFun-Platinen für I²C verwendet wird, zu sehen. Mit diesem Stecker ist es einfach möglich, externe (Sensor- und Aktor-) Boards ohne Lötaufwand anzustecken. Das Projekt Poxi2 macht von diesem Stecker Gebrauch, allerdings müssen zwei zusätzliche Leitungen gelötet werden.

Abschnitt 8.5.1, „Timer des ESP32-C3“, Applikation gameoflife

Bei Conways Game of Life handelt es sich um ein Spiel basierend auf einem zweidimensionalen zellulären Automaten (siehe Game of Life).

Basierend auf einfachen Regeln der Nachbarschaft pflanzen sich Zellen in der nächsten Generation fort, stirbt ab oder vermehrt sich. So können Populationen beobachtet werden.

Die Implementierung auf dem ESP32-C3 verwendet ein Entwicklerboard mit einer 5×5 LED-Matrix. Zellen, die neu entstehen, leuchten blau. Absterbende Zellen leuchten rot, und fortbestehende grün.

Conways Game of Life auf einem Board mit 5×5 LEDs

Die in main.c untergebrachte Implementierung erzeugt mit generateGame() ein neues Zellenmuster. In der Konfiguration ist einstellbar, ob das Spielfeld zufällig (CONFIG_INITIALIZE_GAMEFIELD_RANDOM), mit einem oszillierenden Objekt (CONFIG_INITIALIZE_GAMEFIELD_OSCILLATING) oder einem Gleiter-Objekt (CONFIG_INITIALIZE_GAMEFIELD_GLIDER) initialisiert wird.

Konfigurierung der Spielfeld-Initialisierung

In der Hauptschleife wird alle 10 ms das aktuelle Spielfeld, falls verändert, an die WS2812-LEDs gesendet. Ein Timer ruft alle 20 ms die Funktion displayGameState() auf, die die Pixel „zeichnet“: blaue Pixel werden schrittweise langsam heller, rote schrittweise dunkler. Bei jedem 50. Aufruf (i.e. jede Sekunde) wird die Funktion calculateGeneration() aufgerufen, um eine neue Generation auf einem dynamisch neu erstellten Spielfeld aus der bestehenden Generation abzuleiten.

Da das Spielfeld mit 5×5 Zellen recht klein ist, sind der linke und der rechte Rand, sowie der obere und der untere Rand direkt benachbart. Links benachbart zu einem Pixel in der linksten Spalte ist also beispielsweise ein Pixel in der rechtesten Spalte.

Import der Sourcen aus github

Die Sourcen der Beispiele und Musterlösungen sind auf github verfügbar. Dort ist es möglich, das Repository mit allen Dateien als gepacktes Archiv (.zip) herunterzuladen.

Bequemer ist der direkte Import in Eclipse oder Visual Studio Shell. In diesem Beitrag wird der Import in Eclipse Schritt für Schritt gezeigt.

Import in Eclipse

Um das github-Repository einzubinden, wechseln Sie per „Window – Perspective – Open Perspective“-Menüwahl durch Auswahl von Git

in die Git-Perspektive. Anschließend wählen Sie „Clone a Git repository“ in der linken Liste:

Geben Sie

https://github.com/klushund/embedded-systems-mit-risc-v.git 

als URI ein, der Rest wird selbst ausgefüllt:

Klicken Sie im nächsten Fenster bei der Branch Selection auf „Next >“ , nachdem Sie sichergestellt haben, dass zumindest der „main“-Branch ausgewählt ist. Verschiedene Branches können verschiedene Softwarestände und Weiterentwicklungen enthalten. Stabile Versionen befinden sich dann im „main“-Branch.

Im folgenden Fenster geben Sie den Pfad auf Ihrem Rechner an, in den das Repository kopiert werden soll. Im Beispiel wird der lokale Pfad

C:\git\embedded-systems-mit-risc-v 

verwendet. Mit „Import all existing Eclipse projects after clone finishes“ werden alle Projekte in den Eclipse Project Explorer übernommen. Wird der Haken nicht gesetzt, können die Projekte später einzeln importiert werden.

Im Anschluss stehen die Projekte im Project Explorer bereit und können compiliert und gestartet werden. Es sollte nicht übersehen werden, das Target zum Compilieren auf den ESP32-C3 umzustellen.

Debuggen mit dem ESP32-C3

Bevor mit dem Debuggen begonnen werden kann, muss das ESP-IDF installiert werden. Die Vorgehensweise ist detailliert auf der Espressif-Webseite beschrieben. Für die Beispiele des Buchs wurde die Version 4.4 verwendet. Auf der Webseite links oben kann die gewünschte Version eingestellt werden. Eine neuere Version sollte funktionieren, von einer älteren ist abzuraten.

Wie in Kapitel 2.2 beschrieben, besitzt das ESP32-C3-DevKitM-1 (beziehungsweise sogar der Mikrocontroller ESP32-C3) ein JTAG-Debuginterface über USB. Allerdings ist der USB-Anschluss, der sich auf dem Board befindet, nur für die serielle Datenübertragung geeignet. Es lässt sich über USB damit eine Applikation über den Bootloader in den Flash speichern und die printf()-Programmausgaben in ein Terminalfenster übertragen, aber nicht debuggen.

Um das Debuggen zu ermöglichen, muss ein zweites USB-Kabel angebracht werden. Ein solches Kabel erfordert etwas Lötarbeit. Organisieren Sie ein altes USB-Kabel, dessen Länge unwichtig ist. Schneiden Sie das Kabel ab und löten Sie Stifte an. Für unsere Zwecke genügt es, die grüne und die weiße Litze mit einem Stift auszustatten. Für Lötfaule gibt es auch die Möglichkeit, ein USB-Kabel mit Pfostenstecker oder Pfostenbuchse im Elektronikhandel zu kaufen. Die folgende Galerie zeigt die Herstellung eines JTAG-Kabels. Die rote (Versorgungsspannung) und die schwarze (Ground) Litze wurden isoliert und nicht verwendet.

Das Kabel muss nun an die Pins 18 (weiße Ader) und 19 (grüne Ader), auf denen such USB-JTAG befindet, angeschlossen werden. Es wird gleichzeitig das „normale“ USB-Kabel angesteckt Dies dient einerseits der seriellen Datenübertragung und andererseits der Stromversorgung.

Nachdem die Verkabelung angebracht ist kann mit dem Debuggen begonnen werden. Derzeit wird Eclipse für das Debugging besser unterstützt, weshalb diese Anleitung sich auch auf dieses IDE stützt. Legen sie ein Projekt an, wie in Ein erstes Projekt erstellen beschrieben. Hier wird das Demobeispiel „blink“ verwendet. Zum Test führen Sie einen Build durch und spielen Sie die Applikation auf. Die Applikation wird automatisch ausgeführt, und die LED blinkt nun im Sekundentakt.

Um den Debugger zu starten muss eine neue Konfiguration angelegt werden. Dazu wird die Konfigurationsliste in Eclipse aufgeklappt und „New Launch Configuration…“ ausgewählt:

Im anschließenden Dialog wird der „Launch Mode“ „Debug“ und der „Launch Configuration Type“ „ESP-IDF GDB OpenOCD Debugging“ ausgewählt:

Nach dem Drücken des „Next“-Buttons wird ein vorausgefüllter Dialog angezeigt. Wesentlich ist hier die korrekte Konfiguration des „Debugger“-Tabs. Der Name der Konfiguration wurde in dem folgenden Screenshot auf „blink Debug Configuration“ geändert:

Wichtig ist, die Auswahl des Board ESP32-C3 chip (via builtin USB-JTAG), da das interne JTAG-Interface des ESP32-C3 verwendet wird.

Nach Abschluss des Erstellens der Konfiguration kann diese ausgewählt und das Debugging gestartet werden:

Drücken auf den „Wanzen“-Button (zweiter Button von links) startet den Debugger und hält in der ersten Zeile in main() an. Nun kann die Applikation wie üblich auf dem Zielsystem debugged werden.

Ich schreib‘ dann mal ein Buch…

Nach den drei Kindertheaterstücken „Aladin“, „Robin Hood“ und „Der Schatz des Pharao“, die beim Cantus Verlag erschienen sind, schreibe ich nun ein Fachbuch. Unter dem Arbeitstitel „Embedded Systems – Auf den Punkt gebracht“ soll eine Mischung aus Theorie und Praxis für Anwender und Studierende erscheinen.

Compi, Bücher, Internet und ESPs – s’Bierle erst hinterher 🙂

Ich bin ordentlich dran, und wenn alles klappt, gibt’s das Buch im Herbst im Buchhandel! Ich hoffe, Ihr freut Euch auch schon drauf! Natürlich schaffe ich das nicht alleine. Mein Supportteam ist kompetent und motiviert, was ja vielversprechend ist 😉

Danke schon mal an Regine, Wolfgang, Franz, Johannes und natürlich besonders an Babsi, Johanna und Jakob, die mir die viele Zeit einräumen, das zu machen!