Loslegen mit dem ESP8266

Send to Kindle

Als mein Hausautomatisierungsbuch entstand war der ESP8266 – ein günstiger Microcontroller mit integriertem WLAN-Modul in 1000er Stückzahlen zu unter 2€ – noch nicht auf dem Markt, bis Ende 2014 war es zudem nur möglich, den Microcontroller mit WLAN-Modul nur über seine serielle Schnittstelle (AT-Befehle) anzusprechen, was immer einen separaten Microcontroller nötig machte. Mittlerweile hat die ESP8266-Community Hardware-Unterstützung als Drop-In für die Arduino-Entwicklungsumgebung bereitgestellt, welche die direkte Programmierung des Microcontrollers erlaubt. Dies schafft enorme Freiheitsgrade z.B. bei der Gestalung von Webseiten, die mit dem integrierten Webserver ausgeliefert werden oder der längerfristigen Speicherung von Sensordaten.

Einfache ESP8266-Boards führen nicht alle Pins heraus, verfügen über ein kleines Flash-Modul und benötigen zur Programmierung einen FTDI-Adapter

Einfache ESP8266-Boards führen nicht alle Pins heraus, verfügen über ein kleines Flash-Modul und benötigen zur Programmierung einen FTDI-Adapter

Die Hardware

Beim Microcontroller handelt es sich um einen Tensilica Xtensa mit 32 Bit, er hat 64 KiB Befehlsspeicher und 96 KiB Datenspeicher, die maximale Taktung beträgt 80MHz. Die Peripherie ist mit 17 GPIO-Pins, davon einem SPI-Bus (üblicherweise zur Anbindung von bis zu 16MiB Flash genutzt) und zwei UARTs passabel ausgestattet. Ein einziger ADC (analoger Input) mit 1,0V Referenzspannung dient in der Regel zur Batteriekontrolle, er kann wegen der fixen Referenz nur sehr eingeschränkt zum Auslesen analoger Sensoren verwendet werden.

Boards mit ESP8266 gibt es in den verschiedensten Ausführungen: Die einfachste Variante sind Platinen, die lediglich den ESP8266 enthalten und vier bis sechs Pins herausführen (plus VCC und GND), diese sind typischerweise dafür vorgesehen, über die serielle Schnittstelle angesprochen zu werden. Wer nur vier Pins (bspw. zum Schalten von Relais benötigt) und der Speicher des Controllers ausreicht (für ausgelieferte Webseiten), kann mit diesen Modulen bereits einfache Steuerungsaufgaben erledigen. Wer solch ein Modul mit 2×4 Pins oder weniger kauft, sollte unbedingt die Board-Schematics anschauen und darauf achten, dass neben dem UART wenigstens GPIO0 (Bootloader aktivieren) und möglichst auch GPIO16 (Wake) herausgeführt sind. Ohne GPIO0 kann das Modul nicht (bzw. nur sehr umständlich) geflasht werden!

Etwas teurere Module enthalten einen per SPI angebundenen Flash-Chip, typischerweise mit 1MiB bis 4MiB (damit lassen sich bereits umfangreiche Webinterfaces realisieren) und führen mehr Pins nach außen (ich verwende eine Platine im DIL18-Format, die etwa die Hälfte der Pins zugänglich macht). „Top of the line“ sind Module wie NodeMCU, die praktisch alle Pins nach außen führen und einen USB-Seriell-Wandler auf dem Board verlötet haben, so dass keine separate FTDI-Platine notwendig ist.

Die Preise rangieren von ca. 3€ für Minimallösungen über 8€ (NodeMCU) bis 13€ (Wroom 02). Als Bezugsquelle ist Watterott Electronic nicht teurer als bspw. Amazon. Der Chinaimport bspw. via Banggood.com lohnt sich nur bei größeren Stückzahlen der Minimalboards oder bei Sonderwünschen wie Platinen im Uno-Format.

Wichtig ist, dass der ESP8266 mit 3,3 Volt läuft und nicht 5V tolerant ist! Beiträge wie dieser legen nahe, dass der Betrieb mit 2,4V (zwei bereits recht leere AA-Zellen) über 3,7V (Lithium-Ionen-Zelle, drei AA-Akkus) bis 4,2V (Lipo-Zelle) stabil möglich ist. Über 3,7V würde ich wegen der darüber deutlich ansteigenden Stromaufnahme nicht gehen. Das bedeutet, dass ein USB-Seriell-Wandler genutzt werden muss, der auf 3,3V gejumpert werden kann (bspw. dieser hier)!

Die Software

In der Arduino IDE (getestet mit 1.8.4) fügen Sie unter „Datei > Voreinstellungen“ die zusätzliche Boardverwalter-URL hinzu:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

Anschließend öffnen Sie „Werkzeuge > Board > Boardverwalter“ und suchen dort nach „esp8266“. Installieren Sie nun „esp8266“ des Herausgebers „ESP8266 Community“.

Installation der ESP8266-Unterstützung über der Boardverwalter von Arduino

Installation der ESP8266-Unterstützung über der Boardverwalter von Arduino

Die Verdrahtung

Angeschlossen wird das Modul wie folgt:

  • VCC an 3,3V des USB-Seriell-Wandlers
  • GND an GND des USB-Seriell-Wandlers
  • RX an TX des USB-Seriell-Wandlers
  • TX an RX des USB-Seriell-Wandlers
  • Enable oder Chip Enable (oft als E oder C auf der Platine gekennzeichnet) an VCC
  • D0 auf GND – versetzt das Modul in den Bootloader-Modus
  • (Einige Boards benötigen Reset mit 10kΩ oder 12kΩ auf HIGH gezogen, einfach ausprobieren, ob es sauber läuft)

Ich habe noch eine LED an GPIO14 angeschlossen, um als allererstes Beispiel einen Blink-Sketch ausprobieren zu können.

Wichtig: GND nach GPIO0 aktiviert den Bootloader-Modus, Enable muss mit VCC verbunden sein

Wichtig: GND nach GPIO0 aktiviert den Bootloader-Modus, Enable muss mit VCC verbunden sein

Erste Sketches

Klar, ein Blink-Sketch:

#define LED_BUILTIN 14
 
void setup() {                
  pinMode(LED_BUILTIN, OUTPUT);     
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);    
  delay(100);           
  digitalWrite(LED_BUILTIN, LOW); 
  delay(900);  
}

Schließen Sie erst einen Moment vor dem Upload den FTDI-Adapter an, warten Sie bis der Port verfügbar ist und starten Sie dann den Upload (im Regelfall mit den Default-Werten). Klappt der Upload nicht, lassen Sie den FTDI am Computer, trennen kurz VCC des ESP8266 und probieren Sie es erneut.

Um die WLAN-Funktion zu testen, laden Sie „Datei > Beispiele > ESP8266WebServer > HelloServer“ auf das Modul (natürlich, nachdem Sie ESSID und WPA-Schlüssel angepasst haben). Wenn der Sketch hochgeladen ist, zeigt der serielle Monitor (115200 Baud!) die IP-Adresse an.

......
Connected to pinguinbaendiger
IP address: 10.76.23.110
MDNS responder started
HTTP server started

Jetzt können Sie den Server ansurfen und erhalten eine Plaintext-Seite:

hello from esp8266!

Die mitgelieferten Beispiele zeigen recht gut, wie man Webformulare zum Schalten von LEDs oder Relais bauen kann, daher möchte ich dies an dieser Stelle nicht weiter vertiefen.

Wenn der ESP8266 ohne PC genutzt wird, trennen Sie die Verbindung GND nach GPIO0, der ESP befindet sich sonst bei jedem Start im Bootloader-Modus! GPIO0 kann in Sketches als normaler Input-Output-Pin genutzt werden. Wird er als Output genutzt, verwenden Sie bitte einen 10kOhm-Widerstand zur Aktivierung des Bootloaders, da sonst nach dem Reset zu schnell ein zu hoher Strom fließt!

Wie geht es weiter?

  • Stromaufnahme: Der ESP8266 benötigt beim Boot 300mA, im AP-Modus 80mA, im Clientmodus 30mA und im Sleep 10µA bis 30µA – tatsächlich wohl aber oft 100µA, je nach verlöteten Komponenten (Flash-Modul), ich werde zeigen, wie man in den Sleep-Modus gelangt, immerhin locken dann Laufzeiten von einigen Monaten auf AA-Batterien, wenn stündlich Sensordaten übertragen werden.
  • Eingeschränkter analoger Input: Attiny oder Atmega können analoge Inputs und Outputs bereitstellen und per serieller Schnittstelle oder SPI mit dem ESP8266 kommunizieren, ich werde Eigenbau-Protokolle mit kleinem Overhead und Kniffe vorstellen.
  • Betrieb mit Solarzelle: Bereits eine kleine Solarzelle mit 4V und 35mA zusammen mit einer Ladeschaltung und Akku genügt, um stündlich Sensordaten zu übertragen.
  • Eine Bridge-Bibliothek: Mich reizt der Gedanke, auf ESP-Seite eine Teilmenge der Bridge-Funktionalität zu implementieren, um für Arduino Yún geschriebene Anwendungen leicht auf die Kombination aus ESP und Atmega328 portieren zu können. Mal sehen, ob es etwas wird…

Diskussionsbedarf? Bitte auf Google+ diskutieren…