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.

ESP-IDF Installation (Windows) | Ein erstes Projekt erstellen

Espressif Systems stellt für die Softwareentwicklung auf ESP32 Mikrocontrollern ein Open Source IoT Development Framework (ESP-IDF) zur Verfügung. Die zugehörige Dokumentation enthält diverse hilfeiche Informationen wie beispielsweise Installationsanleitungen, Datenblätter und Programmierschnittstellen (APIs).

Die ausgewählte Version der Dokumentation muss beachtet werden. Dieser Beitrag verwendet Version 4.4.

In folgendem Beitrag wird die Installation des ESP-IDF Frameworks in einzelnen Schritten beschrieben, darauffolgend ein erstes Projekt erstellt und dieses auf dem Mikrocontroller ausgeführt.

Installation des IoT Development Frameworks (ESP-IDF) für Windows

Das Development Framework als auch die benötigten Softwarekomponenten wurden im ESP-IDF Windows Installer zusammengefasst. Der Installer kann hier heruntergeladen werden.

Nach dem Download kann die Installation gestartet werden. Folgende Bildgalerie zeigt den Installationsablauf. Die ausgewählten Komponenten müssen beachtet werden. Bei der Installation der USB-Treiber erscheint gegebenenfalls eine Windows-Sicherheitsabfrage. Diese muss bestätigt werden um den Treiber zu installieren.

Nach Abschluss der Installation kann die Entwicklungsumgebung (IDE) durch die erstellte Desktop-Verknüpfung gestartet werden. (Espressif-IDE) Beim ersten Start der IDE muss ein Workspace-Pfad angegeben werden.

Der Workspace-Pfad darf KEINE Leerzeichen und Umlaute beinhalten!

Ebenso wird beim ersten Start der IDE eine Willkommensseite dargestellt. Diese kann direkt geschlossen werden.

Nach erfolgreicher Installation kann der ESP32-C3 per USB mit dem Computer verbunden werden. Dieser sollte erfolgreich als USB-Gerät erkannt werden und es sollte ein zugehöriger COM-Port existieren. (Silicon Labs CP210x USB to UART Bridge) Dies kann im Gerätemanager überprüft werden.

Ein erstes Projekt erstellen

Die Espressif-IDE (eine angepasste Eclipse-IDE), die nach der Installation über das Windows-Startmenü gestartet werden kann, bietet die Möglichkeit Espressif IDE Projekte zu erstellen. In diesem Beispiel wird ein Projekt auf Basis der ‚blink‘ Vorlage erstellt.

Als Nächstes muss festgelegt werden für welchen ESP32 Mikrocontroller das aktuelle Projekt entwickelt wird. Dafür muss ein neues ‚Launch Target‘ erstellt werden. Der COM-Port des Controller sollte beim Anschluss per USB automatisch erstellt werden. Die konkrete Portnummer kann im Gerätemanager ermittelt werden.

Jetzt kann das Projekt gebuilded werden. Dafür muss das korrekte ‚Launch Target‘ gewählt und der Build-Vorgang mit einem Klick auf das Hammer-Icon gestartet werden.

Sollten nach dem Build-Vorgang noch Fehler im Editor aufscheinen, liegt dies in der Regel an einem inkonsistenten Index. Dieser kann für das gesamte Projekt aktualisiert werden.

Nach dem erfolgreichen Build kann die Software auf den Mikrocontroller geladen werden. Die Konsole zeigt dabei den Fortschritt an. Das initiale Builden kann mehrere Minuten dauern.

Der Mikrocontroller ist programmiert und die LED des ESP32-C3-DevKitM-1 blinkt.

Zusätzlich kann noch eine Monitor-Verbindung geöffnet werden. Diese serielle Verbindung kann für Logging verwendet werden. In diesem Beispiel-Projekt wird der Wechsel des LED-Status gelogged. Die serielle Verbindung kann auch wieder beendet werden.

Der nächste Schritt, das Debugging, wird im Beitrag Debuggen mit dem ESP32-C3 beschrieben.