logo

Elektronik-Dachbude

 

logo

Erste Schritte mit dem WLAN-Modul ESP8266

Inhalt:

Einleitung
Inbetriebnahme
Connect It!
    - AccesPoint
    - Client
Server Einrichten
ESP8266 und Arduino



Einleitung

Vielleich ist dem ein oder anderen bereits das WLAN Modul ESP8266 über den Weg gelaufen. Es scheint sehr populär zu sein. Das liegt vermutlich daran, dass es besonders günstig ist. Mit nicht einmal 3-4€ direkt aus China oder für 7-10€ von einem Distributor in Deutschland ist das Modul bei Ebay zu finden. Also ein sehr günstige Alternative beispielswiese zum Arduino Yun mit rund 70€. Also habe ich mir gleich eines dieser Module bei einem deutschen Ebay-Händler bestellt und einige erste Versuche zum Thema Internet of Things unternommen.


Inbetriebnahme

Es scheint verschiedene Versionen und Typen des Moduls zu geben. Meine Variante ist auf dem Bild oben abgebildet. Vermutlich handelt es sich um Version3. Die Platine hat einen 8-Pin-Stecker und muss mit 3,3V betrieben werden. Dies scheint besonders wichtig zu sein, da es an mehreren Stellen erwähnt wird. Die des Öfteren vorkommende 5-V-Toelleranz von Modulen gilt hier nicht.

Auf 3,3V umgebautes FTDI-Board mit aufsteckten Steckverbindungen (damit die Kabel passen)

Angesteuert wird das Modul über eine serielle Schnittstelle, ebenfalls mit 3,3-V-Pegeln. Deswegen habe ich ein umgebautes FTDI-Board benutzt, wie auf dem Bild ersichtlich. Allerdings muss man die einen oder anderen Besonderheiten beachten.

Pinbelegung des Moduls von unten

Dies ist das Pinout des Moduls von unten (auf meisten anderen Seiten andersherum!). In meinem ersten Versuch habe ich das Modul ganz gewöhnlich mit Spannung versorgt, und RXT und TXD über kreuzt (RXD mit TXD vom FTDI-Board verbinden und andersherum) mit den Pins des FTDI-Boards verbunden. Die rote PowerLED des Boards hat auch geleuchtet, allerdings blieben alle Kommunikationsversuche ohne Reaktion.  Nach ein wenig Recherche fand ich schließlich raus, dass der PD Pin auf High geschaltet werden muss. Doch als ich den Pin mit VCC vom FTDI-Board verbunden habe, kam der USB-Disconect-Sound und das Modul war Spannungslos. Ich dachte zunächst, dass ich den Reset-Pin erwischt hätte. Es hat sich allerdings rausgestellt, dass die Leistung des FTDI-Boards in dieser Konstellation tatsächlich nicht ausreichte.  Auf einer Seite habe ich gelesen, dass das Modul beim Start bis zu 80mA benötigt. Also musste ich eine externe Spannungsquelle dazuschalten.

Nun ist das aufgetreten, was in mehreren Quellen beschrieben wurde: Beim Einschalten blinkt die blaue StatusLED kurz auf und die rote PowerLED bleibt konstant an. Bei geöffneten Arduino Terminal erscheint zudem folgende Meldung:

 

Ein erster Erfolg: Die Kommunikation steht.  


Connect It!

Die erste Verbindung war nun bereits insofern erfolgreich, dass Daten die das Modul geschickt hat, ausgelesen werden konnten. Ob auch Daten in Form von Befehlen an das WLAN-Modul gesendet werden können steht also noch nicht fest. Dazu benötigen Sie nun wieder ein Terminal Programm – am besten den Serial Monitor der Arduino Software. Sie können zwar auch andere Terminals benutzen, allerdings werden die Befehle nur erkannt, wenn sie in einem besonderen Format geschickt werden. Sie müssen nämlich nach jedem Befehl nicht nur das <CR> (Carriage Return) Zeichen, sondern auch das NL (New Line) Zeichen senden. Die meisten Terminalprogramme senden CR wenn Sie Enter drücken, allerdings nicht NL. Im Arduino Terminal lässt sich diese Funktion einstellen, wie Sie auf dem unteren Bild sehen können.

Die Baudrate betrug bei mir übrigens 9600. Auf diversen Seiten habe ich aber auch von einer Standarteinstellung von 115200 oder  57600 gelesen. Wenn Sie also Nichts oder nur Kauderwelsch empfangen, probieren Sie ein bisschen mit der Baudrate herum. Wenn Sie beim Einschalten des Moduls den Text empfangen ist das ja schon ein gutes Zeichen, dass die Baudrate stimmt. Nun können Sie testen, ob Sie Befehle senden können. Bei den Befehlen handelt es sich um sogenannte AT-Befehle (at steht für attention). Das erste Kommando das Sie ausprobieren können lautet einfach AT. Es sollt ein einfaches OK zurückkommen. Das Kommando hat keine Funktion, außer dass Sie nun wissen, dass die Kommunikation einwandfrei funktioniert. Sie können nun auch einen der folgenden Befehle ausprobieren:

AT+GMR                                           Gibt Firmware Version aus

AT+RST                                             Resetet den Controller

AT+CIOBAUD=<baudrate>          Stellt neue Baudrate ein (in diskreten Werten bis 921600)

AT+CIOBAUD?                                Fragt die aktuelle Baudrate ab

Sie sollten immer auf die Großbuchstaben achten, sonst kommt ein Error zurück. Übrigens können Sie bei fast allen Befehlen ein Fragezeichen anhängen, um die aktuelle Einstellung abzufragen.

 

Nun wird es Zeit das Modul mit einem anderen WLAN-fähigen Gerät verbunden werden. Es gibt drei Varianten, wie sich das Modul dabei verhalten soll.

Die erste Variante ist das Modul als AccesPoint zu verwenden. Das bedeutet, dass das Modul sozusagen wie ein Router funktioniert und ein WLAN-Netzwerk bereitstellt. Andere Geräte, wie z.B. Smartphones können sich dann in dieses Netzwerk einwählen. Die Verbindung zwischen Modul und Handy ist also direkt. Der Vorteil ist vor allem, dass kein Router oder WLAN vorhanden sein muss.

Die zweite Variante ist, dass das Modul als Client funktioniert. Das bedeutet, dass das sich das Modul mit einem bestehenden, z.B. von einem Router bereitgestellten WLAN, verbindet. Dazu muss natürlich das WLAN-Passwort vorhanden sein. Der Vorteil ist hier natürlich, dass von allen Geräten im WLAN auf das Modul zugegriffen werden kann. Außerdem kann das Modul über einen Router der mit dem Internet verbunden ist,  auch auf das Internet zugreifen.

Die dritte Variante ist, dass das Modul beide oberen Varianten gleichzeitig zu Verfügung stellt. Es können Sich also Geräte direkt mit dem Modul als AP verbinden oder über den Router eine Verbindung aufbauen.


Modul als AP (Acces Point)

Um den Controller als reinen AccesPoint einzustellen müssen Sie den Befehl AT+CWMODE=2 senden. Dies ist meist auch die Standarteinstellung des Moduls. Nun können Sie ein anderes WLAN-Fähiges Gerät nehmen und das die SSID (=WLAN-Name) des Moduls suchen. Auf dem Bild habe ich meinen Rechner benutzt um die SSID zu finden. Der Name lautete ESP_9EE10B.

Wenn Sie nun auf das WLAN-Netz klicken, wird automatisch eine Verbindung aufgebaut. Ein Passwort ist nicht nötig, da keins definiert wurde. Mit dem Befehl AT+CWLIF können Sie alle verbundenen Clients anzeigen lassen. Über den folgenden Befehl können Sie den Netzwerknamen ändern und ein Passwort sowie andere Parameter einstellen:

AT+CWSAP="<ssid>","<pass>"[,<chan>,<enc>]

<ssid> = SSID

<pass> = Password

<chan> = Kanal 1...14

<enc> = Verschlüsselung: 0 = Offen, 1 = WEP, 2 = WPA_PSK, 3 = WPA2_PSK, 4 WPA_WPA2_PSK


Moduls als Client

Wenn Sie das Modul als Client verwenden möchten, müssen Sie zunächst die Einstellung CWMODE auf 1 oder 3 (für AP und Client) setzen. Also mit z.B. folgendem Befehl:  AT+CWMODE=1. Nun können Sie zunächst einmal nach bestehenden Netzwerken suchen und zwar mit dem Befehl AT+CWLAP. Nach einer kurzen Zeit werden alle gefundenen WLAN-Netzwerke aufgelistet.

Sie können sich nun mit folgendem Befehl mit einem der Netzwerke verbinden:

AT+CWJAP="<ssid>","<pass>"

<ssid> = SSID

<pass> = Passwort

Wenn der Verbindungsaufbau erfolgreich war erscheint die Meldung OK.

Mit dem Befehl  AT+CIFSR kann nun die aktuelle IP ausgegeben werden. Sollten Sie das Modul im AP und Client Modus simultan laufen haben, werden hier zwei IPs angezeigt. Die Daten des WLANs sowie die meisten andere Einstellungen bleiben übrigens gespeichert. Das bedeutet, dass sich das Modul auch nach wiederanschließen an eine Spannungsversorgung automatisch mit dem gespeicherten WLAN verbindet.


Server einrichten

Die Verbindung zu anderen Geräten steht nun, egal ob Sie das Modul als AP oder als Client benutzen. Doch nun sollten die Geräte auch miteinander kommunizieren können. Deswegen wird in diesem Teil ein Server eingestellt. Auf diesen Server kann dann z.B. über ein Handy zugegriffen und Daten übermittelt werden. Doch der Reihe nach.

Zunächst einmal muss eine Einstellung vorgenommen werden und zwar die Einstellung AT+CIPMUX=1. Dies ermöglicht, mehrere Verbindungen gleichzeitig aufbauen zu dürfen. Ich habe noch nicht genau herausgefunden warum diese Einstellung nötig ist, Tatsache ist aber, dass sich der Server nicht starten lässt wenn diese Einstellung nicht gemacht wurde. Ein wichtiger Punkt ist, dass sich diese Konfiguration nicht speichert. Das bedeutet, Sie müssen diesen Befehl jedes Mal neu eingeben, wenn Sie das Modul neu eingeschaltet oder resetet haben.

Nun können Sie den Server mit dem Befehl AT+CIPSERVER=1,80 starten. Der zweite Parameter, also die 80, ist der Port, über den der Server erreicht werden kann. Sie können hier auch einen anderen Port verwenden. In diesem Beispiel ist der Server aber unter dem Port 80 zu erreichen.

Nun wird es spannend. Sollte das Starten des Servers mit OK bestätigt worden sein, können Sie nun versuchen den Server über ein Gerät Ihrer Wahl zu erreichen. Wenn Sie sich nicht mehr sicher sind, wie die IP des Moduls lautet verwenden Sie den AT+CIFSR Befehl. Auf dem Bild unten sehen Sie die beiden IP-Adressen. Die erste ist gültig, wenn Sie eine direkte Verbindung über den AP benutzen, die zweite gilt, wenn Sie über den Router das Modul erreichen möchten.

Ich versuche nun also über den PC und den Router das Modul zu erreichen. Dazu öffne ich einen Browser und gebe die IP-Adresse des Moduls gefolgt von einem Doppelpunkt und dem Port des Servers ein. In diesem Fall also:

192.168.178.35:80

Wenn Sie nun Enter drücken versucht der Browser eine Seite zu laden. Dies hat allerdings kein Erfolgt. Im Serial Monitor können Sie allerdings sehen, dass Daten empfangen wurden:

Zunächst steht dort Link, was verdeutlicht, dass eine Verbindung hergestellt wurde. Dann folgen empfangene Daten. Allgemein werden empfangene Daten durch +IPD gekennzeichnet. Danach folgen zwei Zahlen. Die erste Zahl zeigt, welche der bestehenden Verbindungen die Daten geschickt hat. Da z.Z. nur ein Rechner die Seite geöffnet hat, steht dort eine 0. Eine zweite Anfrage würde dann den Index 1 bekommen usw. Die zweite Zahl gibt die Länge der empfangenen Daten an. Hier wurden also anscheinend 376 Zeichen empfangen. Wer möchte kann ja mal nachzählen. Nach dem Doppelpunkt stehen nun die eben beschriebenen Daten.  Es scheint sich hier um eine Anforderung zu handeln, die allgemein beim Öffnen einer Seite vom Browser geschickt wird.

Diese Verbindung bleibt nun eine Weile stehen, ohne dass etwas passiert. Nach in der Regel 180s = 3 Minuten, wird die Verdingung automatisch getrennt. Dies wird durch die Meldung Unlinked verdeutlicht. Sie können die Zeit bis zur automatischen Trennung übrigens auch Einstellen und zwar mit dem Befehl AT+CIPSTO=X wobei X maximal 28800 für 28800s = 8h entsprechen darf.

Falls Sie sich gerade nicht sicher sind, ob und wenn ja wie viele Verbindungen zum Modul bestehen, können Sie dies mit dem Befehl AT+CIPSTATUS erfragen. Status 4 scheint zu bedeuten, dass keine Verbindungen bestehen. Status 3 bedeutet anscheinend Verbindungen und wird mit einer Liste von verbunden Geräten ergänz.

Nun soll aber die Verbindung nicht völlig nutzlos sein, sondern es sollen Daten an den Browser geschickt werden. Dazu gibt es den AT+CIPSEND Befehl. Dieser hat zwei Parameter, die ähnlich dem Empfangsparametern sind. Der erste Parameter gibt also den Index der Verbindung an, der zweite die Anzahl der zu sendenden Zeichen. Die einfachste Form von Daten sei nun ein Text. Dieser kann tatsächlich auch so im Browser angezeigt werden. Wenn Sie also den Server im Browser andressiert haben und eine Linked Verbindung besteht, können Sie mit AT+CIPSEND=0,5 einen Text senden. Nach eintippen des Befehls ins Terminal erscheint ein > das verdeutlichen soll, dass Sie nun den Text eintippen können. Fünf Zeichen reichen für ein Hallo. Ein Wechsel zu dem Browser ist aber leider enttäuschend, denn dort wird immer noch das Seite-Laden Symbol angezeigt. Das liegt scheinbar daran, dass die Verbindung noch nicht geschlossen wurde. Sie können also nun entweder die 3 Minuten warten, oder Sie schließen mit AT+CIPCLOSE=0 die Verbindung zu diesem Gerät. Nach dem Schließen sehen Sie nun ein einfaches Hallo im Browser.

Nach dem Eintippen dem und Senden einer Nachricht mittel CISEND erscheint übrigens oft die Meldung wrong syntax und ERROR gefolgt von SEND OK. Das scheint vorzukommen, wenn man mehr Zeichen sendet als vorher angegeben. Ich schätze, dass man zwei Zeichen extra eingeplant werden müssen, vermutlich wegen dem CR und NL des Terminals. Gelegentlich trifft man aber auch die richtige Anzahl von Zeichen und die Fehlermeldungen erscheinen nicht. Ich muss diesbezüglich noch ein wenig rumprobieren, aber des Senden scheint nicht beeinträchtigt zu sein.

Es gibt auch die Möglichkeit außerhalb eines Browser eine Verbindung aufzubauen. Dazu kann ein TCP-Client genutzt werden. Ich habe mir einen solchen Client im Google Playstore heruntergeladen und konnte so eine Verbindung herstellen      und Daten hin und her schicken. Der erste Schritt für eine App wäre also gemacht.

App: TCP-Client im Google PlayStore 


ESP8266 und Arduino

Der nächste Schritt ist nun, das Modul mit einem Mikrocontroller zu verbinden um das ganze portabler zu haben. Meine erste Wahl war ein Arduino Nano Nachbau aus China, den ich ebenfalls mitbestellt habe. Dieser hat einen 3,3 V Pin so dass die Sache auf den ersten Blick ganz einfach aussah. Tatsächlich hat das Modul aber ähnlich reagiert, wie schon bei den ersten Versuchen mit der FTDI Platine. Das Modul startete nicht richtig. Nach einigem Suchen fand ich auch den Grund heraus.

Auf dem Nachbau des Nanos befindet sich ein alternativer USB-To-Serial Chip. Dieser wird mit geregelten 5 V versorgt, hat aber auch selbst einen 3,3 V Ausgang, der am entsprechenden Power-Pin der Arduino Patine herausgeführt ist. Das Problem ist allerdings, dass dieser PIN maximal 50 mA liefern kann. Das WLAN-Modul braucht beim Start bis zu 200mA. Laut Datenblatt kann es sogar bis zu 235 mA benötigen. Der Serial-Chip kann den Strombedarf also nicht decken. Ein originaler FTDI Chip hätte übrigens genauso wenig genützt. Dieser liefert ebenfalls maximal 50mA am 3,3 V-Pin.

Eine Möglichkeit das Problem zu lösen wäre, einen Spannungswandler an den 5V Pin anzuschließen und das Modul darüber zu versorgen. Diese Variante werde ich noch ausprobieren, doch für meinen ersten Versuch habe ich doch einen Arduino Uno genommen. Der 3,3 V Pin des Arduino wird nämlich über einen Spannungswandler erzeugt und kann den nötigen Strom liefern. Für die ersten Versuche also die besser Wahl. Der Aufbau des Versuchs sieht folgendermaßen aus:


Zum Aufbau:

An die Modul-Pins GND (grauer Draht) und RXD (weiß)  habe ich jeweils kurze Verbindungsdrähte angelötet. Das Modul selbst ist leicht schräg in ein Steckboard gesteckt, so dass die beiden oben erwähnten Pins keine Verbindung haben. Dafür kommt man über die interne Verdahtung des Steckboards gut an die Pins VCC (gelb/orange) und TXD (braun). Der PD Pin ist direkt mit einer Drahtbrücke mit VCC verbunden. RXD ist mit dem Arduino Pin 10 und TXD mit Pin11 verbunden. VCC wird mit dem 3,3 V-Power-Pin verbunden und GND mit GND.

 

Wie man sieht sind RXT und TXT nicht mit dem Serial Pins des Arduino Unos Verbunden, sondern stattdessen mit den digitalen Pins 11 und 10. Das liegt daran, dass ich eine softwarebasierte Serielle Schnittstelle verwende. Dadurch bleibt die Hardwareschnittstelle fürs Debugging frei und es gibt auch keine Probleme beim Uploaden von Programmen.

Für den ersten Test hat sich das Beispielprogramm SoftwareSerialExample (Beispiele > SoftwareSerial) bewährt. Ich musste lediglich die Baudraten anpassen. Dann war es möglich über das Terminal Befehle zu schicken und zu empfangen. Im Grunde ist dieser Aufbau in Verbindung mit diesem Beispielprogramm auch eine gute Alternative  für alle, die kein passendes  FTDI-Board zur Verfügung haben.




Home
Copyright 2015 Fabian Kainka | All Rights Reserved.