Für die Entwicklung von Mikrocontroller-Projekten und zum Basteln eignet sich mit Sicherheit die Arduino IDE. Bei größeren Projekten ist es sinnvoll hier auf Atmel Studio, Microsoft Visual Studio Code oder Eclipse zu gehen. Ich werde zum einen mit die Espressif ESP-IDF Tools aufsetzen und im Anschluß mit Microsoft Visual Studio Code weitermachen, da ich seit über 20 Jahren im Microsoft Technologie-Stack unterwegs bin und vor allem aber Microsoft Visual Studio Code ein Multitalent ist. Es ist extrem vielseitig, sehr einfach und plattformübergreifend nutzbar. Die Espressif ESP-IDF Tools sind Kommandozeilen Tools um Projekte für die ESP32 Familie zu kompilieren und zu flashen.

Wir starten mit der Schritt-für-Schritt Installation und Konfiguration der Espressif ESP-IDF Tools.

Installation von Git

Wir laden zunächst Git von https://git-scm.com/download/win herunter.

Starten anschließend das heruntergeladene Installationspaket. Mit Next machen wir weiter.

Im Dialog Select Destination Location wählen wir den Speicherort für die Installation aus.

Anschließend wählen wir die gewünschten Komponenten aus welche installiert werden sollen.

Das Installationspaket erstellt einen Shortcut im Startmenü. Der Name und ggf. der Ordner können hier ausgewählt werden.

Den Standard-Editor lassen ich unangetastet. Diesen kann man zu einem späteren Zeitpunkt immer noch ändern, falls man das wünscht. Eine Anleitung dazu gibt es beispielsweise im Stack Overflow Post How to use Visual Studio Code as Default Editor for Git.

Im nächsten Dialog sind keine Anpassungen notwendig. Mit Next geht es weiter.

Auch bei Adjust your PATH evironment sind keine Anpassungen notwendig. Mit Next geht es weiter.

Bei Choosing HTTPS transport backend muss Use the OpenSSL library ausgewählt werden. OpenSSL hatten wir bereits im Artikel Der Microsoft Azure Device Provisioning Service eingerichtet.

Hier sind keine Änderungen notwendig. Wir lassen es beim Standard und klicken auf Next.

Hier auch wieder weiter mit Next.

Hier ebenfalls weiter mit Next.

Weiter mit Next.

Weiter mit Next.

So, jetzt haben wir es fast geschafft. Mit einem Klick auf Install startet die Installation.

Die Git Installation ist abgeschlossen. Mit einem Klick auf Finish beenden wir die Installation.

Im nächsten Schritt ist die Installation von Python erforderlich.

Installation von Python

Um Python zu installieren laden wir diesen mit der Version 3.8.8 von der Seite https://www.python.org/downloads/windows herunter.

Starten den heruntergeladenen Installer mit einem Klick auf Customize installation. Dabei setzen wir den Haken bei Install launcher for all users (recommended) und Add Python 3.9 to PATH womit in den Systemumgebungsvariablen zu der Path Variable das Python Installationsverzeichnis hinzugefügt wird.

Die Optional Features lasse ich so wie sie sind (alle ausgewählt). Mit Next geht es weiter.

Bei den Advanced Options wähle ich Install for all users. Klicken danach auf Install und starten damit die Python installation.

Nachdem die Installation erfolgreich abgeschlossen wurde, klicken wir noch auf den Punkt Disable path length limit.

Fertig! Installation von Python ist damit abgeschlossen.

Jetzt jetzt darum die Espressif ESP-IDF Tool zu installieren.

Download und Installation ESP-IDF Tools

Dazu laden wir das Instalationspaket der Espressif EDP-IDF Tools von https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/windows-setup.html#esp-idf-tools-installer herunter.

Starten nun das heruntergeladene Installationspaket und wählen I accept the agreement und klicken auf Next.

Das Installationspaket prüft die System auf Voraussetzungen und ob diese erfüllt sind. Nach erfolgreicher Prüfung klicken wir auf Next.

Im Git choice DIalog belassen wir alles so wie es ist. Da wir Git bereits installiert haben, hat die Installation das erkannt und bietet und dies zur Auswahl an. Klicken auf Next um fortzufahren.

Bei Version of ESP-IDF können wir auswählen welche Version von ESP-IDF wir installieren möchten. Wir nehmen hier v4.2 (release version), da diese zum Zeitpunkt dieses Artikels die aktuellste Version ist.

Jetzt ist es wichtig die Verzeichnisse die man in diesem und dem nächstem Dialog eingibt zu merken, da wir diese noch mehrmals benötigen werden. Wieso Espressif zwei Installationsverzeichnisse benötigt und die zu installierenden Komponenten/Artefakte aufteilt, ist mir einfach nicht klar. Würde mich aber trotzdem mal interessieren.

Für den ESP-IDF Teil wähle ich als Verzeichnis c:/esp/esp-idf und klicken auf Next um fortzufahren.

Für die ESP-IDF Tools wähle ich als Verzeichnis c:/esp/esp-idf-tools. Mit einem Klick auf Next kommen zum letzten Dialog.

Wir bestätigen die Einstellungen mit einem Klick auf Install und starten damit die Installation.

Wenn die Installation abgeschlossen wurde, können wir hier abschließend noch auswählen, dass ESP-IDF in der Konsole gestartet werden soll. Dazu setzen wir einen Haken bei Run ESP-IDF Command Prompt Environment und klicken auf Finish.

Laut der Ausgabe in der Konsole sollen die Notwendigen Verzeichnisse der Path Variable in der Systemgebung hinzugefügt werden. Auch nach mehreren Installation konnte ich das nicht verifizieren. Das passiert einfach nicht.

Um es sich aber an dieser einfach zu machen, kopieren wir die Ausgabe in der Konsole in den Notepad für die spätere Verwendung.

Wie gesagt, da die Verzeichnisse nicht automatisch zu der Path Umgebungsvariablen hinzugefügt werden, müssen wir das nun manuell machen.

Dazu öffnen wir das Windows Startmenü und geben einfach Systemumgebungsvariablen ein. Es erscheint ein Auswahl mit Systemumgebungsvariablen bearbeiten. Wir klicken auf diesen Eintrag und gelangen in die Systemeigenschaften.

Hier klicken auf die Schaltfläche Umgebungsvariablen… unten rechts.

Jetzt nehmen wir die Verzeichnisse, welche uns oben in der Konsole ausgegeben wurden und fügen diese der Systemvariable Path hinzu.

So, oder so ähnlich, sollte die Path Variable aussehen.

Das sind nachfolgende meine Verzeichnisse, die ich der Path Variable hinzugefügt habe. Falls dieselben verwendet wurde, so könnt ihr sie auch unten rauskopieren.

C:\esp\esp-idf-tools\tools\xtensa-esp32-elf\esp-2020r3-8.4.0\xtensa-esp32-elf\bin;C:\esp\esp-idf-tools\tools\xtensa-esp32s2-elf\esp-2020r3-8.4.0\xtensa-esp32s2-elf\bin;C:\esp\esp-idf-tools\tools\esp32ulp-elf\2.28.51-esp-20191205\esp32ulp-elf-binutils\bin;C:\esp\esp-idf-tools\tools\esp32s2ulp-elf\2.28.51-esp-20191205\esp32s2ulp-elf-binutils\bin;C:\esp\esp-idf-tools\tools\cmake\3.16.4\bin;C:\esp\esp-idf-tools\tools\openocd-esp32\v0.10.0-esp32-20200709\openocd-esp32\bin;C:\esp\esp-idf-tools\tools\ninja\1.10.0\;C:\esp\esp-idf-tools\tools\idf-exe\1.0.1\;C:\esp\esp-idf-tools\tools\ccache\3.7\;C:\esp\esp-idf-tools\tools\dfu-util\0.9\dfu-util-0.9-win64;C:\esp\esp-idf\tools

Um zu testen ob wir alles richtig gemacht haben, begeben wir uns in den Ordner hello_world innerhalb der examples. Diese befindet sich in meinem Fall unter C:\esp\esp-idf\examples\get-started. Wir öffnen vom Desktop die Verlinkung ESP-IDF Command Prompt.

In der Konsole wechseln wir in das Verzeichnis.

Mit dem Befehl idf.py set-target können wir uns die unterstützen Zielplattformen ausgeben lassen. Da ich einen ESP32 nutze, verwende ich den Parameter esp32 und setzen diesen mit dem folgenden Befehl.

idf.py set-target esp32

Wenn der Befehl erfolgreich war, erhält man nachfolgende Ausgabe in der Konsole.

C:\esp\esp-idf\examples\get-started\hello_world>idf.py set-target esp32
Adding "set-target"'s dependency "fullclean" to list of commands with default set of options.
Executing action: fullclean
Build directory 'c:\esp\esp-idf\examples\get-started\hello_world\build' not found. Nothing to clean.
Executing action: set-target
Set Target to: esp32, new sdkconfig created. Existing sdkconfig renamed to sdkconfig.old.
Running cmake in directory c:\esp\esp-idf\examples\get-started\hello_world\build
Executing "cmake -G Ninja -DPYTHON_DEPS_CHECKED=1 -DESP_PLATFORM=1 -DIDF_TARGET=esp32 -DCCACHE_ENABLE=1 c:\esp\esp-idf\examples\get-started\hello_world"...
-- Found Git: C:/Program Files/Git/cmd/git.exe (found version "2.31.0.windows.1")
-- ccache will be used for faster recompilation
-- The C compiler identification is GNU 8.4.0
-- The CXX compiler identification is GNU 8.4.0
-- The ASM compiler identification is GNU
-- Found assembler: C:/esp/esp-idf-tools/tools/xtensa-esp32-elf/esp-2020r3-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc.exe
-- Check for working C compiler: C:/esp/esp-idf-tools/tools/xtensa-esp32-elf/esp-2020r3-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc.exe
-- Check for working C compiler: C:/esp/esp-idf-tools/tools/xtensa-esp32-elf/esp-2020r3-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: C:/esp/esp-idf-tools/tools/xtensa-esp32-elf/esp-2020r3-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-g++.exe
-- Check for working CXX compiler: C:/esp/esp-idf-tools/tools/xtensa-esp32-elf/esp-2020r3-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-g++.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Building ESP-IDF components for target esp32
-- Found PythonInterp: C:/esp/esp-idf-tools/python_env/idf4.2_py3.8_env/Scripts/python.exe (found version "3.8.7")
-- Could NOT find Perl (missing: PERL_EXECUTABLE)
-- App "hello-world" version: v4.2
-- Adding linker script C:/esp/esp-idf/components/esp_rom/esp32/ld/esp32.rom.newlib-time.ld
-- Adding linker script C:/esp/esp-idf/components/esp_rom/esp32/ld/esp32.rom.ld
-- Adding linker script C:/esp/esp-idf/components/esp_rom/esp32/ld/esp32.rom.libgcc.ld
-- Adding linker script C:/esp/esp-idf/components/esp_rom/esp32/ld/esp32.rom.newlib-data.ld
-- Adding linker script C:/esp/esp-idf/components/esp_rom/esp32/ld/esp32.rom.syscalls.ld
-- Adding linker script C:/esp/esp-idf/components/esp_rom/esp32/ld/esp32.rom.newlib-funcs.ld
-- Adding linker script C:/esp/esp-idf/examples/get-started/hello_world/build/esp-idf/esp32/esp32_out.ld
-- Adding linker script C:/esp/esp-idf/components/esp32/ld/esp32.project.ld.in
-- Adding linker script C:/esp/esp-idf/components/esp32/ld/esp32.peripherals.ld
-- Components: app_trace app_update asio bootloader bootloader_support bt cbor coap console cxx driver efuse esp-tls esp32 esp_adc_cal esp_common esp_eth esp_event esp_gdbstub esp_hid esp_http_client esp_http_server esp_https_ota esp_https_server esp_ipc esp_local_ctrl esp_netif esp_ringbuf esp_rom esp_serial_slave_link esp_system esp_timer esp_websocket_client esp_wifi espcoredump esptool_py expat fatfs freemodbus freertos heap idf_test jsmn json libsodium log lwip main mbedtls mdns mqtt newlib nghttp nvs_flash openssl partition_table perfmon protobuf-c protocomm pthread sdmmc soc spi_flash spiffs tcp_transport tcpip_adapter tinyusb ulp unity vfs wear_levelling wifi_provisioning wpa_supplicant xtensa
-- Component paths: C:/esp/esp-idf/components/app_trace C:/esp/esp-idf/components/app_update C:/esp/esp-idf/components/asio C:/esp/esp-idf/components/bootloader C:/esp/esp-idf/components/bootloader_support C:/esp/esp-idf/components/bt C:/esp/esp-idf/components/cbor C:/esp/esp-idf/components/coap C:/esp/esp-idf/components/console C:/esp/esp-idf/components/cxx C:/esp/esp-idf/components/driver C:/esp/esp-idf/components/efuse C:/esp/esp-idf/components/esp-tls C:/esp/esp-idf/components/esp32 C:/esp/esp-idf/components/esp_adc_cal C:/esp/esp-idf/components/esp_common C:/esp/esp-idf/components/esp_eth C:/esp/esp-idf/components/esp_event C:/esp/esp-idf/components/esp_gdbstub C:/esp/esp-idf/components/esp_hid C:/esp/esp-idf/components/esp_http_client C:/esp/esp-idf/components/esp_http_server C:/esp/esp-idf/components/esp_https_ota C:/esp/esp-idf/components/esp_https_server C:/esp/esp-idf/components/esp_ipc C:/esp/esp-idf/components/esp_local_ctrl C:/esp/esp-idf/components/esp_netif C:/esp/esp-idf/components/esp_ringbuf C:/esp/esp-idf/components/esp_rom C:/esp/esp-idf/components/esp_serial_slave_link C:/esp/esp-idf/components/esp_system C:/esp/esp-idf/components/esp_timer C:/esp/esp-idf/components/esp_websocket_client C:/esp/esp-idf/components/esp_wifi C:/esp/esp-idf/components/espcoredump C:/esp/esp-idf/components/esptool_py C:/esp/esp-idf/components/expat C:/esp/esp-idf/components/fatfs C:/esp/esp-idf/components/freemodbus C:/esp/esp-idf/components/freertos C:/esp/esp-idf/components/heap C:/esp/esp-idf/components/idf_test C:/esp/esp-idf/components/jsmn C:/esp/esp-idf/components/json C:/esp/esp-idf/components/libsodium C:/esp/esp-idf/components/log C:/esp/esp-idf/components/lwip C:/esp/esp-idf/examples/get-started/hello_world/main C:/esp/esp-idf/components/mbedtls C:/esp/esp-idf/components/mdns C:/esp/esp-idf/components/mqtt C:/esp/esp-idf/components/newlib C:/esp/esp-idf/components/nghttp C:/esp/esp-idf/components/nvs_flash C:/esp/esp-idf/components/openssl C:/esp/esp-idf/components/partition_table C:/esp/esp-idf/components/perfmon C:/esp/esp-idf/components/protobuf-c C:/esp/esp-idf/components/protocomm C:/esp/esp-idf/components/pthread C:/esp/esp-idf/components/sdmmc C:/esp/esp-idf/components/soc C:/esp/esp-idf/components/spi_flash C:/esp/esp-idf/components/spiffs C:/esp/esp-idf/components/tcp_transport C:/esp/esp-idf/components/tcpip_adapter C:/esp/esp-idf/components/tinyusb C:/esp/esp-idf/components/ulp C:/esp/esp-idf/components/unity C:/esp/esp-idf/components/vfs C:/esp/esp-idf/components/wear_levelling C:/esp/esp-idf/components/wifi_provisioning C:/esp/esp-idf/components/wpa_supplicant C:/esp/esp-idf/components/xtensa
-- Configuring done
-- Generating done
-- Build files have been written to: C:/esp/esp-idf/examples/get-started/hello_world/build

C:\esp\esp-idf\examples\get-started\hello_world>

Das Espressif IoT Development Framework bietet ein Konfigurationsmenü welches man mit dem Befehl idf.py menuconfig in der Konsole öffnen kann.

Hier ändere ich lediglich unter dem Menüpunkt Serial flasher config > Flash size (2MB) den Wert von 2MB auf 4MB. Mit ESC kommt man aus den Menüs raus und wenn man das Konfigurationsmenü verlassen möchte, so wird man gefragt ob die Änderungen gespeichert werden sollen. Mit Y kann man angeben, dass die Änderungen gespeichert werden sollen.

Ein Projekt (wir müssen uns hierzu im Projektverzeichnis befinden) kann mit dem nachfolgenden Befehl kompiliert werden (Build). Das kann etwas dauern :)

idf.py build

Wenn der Build-Vorgang abgeschlossen ist, können wir nun unser Mikrocontroller-Board flashen. Dazu führend wir nachfolgenden Befehl aus:

idf.py -p COM3 flash

Wenn das flashen erfolgreich war, kann man die Aktivitäten des Boards mit Hilfe des Befehls idf.py -p COM3 monitor überwachen.

idf.py -p COM3 monitor

Fertig! Alles scheint wie erwartet zu laufen. Im nächsten Schritt installieren und konfigurieren das Espressif IDF unter Microsoft Visual Studio Code.

Installation von Microsoft Visual Studio Code

Download des Installationspaketes unter https://code.visualstudio.com.

Ausführen des heruntergeladenen Installationspaketes. Ich akzeptiere die Vereinbarung auswählen und auf Weiter klicken.

Das Installationsverzeichnis lasse ich so wie vorgegeben und klicken auf Weiter.

Startmenü-Ordner lasse ich ebenfalls unangetastet und klicke auf Weiter.

Bei den Zusätzliche Aufgaben wähle ich alle Punkte aus und klicken auf Weiter.

Wenn alle Angaben stimmen, können wir die Installation mit einem Klick auf die Schaltfläche Installieren starten.

Nachdem die Installation erfolgreich abgeschlossen wurde, klicken wir auf Fertigstellen.

Nach Abschluss der Installation startet Microsoft Visual Studio Code.

Installation und Konfiguration der Espressif IDF Extension in Microsoft Visual Studio Code

Bevor wir uns an die Installation und Konfiguration der Espressif IDF Extensions machen, müssen wir zuvor die C/C++ Extension installieren.

Ich hatte zunächst die Extension innerhalb von Visual Studio Code installiert, später jedoch durch die 1.3.0-insiders ersetzt. Bei der 1.3.0-insiders handelt es sich um ein .vsix Paket, was heruntergeladen und anschließend manuell zu zu den Visual Studio Code Extensions hinzugefügt werden muss. Der Installation-Teil ist immer gleich. Wir klicken im linken Menü auf die 4 Kästchen.

Wählen in den Extensions C/C++ oder fügen unser .vsix via den drei Punkten (…) rechts von der Ãœberschrift EXTENSIONS. Klicken anschließend auf Install. Das sollte recht schnell gehen.

Wenn die Installation erfolgreich war, verschwindet die Install Schaltfläche und stattdessen erscheinen nun Disable und Uninstall.

Espressif IDF Installation un Konfiguration

So, nun kommen wir zu der Espressif IDF Installation und Konfiguration. Im Suchfeld im Panel EXTENSION MARKETPLACE geben wir esp ein. Man kann auch Espressif eingeben. Es erscheint Espressif IDF in der Liste der Extensions. Wie bei den C/C++ Extensions klicken wir auf Install um die Erweiterung zu installieren.

Nach erfolgreicher Installation erscheint links im Menü ein neues Symbol, das Logo der Espress IDF Extension. Wir klicken darauf. Alternativ kann man das auch via F1 machen. Das Betätigen der Taste F1 bewirkt, dass alle zur Verfügung stehenden Befehle (auch bereitgestellt durch die Extensions) in Form eines DropDowns unterhalb eines Eingabefeldes auflistet. Man kann es als eine Art Menü über alle Extensions sehen. Wenn man in diesem Feld lostippt, so werden die zur Verfügung stehenden Befehle aufgezeigt/gefiltert.

Der Klick auf das Espressif Symbol bewirkt, dass die Express IDF Extension Setup Seite aufgerufen wird. Auf dieser Seite klicken wir auf die Fläche EXPRESS.

Da wir ESP-IDF zuvor bereits installiert haben, wählen wir bei Select ESP-IDF version > Find ESP-IDF in your system. Im Feld Enter ESP-IDF directory geben wir unser Verzeichnis an in das wir ESP IDF zu Begin installiert haben. Das Verzeichnis lautete c:\esp\esp-idf. Das Feld Select Python version bereits vorausgefüllt sein, hier braucht es keine Änderung. Anschließend klicken wir auf Install. Das kann ein ganzes Weilchen Dauern.

Nachdem die Installation erfolgreich abgeschlossen wurde, betätigen wir auf der Tastatur die Taste F1 und es öffnet sich eine Liste mit Befehlen. Hier wählen wir aus der Liste den Befehl ESP-IDF: Show Example Projects aus.

Damit erscheint eine weitere Auswahl die bei mir lautet Use current ESP-IDF (c:\esp\esp-idf) ESP-IDF, welches ich auswähle.

Wir wählen auf der Seite ESP-IDF Examples unter get-started den Punkt hello_world und klicken danach auf die große blaue Schaltfläche Create project using example hello_world.

Visual Studio Code fragt nach, in welches Verzeichnis es dieses Projekt legen soll. Dabei wird das Projektverzeichnis (in diesem Fall hello_world) innerhalb des angegebenen Verzeichnisses erstellt!

Nachdem das Projekt erstellt wurde, müssen wir dem Projekt mitteilen an welchem Anschluss unser Board angeschlossen ist. Dazu klicken wir unten in der Fussleiste auf das Stecker-Symbol.

Erneut öffnet sich die Befehlsliste und bietet uns die zur Verfügung stehenden Anschlüsse an. Bei mir ist das Board mit dem ESP32 an COM3 angeschlossen. Also wähle ich COM3 aus.

Als nächstes wähle ich das Target-Board aus. Ich drücke die Taste F1 und wähle den Befehl ESP-IDF: Set Espressif device target.

Da ich einen ESP32 verwende, wählen ich diesen aus der Liste aus.

Da nun das Projekt bereits geladen ist, das Target Device und der Anschluss definiert wurde, können wir das Projekt kompilieren, flashen und direkt monitorn. Dazu wählen wir den Befehl ESP-IDF: Build, Flash and start monitor on your device.

Nachdem wir den Befehl abgesetzt haben, sehen wir im Terminal die Ausgabe der durchgeführten Schritte, als auch die Ausgabe/Aktivtäten des Boards.

Perfekt! Alles funktioniert wie erwartet und fehlerfrei. Wir haben nun damit die Möglichkeit neben der Arduino IDE, Espressif ESP-IDF Tools und auch Microsoft Visual Studio Code für die Entwicklung von ESP32 Projekten zu nutzen.

Mögliche Probleme und Lösungen

  • C/C++ for Visual Studio Code sollte zum Zeitpunkt dieses Artikel die Version 1.3.0-insiders verwendet werden. Dazu kann man das .vsix Paket von GitHub herunterladen und in Visual Studio Code einbinden und installieren.