Evaluation Arduino-Modul Erweiterung der Arduino-Familie: ESP32 – wie gut ist es?

Bild 3: ESP32 IoT Starter Kit.
Das ESP32 IoT Starter Kit.

Nachdem der verbreitete ESP8266 in die Arduino-Umgebung integriert wurde und Ledunia als High-End-ESP8266-Modul verfügbar ist, steht mit dem ESP32 der chinesischen Firma Espressif ein weiteres Upgrade der Arduino-Familie bereit. Dieser Beitrag untersucht, was von dem Modul zu halten ist.

Ich hatte die Benchmarks aus dem Beitrag »Arduino32: Die jungen Wilden« [1] mit denen des ESP8266/Ledunia ergänzt und will nun den deutlich mehr Rechenleistung versprechenden ESP32 ebenfalls diesen Tests unterziehen. 

Sowohl der ESP8266 als auch der ESP32 Mikrocontroller von Espressif sind in zahlreiche Mikrocontrollermodule eingegangen und heute gerade wegen ihrer WiFi-Eigenschaften oft Bestandteil von Entwicklungen. Beim ESP32 kommt nun auch noch die Bluetooth LE-Konnektivität (BLE) hinzu. Das ESP32-SoC bietet wie das ESP8266 SoC eine vollständige und in sich geschlossene WiFi-Netzwerklösung. Es kann verwendet werden, um eine Anwendung direkt auszuführen oder WiFi-Netzwerkfunktionen einem anderen Anwendungsprozessor zur Verfügung zu stellen. Für beide Varianten gibt es praktische Umsetzungen. Neu ist die Möglichkeit der Kommunikation über BLE.

Der ESP32 enthält zusätzlich zu den WiFi- und BLE-Funktionen und einer umfangreichen Peripherie eine Single- oder Dual-Core-Xtensa-LX6-CPU mit integriertem SRAM. Der ESP32 ist oft mit externen Sensoren und anderen anwendungsspezifischen Geräten über seine GPIOs verbunden. Technische Daten sind in der umfangreichen Dokumentation von Espressif zu finden [2]. Bild 1 zeigt die komplexe Funktionalität des ESP32 in einem Blockdiagramm.

Der ESP32 ist in QFN-Gehäusen (Quad-Flat-No-Leads) unterschiedlicher Größe mit 49 Pads untergebracht. 48 Anschlusspads befinden sich an den vier Seiten und ein großes, mit Masse verbundenes Wärmeleitpad an der Unterseite. Diese beiden Gehäuseformen sind industriellen Verarbeitungsprozessen vorbehalten. Es gibt Konfigurationen als Single- und Dual-Core mit 0, 2 oder 4 MB Flash-Speicher (Bild 2, Nummern 1 und 2).

ESP32-Module 

Kompakte SMD-Module lassen sich zwar schon konventionell verarbeiten, zielen aber auf die Systemintegration hin. Hier gibt es von zahlreichen Anbietern unterschiedlich ausgestattet Module. Die Unterschiede liegen dabei vor allem in der Größe des zur Verfügung gestellten Flashs, der Antenne und der Abschirmung.

In Bild 2, Nummer 3 ist beispielhaft das abgeschirmte und mit einer MIFA-Antenne ausgestattete ESP-WROOM-32 von Espressif gezeigt. Von Espressif, AI-Thinker, Pycom, U-blox und 11 weiteren Herstellern gibt es Varianten mit 1, 2, 4, 8 und 16 MB Flash-Speicher sowie Antennen der Typen MIFA, PIFA, Ceramic und U.FL Connector.

Von zahlreichen Anbietern werden unterschiedlich ausgestattete Boards angeboten, die zum einen auf den Einsatz der SMD-Module verzichten oder aber diese nutzen.

In Bild 2, Nummer 4 ist beispielhaft das Modul ESP Thing von Sparkfun gezeigt, welches aus Einzelkomponenten aufgebaut ist und zusätzlich mit einem Anschluss für eine LiPo-Batterie ausgestattet wurde. Andere Anbieter sind Espressif, Pycom, WEMOS und 8 Weitere, die Produkte mit 4, 8 und 16 MB Flash sowie Antennen der Typen MIFA, PIFA, Ceramic und U.FL Connector anbieten.

Da es recht einfach ist, ein SMD-Modul in ein finales Produkt zu integrieren, sind in dieser Sparte wesentlich mehr Anbieter zu finden. Bild 2, Nummer 5 zeigt beispielhaft das Board HUZZAH32 von Adafruit, das ebenfalls einen LiPo-Anschluss aufweist und so als abgesetzter und batteriebetriebener IoT-Knoten geeignet ist. Hier gibt es Varianten von Espressif, Adafruit, AI-Thinker, Watterott, WEMOS und 32 weiteren Anbietern, welche die Module ESP-WROOM-32, ESP32-WROVER und ESP-32S nutzen.

Eine Übersicht zu Large Development, Specialty- und Project-Boards sowie Detail-Informationen zu den hier gelisteten Komponenten einschließlich Bezugsmöglichkeiten und Preisen sind unter http://esp32.net/#Hardware zu finden. 

ESP32 versus ESP8266 

Abschließen möchte ich die Vorstellung der ESP32-Hardware mit einem Vergleich der Spezifikationen von ESP32 und ESP8266 (Tabelle 1). Auffällig ist, dass die höher getaktete CPU nun auch deutlich mehr SRAM zur Verfügung stellt. Der beim ESP8266 limitierte SRAM hat bei einigen Anwendungen immer wieder zu Problemen geführt, sodass eine geeignete Segmentierung des Programms häufig unumgänglich war. 

Die Größe des unterstützen Flashs ist unverändert, hat sich aber in der Vergangenheit kaum als limitierende Größe dargestellt.

SpezifikationenESP8266ESP32
MikrocontrollerXtensa Single-Core-32-Bit-L106Xtensa Dual-Core-32-Bit-LX6
802.11 b/g/n WiFija, HT20ja, HT40
BluetoothneinBT 4.2 und darunter
CPU-Takt80 / 160 MHz160 / 240 MHz
SRAM160 KB512 KB
FlashSPI-Flash bis zu 16 MB 
GPIO1736
Hardware/Software PWMkeine / 8 Kanäle1 / 16 Kanäle
SPI / I2C / I2S / UART2 / 1 / 2 / 24 / 2 / 2 / 2
A/D-Wandler10 Bit / 1 Kanal12 Bit / 18 Kanäle
CANnein1
Ethernetnein1
Touch Sensorneinja
Temperatursensorneinja
Temperaturbereich-40 °C - 125 °C 

 

Tabelle 1: Spezifikationen ESP8266 vs. ESP32.

Die Peripherie wurde beim ESP32 deutlich ausgebaut. Der Analog-Digital-Umsetzer (ADC) weist nun eine Auflösung von 12 Bit auf und bedient 18 analoge Eingänge. Praktisch sind zwei ADCs vorhanden, wobei bei der Verwendung von WiFi ADC2-Einschränkungen unterliegt. Dennoch bleibt eine deutliche Verbesserung gegenüber dem ESP8266.

Neu hinzugekommen sind CAN- und Ethernet-Interface, das drahtgebundene Kommunikation ermöglicht und für den industriellen Einsatz interessant sein dürfte.

Der ESP32 verfügt zudem über 10 kapazitiv abtastende GPIOs, die als Touch-Sensor verwendet werden können. Bedingt durch das Design und die hohe Empfindlichkeit kann die Fläche der Pads recht klein gehalten werden. Mit Arrays von Pads können größere Flächen oder mehrere Punkte erfasst werden. Ein interner Temperatursensor kann zur Überwachung der Chiptemperatur herangezogen werden. Wegen der Eigenerwärmung des Chips eignet sich dieser kaum zur Messung der Umgebungstemperatur. Für den industriellen Einsatz interessant dürfte der Temperaturbereich von -40 °C bis zu 125 °C sein. 

ProgrammierumgebungProgrammierspracheLink
Arduino IDE mit ESP32 Arduino-CoreC/C++[4]
Espressif IoT-Development-FrameworkC/C++[5]
Mongoose OSC & JavaScript[6]
Whitecat IDELua RTOS & Blocks[7]
PlatformIO IDEC/C++, Python[8]
Pymakr IDEPython[9][10]
ZerynthPython[11]
mrubyRuby[12]
EspruinoJavaScript[13]

 

Tabelle 2: ESP32 Programmierumgebungen.

Programmierung des ESP32

Für den ESP32 von Espressif gibt es zahlreiche Programmierumgebungen, die ohne Anspruch auf Vollständigkeit in Tabelle 2 gelistet sind. 

Da im Mittelpunkt dieses Beitrags die Arduino-IDE steht, habe ich diese an oberster Stelle in Tabelle 2 platziert. Die Installation des ESP32-Cores ist (noch) abweichend von der üblichen Arduino Prozedur über den betreffenden Link aber detailliert erläutert.

Das Espressif-IoT-Development-Framework (ESP-IDF) ist das offizielle Espressif-Development-Framework für den ESP32 und sicher das Framework der Wahl für den industriellen Einsatz.

Das Mongoose OS ist ein Betriebssystem für in JavaScript oder C-programmierbare Mikrocontroller, welches von Espressif, AWS IoT und Google Cloud IoT empfohlen wird. Einen raschen Einstieg in die Programmierung des ESP32 auf Basis des Mongoose OS kann man beispielsweise mit dem in Bild 3 gezeigten Starter-Kit erreichen.

Die Whitecat IDE unterstützt die Programmierung der ESP32 in Blocks oder Lua RTOS. Unabhängig davon, ob Blocks oder Lua verwendet wird, Grundlage ist ein und dieselbe Programmierumgebung. Bild 4 links zeigt die Notation einer Programmsequenz in Blocks, während Bild 4 rechts das in Lua zeigt. PlatformIO ist ein Cross-Platform-Code-Builder und Library-Manager und setzt auf Python auf. Dadurch läuft es auf jedem Host-System unabhängig vom da eingesetzten Betriebssystem.

PlatformIO selbst ist eine Konsolenanwendung und kann in Kombination mit einem Texteditor, wie der PlatformIO IDE für Atom, Eclipse oder andere verwendet werden.

Die Pymakr IDE dient in erster Linie zur Programmierung der ESP32-basierten Module WiPy, LoPy und anderen der in UK beheimateten Firma Pycom. Wie die Namensgebung erahnen lässt, erfolgt die Programmierung in Python. Die Pymakr IDE selbst wird von Pycom nicht weiter gepflegt und wird durch Pymakr-PlugIns für Atom und Visual Studio ersetzt werden.Ein mit der Pymakr IDE erstellter IoT-Knoten, der Temperaturmesswerte über MQTT versendet, ist im Blogbeitrag »LoPy versendet MQTT Messages« beschrieben [14].

Zerynth bietet Entwicklern ein Framework von Software-Tools, um Mikrocontroller in Python respektive Python und C zu programmieren und diese mit der Cloud zu verbinden. Zerynth zeichnet sich durch geringen Footprint aus. Es werden maximal 80 KByte Flash und 5 KByte RAM benötigt.

Will man den ESP32 in Ruby programmieren, dann steht mit mruby eine entsprechende Version zur Verfügung, während mit Espruino die Programmierung in JavaScript erfolgen kann.

Wie bereits erwähnt wird der ESP32 mittlerweile auch durch die Arduino-IDE unterstützt. Damit können in der weit verbreiteten Umgebung sogenannte Sketches mit den bekannten Arduino-Funktionen und -Bibliotheken geschrieben und direkt auf dem ESP32 (ohne externen Mikrocontroller) ausgeführt werden. Der ESP32 Arduino Core umfasst Bibliotheken, um über WiFi mit TCP und UDP zu kommunizieren, HTTP-, mDNS-, SSDP- und DNS-Server einzurichten, OTA-Updates zu machen, einem Dateisystem im Flashspeicher (SPIFFS), mit SD-Cards, Servos, SPI- und I2C-Interfaces.

Sicher haben viele Entwickler mit dem einen oder anderen ESP8266 Modul bereits Erfahrungen sammeln können. Ein ständiges Problem war, dass der zur Verfügung stehende Speicher (RAM, Heap) schnell an seine Grenzen geriet. Diese Situation ist durch die erweiterten Ressourcen des ESP32 weniger kritisch. Bild 5 links zeigt die Ressourcen des ESP8266, während Bild 5 rechts die des ESP32 gegenüberstellt.

Programmbeispiele – Benchmarks 

In meinem Beitrag zu 32-Bit-Arduinos [1] hatte ich verschiedene auf Cortex-M0+/-M3/-M4 basierende Arduinos vergleichend betrachtet und zwei einfachen Benchmarks unterzogen. 

Die CPU-Performance war mit dem »Sieve of Eratosthenes« untersucht worden und zur Messung des Schaltverhaltens der digitalen IOs wurde eine Pulssequenz in einer Endlosschleife erzeugt, die dann vermessen werden konnte.

Den ESP32 habe ich ebenfalls diesen Benchmarks unterzogen. Tabelle 3 zeigt die Benchmark-Ergebnisse für verschiedene Arduinos im Vergleich zu Ledunia, als einem Arduino auf Basis des ESP8266, und des ESP32.

Aus diesen Ergebnissen wird deutlich, dass der ESP32 den Erwartungen absolut erfüllt und die Arduino-Familie bezüglich erreichbarer Rechenleistung deutlich ergänzt.

IoT-Knoten 

Im folgenden Anwendungsbeispiel wird ein ESP32 mit einem Sensor zur Erfassung von Temperatur und Luftfeuchtigkeit ausgestattet und sendet die erhobenen Messwerte als MQTT-Message an einen MQTT-Broker (publish). Von diesem können beliebige Clients dann die erhobenen Messwerte abfragen (subscribe). Bild 6 zeigt schematisch die Anordnung. 

Bild 7 zeigt, der Programm­ablauf ist denkbar einfach. Nach Initialisierung, Konfiguration und Verbindungsaufnahme zum MQTT-Broker erfolgt die Abfrage der Sensoren. Initialisierung, Konfiguration und Verbindungsaufnahme zum MQTT-Broker werden durch Ausgaben über die Konsole dokumentiert (Bild 8).

In diesem Anwendungsbeispiel werden Messwerte für Temperatur und relative Luftfeuchtigkeit mit einem Sensor DHT11 erfasst. Sind die Messwerte dieses einfachen und kostengünstigen Sensors hinsichtlich der Genauigkeit unzureichend, dann findet man genügend Alternativen mit höherer Genauigkeit, die über ein Standard-Interface (I2C o. ä.) mit dem ESP32 verbunden werden können.

Die Messwerte werden schließlich in eine Message mit dem betreffenden Topic eingebaut und an den Broker versendet. Auf die Angabe des Quelltextes wird hier aus Platzgründen verzichtet. Dieser steht wie der aller anderen Programmbeispiele auf Github (https://github.com/ckuehnel/ESP32) zum Download zu Verfügung.

Die Zugangsdaten zum WiFi-Netzwerk und zum MQTT Broker sind in ein separates File credentials.h ausgelagert. Hier sind die anzupassenden Einträge:


// This file contains credentials to access several services

const char* mySSID = „<Your SSID>“;

const char* myPW = „<Your Password>“;

// MQTT (CloudMQTT) const char* BROKER = „m20.cloudmqtt.com“;

uint16_t BRPORT = 12394; const char* BRUSER = „<Your Username>“;

const char* BRPWD = „<Your Password>“;

const char* CLIENTID = „ESP32-Client“; 

Die Zugangsdaten vom MQTT-Broker erhält man nach der Registrierung bei CloudMQTT (https://www.cloudmqtt.com).

Um auf die zum MQTT-Broker gesendeten Daten zugreifen zu können, habe ich die App IoT MQTT Dashboard aus dem Playstore von Google heruntergeladen und auf meinem Smartphone installiert. Nach Subscription der beiden Topics ESP32/temp und ESP32/humi werden die Messwerte auf dem Dashboard visualisiert (Bild 9). 

Schlussbemerkung

Mit Espressifs ESP32 steht ein leistungsfähiger Mikrocontroller zur Verfügung, der durch die Integration in die Arduino Umgebung schnell und einfach in Betrieb genommen werden kann.

Die Benchmarks zeigen die Performance des ESP32 im Vergleich zu anderen 32-Bit-Arduinos und die MQTT-Anwendung, wie mit Hilfe vorhandener Bibliotheken Anwendungen komfortabel erstellt werden können. (fr)

BoardArduino UnoArduino M0Arduino DueLeduniaESP32 Dev Kit
CPUATmega328ATSAMD21G18 (arm Cortex-M0+)AT91SAM3X8E (arm Cortex-M3)ESP8266EXESP32
Clock16 MHz48 MHz84 MHz80 MHz240 MHz
Runtime18267 ms5180 ms3451 ms2189 ms805 ms
IO- Periode11,60 us3.24 us4,32 us5 us3 us
I/O-Frequenz86,21 kHz308,6 kHz203,3 kHz200 kHz333 kHz

 

Tabelle 3: Benchmark-Ergebnisse.

Referenzen:

[1] Arduino32: Die jungen Wilden (Teil 2). DESIGN & ELEKTRONIK 06/2016 S.14-17, http://www.elektroniknet.de/embedded/arduino32-die-jungen-wilden-131502.html

[2] Espressif ESP Dokumentation: https://www.espressif.com/en/support/download/documents?keys=&field_type_tid%5B%5D=13

[3] Arduino IDE mit ESP32 Arduino Core: https://github.com/espressif/arduino-esp32

[4] Espressif IoT Development Framework: https://github.com/espressif/esp-idf

[5] Mongoose OS: https://mongoose-os.com/ Whitecat IDE: https://whitecatboard.org/the-whitecat-ide/

[6] PlatformIO Ecosystem und IDE: https://platformio.org/platforms/espressif32

[7] Pymakr IDE: https://forum.pycom.io/topic/11/pymakr-full-release-now-available

[8] pymakr Plugins: https://docs.pycom.io/chapter/pymakr/

[9] Zerynth – Python für IoT und Mikrocontroller: https://www.zerynth.com/

[10] mruby für den ESP32: https://github.com/mruby-esp32

[11] Espruino – JavaScript SDK und Firmware: http://www.espruino.com/ESP32

[12] LoPy versendet MQTT Messages: https://pycom.wordpress.com/lopy-versendet-mqtt-messages