Entwicklungsumgebung für den ESP32

Vorstellung

Seit einigen Jahren sind die SoC der chinesischen Firma Espressif eine feste Größe in der Bastlerszene. Vor allem durch den geringen Preis von <4€ gab es kaum einen Weg am ESP8266 vorbei. Bei diesem Preis-/Leistungsverhältnis musste im Bastlerhirn einfach der "Auch-Haben-Wollen-Impuls" zünden. Unzählige Blogs und YouTube-Videos zeigen blinkende LEDs auf Steckbrettern.

Nun schickt sich der ESP32 an, die Nachfolge anzutreten. Er ist ein wenig teurer, dafür aber wesentlich besser ausgestattet. Mit Doppelkern-Prozessor, einem Ultra-Low-Power-Prozessor und umfangreicher Peripherie steht vieles zur Verfügung, worauf beim Vorgänger verzichtet werden musste.
Als Handwerkzeug stellt Espressif das Framework (ESP-IDF) und eine gute Dokumentation bereit. Die mitgelieferten Anwendungsbeispiele runden das Ganze ab.

Für erste Experimente bietet der Handel preiswerte Entwicklungsboards ESP32-NodeMCU. Dazu einen PC und ein passendes USB-Kabel, mehr Hardware benötigt man erst mal nicht. Für weiterführende Experimente und tatsächliche Projekte sind Standardmodule ESP32-WROOM für 4-6€ erhältlich.

Zur SW-Entwicklung in C/C++ bieten sich unterschiedliche Wege an. Zum Einen werden die Espressif-Module durch das Arduino-Projekt unterstützt, wobei dem ESP-IDF ein zusätzliches Framework aufgesetzt wird, mit dem die gängisten Befehle aus der Arduino-Welt verfügbar sind. Wer ein klein wenig tiefer in die Materie einsteigt, stößt hier allerdings schnell an Grenzen und muss immer wieder direkt auf die ESP-Schnittstellen zurückgreifen.
Daher ist es sinnvoll Arduino außen vor zu lassen und das ESP-IDF als Kommandozeilenwerkzeug zu installieren. Zur Entwicklung des Quellcodes lässt sich Eclipse als IDE aufsetzen.

Im Folgenden werden die Schritte zur Installation auf Basis eines Linux Mint 19.3 zusammengefasst.

ESP-IDF - Das IoT Development Framework

Die Installation von Toolchain und Framework beschreibt Espressif in der Dokumentation Get Started recht ausführlich. Gegenüber früheren Versionen hat sich die Installation nun deutlich vereinfacht. Der größte Teil läuft scriptbasiert ab. Das hat aber auch den Nachteil, dass nur noch schwer nachzuvollziehen ist, was im Hintergrund passiert. Ein wenig Vertrauen / Gutgläubigkeit ist aber ohnehin angebracht, da man nicht weiß, was die installierten Tools nebenbei anstellen oder die Closed-Source-Bibliothen des Framework im Netzwerk treiben.

Alle nachfolgenden Befehle sind in einem Terminalfenster des Users ausführbar.


Vorbereitung

Installation von Abhängigkeiten

sudo apt install git wget libncurses-dev flex bison gperf python python-pip \
python-setuptools python-serial python-click python-cryptography python-future \
python-pyparsing python-pyelftools cmake ninja-build ccache

Zum Flashen benötigt der User Zugriff auf die Geräte der seriellen Schnittstelle. Das wird erreich durch Aufnahme in die Gruppe dialout.

sudo usermod -a -G dialout $USER


Installation

Die Doku bietet eine Übersicht der verfügbaren Versionen. Zum jetzigen Zeitpukt (Dez.2019) ist es sinnvoll auf die "Latest-Version" zurückzugreifen. Diese wird zwar als "dev-dirty" eingestuft, benutzt aber schon den cmake-Befehl. Die "Stable-Version V3.3" arbeitet noch mit dem make-Befehl. Damit erstellte Projekte müssten später portiert werden.

Die Installation erfolgt in einem beliebigen Verzeichnis des Users. Beispielsweise:

mkdir -p $HOME/Development/esp32
cd $HOME/Development/esp32

Die aktuellen Dateien holen

git clone --recursive https://github.com/espressif/esp-idf.git

und installieren

cd $HOME/Development/esp32/esp-idf
./install.sh


Anpassungen

Zum Setzen der allgemeine Umgebungsvariablen folgende Zeilen an die ~/.profile anhängen:

# Espressif-Tools
export IDF_PATH="$HOME/Development/esp32/esp-idf"
export PATH="$PATH:$HOME/Development/esp32/esp-idf/tools"

Zur Ausführung des IDF müssen zahlreiche Umgebungsvariablen in der jeweiligen Terminalsession gesetzt werden. Dazu wird das Shell-Scrpt export.sh mitgeliefert. Da der Befehl zum sourcen des Scripts in jedem Terminalfenster neu eingegeben werden muss, ist es günstig, sich hierfür einen alias anzulegen. Folgende Zeile an die ~/.bashrc anhängen.

alias idfx='. $HOME/Development/esp32/esp-idf/export.sh'
Die Syntax mit dem am Anfang allein stehenden Punkt ist zu beachten. Damit wird erreicht, dass die Befehle nicht eigenständig sondern innerhalb des Terminal-Prozesses ausgeführt werden. Am Anfang einer Termialsession muss später nur noch das Kommando idfx eingegeben werden.


Testen

Zur Aktivierung der Einstellungen sollte der PC neu gestartet werden.

IDF-Version abfragen.

idf.py --version

Übersicht der Kommandos und Optionen

idf.py --help


Ein Beispielprojekt

Alle eigenen ESP32-Projekte sollten in einem gemeinsamen Ordner zusammengefasst werden, der später den Workspace von Eclipse bildet. Unterhalb davon erhält jedes Projekt seinen eigenen Subfolder. Leerzeichen, Umlaute o.ä. sind innerhalb des Pfades nicht zulässig. Vorschlag:

mkdir -p $HOME/Projects/espressif/esp32
cd $HOME/Projects/espressif/esp32

Das ESP-IDF liefert zahlreiche Beispielprojekte in /examples mit.

Für einen ersten Versuch kopiert man sich ein einfaches Projekt in den Workspace (in dem man sich aktuell befindet).

cp -r $IDF_PATH/examples/get-started/blink ./

Alle Befehle werden auf der oberen Ebene des Projektverzeichnisses ausgeführt.

cd blink

Umgebungsvariablen einmalig exportieren (alias).
idfx

Probebau

idf.py build

Der Build-Prozess sollte mit folgenden Worten abschließen:

Project build complete.
gefolgt von Hinweisen, wie der ESP mit den generierten Files zu flashen ist. Dies ist sinnvoll zum Verständnis des Vorganges, wird später allerdings vereinfacht.


Der Flash-Prozess

Erste Gehversuche unternimmt man sinnvollerweise mit einem NodeMCU. Diese Testboards bringen den USB/Seriell-Wander zur Kommunikation mit dem PC bereits mit und sind auch später hilfreich für erste Schaltungstests.

Ist das NodeMCU-Board per USB-Kabel mit dem PC verbunden, muss ein Gerät /dev/ttyUSB0 zu finden sein.

ls -al /dev/ttyUSB*
Falls der PC mehrere ttyUSB - Schnittstellen zu verwalten hat, sollte man über eine feste Namen-Zuordnung für die USB-Adapter nachdenken.

Die im Build-Prozess generierten Dateien werden mit folgendem Befehl in den Flash-Rom des ESP-Moduls geschrieben.

idf.py -b 460800 -p /dev/ttyUSB0 flash
(Der Befehl idf.py wird immer in der oberen Ebene des Projektpfades aufgerufen !!!)

Die Parameter dienen zum Einen dem Setzen der Baudrate. Das max. Tempo ist i.A. vom USB-Seriell-Wandler anhängig. Mein NodeMCU erreicht 980000 Baud. Andere Billig-FTDI232-Adapter schaffen 2MBit.
Es ist nicht erforderlich, sich an Standard-Baudraten zu halten. Die festgelegte Geschwindigkeit wird dem ESP zu Beginn der Kommunikation übermittelt.

Der andere erforderliche Parameter ist der Gerätename der Schnittstelle. Mehrere gleichzeitig betriebene Adapter können zu Namensverwirrungen führen, da Linux über die Reihenfolge der Nummerierung selbst entscheidet.

Das flash-Kommando erzwingt einen vorhergehenden Build-Prozess. Ein separater Aufruf des build-Kommandos nach Quellcode-Änderung ist somit nicht erforderlich.

Ein erfolgreicher Flash-Prozess wird mit diesen Zeilen abgeschlossen:

Leaving...
Hard resetting via RTS pin...
Done

Der Hard-Reset führt zum Booten und Starten des Anwenderprogramms.

Ein üblicher Weg, den Quellcode zu debuggen, ist die Info-Ausgabe über die serielle Schnittstelle. Um die RS232 sofort nach Flash und Reset mitzulesen, wird o.g. Befehl um das monitor-Kommando erweitert.

idf.py -b 460800 -p /dev/ttyUSB0 flash monitor

Die Baudrate beträgt im Monitor-Mode per default 115,2kBaud. Änderungen sind über die Konfiguration möglich.

Da dieser Befehl häufig verwendet wird, wäre ein alias-Eintrag in ~/.profile sinnvoll.

Im Ergebnis des o.g. Befehls sollten zahlreiche Debug-Meldungen zum Bootprozess und anschließende Programmausgaben zu lesen sein.

Turning on the LED
Turning off the LED
Turning on the LED
...

An GPIO 5 ist ein Spannungswechsel messbar.
Alternativ ließe sich auch eine LED über einen Vorwiderstand anschließen. Dann aber nicht vergessen: ... ein Video drehen und auf YouTube stellen !!!

Abbrechen lässt sich die Debug-Ausgabe mit der etwas hakligen Tastenkombination Ctrl+AltGr+9.


Weitere nützliche Befehle:

  • idf.py erase_flash  Löscht den komplette Flash-Speicher.
  • idf.py fullclean    Löscht das Build-Verzeichnis, Erste Hilfe bei unerklärbaren Fehlermeldungen.
  • idf.py menuconfig   Steuerzentrale für Systemeinstellungen, komfortabler über Eclipse möglich.
  • idf.py size         rudimentäre Informationen zur Programmgröße.
  • idf.py --help       Liste aller Befehle

Sollte man sich einmal fragen, welche Toolversionen installiert worden sind, hilft folgender Befehl:

idf_tools.py list

Neben der Eclipse-IDE bleibt bei mir immer ein Gnome-Terminal im Projektpfad geöffnet, in der o.g. Befehle zum Testen des Programms aufgerufen werden. Komfort und Darstellung sind deutlich besser als in der Eclipse-Konsole.

Komfort durch Eclipse

Grundsätzlich lässt sich Source-Code mit jedem beliebigen Texteditor verfassen. So richtig komfortabel wird es aber erst mit einer IDE wie Eclipse. Funktionen wie Quellcode-Prüfung im Editor oder Code-Vervollständigung erleichtern die Programmierung deutlich. Obendrein wir noch eine Projektverwaltung mitgeliefert. Ob das ein Segen ist, sei dahingestellt.
Espressif setzt die Installation einer passenden Eclipse-Konfiguration voraus und beschreibt die Installation der Plugins in der Doku.

Voraussetzungen prüfen:

java -version       # Java >= 8
python3 --version   # Python >= 3.5
idf.py --version    # IDF >= 4.0
git --version       # über Systemaktualisierung aktuell




Installation

Die Installation der Eclipse-IDE beschränkt sich auf herunterladen und entpacken des Zip-Paketes in ein beliebiges Verzeichnis. Beipielsweise:

cd $HOME/Development/esp32

Es wird eine aktuelle Eclipse-Version (Eclipse IDE for C/C++ Developers) benötigt. Linux 64-bit wählen, downloaden und im aktuellen Verzeichnis entpacken.

Gestartet wird die IDE mit ./eclipse/eclipse.

$HOME/Development/esp32/eclipse/eclipse
Auf die Dauer hilft das Anlegen eines Menueintrages.


Arbeitsbereich festlegen

Im Ersten Schritt verlangt Eclipse nach Festlegung des Workspace, d.h. des übergeordneten Project-Verzeichnisses. Dies wäre aus dem vorherigen Kapitel ~/Projects/espressif/esp32.


Espressif-Plugin installieren

Diesen Installationsschritt beschreibt Espressif hier ausführlich.
Folgende Schritte sind im Eclipse-Menu auszuführen:

-> Help -> Install New Software... 
-> Add
    Name: Espressif IDF Plugins for Eclipse
    Location: https://dl.espressif.com/dl/idf-eclipse-plugin/updates/latest/
-> Add
-> (Check) "Espressif IDF"
-> Next
-> Next
-> (check) "I accept ..."
-> Finish
-> Install anyway
-> (check) "https: ...espressif..."
-> Accept selected
-> Restart Now


IDF-Tools installieren

Folgende Schritte im Espressif-Menu ausführen:

-> Help -> Espressif IDF Tools Manager > Install Tools


Beispielprojekt importieren

Bevor mit der IDE sinnvoll hantiert werden kann, benötigt man erstmal ein Projekt. Hier bietet sich fürs Erste wieder ein mitgeliefertes Beispiel an. Das zuvor manuell in den Workspace kopierte Projekt sollte gelöscht oder verschoben werden. Es ist einfacher, die Verwaltung der Projekte dem Project Explorer von Eclipse zu überlassen. Anschließend wird das Projekt über Eclipse neu importiert.

-> File -> Import ... -> Espressif / Existing IDF-Project -> Next
      Existing project Location: ~/Development/esp32/esp-idf/examples/get-started/blink          
-> Finish
Der Project-Name blink wird automatisch vergeben, kann aber auch geändert werden.
Auf diese Weise lassen sich eigene Projekte klonen. Falls beim Importieren ein build-Verzeichnis kopiert wurde, muss dies im neuen Verzeichnis gelöscht werden. Dabei ist es unerheblich, ob das Verzeichnis oder der komplette Inhalt gelöscht wird.


Die Haupt-Steuerelemente


icon


Es ist darauf zu achten, dass in der mittleren Textbox das richtige Projekt und rechts die richtige Zielplattform ausgewählt ist. Ggf. muss ein neues ESP-Ziel angelegt werden (Zahnradsymbol).
Der Hammer führt ein build aus und der Run-Button entspricht dem flash-Befehl. Zum flashen muss der USB-Adapter angesteckt und der richtige Port im Launch Target gewählt sein.

Abseits dieser Elemente gibt es in der IDE eine Unmenge an Funktionen zu entdecken, an die man sich nach und nach herantasten kann.

Wie bereits oben erwähnt nutze ich Eclipse nur zum Schreiben und testweisen Übersetzen des Quellcodes. Flashen und debuggen erledige ich anschließend in einem separaten Gnome-Terminal.



Neues Projekt anlegen

Neue Projekte lassen sich leer oder über Templates erzeugen.

-> File -> New -> Espressif IDF Project
-> Name: xxxxxx
-> Finish 
oder
-> Next 
-> Template auswählen
-> Finish




Troubleshooting


Fehlende Espresif-Einträge im Menu

Sollten Espressif-Einträge im Menu fehlen, hilft ggf. ein Reset der Perspektive weiter.
-> Window -> Perspective -> Reset Perspective.. -> Reset Perspective


Anzeige von Syntax-Fehlern im Editor

Beim Neuanlegen eines Projektes kommt es vor, dass trotz fehlerfreiem Quellcode Markierungen im Editor angezeigt werden. Dabei handelt es sich i.d.R um fehlende Verweise auf externe Variablen oder Funktionen innerhalb der IDE. Dies bereinigt sich oft nach dem ersten Build-Durchlauf. Es sollte auch kontrolliert werden, ob in der rechten Auswahlbox der ESP32 als Zielplattform eingestellt ist.

icon
Hin und wieder stellen sich auch nach längerem fehlerfreien Arbeiten unberechtigte Fehlermeldungen ein. Dann kann es helfen, in den Workspace-Preferences den Eintrag
Index all header variants
zu aktivieren. Erreichbar über:
Window -> Preferences -> C/C++ -> Indexer.

Gelegentliche Fehlermeldungen lassen sich mit einem Rebuild des Indexers im Projekt bereinigen. Auch ein Restart von Eclipse kann hilfreich sein.


Updates

Installiere kein Update, das nicht wenigstens 14 Tage alt ist ! Sollen doch die Fehler erst mal andere suchen.
Ist man mit einem Plugin reingefallen, lässt es sich wie folgt deinstallieren:
Help -> About Eclipse IDE -> Installation Details -> "Espressif IDF Plugins for Eclipse..." -> Uninstall
Anschließend holt man sich die Vorgängerversion und installiert das Plugin vom lokalen Zip-Archiv.



nach oben