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 20 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 flex bison gperf  cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0

Seit Ubuntu/Mint 20 läuft der Befehl python ins Leere. Der Interpreter muss explizit mit python2 oder python3 aufgerufen werden. Damit kommt das ESP-IDF nicht zurecht.
Da python2 obsolet ist, sollten die Abhängigkeiten zu python3 installiert und diese Version als Standadinterpreter verlinkt werden.

sudo apt install python3 python3-pip python3-setuptools python3-venv
Achtung: Nachfolgender Befehl setzt python3 als systemweiten Standardinterpreter. Dies kann zu Nebenwirkungen bei anderen Python-Programmen führen.
sudo apt install python-is-python3

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

sudo usermod -a -G dialout $USER


Installation

Vor der Instalation muss man sich für die stable oder latest Version entscheiden. Die Doku bietet eine Übersicht der verfügbaren Versionen. Ich entscheide mich i.A. für das aktuelle Stable Release.

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

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

Die Dateien holen (die gewünschte Version ist einzutragen):

git clone -b 5.x.x --recursive https://github.com/espressif/esp-idf.git
Weglassen der -b Option lädt die latest Version.

und installieren.

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


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-Script 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='source $HOME/Development/esp32/esp-idf/export.sh'
Damit wird erreicht, dass die Befehle nicht eigenständig sondern innerhalb des Terminal-Prozesses ausgeführt werden.
Ob mit Alias oder dem kompletten source-Kommando -> Die Export-Variablen müssen später in jedem Terminalfenster neu geladen werden, sonst hagelt es Fehlermeldungen.


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.
Auf eine detaillierte Beschreibung des Installationsvorganges soll hier verzichtet werden. Die Dokumentation für das Eclipse-Plugin ist mittlerweile gut nachvollziehbar. Außerdem ändern sich mit jeder Version Details im Installationsablauf, sodass man mit Korrekturen kaum noch hinterherkommt.
In der Vergangenheit wurde nicht immer die aktuelle Eclipse-Version durch das Espressif-Plugin unterstützt. Es sollte nur die in der Doku angegebene Version verwandt werden.

Je nach persönlichen Vorlieben lässt sich auch auch die VS Code - IDE verwenden.

Updates

Sowohl das ESP-IDF als auch Eclipse werden in relativ kurzer Folge mit Updates versorgt. Mit Start eines neuen Projektes oder nach längeren Schaffenspausen installiere ich beides i.d.R. neu.
Da bei o.g. Installation alles in einem Ordner im User-Bereich liegt, muss dieser nur zu Backup-Zwecken umbenannt und die Installation von IDF und eclipse wiederholt werden.

Mit dem Aufbewahren älterer Versionen besteht im Fall fehlender Abwärtskompatibilität die Chance, alten Code wieder übersetzen zu können.

Das ESP-Framework legt im Home-Verzeicnis des Users einen versteckten Ordner .espressif mit Installationsdateien und Tools an. Auch der sollte vor einem Update umbenannt werden.
Eclipse legt im selben Verzeichnis den Ordner .eclipse an, der die mühevoll gefunden Einstellungen enthält. Die sollten, wenn möglich erhalten bleiben.

nach oben