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.

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.