Entwicklungsboards Wrover-Development-Kit für IoT-Anwendungen

Die chinesische Firma Espressif ist insbesondere in der Maker-Szene für ihr sehr preiswertes ESP8266-WLAN-Modul mit integriertem 32-bit-Mirocontroller bekannt. Mit dem ESP32, der mit einem Development Board von Espressif zum Einsatz kommt, sollen auch professionelle Anwendungen adressiert werden.

Sowohl der ESP8266 als auch der ESP32 basieren auf einem Xtensa L106/LX6 der kalifornischen Firma Tensilica, die im Jahre 2013 von der Firma Cadence übernommen wurde. Die Cores von Tensilica bzw. Cadence [1] sind in zahlreichen Codecs für die Signalverarbeitung integriert, insbesondere in Chips für die Audio- und Videosignalverarbeitung.

Der Xtensa LX6 ist beim ESP32 als Dual-Core ausgeführt, während der ESP8266 mit einem 32-bit-Single-Kern (L106) arbeitet. Der ESP32 verfügt über 512 kB an SRAM, wird mit maximal 240 MHz getaktet und bietet neben WLAN auch Bluetooth (Standard und BLE 4.2).

Der ESP8266 ist mit 160 kB SRAM und einem maximalen Takt von 160 MHz demgegenüber leistungsschwächer, zumal ihm Bluetooth sowie die Schnittstellen CAN und Ethernet sowie Sensoren (Chip-Temperatur, Touch, Hall) fehlen.

Die typischen Schnittstellen wie GPIO, SPI, I²C und UART bieten beide Typen, wenn auch in unterschiedlicher Anzahl (Bild 1). Außerdem ist beim ESP32 ein 12-bit-A-D-Wandler mit 18 Kanälen sowie ein Zweifach-D-A-Wandler (8 bit) integriert.

Beim ESP8266 gibt es nur einen einkanaligen ADC mit einer Auflösung von 10 bit. Der Flash-Speicher ist wie beim ESP8266 extern angeschlossen und kann beim ESP32 bis zu 64 MB groß sein, beim ESP8266 sind es maximal 16 MB.

Es sind bereits zahlreiche Module mit dem ESP32 – schon ab 10 € – von unterschiedlichen Herstellern [2] verfügbar. Dabei wird üblicherweise immer nur eine Untermenge der prinzipiell verfügbaren Funktionen zur Verfügung gestellt, sodass stets zu überprüfen ist, welche internen Peripherieeinheiten des ESP32 durch das jeweilige Modul für die eigene Anwendung zur Verfügung stehen. Dies ist nicht verwunderlich, weil der ESP32 mit seinem Gehäuse (5 × 5 QFN) lediglich 49 Pins zur Verfügung stellt, sodass eine Mehrfachbelegung der Signale unausweichlich ist. Einige Anschlüsse führen deshalb bis zu neun unterschiedliche Funktionen, was dementsprechend auch unterschiedliche Peripherie erfordert.

Von einem Developer-Kit der Firma Espressif, wie dem hier betrachteten für das Wrover-Modul (Bild 2), erwartet man eine umfassende und auch universell einsetzbare Lösung, die die zahlreichen Möglichkeiten des ESP32 demonstriert und sich deshalb aus der Masse der bereits erhältlichen ESP32-Realisierungen heraushebt. Das Kit wird in einer kleinen Pappschachtel geliefert, in der sich lediglich eine Platine (ESP-Wrover-Kit) in einer Antistatikhülle ohne jegliche Peripherie oder Dokumentation befindet.

Auf der Platine dominiert, quasi auf der Unterseite, ein 3,2-Zoll-Farbdisplay. Auf der anderen Platinenseite befindet sich die weitere Elektronik, wie das ESP32-Wrover-Modul, das mit einem Metalldeckel verschlossen ist und wo lediglich die gedruckte Antenne herausragt. Der ESP32 ist im Modul über SPI mit einem externen Flash-Speicher von 4 MByte verbunden. Das Wrover-Modul ist auf dem Entwicklungs-Board festgelötet, sodass es nicht gegen ein anderes ausgetauscht werden kann. Das ist schade, weil andere Module wie das ESP32-WROOM kompatibel sind. Wenn das Evaluation-Board stattdessen Steckkontakte aufweisen würde, wäre das Board damit universeller einsetzbar.

Das Board (Bild 3) bietet außerdem einen SD-Karten-Slot und die notwendige Hardware, um das Modul mittels USB (FT2232) programmieren und betreiben zu können. Hinzu kommen vier LEDs, zwei Buttons, eine RGB-LED sowie eine Buchsenleiste für ein Kameramodul. Alle Anschlüsse des Moduls, auch die bereits belegten GPIOs, werden über Stift- und Buchsenleisten für die Kontaktierung nach außen geführt.

Zur Inbetriebnahme wird lediglich ein Micro-USB-Kabel benötigt, über das das Modul mit einem Computer zu verbinden ist. Die Programmierschaltung ist auf dem Board integriert und wird über UART und JTAG angesprochen. Die Stromaufnahme des Systems wird mit durchschnittlich 80 mA angegeben. Als Stromversorgung werden hingegen 500 mA (Vcc = 2,3 bis 3,6 V) spezifiziert, was bereits darauf hindeutet, dass genauere Untersuchungen der Stromaufnahme in der konkreten Anwendung notwendig sind, zumal nicht ersichtlich ist, wie die durchschnittliche Stromaufnahme ermittelt worden ist. Es ist davon auszugehen, dass die gesamte Peripherie (Display, USB-Interface etc.) dabei nicht mit berücksichtigt wurde. Vor der Inbetriebnahme ist die jeweilige Position von zwei Jumpern (Power Selector) für die Spannungsversorgung (5 V extern, USB) zu kontrollieren.

Software und Installation

Für die (professionelle) Programmierung kommen verzugsweise das IoT-Development-Framework (IDF) sowie die Expressif Toolchain (ESP-IDF) zum Einsatz, wie es im Getting Started Guide [3] beschrieben ist. Möglich ist auch die Verwendung der Arduino-IDE, wofür entsprechende Bibliotheken und Beispiele zur Verfügung gestellt werden.

Programmiert wird in C++ und eine spezielle IDE gibt es nicht. Empfohlen wird die Verwendung von Eclipse; es geht aber auch ohne, indem die um MinGW und Make entwickelte Toolchain eingesetzt wird. Der notwendige Editor ist quasi frei wählbar, wir haben Notepad++ benutzt. Eine neue Toolchain auf Basis von CMake ist zwar in der Entwicklung, sie ist jedoch noch nicht als vollständige Release verfügbar, sondern lediglich als Preview, weshalb wir uns damit nicht näher beschäftigt haben.

Expressif stellt neben den Programmen für die Toolchain auch offizielle Beispielprogramme zur Verfügung. Sie setzen auf FreeRTOS als RTOS (Real Time Operating System) auf, sodass die Implementierung von Interrupts und parallellaufenden Prozessen (für die zwei individuell programmierbaren Cores) und die Peripherieanbindung wie für die SD-Card oder Ethernet deutlich vereinfacht wird.

Für die Installation und die spätere Programmierung wurde ein PC mit Windows 10 verwendet. Der Download der Toolchain umfasst ca. 650 MByte, der auf einem Laufwerk (empfohlen wird C:\) zu entpacken ist, was dann zu ca. 1,6 GByte an Daten führt, was eine ganze Weile dauern kann. Im nächsten Schritt ist das IoT-Development-Framework (IDF) von Github zu beziehen. Dies erfolgt über die Kommandozeile und zwar aus dem Verzeichnis, aus dem die heruntergeladenen Daten entpackt wurden. Mit der folgenden Zeile und dem Befehl git clone wird das notwendige Git-Repository auf den PC kopiert:

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

Anschließend ist die Umgebungsvariable IDF_PATH, die den Pfad zum IDF enthält, zu setzen, was manuell oder über ein Skript (*.sh) mit dem folgenden Inhalt erfolgen kann:

export IDF_PATH=“C:/msys32/home/arbeitsverzeichnis/esp/esp-idf“

Mit der folgenden Zeile werden die Python-Requirements für das IDF installiert. Hierfür sollte zuvor Python (z. B. Version 2.7.15) installiert worden sein:

python -m pip install --user -r $IDF_PATH/requirements.txt

Nach diesen Vorbereitungen kann das Board an den PC angeschlossen werden, woraufhin zwei neue USB-Serial-Ports (COM xx) im Geräte-Manager auftauchen.

Wichtig ist die MinGW-Konsole (mingw32.exe), über die die Kommunikation mit dem Board stattfindet. MinGW ist aus dem Cygwin-Projekt entstanden und bietet eine Portierung der GNU-Werkzeuge für Windows. Mittels cd wird in das Verzeichnis gewechselt, in dem sich das gewünschte Beispielprogramm befindet (z. B. cd ~/esp/hello_world). Zunächst ist make menuconfig einzugeben und in der erscheinenden Oberfläche mittels Pfeiltasten und Enter der Unterpunkt Serial flasher config auszuwählen, wo im Feld Default serial port der im Gerätemanager gefundene höhere COM-Port (Bild 4) einzutragen ist. Damit ist die Konfigurierung des Boards beendet, und die abschließende Frage, ob die veränderten Einstellungen gespeichert werden sollen, ist zu bestätigen.

Durch make flash wird zunächst das Programm kompiliert und dann in den Flash-Speicher des ESP32 geladen. Nach Beendigung der Übertragung findet automatisch ein Neustart des Boards mit dem Laden und der unmittelbaren Ausführung des Programms statt.

Für die Ausgabe von Zeichen und Texten sowie Debug-Informationen steht das Programm make monitor (Bild 5) auf dem PC zur Verfügung. Dort tauchen dann etwa die Hello-World-Nachricht sowie Informationen zur Programmausführung und der ESP32-Version auf.

Beim verwendeten Hello_world werden die vier LEDs D9-D12 und alle Farbkomponenten der RGB-LED auf dem Board eingeschaltet. Das Farbdisplay zeigt hingegen nichts an. Für den Test des Displays gibt es ein eigenes Beispielprogramm (peripherals/spi_master), welches sich direkt mit make flash auf den ESP32 »flashen« ließ und ein wabernd animiertes ESP32-Logo auf dem Display abbildet.

Besonders interessant sind natürlich die WiFi- und die Bluetooth-Funktion. Für WiFi gibt es das Beispiel wifi/getting-started/softAP, das mit dem ESP32 einen WiFi-Hotspot bildet. Über menuconfig lassen sich hierfür eine SSID und ein Passwort festlegen. Dieses Beispiel hat sofort ohne jegliche Nachbesserungen funktioniert, sodass sich verschiedene Geräte damit verbinden konnten (Bild 6).

Für das im ESP32 integrierte Bluetooth-Modul existiert eine Vielzahl von Beispielen. Als einfacher Test wurde bluetooth/gatt_server eingesetzt. Eine ausführliche Beschreibung hierzu ist unter [4] zu finden. Nach dem erfolgreichen Flash-Vorgang ließen sich BLE-Verbindungen zwischen dem ESP und Mobilgeräten herstellen, und es konnte auf die Services (Bild 7) und Charakteristiken zugegriffen werden. Der ESP32 protokolliert alle Zugriffe in der Monitor-Konsole, wie es bereits beim WiFi-Beispiel (Bild 6) gezeigt ist.

Alle ausprobierten Beispiele haben erfreulicherweise auf Anhieb funktioniert. Auffallend waren allerdings die verhältnismäßig langen Kompilierungszeiten (make flash) von bis zu 9 Minuten. Hierzu findet sich im Github-Repository ein hilfreicher Tipp, den man nicht in der Startanleitung [3] oder auch sonst wo findet: Mit dem Parameter -j4 lässt sich das Kompilieren auf mehrere Kerne verlagern, sodass der Zeitaufwand deutlich reduziert wird. Der Befehl lautet dann make –j4 flash, und mit make –j4 flash monitor wird direkt im Anschluss auch die Monitor-Konsole gestartet.

Fazit

Das Wrover-Development-Kit mit dem ESP32 ist mit WiFi und Bluetooth für IoT-Anwendungen prinzipiell geeignet. Allerdings vermisst man nutzbare Sensoren, und der im ESP32 integrierte ADC liefert in der getesteten Version keine verlässlichen Ergebnisse, weil er nicht kalibriert ist. Laut Espressif hängt es vom Fertigungszeitpunkt des Chips ab, ob dies der Fall ist oder nicht. Mit dem ADC soll es zukünftig auch möglich sein, den im Modul eingebauten Hallsensor auszulesen.

Die Software-Entwicklung findet in klassischem C++ mit einem Editor (eigener Wahl) sowie mit den GNU-Tools unter MinGW statt, was als relativ einfache und universelle Möglichkeit anzusehen ist, wenn man dies mit den teilweise überfrachteten und komplex anmutenden IDEs anderer Hersteller vergleicht. Die Installation der Software ist aber verbesserungswürdig, denn das Entpacken des ZIP-Archivs für die Toolchain, das Clonen des GitHub-Repository sowie die Installation der Python-Requirements erfordern unterschiedliche Aktionen und Abstimmungen, was doch einige Zeit in Anspruch nimmt. Hierfür wäre ein Installer wünschenswert, der diese einzelnen Aktionen bündelt, sodass die Software möglichst in einem Rutsch installierbar und einfacher zu konfigurieren ist.

Die Dokumentationen und die zur Verfügung stehenden Beispiele reichen nicht nur für die Erkundung des Wrover-Development-Kits mit WiFi und Bluetooth aus. Vielmehr bilden sie eine sehr gute Ausgangsbasis für eigene Projekte, was auch den ausführlichen Kommentaren in den Quellcodes geschuldet ist.

Enttäuschend ist allerdings, dass das Developerboard im Vergleich mit Produkten anderer Hersteller, die ebenfalls ein ESP32-Modul einsetzen, keine Besonderheiten – vielleicht bis auf das Display – bietet, zumal Ethernet und CAN des Wrover-Moduls brachliegen und die Kameraschnittstelle noch nicht nutzbar ist. Außerdem ist die Funktion mit der Arduino-IDE, die wir am Rande mit getestet haben, unbefriedigend, denn sämtliche Beispiele lassen sich zwar korrekt übertragen, sie werden jedoch nicht ausgeführt (Programme hängen mit user code done). Ein Update der Board-Konfiguration auf eine neuere Version führte leider zu keiner Lösung, sondern zu anderen Problemen (Prüfsummenfehler, Bootschleife), was dringend einer Nachbesserung bedarf. (fr)

Referenzen
[1] Cadence IP Portfolio: https://ip.cadence.com/ipportfolio/ip-portfolio-overview

[2] Dr. Claus Kühnel, ESP32 – Erweiterung der Arduino-Familie, Design & Elektronik 11/2018, https://www.elektroniknet.de/design-elektronik/embedded/erweiterung-der-arduino-familie-esp32-wie-gut-ist-es-160294.html

[3] ESP Wrover Kit Geting Starting Guide: https://docs.espressif.com/projects/esp-idf/en/latest/get-started/get-started-wrover-kit.html

[4] Dokumentation GATT-Server: https://github.com/espressif/esp-idf/blob/master/examples/bluetooth/gatt_server/tutorial/Gatt_Server_Example_Walkthrough.md