Jakobs Blog Coden für Spass und Erfahrung

ESP8266: Ein minimaler Computerchip mit Internetfähigkeit

Der Prozessor: Gerade mal 5 mm auf 5 mm! Das komplette Modul? 1.4 cm auf 2.5 cm.

Der ESP8266 ist ein Mikroprozessor der alle nötigen Protokolle ab Fabrik beherrscht, um über ein lokales Wifi Netz mit dem Internet zu kommunizieren. In diesem Beitrag behandle ich eines der gängigsten Module mit diesem Mikroprozessor verbaut, das ESP-01S Modul.

Auf dem Bild zu sehen ist bereits das komplette ESP-01S Modul. Es fehlt wirklich nur noch die Stromquelle und dann ist das Ding in Lage sich mit dem Internet zu verbinden. Erhältlich sind sie auch als Privatperson für unter 3 CHF und jegliche benötigte Software zur Programmierung ist offen verfügbar!

Was kann man damit machen?

Bild: Der Chip in meiner Hand

Die Möglichkeiten für Projekte mit einem ESP-01S sind nahezu unbegrenzt. Das Modul ist klein genug um im Zentrum einer Smartwatch zu sein. Man könnte es auch an eine Sicherheitskamera hängen und somit die aufgezeichneten Daten auf einen Server verschicken. Oder, man könnte sogar soweit gehen und einen intelligenten Roboter bauen, der mithilfe des ESP-01S an das Internet angebunden ist. Da die Rechenpower des Chips doch eher begrenzt ist, würde ich die eigentlichen Berechnungen auf einen dedizierten Server auslagern, womit der Roboter kaum Strom brauchen wird und auch schön leicht bleibt.

Ich für meinen Teil habe mich erst einmal dafür entschieden, eine 8x8 LED Matrix anzusteuern und darauf Daten aus dem Web anzuzeigen. Konkret sehe ich darauf, wann ich die nächste ÖV Verbindung in die Stadt habe, mit live Daten aus dem Internet. Eine komplette Beschreibung des Projektes wird in weiteren Beiträgen folgen. Hier möchte ich erst einmal die Grundlagen über den Chip beschreiben.

Technischer Aufbau des ESP-01S

Bild: ESP8266 Komponente

Der Prozessor

Im Herzen ist ein 32-bit RISC Prozessor, der ESP8266. Entwickelt wurde er durch die internationale Firma Espressif Systems mit Hauptsitz in Schanghai.

Das Datenblatt verrät uns, was genau im Chip drin steckt. Mit einer Geschwindigkeit von 80MHz rechnet er unter anderem die Protokolle 802.11 (umgangssprachlich auch Wifi genannt), IPv4, TCP und HTTP. Zusammengefasst, alles was man braucht um Daten von einer beliebigen Webseite abzuholen. Oder alternativ kann ein Chip auch als Wifi-Station operieren. Damit kann man beispielsweise ein Smartphone direkt verbinden, ohne Zwischenschaltung eines Wifi-Routers.

Doch ein Mikrocontroller braucht auch das andere Ende, nämlich Pins um Elektronik direkt per Stromsignal zu kontrollieren. Davon hat der Chip insgesamt 32, wobei 16 davon sogenannte GPIOs sind. Dies sind Allzweckpins, die wir flexibel zum Empfangen oder Senden von Signalen verwenden können und sind daher von besonderer Bedeutung für uns.

Das Modul

Da der Prozessor alleine kaum nützlich ist, bringt das ESP-01S Modul die weiteren nötigen Komponenten hinzu. Grob zusammengefasst handelt es sich um:

  • 1MB Flash Speicherplatz worauf unsere Software gespeichert werden kann
  • Eine Wifi Antenne
  • Ein Schwingquarz für die Taktung bei der seriellen Kommunikation (UART)
  • Verbindungen von den wichtigsten Pins zu gut erreichbaren Steckern. Die 8 verfügbaren Stecker sind:
    • 3V3: Stromeingang
    • GND: Die Erdung / Der Stromausgang
    • EN: Wird verwendet, um verschiedene Modi des Chips zu starten
    • RST: Kann verwendet werden zum Neustarten
    • RX: UART Empfänger (Kann auch als GPIO verwendet werden)
    • TX: UART Sender (Kann auch als GPIO verwendet werden)
    • IO0: GPIO
    • IO2: GPIO

Mit diesen Erweiterungen wird aus dem Mikroprozessor ein vollwertiger Mikrocontroller der mit neuer Software programmiert werden kann und mit der Aussenwelt kommunizieren kann.

Allerdings bleiben bei diesem Modul die meisten Pins ungenutzt, gerade einmal 4 von 16 GPIOs sind verfügbar. Und die anderen 16 Pins, die für spezifische Funktionen vorgesehen sind, wie zum Beispiel für den Flash Speicher Anschluss, werden intern auch nicht alle verwendet. Aber alle grundlegenden Funktionalitäten sind gegeben und mit den reduzierten Funktionen bleibt der Chip schön kompakt.

Programmieren des ESP8266

Als Nächstes will ich beschreiben, wie wir unsere eigene Software auf dem ESP8266 ausführen können. Zuerst müssen wir die Software zu einer binären Datei kompilieren können die der Chip versteht. Danach müssen die Daten auf den Flash Speicher kopiert werden, was auch flashen genannt wird.

Software schreiben und kompilieren

Es gibt unterdessen eine Vielzahl an Möglichkeiten, wie man Programme für die ESP8266 Familie schreiben kann. Zum Beispiel kann mit der NodeMCU Plattform direkt in der Skriptsprache Lua programmiert werden. Oder ein weiteres interessantes Beispiel ist dieses Projekt, dank welchem die beliebte Arduino IDE verwendet werden kann um ESP8266 Programm zu schreiben.

Ich habe mich aber für den traditionellen Weg entschieden, alles direkt in C zu programmieren. Espressif stellt Programmierern dazu ihr SDK zur Verfügung, zusammen mit einer ausführlichen Dokumentation. Somit kann man auf relativ einfache Weise direkt auf die Funktionalitäten des Mikroprozessors zugreifen.

Toolchain installieren

Für die Installation aller Entwicklungssoftware habe ich mich vollkommen auf das ESP Open SDK Projekt gestützt. Nachdem ich der verlinkten Anleitung gefolgt bin, musste ich noch ein paar Versionskonflikte von verschiedenen vorinstallierten Programmen beheben und alle Berechtigungen im Dateisystem berichtigen und nun habe ich eine funktionstüchtigte Entwicklungsumgebung auf meiner Ubuntu LST 16.04 Installation.

Wie so üblich bei C Projekten, hilft ein Makefile aus um die langen Kompilierungsbefehle zu bündeln. In meinem konkreten Fall ist der Befehl der sich hinter make verbirgt wie folgt:

xtensa-lx106-elf-gcc -I. -mlongcalls -I/home/jakob/esp-open-sdk/sdk/include     -c -o blinky.o blinky.c
xtensa-lx106-elf-gcc -T/home/jakob/esp-open-sdk/sdk/ld/eagle.app.v6.ld -L/home/jakob/esp-open-sdk/sdk/lib  blinky.o  -nostdlib -Wl,--start-group -lmain -lnet80211 -lwpa -llwip -lpp -lphy -lc -Wl,--end-group -lgcc -o blinky

Damit wird mein erstes Testprogramm blinky.c kompiliert und auch gleich das binäre Abbild erstellt, welches zum ESP8266 passt.

Flashing

Wenn wir einmal die binären Daten haben, müssen wir sie nur noch auf den Chip herüberkopieren. Aber dies bringt auch noch ein paar Herausforderungen mit sich.

Verbindung zum Computer

Bild: USB TTL Adapter

Dieser USB TTL Adapter passt perfekt zum ESP-01S. Und wenn ich den Chip damit an meinen Laptop anstecke, läuft er einwandfrei und ich kann auch TTL Signale über PuTTY empfangen. Wichtig beim Kauf eines Adapters ist, dass er 3.3V als Stromquelle liefert und auch für die Datenübertragung 3.3V Spannung benutzt. Der erste Adapter den ich gekauft hatte, lieferte 5V für die Datenübertragung und war somit unbrauchbar für den ESP8266.

Den Bootloader ansprechen

Steckt man den Chip einfach auf den Adapter und diesen wiederum an den Computer, dann startet die aktuell installierte Software auf dem Flash Speicher. Um die Binaries dem Chip zu überreichen, muss der Chip aber im Bootloader Mouds starten. Dies erreicht man mit folgender Konfigruation auf den Pins beim Starten des Chips:

Pin Wert
EN +
IO0 -
IO2 +

Um alle Pins richtig einzustellen, habe ich einfach noch eine externe Stromquelle beigezogen um die Pins, die auf dem Adapter falsch sind, manuell auf die entsprechenden Werte zu setzen. IO0 schien schon richtig gesetzt zu sein, daher musste ich nur noch EN und IO2 an eine positive Spannung anschliessen. Das sieht in meinem Fall so aus:

Bild: Verbindung an den Computer

Mit dem Computer verbunden und im Bootloader Modus, kann das eigentliche Flashing beginnen. Besipielsweise über esptool.py können wir das voher kompilierte Programm auf den Chip kopieren:

esptool.py write_flash 0 blinky-0x00000.bin 0x10000 blinky-0x10000.bin
  esptool.py v1.2
  Connecting...
  Auto-detected Flash size: 8m
  Running Cesanta flasher stub...
  Flash params set to 0x0020
  Writing 32768 @ 0x0... 32768 (100 %)
  Wrote 32768 bytes at 0x0 in 2.9 seconds (91.9 kbit/s)...
  Writing 200704 @ 0x10000... 200704 (100 %)
  Wrote 200704 bytes at 0x10000 in 17.4 seconds (92.2 kbit/s)...

Fertig! Das Programm ist auf dem Chip drauf und wird ausgeführt!

In weiteren Beiträgen werde ich dann auch Programmcode zeigen, den ich in meinem Projekt verwendet habe.