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
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
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
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='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.
Übersicht der Kommandos und Optionen
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.
Umgebungsvariablen einmalig exportieren (alias).
Probebau
Der Build-Prozess sollte mit folgenden Worten abschließen:
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.
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:
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
Im Verlauf der Installation wird nach Executable Locations gefragt.
Hier genügt es git und python3 einzutragen
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
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.
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.
Tool-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.