Arduino IDE mit dem ESP8266

Der ESP8266 ist ja schon länger im Gespräch. Allerdings: wozu einen Arduino (ab $2,50) noch anhängen, der um die 32k Speicher hat und auf 16MHz läuft, wenn der ESP ($2,40) selber bis zu 4 MB Flash und 18 11 GPIOs bei 80 oder sogar 160 MHz hat? Seit ein paar Tagen gibt es einen Aufsatz für die Arduino IDE, wie es auch schon beim Teensy der Fall ist. Lohnt es sich wirklich?

Randnotiz: Je nach Board-Typ gibt es unterschiedliche Pins, die auf dem Breakout sind – minimum sind aber 4 (inkl. Rx (GPIO 3) und Tx (GPIO 1)). Eine Übersicht über die Pin-Namen gibt es im Bild.

Arduino IDE Umgebungen

Variante 1 (aktueller, aber eigenständig): Man läd sich eine zweite IDE herunter, die dann fertig gepackt ist: von GitHub laden
Variante 2 (schnell und einfach): Man läd sich nur die Hardware Library herunter und bindet die selber ein: ebenfalls auf GitHub verfügbar
Variante 3 (schnell, einfach UND aktuell): Arduino >= 1.6.5 öffnen, in den Einstellungen unten http://arduino.esp8266.com/stable/package_esp8266com_index.json eintragen. Dann unter Tools > Board „…“ > Board Manager… auswählen, esp8266 anklicken und Install drücken. Um eine neue Version zu installieren den letzten Schritt bei Verfügbarkeit wiederholen.

Selber einbinden klingt ein bisschen schwerer, als es ist: ZIP herunterladen und entpacken. In dem Ordner befinden sich neben den Git-Dateien auch der Ordner esp8266com. Den verschiebt man einfach in den Arduino-Ordner /hardware – da wo auch die Sketche platziert sind (bei mir ist das ~/Dokumente/Arduino/hardware). Meine Erfahrungen habe ich mit der 2. und 3. Variante gemacht. Die extra IDE habe ich mir auch installiert, der Aufwand ist es mir allerdings nicht wert, bei jedem Update die gesamte IDE zu ersetzen (Teensyduino nachzuinstalliern) anstatt einfach nur den einen Ordner zu überschreiben.

Programm schreiben

Nach dem Öffnen findet man eine neue Kategorie in der Boardauswahl, in der sich auch Generic ESP8266 board befindet. In den Beispielen finden sich auch neue Sketche:

  • ESP8266WebServer Ein einfaches Hello World Programm für die Serverfunktion
  • ESP8266mDNS Server mit mDNS (gerätename.local)
  • ESP8266WiFi Verschiedene Sketche: Scanner, Server und ein Client (normales WLAN Gerät, das sich in ein bestehendes Netzwerk einwählt). Inzwischen auch ein NTP-Client (Zeitsynchronisation über das Internet)

Ich habe bisher nur meine Briefkasten-Benachrichtigungen mit einem ESP-01 Modul programmiert und dazu auf dem Client-Sketch aufgebaut. Die Syntax ist Arduino-konform einfach, da jetzt alles eigene Librarys hat und die Kommunikation intern verläuft und nicht von einem Arduino nur mit AT-Kommandos über die serielle Schnittstelle.

Da die Beispiele selbsterklärend sind binde ich hier keinen Code mit ein – wer sich das trotzdem erst einmal angucken möchte, kann die Dateien auch auf GitHub einsehen. Die Pins lassen sich normal mit digitalWrite()/digitalRead()/pinMode() entsprechend dem oben verlinkten Bild ansprechen, allerdings sind keinerlei PullUps/-Downs verfügbar, bedeutet I2C und Buttons muss man mit externen Widerständen versehen. Eins muss man aber lassen: die Pins wackeln nicht im Floating rum sondern halten ihren letzten Pegel, wenn sie als Eingang definiert sind und keinen Widerstand haben.

Verkabelung

Zum Programmieren muss man das ESP-Modul wie folgt verbinden:

  • SC_PD/CHIP_EN auf VCC (dem Modul überhaupt erst mal sagen, dass es laufen soll)
  • Tx und Rx über Kreuz an ein USB-Serial Modul
  • VCC an 3,3V – der ESP ist nicht 5V Tolerant!
  • GND natürlich mit der Masse verbunden
  • GPIO0 muss zum Programmieren auf Masse gezogen werden
  • RST kann offen bleiben, ich habe allerdings einen PullUp (10k) eingebaut

Als Platine ist das dann deutlich einfacher für mehrere Projekte:

Das Overlay habe ich auch als PDF mit verschiedenen Ansichten zum selber ausdrucken. Sollte exakt passen. Mein Platinenlayout ist geeignet für den ESP-01. Für andere Versionen muss das Layout verändert werden.

Beim Tx Pegel sollte man auch drauf achten, dass dieser nicht auf 5V läuft. Einige Adapter haben zwar einen Jumper, den man von 5V auf 3V3 umlöten kann, teilweise wird damit allerdings nur VCC und nicht der Datenpegel geändert. Allerdings wäre dies weitaus harmloser, als den ESP mit 5V an VCC zu versorgen. Die einfachste Abhilfe schafft ein Spannungsteiler mit zwei Widerständen, deren Werte etwa im Verhältnis 1:2 sind. Beispielsweise 1kΩ von TxUSB an RxESP und 2k2Ω von TxUSB an GND. Dadurch wird der Pegel auf 5V * 2k2Ω / (1kΩ + 2k2Ω) = 5V * 2.2 / 3.2 = 3,4V gesenkt.

Die USB-Serial Adapter gibt es zuhauf bei eBay, damit lassen sich dann auch Arduino Pro Minis programmieren (haben extra eine 6-polige Leiste für die Adapter). Sollte man allerdings keinen Adapter zur Hand haben und einen ESP und Arduino schon sein Eigen nennen können, gibt es Alternativen:

  1. Das vorliegende Modell ist ein Arduino Uno:
    Den ATmega entfernen und den ESP mit Kabeln an 3.3V und GND nach obiger Beschreibung anschließen. Da die Tx und Rx Markierungen auf den ATmega328/168 zutreffen und nicht den 16u2 oder in den Billignachbauten den USB-Serial Wandler, müssen die Leitungen nicht gekreuzt werden. Bedeutet Tx vom Arduino and Tx am ESP, das gleiche Spiel auch bei Rx.
  2. Hat man stattdessen einen Nano oder will den ATmega einfach nicht entfernen:
    Den Arduino mit dem BareMinimum (also einem leereren Sketch) bespielen. Dann sollte die Kommunikation auch klappen. Verkabelung wie bei 1.
  3. Hat man einen Leonardo oder Micro gestaltet sich das ganze schwieriger, aber nicht unmöglich:
    Kurz gegoogelt und gefunden: einfach den im Artikel beschriebenen Sketch auf den Arduino spielen, Verkabelung muss hier jedoch wieder gekreuzt erfolgen.

Dabei sollte beachtet werden, dass der Standardpegel 5V beträgt, Tx muss also einen Spannungsteiler haben. Rx wird durch den Pegel des Tx der Gegenstelle, also dem des ESP definiert. Der Pegel von 3V3 reicht hier, um ein logisch HIGH zu erkennen. Hier wird also weder Pegelwandler, noch Spannungsteiler benötigt.

Programmierung

Die Kompilierung dauert etwas länger, als bei einem ATmega328 – es muss auch noch das normale ESP System mit eingebunden werden (ca. 200k groß) und der gesamte Flash überschrieben werden. Zeitlich ist es vergleichbar mit einem MEGA2560. Der Upload sollte dann mit „esptool“ anstatt avrdude in der kleinen Konsole unten vonstatten gehen. Hier bin ich allerdings erst einmal auf Feedback angewiesen – auf meinem Mac hat es nicht ganz reibungslos geklappt. Der folgende Fehler ist laut Forenbeiträgen jedoch wohl Mac-spezifisch, unter Windows sollte es klappen. Sollte der Upload abbrechen, so ist der ESP u.U. nicht im standard Bootloader. Dazu mit GP0 auf LOW einfach noch einmal Reset betätigen. Nach dem erfolgreichen Programmieren startet er das Programm unabhängig vom Pegel an GP0.

Probleme unter MacOSX (in alten Versionen)

Der Upload startet, wird allerdings mit einem Fehler quittiert (der sich auch bei Anderen reproduzieren lässt). Nach etwas googlen bin ich auf eine Workaround gestoßen. Ich habe allerdings das verlinkte pyesptool nicht in dem von ihm vorgeschlagenen Ordner eingebunden (setzt die Modifikation der Arduino IDE voraus und ist somit beim nächsten Update futsch), sondern in {Sketchordner}/hardware/esp8266com/esp8266/tools platziert. In der platform.txt muss demnach eine Zeile geändert werden:
tools.pyesptool.path={runtime.hardware.path}/esp8266/tools/pyesptool
Vorher stand dort {runtime.ide.path}.

Man muss noch python-serial installiert haben (unter UNIX-Systemen mittels pip install pyserial). Allerdings meckert er in der IDE dann beim Upload mit Programmer (vorher pyesptool aus der Programmerliste auswählen), dass er serial nicht importieren kann. Ich habe dann einfach das Kommando aus dem kleinen schwarzen Fenster kopiert und in der Kommandozeile direkt ausgeführt. Siehe da es klappt. Das wird wohl mit der Zeit noch besser, ist ja erst seit wenigen Tagen verfügbar.
Die Problematik besteht bei mir mit esptool v0.4.2 ({esp8266com-Ordner}/esp8266/tools/macosx/esptool -v)

Fazit: ja, es lohnt sich! Jetzt viel Spaß mit euren kleinen Strahlenmaschinen!

*Info: In diesem Beitrag verweisen orangefarbende Links auf Affiliates.