Großer Bruder: Espressif ESP32

Schnelleres WLAN (bis 150 Mbit/s), zwei Prozessoren (160 MHz), Bluetooth (Low Energy), noch mehr Speicher und viel Peripherie soll der neue Chip bringen.

In Pocket speichern vorlesen Druckansicht 14 Kommentare lesen
Ein ESP32 auf einem weißem Breadboard

(Bild: Markus Ulsaß)

Lesezeit: 19 Min.
Von
  • Markus Ulsaß
Inhaltsverzeichnis

Der neue Mikrocontroller des chinesischen Herstellers Espressif mit dem Namen ESP32, der im Frühherbst erscheinen soll, verspricht noch mehr Möglichkeiten zu bieten als der bei Hardware-Bastlern für seinen geringen Preis und gute Verfügbarkeit beliebte ESP8266 (siehe auch Make 6/15). Der ESP32 soll zwar kein direkter Nachfolger sein und wird etwas teurer werden, dafür bietet er eine Menge an zusätzlichen Optionen.

Wir haben uns das Developer Board des ESP32 angeschaut. Bisher haben erst 200 Beta-Tester weltweit ein ESP32-Entwicklerboard bekommen. Auf diesem ESP-WROOM-03 ist ein Chip mit der Bezeichnung "ESP31B" verbaut, der sich zu dem endgültigen Chip noch unterscheiden kann.

Das 18 mm × 20 mm × 3 mm große Board wurde mit einem für Breadboards geeigneten Breakout-Board geliefert. An Bauteilen sind unter anderem ein 26 MHz- und ein 32 kHz-Taktgeber, ein 32 Mbit (4 Megabyte) großes EEPROM (EM25Q32) als SPI-Flash sowie jede Menge Hühnerfutter in SMD-Bauweise bestückt. Außerdem gibt es eine für Bluetooth und WLAN angepasste Antenne, die als Platinenbahn ausgeführt ist. Betrieben wird das System mit 3 bis 3,6 Volt. Die genauen Spezifikationen findet man im PDF zum ESP32-WROOM-03.

Erste Eindrücke vom ESP32 (4 Bilder)

Das Espressif ESP32 Developer Board wurde an 200 Beta-Tester verschickt.
(Bild: Markus Ulsaß)

Zunächst einmal eine kleine Einschränkung ganz am Anfang: Das uns vorliegende Developer-Modul mit einem ESP31B kann sich von dem endgültigen Chip noch unterscheiden. Einiges, was an Eigenschaften vom Hersteller angekündigt wurde, ist mit dem Developer Board (noch) nicht möglich beziehungsweise noch nicht getestet worden oder ändert sich noch. Das liegt unter anderem auch daran, dass das Software Development Kit (SDK) und die dazugehörigen APIs (Application Programming Interfaces) noch in einer frühen Entwicklungsphase stecken. Durch die sehr aktive Community ist der Funktionsumfang und vor allem das Preis-Leistungs-Verhältnis bemerkenswert. Bei Espressif handelt es sich zudem um einen Chip-Entwickler, der die Quellen für die API weitgehend freigibt.

ESP32 (ESP31B) ESP8266
Ethernet MAC Interface Nicht vorhanden
GPIOs für 10 Touch-Sensoren Nicht vorhanden
Temperatur-Sensor (on-chip) Nicht vorhanden
Remote-Controller-Funktionalität Nicht vorhanden
Hall-Sensor Nicht vorhanden
Digital-to-Analog Converter (DAC) Nicht vorhanden
CAN 2.0 Nicht vorhanden
Analog-to-Digital Converter (ADC): 16 Kanäle mit 12-Bit SAR-ADC mit Unterstützung für einen Low-Noise Amplifier (LNA) 10-bit ADC, kein LNA
2 I2C-Schnittstellen 1 I2C-Schnittstelle
16 Kanäle für PWM 8 Kanäle für PWM
GPIOs (General-Purpose Input/Output): 36 GPIOs: 17
4 SPI-Schnittstellen mit Quad-SPI und maximal 80 MHz 3 SPI-Schnittstellen mit Quad-SPI und maximal 80 MHz

Hunderte von Projekten und Tutorials zu zahlreichen Anwendungen vor allem im Bereich Internet of Things zeigen die Fähigkeiten des alten ESP8266. Was kann der ESP32 (Pinout) besser als sein kleiner Bruder und vor allem: Welche neuen Möglichkeiten erschließen sich dem Anwender dadurch? Dazu werfen wir einen Blick unter die Haube des neuen Chips, schauen, was verbessert wurde beziehungsweise auf welche neuen Schnittstellen man zugreifen kann.

Eine der wichtigsten Neuerungen ist der zweite 32-Bit Prozessor (Tensilica L106), den Espressif dem SoC (System on Chip) spendiert hat. Damit wird der neue Chip nicht nur kraftvoller (bis zu 400 MIPS), sondern es fallen auch wichtige Beschränkungen des ESP8266 weg. So ist das Auslesen des analogen Eingangs oder die Programmierung von Verzögerungsschleifen beim ESP8266 in manchen Situationen nicht unproblematisch und soll manchmal zu falschen Werten beziehungsweise zum Reset des Controllers führen, wenn der Prozessor sich gleichzeitig um die WLAN-Kommunikation kümmern muss. Prinzipiell muss man bisher dafür sorgen, dass es im Programmablauf nicht zu Kollisionen kommt.

Mit einer Standard-Taktung von 160 MHz wird zudem der Takt für das Prozessor-Duo verdoppelt. Laut Espressif ist das Chip-Design sogar auf maximal 240 MHz ausgelegt. Getestet wurde das bisher aber noch nicht. Mit 400 MIPS dürfte sogar eine rudimentäre Spracherkennung möglich werden, die zur Zeit in viele Smart-Home Geräte eingebaut wird (Amazon Echo, Google Home). Erweitertes internes ROM, SRAM und die Möglichkeiten, über das schnelle Quad-SPI (QSPI) mit bis zu 80 MHz insgesamt 64 MByte Flash anzubinden, zeigen die Möglichkeiten des potenten Prozessor-Duos.

Selbst für Fritzing gibt es schon ein ESP32-Bauteil von Sparkfun.

(Bild: Markus Ulsaß)

Das ROM für das Bootprogramm und Grundfunktionen wurde auf 128 kBytes aufgestockt - jeder der Cores kann dabei auf eigenes ROM zugreifen. An SRAM stehen jetzt 416 kBytes zur Verfügung (Heap & Data: 150 kBytes, Code: 60 kBytes). Unterstützt werden 32 Interrupt-Vektoren von etwa 80 Interrupt-Quellen. Wie beim ESP8266 können Programmcode und Daten in den externen Flash-Speicher ausgelagert werden. Der ESP32 unterstützt bis zu 64 MByte (ESP8266: 16 MByte).

Mit einer Erhöhung der Bandbreite auf 40 MHz im 802.11n-Standard und damit bis zu 150 MBit/s (nach Angaben von Espressif) soll endlich das Streaming von Videodaten über WLAN möglich werden. Audio-Streaming, wie man es für ein Internet-Radio oder das lokale Abspielen von Musik benötigt, dürften so kein Problem mehr sein. Eine Kamera könnte somit über das SDIO Interface für SD-Speicherkarten angebunden werden. Damit sind theoretisch 200 Mbps auf vier Datenbussen mit 50 MHz möglich.

Mit Bluetooth 4.2 Low Energy (BLE) und Bluetooth Legacy erweitert der ESP32 seine Fähigkeiten im Funk um einen wichtigen Standard. Audio-Headsets und Bluetooth-Lautsprecher auf Basis des neuen Chips sind durchaus vorstellbar. Mit BLE werden nun auch stromsparende Wearables und Sensorbausteine möglich.

Besonders stromsparende Modi bis hinunter zu 2 µA ermöglicht auch der neue Ultra Low Power (ULP)-Prozessor und die RTC (Real Time Clock), da Programme und Daten für den ULP-Prozessor in das SRAM (bis zu 8 kBytes) der RTC ausgelagert werden können und somit auch im Deep Sleep-Modus auf Peripherie, Interrupts und Timer zugegriffen werden kann. So kann man die stromhungrigen 32-Bit-Prozessoren aufwecken, wenn es nötig ist, und danach sofort wieder schlafen legen. Batteriebetriebene ESP-Geräte werden noch ausdauernder und zahlreiche neue gänzlich drahtlose Geräte für das Internet of Things und Smart Home werden möglich, die zuvor noch an der Steckdose hängen mussten.

Verdrahtet werden kann der ESP32 zukünftig auch mit dem LAN und zwar über den neuen Media Access Controller (MAC). Eine Neuerung in der Peripherie soll auch ein CAN-BUS-Controller 2.0 sein, zehn kapazitive Eingänge (low noise/high sensitivity), an die Touch-Sensoren angeschlossen werden können, sowie ein Remote-Controller, der mit acht Kanälen ausgestattet ist und über den per pulse waveform eigene Protokolle programmiert werden können. Hierzu gibt es allerdings noch keine weiterreichenden Informationen.

Besonders der neue Analog-Digital Wandler (ADC) mit jetzt 12 Bit Auflösung und 16 Kanälen wird für Projekte im Bereich Messen begrüßt werden. Die Begrenzung auf eine maximale Spannung bis 1 Volt am Eingang (wie beim ESP8266) ist Geschichte. Zukünftig werden vier Spannungsbereiche von 0 bis 4 Volt möglich und damit sind zahlreiche Sensoren deutlich einfacher anzuschließen. Zusätzlich bietet der ESP32 jetzt einen Digital-Analog Wandler (DAC) mit zwei 10 Bit Kanälen.

Die Zahl der (teilweise mehrfach genutzten) Ein- und Ausgänge, welche als GPIOs (General Purpose Input Output) bezeichnet werden, hat sich verdoppelt. Im ESP32 sind jetzt 36 nutzbar, auch wenn natürlich einige davon standardmäßig schon mit anderen Funktionen für weitere Peripherie belegt sind.

Bereits in der Beta-Phase unterstützt von der Arduino-IDE

(Bild: Markus Ulsaß)

Eine Kernfrage bei kleinen, smarten Geräten ist oft der Stromhunger. Damit steht und fällt die Möglichkeit unabhängig von der Steckdose betrieben zu werden. Für Wearables oder Roboter ist das vorteilhaft. Der ESP32 unterstützt verschiedene Power-Modes, die durch den neuen Ultra-Low-Power-Prozessor in Kombination mit der RTC bis zu wenigen Mikroampere herunter - trotz zahlreicher aktiver Peripherie - betrieben werden können. Die wichtigsten Modi sind:

  • Active Mode: Alle Einheiten des Chips sind aktiviert. In ersten Tests scheint der ESP32 noch stromhungriger als sein Vorgänger zu sein, denn der Stromverbrauch liegt bei etwa 160-260 mA (alle Angaben zum Verbrauch vom Hersteller).
  • Modem Sleep Mode: Die CPUs arbeiten, WLAN und Bluetooth sind deaktiviert. Stromverbrauch 3-20 mA.
  • Light Sleep Mode: Die CPU ist ausgeschaltet - Ultra Low Power (ULP) und RTC arbeiten, externe Interrupts sind möglich. Stromverbrauch 0,8 mA.
  • Deep Sleep Mode: Nur die RTC ist aktiviert, der ULP-Prozessor kann eingeschaltet werden. Stromverbrauch 2-25 µA .

Die vielen Möglichkeiten des neuen Chips müssen natürlich auch per Programmcode in die Realität umgesetzt werden. Während bei dem ESP8266 knapp ein Jahr verging, bis die beliebte Arduino IDE zumindest rudimentär den Mikrocontroller unterstützte, ist diesmal bereits parallel zur Beta-Phase ein Github-Projekt zur Integrationdes EPS32 in die Arduino IDE entstanden, das erste Funktionen über die einfach zu bedienende Oberfläche unterstützt.

Für die Integration in die Arduino IDE sind zur Zeit folgende Schritte notwendig:

  • Zunächst muss man sich die ESP-Toolchain für das entsprechende Betriebssystem herunterladen, die später für die Integration in die Arduino IDE gebraucht wird (alle nachfolgenden Links für die Downloads im Github-Repository)
  • Für Windows ist mit cygwin zusätzlich noch eine Linux-ähnliche Umgebung erforderlich, die man downloaden und gleich installieren kann.
  • Danach muss man sich – falls noch nicht vorhanden – eine aktuelle Version der Arduino IDE installieren, die man auf der Webseite von Arduino LLC im Bereich Download findet.
  • Nun lädt man sich auf der Github Projektseite das Respository herunter (grüner Button: Clone or Download/Download ZIP).
  • Das ganze entpackt man und wechselt in das Arduino-Verzeichnis (in Windows etwa: \Program Files (x86)\Arduino\hardware) erstellt dort ein neues Verzeichnis espressif, wechselt in das Verzeichnis und kopiert anschließend die entpackten Dateien hinein.

Neues Verzeichnis für das Repository

Die Schritte funktionieren unter Linux analog. Hier kann man mit dem Befehl git clone https://github.com/me-no-dev/ESP31B.git das Repository auch direkt in das Verzeichnis /hardware/espressif im Arduino-Stammverzeichnis kopieren.

  • Zusätzlich wird noch Python in der Version 2.7 benötigt, das man je nach Betriebssystem über die Installationsmanager installiert, beziehungsweise für Windows heruntergeladen und installiert werden kann.
  • Wichtig: Python2.7 muss in die PATH-Variable des jeweiligen Betriebssystems eingefügt werden. Dies geschieht bei Windows über Einstellungen/System/Systeminfo/Erweiterte Systemeinstellungen. Dort klickt man auf dem Reiter Erweitert auf die Schaltfläche Umgebungsvariablen und bearbeitet dann bei Systemvariablen die Path-Variable.

Anpassung der Variable PATH für die Python-Installation unter Windows
  • Als letztes muss noch die extrahierte Toolchain in das Arduino-Verzeichnis unter hardware/espressif/ESP31B/tools directory kopiert werden.

Verzeichnis mit der Toolchain
  • Hat man die Arduino IDE noch geöffnet, muss man sie beenden und neu starten. Die neuen Boards sind dann unter Werkzeuge/Board/Boardverwalter in die Auswahl integriert.

Github-Repository klonen und schon ist der ESP32 (beziehungsweise die Beta-Version 31B) in die Arduino IDE integriert.

Prinzipiell ist der ESP32 seriell und Over-the-Air (OTA) programmierbar. Over-the-Air lassen sich Firmware-Updates ohne direkte PC-Anbindung per WLANauf das Modul aufspielen. Dafür wird der Flash-Speicher so aufgeteilt, dass bei einem Fehler der vorherige Code erhalten bleibt. Zusätzlich steht ein bisher undokumentiertes JTAG-Interface zur Verfügung.

Espressif nutzt das Realtime Operating System "freeRTOS" mit einem "Lightweight IP" Stack "LwIP". Neben der Arduino IDE existiert mit "UnofficialDevelopment Kit for Espressif ESP32 (Windows toolchain)" ein weiteres Projekt, das die quelloffene Eclipse IDE, die auf verschiedenen Plattformen nutzbar ist, komfortabel in einer Windows-Umgebung mit dem ESP32 SDK aufsetzt. Der Entwickler des Projekts hat diese Umgebung bereits auch für den ESP8266 angepasst. So kann man in Eclipse C-Programme schreiben, testen und übertragen und direkt auf die zahlreichen Funktionen der ESP32 APIs zugreifen. Damit bieten sich deutlich mehr Möglichkeiten als mit der doch recht eingeschränkten Arduino IDE. Wer sich auf der Kommandozeile zuhause fühlt, kann sich die Toolchain natürlich auch unter Linux selbst zusammenstellen. Eine sehr ausführliche Anleitung dazu und was man an Software benötigt, findet man im Espressif ESP32 SDK Github-Repository.

Die Installation des "Unofficial Development Kit for Espressif ESP32" ist durch die Zusammenstellung der Links und automatisch ablaufenden Skripte unter Windows recht einfach durchzuführen.

  1. Zunächst muss das "Unofficial Development Kit for Espressif ESP32" heruntergeladen werden.
  2. Danach benötigt man eine JavaLaufzeit Umgebung (JRE) für x86.
  3. Als IDE dient Eclipse Mars x86. Das Archiv muss entpackt und in das Stammverzeichnis abgelegt werden.
  4. Zusätzlich benötigt man eine Linux-ähnliche Umgebung. MinGW kann hierzu heruntergeladen und installiert werden. Für die Installation wird keine Benutzeroberfläche benötigt, man kann also die Option "... also install support for the graphical user interface" abwählen.
  5. Der Entwickler für dieses Development Kit stellt einen Download bereit, der per Script zusätzlich benötigte MinGW Module installiert.
  6. Von der extrahierten Datei muss install-mingw-package.bat aufgerufen werden, das die zusätzlich benötigten Module installiert.
  7. Nun startet man Eclipse aus dem im Stammverzeichnis abgelegten Eclipse-Ordner mit eclipse.exe
  8. In Eclipse wählt man unter File/Import den Unterpunkt General/Existing Projects into Workspace, klickt auf Next und wählt dann bei select root directory den Eintrag C:\Espressif\examples\ESP32 (oder das entsprechende Laufwerk für das Stammverzeichnis) und importiert die vorhandenen Projekte.

Importieren der Projekte, 1. Schritt

Importieren der Projekte, 2. Schritt

Weiterführende Informationen findet man in einem Forenbeitrag im ESP32-Forum.

Für unser erstes Projekt benötigen wir außerdem ein Terminal-Programm wie TeraTerm oder Putty für Windows oder Hterm, das heruntergeladen und installiert werden muss.

Anhand zweier Beispiele stellen wir die Programmierung unter Eclipse kurz vor.

Wenn man das Projekt esp32_hello_world öffnet, das standardmäßig nach der Installation vorhanden ist, hat man mehrere Unterpunkte wie Archives, Includes, build, firmware, include und user (linkes Fenster). Im Stammverzeichnis finden sich außerdem die Dateien Makefile und esp.conf. Die ganzen Inhalte sind prinzipiell auch in der Arduino IDE enthalten, bleiben aber aufgrund der Vereinfachung der Programmieroberfläche weitgehend vor dem Benutzer verborgen.

"Hello-World" Projekt in Eclipse

Wichtig sind für unser Beispiel nur die Datei user_main.c und esp.conf. Die erste Datei ist unser eigentlicher Quellcode und für spätere Projekte die Einstiegs-Datei für das Programm, das später auf unserem ESP32 laufen soll. Die Datei ist sehr überschaubar und bindet mit den beiden include-Zeilen wichtige header-Dateien ein, die den Unterbau des Programms darstellen und auf die APIs des Espressif SDKs zugreifen. Was genau in diesen Dateien passiert, steht in diesem Fall im Unterpunkt includes (./Espressif/ESP32_RTOS_SDK/include und ./Espressif/ESP32_RTOS_SDK/third_party/include/freertos).

Als nächstes wird die Stammfunktion geschrieben (void user_init(void)). Die Funktion bietet den Einstiegspunkt nach dem Start des ESP32. Hier wird festgelegt, dass per API system_get_sdk_version neben vielen anderen Systeminfos die derzeitig verwendete SDK-Version des zuletzt kompilierten Projekts angezeigt wird. Zum anderen wird in einem Terminal-Programm mit Hilfe eines printf-Befehls später ein "Hello World" angezeigt werden.

In der Datei esp.conf muss nun noch der verwendete serielle Port angepasst werden (ESP_PORT) und unter Umständen je nach verwendetem Modul die SPI-Eigenschaften (Speichergröße, Art der Anbindung) des Flash-Bausteins. In dem rechten Fenster unter dem Reiter Make Target kompiliert man nun das Projekt testweise mit clean und dann rebuild.

"Hello World"-Ausgabe im seriellen Monitor, hier jener der Arduino-IDE

Klappt alles, so muss der ESP32 jetzt in den Boot-Modus versetzt werden. Der Vorgang unterscheidet sich zum ESP8266, denn der ESP32 hat keinen Reset-Pin (RST), sondern nur einen Enable-Pin (EN). Den Bootmodus löst man durch Verbinden des GPIO 0 mit Masse und einem Neustart aus (Enable Pin kurz auf Masse legen, dabei GPIO 0 verbunden lassen). Dann kann man mit flash_all das Programm auf den ESP32 übertragen. Danach müsste sich der ESP32 mit der vorher programmierten Systeminfo und dem "Hello World" in einem Terminal-Programm (115,2 kbits/s) melden.

Das Developer-Modul im Breadboard-Aufbau: oben eine LED (inklusive integriertem Vorwiderstand) an GPIO4, der obere Taster ist an GPIO 0 (Boot-Modus) der untere mit einem Pull-Up-Widerstand am ENable-Pin angeschlossen. Oben rechts der USB-Seriell-Wandler und unten rechts die Stromversorgung.

(Bild: Markus Ulsaß)

Kleiner Tipp: Auch in Eclipse lässt sich ein Terminal-Programm integrieren, das dann wie der Reiter Console einfach angewählt beziehungsweise konfiguriert werden kann.

Während es bei einem mit der Arduino-Oberfläche erstellten Programm recht einfach ist, eine LED mit den bekannten Funktionen blinken zu lassen, sieht dies bei einem direkt auf den Espressif SDK APIs aufsetzenden Programmcode zwar etwas komplizierter aus, bietet dabei aber deutlich mehr Möglichkeiten bei der Entwicklung. Wir haben dazu ein Projekt vorbereitet. Nachdem das Projekt in Eclipse eingebunden ist, sehen wir uns die Datei user_Main.c genauer an. Zunächst muss die gpio.h Header-Datei eingebunden werden, um auf die Funktionen für die Pins zugreifen zu können.

Einbinden der Header-Datei

Der GPIO wird in diesem Fall per GPIO_AS_OUTPUT(LED_PIN) und der Angabe des Pins (LED_PIN wird in der Datei include/user_config.h definiert) als Ausgang gesetzt und mit GPIO_OUTPUT_SET(LED_PIN, 1) auf High gesetzt und damit angeschaltet.

Um die LED tatsächlich im Intervall blinken zu lassen, benötigen wir die Funktion blinkIntervalTimer, die per ESP32-Software-Timer die Funktion blink in einer vordefinierten Zeitspanne (Variable: interval) aufruft.

Programmcode für das Blink-Programm unter Eclipse

Die Dokumentation zu den Espressif SDK APIs, auf denen dieses Beispiel aufsetzt, findet man im Github-Repository zum ESP32 freeRTOS SDK unter documents. Noch eine kleine Besonderheit bei diesem Projekt - zumindest zu dem Zeitpunkt des Tests der Eclipse-Umgebung: Die Bibliotheken unter ./Espressif/ESP32_RTOS_SDK/driver_lib mussten manuell eingebunden werden. Dies geschieht über den Eintrag #includegpio.h im Code von user_main_c. Und auch die Pfade im Makefile mussten angepasst werden.Dies geschieht in unserem Beispiel, indem man bei der Makefile-Variable EXTRA_INCDIR den Eintrag $(SDK_BASE)/driver_lib/include hinzugügt. Das stellt sicher, dass die zuvor inkludierte gpio.h auch gefunden werden kann. Falls also unerwartet Fehlermeldungen erzeugt werden, lohnt es sich immer zu schauen, ob auf die verwendeten Bibliotheken auch zugegriffen werden kann.

Ein günstiger 32-Bit Mikrocontroller mit WLAN und Bluetooth sowie umfangreicher Peripherie zu kleinem Preis werden den ESP32 schnell wieder zu einem Liebling der Community machen. Besonders interessant ist dabei die Option, mit dem verbesserten WLAN größere Datenmengen zu übertragen und damit beispielsweise Videostreams zu ermöglichen. Der neue Ultra-Low-Power-Prozessor schafft die Voraussetzung für batteriebetriebene Projekte und mit Bluetooth öffnet sich der ESP32 einem weiteren wichtigen Funkstandard. Erfahrungsgemäß wird es allerdings noch eine Weile dauern, bis der SoC für jedermann in Form von Modulen und zu günstigen Preisen erhältlich ist. Und auch die Entwicklung des SDKs für den neuen ESP32 könnte einige Zeit in Anspruch nehmen. Bis dahin ist man mit dem preiswerten ESP8266, den vielen Programmbeispielen und Tutorials und dem mittlerweile ausgereiften SDK gut bedient, wenn es darum geht, "Dinge" in das Internet zu bekommen. (fls)