Heute ist mein ESP8266 ESP-01 gekommen und habe mich gleich daran gemacht das Teil zu testen. Vorab der Hinweiß auf folgenden Thread mit genaueren Informationen:
-> ESP8266 - heisser Tipp für WLAN über rs232
Mein Ziel ist es einen zusätzlichen USB-WLAN-Stick am PI einzusparen.
Als Versorgungsspannung verträgt das ESP8266 Module mind. 1,7V und max. 3,6V aber die I/O Ports vertragen maximal 3V3! (Quelle)
Problem im Bezug auf den alten RaspberryPI A & B ist allerdings dass dieser nicht mehr allzuviele Stromreserven hat, da er selbst ja 700-800mA benötigt und wegen der 1A Polyfuse nur noch ca. 200-300mA (eher weniger als mehr) zur Verfügung steht.. Laut diversen Information u.a. von dreamshader kann es aber vor kommen dass das ESP8266 bis zu 250mA oder sogar 300mA benötigen könnte. Inwiefern das tatsächlich zu einem Problem wird muss ich noch herausfinden.
Die Pinbelegung des ESP-01 sieht wie folgt aus:
An den PI habe ich es wie folgt angeschlossen:
ESP8266 Raspberry Pi B
--------------|--------------
VCC and CH_PD 3V3 (pin# 1)
GND Ground (pin# 6)
UTXD GPIO 15 (pin# 10)
URXD GPIO 14 (pin# 8)
Es ist darauf zu achten das TxD vom ESP-01 auf RxD vom PI geht, ebenso wie TxD vom PI auf RxD vom ESP-01. Also verdreht.
Ausserdem hat es sich als nützlich herausgestellt einen weiteren GPIO vom RaspberryPI mit dem RESET pin des ESP-01 zu verbinden, so brauch man den dann nur auf HIGH setzen um das Modul neu zu starten. Welchen ihr dafür am PI verwendet spielt aber keine Rolle.
Ob ihr nur einen 3V3 pin vom PI verwendet oder 2 wie auf dem Bild zu sehen spielt keine Rolle, habe das nur aus Übersichtsgründen so gemacht
Auch habe ich in fritzing auf ein Breadboard (Steckbrett) aus Übersichtsgründen verzichtet, da das Module leider nicht Breadboard-freundlich gebaut wurde und nicht so einfach auf die Mitte des Breadboards gesteckt werden kann... Siehe dazu auch > hier <. Aber ich benutze sowieso Female-Female Kabel und brauch daher kein Breadboard.
Erst nach Anschluss den PI einschalten.
Wenn ihr das Modul erst einschaltet nachdem ihr minicom geöffnet habt, kommen viele komische Zeichen - aber wichtig ist das am Ende ein ready ausgegeben wird.
Bevor man das Modul jetzt ansprechen kann muss erst der UART vom PI freigeschaltet werden. Wie das geht habe ich >> hier << beschrieben. Dieser Schritt ist sehr wichtig! Anschließend den PI neu starten!
Als nächstes sollte man erst mal minicom verwenden um das Modul zu testen. Zunächst mal installieren:
Alternativ zu minicom kann ich aber auch picocom empfehlen
Dann starten wir minicom:
Jetzt geben wir erst mal folgendes ein um sicherzustellen dass die Kommunikation funktioniert:
Damit weisen wir das Modul an einen RESET / Neustart durchzuführen.
Ausgabe:
Sollte das nicht der Fall sein stimmt entweder etwas nicht mit der Verkabelung oder der Firmware auf dem Modul.
Möglicherweise muss man aber auch die Baudrate runter stellen - das kommt auf die jeweilige Firmware an die auf eurem Modul installiert ist. Bei Problemen also noch mal minicom beenden und stattdessen wie folgt aufrufen:
(Oder eine Baudrate von 57600)
Eine Liste der verfügbaren AT Befehle findet ihr > hier <
Jetzt stellen wir eine Verbindung zu unserem WLAN her:
SSID müsst ihr mit eurer SSID ersetzen, also die Kennung eures WLAN's.
PWD müsst ihr mit eurem WLAN-Password ersetzen.
Ihr könnt auch die verfügbaren WLAN-Netze scannen:
Unter Umständen muss der Mode vorher noch umgestellt werden:
Um dann zu überprüfen ob ihr erfolgreich Verbindung zu eurem SSID hergestellt habt solltet ihr das noch prüfen, das OK sagt darüber nämlich nichts aus:
Wenn ihr eine Verbindung hergestellt habt könnt ihr mit folgendem Befehl die IP herausfinden, die dem ESP8622 zugewiesen wurde:
[hr]
[hr]
Hier ein Python Script zum testen:
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Run 'SocketTest' Java on your PC.
# Start a Server and set servIP/servPort to your PC's one
#
import sys, serial
from time import *
import datetime, string
#-------------------------------------------------------------------
SerialPort = "/dev/ttyAMA0"
SerialBaudrate = 115200
#servIP = "74.125.225.6" # Google's IP Number
#servPort = 80
servIP = "192.168.178.20"
servPort = 999
#-------------------------------------------------------------------
#initialization and open the port.
#possible timeout values:
# 1. None: wait forever, block call
# 2. 0: non-blocking mode, return immediately
# 3. x, x is bigger than 0, float allowed, timeout block call
ser = serial.Serial()
ser.port = SerialPort
ser.baudrate = SerialBaudrate
ser.bytesize = serial.EIGHTBITS #number of bits per bytes
ser.parity = serial.PARITY_NONE #set parity check: no parity
ser.stopbits = serial.STOPBITS_ONE #number of stop bits
#ser.timeout = 1 #non-block read
ser.timeout = 2.5 #timeout block call
ser.xonxoff = False #disable software flow control
ser.rtscts = False #disable hardware (RTS/CTS) flow control
ser.dsrdtr = False #disable hardware (DSR/DTR) flow control
ser.writeTimeout = 2 #timeout for write
#-------------------------------------------------------------------
if len(sys.argv) != 3:
print "Usage: ESP8266.py SSID Password"
exit()
else:
ssid = sys.argv[1]
pwd = sys.argv[2]
print("SSID: %s" % ssid)
print("PWD: %s" % pwd)
# ----------------------------------------
def wifiCommand( sCmd, waitTm=1, sTerm='OK' ):
lp = 0
ret = ""
print(" ")
print("Cmd: %s" % sCmd)
ser.flushInput()
ser.write( sCmd + "\r\n" )
ret = ser.readline() # Eat echo of command.
sleep( 0.2 )
while( lp < waitTm ):
while( ser.inWaiting() ):
ret = ser.readline().strip( "\r\n" )
print(ret)
lp = 0
if( ret == sTerm ): break
if( ret == 'ready' ): break
if( ret == 'ERROR' ): break
if( ret == 'Error' ): break
sleep( 1 )
lp += 1
return ret
# ------------------------------------------
def wifiCheckRxStream():
while( ser.inWaiting() ):
s = ser.readline().strip( "\r\n" )
# ------------------------------------------
def main():
REG_OFF = True
REG_ON = False
# Power Cycle ESP8266 - The RTS pin is used to control the 3.3V regulator.
#print("Pwr Off - 10s")
#ser.setRTS(REG_OFF) # Turn off 3.3V power.
#sleep(10)
#print("Pwr On - 3s")
#ser.setRTS(REG_ON) # Turn on 3.3V power.
#sleep(3) # and wait for WiFi to stabablize.
wifiCommand( "AT" ) # Should just return an 'OK'.
wifiCommand( "AT+CIPCLOSE" ) # Close any open connection.
wifiCommand( "AT+RST", 5, sTerm='ready' ) # Reset the radio. Returns with a 'ready'.
wifiCommand( "AT+GMR" ) # Report firmware number.
wifiCommand( "AT+CWMODE=1" ) # Set mode to 'Sta'.
wifiCommand( "AT+CWLAP", 10 ) # Scan for AP nodes. Returns SSID / RSSI.
# Join Access Point given SSID and Passcode.
wifiCommand( "AT+CWJAP=\""+ssid+"\",\""+pwd+"\"", 5 )
wifiCommand( "AT+CWJAP?" )
# Sometimes it takes a couple querries until we get a IP number.
sIP = wifiCommand( "AT+CIFSR", 3, sTerm="ERROR" )
if ( sIP == 'ERROR' ):
i = 10 # Retry n times.
while( (sIP == 'ERROR') and (i > 0) ):
print(i)
sIP = wifiCommand( "AT+CIFSR", 3, sTerm="ERROR" )
if( sIP == 'ERROR' ): sleep( 3 )
i -= 1
if( i > 0 ):
print("IP Num: %s"% sIP)
else:
print("Bad IP Number.")
else:
print("IP Num: %s"% sIP)
wifiCommand( "AT+CIPMUX=0" ) # Setup for single connection mode.
print("Delay - 5s")
sleep( 5 )
s = wifiCommand( "AT+CIPSTART=\"TCP\",\""+servIP+"\","+str(servPort), 10, sTerm="Linked" )
if ( s == 'Linked' ):
#cmd = 'GET / HTTP/1.0\r\n\r\n'
cmd = "Now is the time for all good men to come to the aid of their country.\r\n"
#cmd = "Bridgeport 30 34 31 35 31 34 41 42 43 34\r\n"
cmdLn = str( len(cmd) )
s = wifiCommand( "AT+CIPSEND=" + cmdLn, sTerm=">" )
sleep( 1 )
wifiCommand( cmd, sTerm="SEND OK" )
#sleep( 2 )
#wifiCommand( "+IPD" )
i = 5
while( i > 0 ): # Dump whatever comes over the TCP link.
while( ser.inWaiting() ):
sys.stdout.write( ser.read() )
i = 5 # Keep timeout reset as long as stuff in flowing.
sys.stdout.flush()
i -= 1
sleep( 1 )
else:
print("Error:")
ser.write( "\r\n" )
sleep( 0.5 )
i = 5
while( (i > 0) and ser.inWaiting() ): # Dump whatever is in the Rx buffer.
while( ser.inWaiting() ):
sys.stdout.write( ser.read() )
i = 5 # Keep timeout reset as long as stuff in flowing.
sys.stdout.flush()
i -= 1
sleep( 1 )
# ------------------------------------------
def _exit():
global finished
print("Quit")
ser.close()
finished = True
exit()
# ------------------------------------------
# Custom User Input:
def Custom():
global finished
try:
print(" ")
while not finished:
Eingabe = raw_input("Custom command to ESP8266? ")
if Eingabe == "q":
_exit()
else:
wifiCommand(Eingabe, 240)
except:
exit()
# ------------------------------------------
if __name__ == '__main__':
finished = False
try:
ser.open()
except Exception, e:
print("Error open serial port: " + str(e))
exit()
if ser.isOpen():
try:
main()
Custom()
except Exception, e1:
finished = True
print("Error...: " + str(e1))
except (KeyboardInterrupt, SystemExit):
_exit()
else:
print("Cannot open serial port %s" % SerialPort)
_exit()
Display More
Hab das original etwas modifiziert
Das Script stellt erst über euer WLAN eine Verbindung nach Google her und anschließend habt ihr die Möglichkeit eigene AT Befehle an das Modul zu senden, was mit Eingabe von q beendet werden kann.
[hr]
[hr]
Das war jetzt auch schon der Leichte Teil des ganzen. Nun kommt der Schwierige Teil Die Einbindung als vollwertige WLAN-Schnittstelle.
Hier hab ich nun selber noch dran zu knabbern :s
..stay tune..
[hr]
Um die Firmware zu ändern muss man sich den SDK installieren. Dazu macht ihr am besten folgende Schritte:
apt-get update
apt-get install -y -q git autoconf build-essential gperf bison flex texinfo libtool libncurses5-dev wget apt-utils gawk sudo unzip libexpat-dev bash-completion
useradd -d /opt/Espressif -m -s /bin/bash esp8266
echo "esp8266 ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/esp8266
chmod 0440 /etc/sudoers.d/esp8266
su - esp8266
cd ~; git clone -b lx106 git://github.com/jcmvbkbc/crosstool-NG.git
cd crosstool-NG
./bootstrap && ./configure --prefix=`pwd` && make && make install
./ct-ng xtensa-lx106-elf
./ct-ng build
PATH=$PWD/builds/xtensa-lx106-elf/bin:$PATH
cd ~ && wget -O esp_iot_sdk_v0.9.3_14_11_21.zip http://bbs.espressif.com/download/file.php?id=72
wget -O esp_iot_sdk_v0.9.3_14_11_21_patch1.zip http://bbs.espressif.com/download/file.php?id=73
unzip esp_iot_sdk_v0.9.3_14_11_21.zip
unzip -o esp_iot_sdk_v0.9.3_14_11_21_patch1.zip
mv esp_iot_sdk_v0.9.3 ESP8266_SDK
mv License ESP8266_SDK/
cd ESP8266_SDK
sed -i -e 's/xt-ar/xtensa-lx106-elf-ar/' -e 's/xt-xcc/xtensa-lx106-elf-gcc/' -e 's/xt-objcopy/xtensa-lx106-elf-objcopy/' Makefile
mv examples/IoT_Demo .
wget -O lib/libc.a https://github.com/esp8266/esp8266-wiki/raw/master/libs/libc.a
wget -O lib/libhal.a https://github.com/esp8266/esp8266-wiki/raw/master/libs/libhal.a
wget -O include.tgz https://github.com/esp8266/esp8266-wiki/raw/master/include.tgz
tar -xvzf include.tgz
echo "export PATH=/opt/Espressif/crosstool-NG/builds/xtensa-lx106-elf/bin:$PATH" > ~/ESP8266_SDK/env.sh
export PATH=/opt/Espressif/crosstool-NG/builds/xtensa-lx106-elf/bin:$PATH
cd ~/ESP8266_SDK; make clean; make
Display More
Video Tutorial zum compilieren über die VM: