ESP8266 WiFi module

De ESP8266 is een mooie oplossing om een embedded project zonder al te veel problemen WiFi toegang te geven - en dit alles voor € 5,-.
Verwacht geen wonderen van deze module. Een simpele UDP of TCP toegang is alles wat de module regelt, de rest moet je zelf doen.

Ik heb een module van TinyTronics gekregen om te kijken hoe deze module gebruikt kan worden en ik wilde er al snel meer hebben. Dit lijkt de perfecte oplossing om een dataverbinding tussen PC en de embedded target of tussen twee embedded targets te maken zonder draden of het beperkte bereik van BlueTooth.

Op internet zijn veel leuke projecten met deze module te vinden. De WiFi temperature logger is een mooi voorbeeld waarbij data wordt verzonden naar ThingSpeak. Hackaday heeft een lijst met meer projecten met deze module.

Praktisch iedere vorm van datacommunicatie over een TCP poort naar een ander (IP) apparaat is te maken. De module kan zelfs in Access Point mode gezet worden zodat je een direkte verbinding tussen twee apparaten kan leggen.

micropython

In het afgelopen jaar is de ESP8266 steeds makkelijker geworden in gebruik. De module wordt nu ook al ondersteund door de Arduino omgeving maar ik gebruik de ESP8266 (en d ESP32) met micropython.

Voor de ESP32 zijn de bordjes van PyCom erg mooi, deze worden standaard met microPython geleverd. Bij de ESP8266 zal je er zelf nog mycropython in moeten zetten. Hiervoor moet je een seriële poort module aansluiten of een module zoals de Wemos D1 mini of mini Pro kopen.

Om te beginnne moeten eerst de programmeertools (esptool) en een versie van microPython gedownload worden.

Voor het programmeren van microPython moet de flash eerst gewist worden met het erase_flash commando:

esptool.py --port=COM32 erase_flash

Na het wissen van de flash kan microPython geprogrammeerd worden. Op mijn Wemos D1 mini Pro v1.0.0 board gebruik ik:

esptool.py --port=COM32 --baud 115200 write_flash --flash_size=4MB 0 esp8266-20170823-v1.9.2.bin

Maar er zit blijkbaar een verschil tussen het v1.0.0 en het v1.1.0 board. Op het nieuwe board moet de extra parameter --flash_mode dio opgegeven worden. Zo niet ,dan werkt python niet en verschijnt er alleen maar onzin op de terminal.

esptool.py --port=COM32 --baud 115200 write_flash --flash_mode dio --flash_size=4MB 0 esp8266-20170823-v1.9.2.bin

 

Na het programmeren is de python REPL prompt beschikbaar via de COM poort op 115200 baud.

Is er geen prompt te zien maar komt er alleen maar onzin op het scherm, dan is het programmeren mislukt.
Tijdens het programmeren gebruikt de module relatief veel stroom. Gebruik een goede kabel en sluit de module rechtstreeks op een USB poort van de PC aan. Bij gebruik van een extra hub (zeker een zonder extra power adapter) is de kans groot dat de spanning op de USB poort niet stabiel genoeg is om de module te kunnen programmeren.
Dit geldt ook voor USB poorten op sommige laptops.
Als het programmeren mislukt, probeer dan eerst om de module op een andere USB poort aan te sluiten, probeer daarna de flash_mode op dio of qio te zetten.

Oude firmware

De modules worden met een oude firmware versie geleverd. Ik ondervond wat problemen met deze firmware en kreeg geen stabiele verbinding.

Dit problem is makkelijk op te lossen door nieuwe firmware te installeren. Een simpele klus als je de juiste tools en instructies hebt Laughing

Voorbereiden voor firmware update

Je moet wel een manier hebben om deze module aan een PC te koppelen - een Windows PC - middels een USB-serial converter.

LET OP: De ESP8266 is een 3.3V module en de I/O signalen moeten ook 3.3V zijn.
Ja, ik heb deze goedkope PL2303 module met 3.3V regelaar gebruikt maar het Tx signaal is dan wel 5V. Hoewel de module niet defect is geraakt kreeg ik wel wat communicatie fouten.
Ik gebruik nu deze 5V naar 3v3 level converter om te zorgen dat alles goed gaat.

Kijk op de foto rechts (klik hierop voor een groter overzicht) voor alle verbindingen. Het CH_PD signaal moet aan3v3 liggen, anders krijg je geen communicatie met de module.

GPIO0 en Reset hoeven nog niet verbonden te worden, deze signalen worden alleen in de programmeer mode gebruikt.

 

First Contact

Zonder verbindingen aan GPIO0 en Reset (of met beide via een pull-up weerstand aan 3.3V) kan je met de module communiceren. De standaard baudrate is 115200 Baud met 8n1 instelling.

Het AT+GMR commando laat de huidige versie van de API (0016) en de AT commando set (9.1) zien.
AT+CWMODE=1 zet de module in station mode en AT+CWLAP laat vervolgens een lijst met beschikbare access points zien.

Updaten van de firmware

Verbindt het GPIO0 signaal aan Gnd en reset de module door de reset pin even laag te maken. Ik gebruik hier een draadje voor dat aanGnd hangt en raak dan even de Reset pin aan - meer is niet nodig.

Zorg dat je een recente firmware versie (ik gebruik v 0.9.2.2) en het esp8266_flasher.exe programma hebt.
Beide zijn via bovenstaande links van deze site te downloaden. Ja ... een .exe bestand van een onbekende site is niet echt aan te raden. Er zou een Expressif website moeten zijn waar het "officiële" programma staat maar ik vraag me af of die site veiliger is...

Na opstarten van het programma moet je het juiste COM poort nummer met de hand intypen en daarna de firmware selecteren. Hierna op "Download" klikken en wachten tot het programmeren klaar is.

Als je alleen "connecting" te zien krijgt heb je waarschijnlijk de GPIO0 lijn niet met Gnd verbonden of de module niet gereset. Ook kan het zijn dat je nog een ander terminalprogramma open hebt staan. Zorg ervoor dat de GPIO0 pin laag is, reset de module en sluit andere terminal programma's af.

De "Failed to leave Flash mode" melding aan het einde schijnt standaard te zijn. Je kan het esp8266_flasher programma gewoon afsluiten en de module resetten.

Vergeet niet om de verbinding van de GPIO0 lijn weer te verwijderen. Tijdens normaal gebruik moet deze pin niet aan Gnd liggen.

Controleer de nieuwe firmware

De baudrate van de nieuwe firmware is 9600 Baud (vraag me niet waarom zo laag!) dus zorg ervoor dat je terminalprogramma op 9600 Baud staat.
Vervolgens controleer ik met het AT+GMR commando de software versies: API level 18 en AT commando set v 9.2.

NU kan je met het AT+CIOBAUD commando de baudrate weer op 115200 zetten en dan ben je klaar.

Cloud update

Er is nog nieuwere firmware beschikbaar maar daar heb ik geen bestand voor gevonden. Het lijkt dat deze nieuwere firmware alleen als online update te krijgen is.

Om de module te kunnen updaten moet deze eerst in station mode staan met "AT+CWMODE=1" of "AT+CWMODE=3". Maak dan een verbinding met het access point het met "join access point" commando: "AT+CWJAP="ssid","passwd"" (vervang hier ssid en passwd door naam en wachtwoord van je access point.

Nu hoef je alleel maar een AT+CIUPDATE commando in te typen. Vervolgens krijg je een aantal regels met tekst te zien ("found server", "connect server", "got edition" en "start start"). Een aantal weken geleden lukte dit nog maar het lijkt dat er nu een probleem met de server is.
Geen probleem: de 00180902 versie van de firmware lijkt goed te werken.

AT commands

Hier is een lijst met alle AT commando's die ik gevonden heb.
Sommige commando's zijn alleen geldig in een bepaalde mode. Het AT+CWLAP commando is niet beschikbaar als de module in Access Point mode staat. Er zijn andere commando's die alleen beschikbaar zijn als de module juist in Access Point mode staat.

Ga gerust wat spelen met deze commando's. Kijk ook naar de projecten op Hackaday, deze geven een redelijk goed beeld hoe je de module kan gebruiken.

AT General AT command    
       
AT+RST Reset device    
  \n\rOK\n\r    
  <info>    
  \n\rready\n\r    
  Note: there is no OK after "ready"    
       
AT+GMR Get firmware version    
  19000902    
AT+CWMODE=<mode> Set mode    
    <mode> 1 - station
      2 - Access Point
      3 - Station & Access Point
AT+CWMODE? Get mode    
  \n\r    
  +CWMODE=<mode>    
       
AT+CWMODE=? Mode command help    
  \n\r    
  +CWMODE:(1-3)    
  \n\rOK\n\r    
       
AT+CWJAP="ssid","passwd" Join Access Point    
AT+CWJAP? Get joined access point    
  +CWJAP:"ssid"    
       
AT+CIFSR Get Local IP Address    
  \n\r    
  <IP address>    
  \n\rOK\n\r    
       
AT+CWLAP List currently available Access Points (in mode 1 & 3)    
  \n\r    
  +CWLAP:(<ecn>,<ssid>,<rssi>,<mac>,<chl>)\n\r <ecn> 0 - open, no security
      1 - WEP
      2 - WPA_PSK
      3 - WPA2_PSK
      4 - WPA_WPA2_PSK
    <ssid> "device-name"
    <rssi> RSSI value (number)
    <mac> MAC address, e.g. "70:4d:d2:a9:a3:2f"
    <chl> Channel (number)
  … repeat for each access point found    
  \n\rOK\n\r    
       
AT+CWQAP Exit connection with the AccessPoint    
  \n\rOK\n\r    
       
AT+CWSAP=<ssid>,<pwd>,<chl>,<ecn> Set AccessPoint parameters    
  \n\rOK\n\r <ssid> "ssid"
    <pwd> "password" (only valid when ecn not 0)
    <chl> channel (number)
    <ecn> 0 - open, no security
      1 - WEP
      2 - WPA_PSK
      3 - WPA2_PSK
      4 - WPA_WPA2_PSK
AT+CWSAP? Get AccessPoint parameters    
  \n\r    
  +CWSAP:"ssid","passwd",<chl>,<ecn>    
  \n\rOK\n\r    
       
AT+CWLIF Get IP address for client (only when client connected)    
  \n\r    
  <IPv4>,<Mac> <IPv4> 100.168.4.100
  \n\rOK\n\r <Mac> d8:90:e8:9e:6d:56
       
  Note: line with IP addresses is omitted when no client connected    
  multiple lines with IP addresses when multiple clients connected    
       
AT+CIPMUX=<mode> Start multiple connections    
    <mode> 0 - single connection mode
      1 - multi connection mode
AT+CIPMUX? Get multiple connection mode    
  \n\r    
  +CIPMUX:<mode>    
       
AT+CIPSERVER=<mode>,<port> Configure a server    
    <mode> 0 - off server mode
      1 - open server mode
    <port> Port
       
AT+CIPSTATUS Return server status    
  \n\r    
  STATUS:<status> <status>  
  +CIPSTATUS:<id>,<type>,<addr>,<port>,<???> <id> ID number of connection (0-4)
    <type> "TCP" or "UDP"
    <addr> IP address
    <port> port number
    <???>  
       
AT+CIPSTO=<timeout> Set automatic socket client connection timeout    
    <timeout> timeout in seconds
       
AT+CIPSEND=<id>,<length> Send data    
    <id> connection ID (omitted of CIPMUX=0)
    <length> number of bytes to follow
       
  Note: ESP8266 sends ">", then respond with length bytes    
       
+IPD,<id>,<length>:<data> Receive data    
    <id> connection ID (omitted if CIPMUX=0)
    <length> number of bytes to follow
    <data> received data
       
AT+CIOBAUD=<baudrate> Set baudrate <baudrate> 9600 .. 115200
  \n\r    
  BAUD-><baudrate>    
  \n\r    
       
       
AT+CIOBAUD? Get baudrate