Publi

Trasteando con juguetes nuevos. Primeros pasos con el ESP8266

ESP8266
Esta pequeña placa de apenas 24x14mm contiene un microcontrolador y chip WiFi a/b/g (esas de 2.4GHz) y una memoria. Además de algunos leds, una antena y un oscilador. Cuesta muy poco dinero (apenas unos 3€ comprándolo en algunas tiendas de España y mucho menos si se compra directamente a China). Y encima consume muy poco, alrededor de 0.5W a pleno rendimiento y muchísimo menos en alguno de sus modos de sueño y bajo consumo. Lo que hace que este circuito sea idóneo para trabajar con pilas o baterías, miniaturizar nuestros proyectos y automatismos así como conectarlos a Internet o a una red local.

Así de primeras, se me ocurren algunos proyectos, unos de ellos perversos y otros más normales. Entre ellos sistemas de automatización doméstica, lo típico encender y apagar enchufes desde el móvil, o programar para que se enciendan y apaguen y verificar el estado de los aparatos; estaciones meteorológicas a las que podemos acoplar decenas de sensores diferentes, avisadores de correo en el buzón, pequeños detectores de humo para zonas de no fumadores o para detectar que alguien se acerca a la puerta de la habitación; así como un pequeño keylogger que podemos camuflar dentro de un teclado, dispositivo USB que podrá hacer estragos y camuflar dentro de un ratón o para suplantar una WiFi y que los usuarios se conecten a ti (aunque no creo que soporte mucho ancho de banda con sacar la información que queremos y desconectar vamos sobrados).

Es cierto que hay versiones y chips más autónomos como es el caso del NodeMCU, que puedes programarlo en LUA o Python; o por ejemplo versiones más nuevas como el ESP8866-12 (para mis experimentos estoy utilizando el ESP8266-01), cuando yo lo compré me salía un poco más barato el ESP8266-01, además, lo quiero para un proyecto en el que cuanto más pequeño, mejor.

Estrenando el juguete

Pero por ahora estoy como un chaval con un juguete nuevo y quiero experimentar con él. Empezar a cacharrear y a descubrir sus posibilidades. Así que vamos a empezar conectándolo al ordenador a ver qué pasa. En principio, yo he utilizado un adaptador USB a puerto serie para poder enviar y recibir de la placa. Este adaptador (otros no lo hacen) tiene dos salidas VCC. Una a 5V proporcionada por el USB y otra a 3.3V después de pasar por un regulador de tensión. Y, como el ESP8266 trabaja a 3.3V, pongo una resistencia de 1KΩ entra la patilla de transmisión del adaptador y la patilla de recepción del ESP8266. En algunos adaptadores no hace falta, pero yo, sin esa resistencia no puedo comunicarme bien con el chip. No se me ha quemado, como dicen en muchos sitios, pero pasa de mi olímpicamente.
Adaptador USB a UART RS323

Aprovechar el adaptador USB de Arduino

Es otra opción si, como yo, eres de los que te pones a hacer este tipo de cosas a las 3 de la mañana y no tienes un adaptador a mano. Si tienes un Arduino cerca puedes probar hacer lo siguiente:

Así estarás utilizando la propia placa Arduino como conversor USB-TTL para nuestro ESP8266 ya que hemos puesto RESET a VCC, el chip Atmega no va a entrar en funcionamiento y todo lo que hablemos por el puerto serie lo estaremos aprovechando para nuestro ESP8266. Eso sí, dependiendo de la placa, la resistencia de 1KΩ ya no es necesaria. Además, yo en enlazado el RX de Arduino con el RX de la ESP8266 y el TX de uno con el TX del otro, mientras que con al conversor USB hacía lo contrario. Eso es por cómo está la placa etiquetada, si hacemos caso a las flechitas que hay dibujadas todo se entiende mejor.

Hablando con nuestro nuevo amigo

Lo tenemos todo listo para empezar a hacer algo con el chip. Así que vamos a hablar con él a través del puerto serie. Como está pensado para comunicarnos con otro microcontrolador (éste que se encargue de la comunicación y otro que haga el trabajo sucio), podemos enviarle comandos al chip y éste nos devolverá un resultado de la ejecución de dichos comandos. Así que lo podemos conectar sin problema a un Arduino (o un circuito basado en ATmega/ATtiny), un Raspberry PI, microcontroladores PIC o incluso una placa controladora de un móvil viejo si tenemos ganas de cacharrear. Aunque, por supuesto, el ESP8266 puede funcionar de manera autónoma.

El idioma que habla es el de los módems de toda la vida, tanto los de cable telefónico como los GSM. Bueno, no lo hablan todos los dispositivos, pero sí muchos de ellos, el lenguaje de comandos Hayes. Para mi gusto es un lenguaje muy imperativo (AT, viene de ATención) y serán comandos muy simples, y siempre con una respuesta cubriendo así todas las opciones que tiene nuestro chip. Así que vamos a conectar a un puerto USB nuestro ESP8266 y abrir un emulador de terminal. Podemos utilizar el mismo que viene con Arduino, aunque a mí me gusta más CuteCom. Aunque puedes utilizar GNU Screen si lo prefieres.
La conexión por defecto suele ser a 115200 baudios sin paridad y con CRLF como fin de línea (aunque a mí me funciona sólo con LF).

Hay algunos comandos que soportan las terminaciones _CUR y _DEF. Estas definiciones suelen afectar a la memoria interna del chip, ya que guardan valores de configuración. Estos pueden ser tratados sólo para la sesión actual (_CUR), por lo tanto cuando reiniciemos se perderá esa información; o pueden ser grabados de forma definitiva en el chip y recordados en futuras sesiones (_DEF). Esto nos permitirá por ejemplo conectar automáticamente con un punto de acceso o recordar la velocidad de conexión del puerto serie entre otras cosas.

Voy a hacer un resumen aquí de algunos comandos que podemos utilizar:

Comprobar el estado del chip

Sólo para saber que la comunicación se establece y que el chip está bien inicializado.

AT
OK

Si obtenemos un error aquí, puede deberse a:
  • La inicialización no ha sido correcta. Se ha encontrado un problema al ejecutar el programa y todas las demás acciones se cancelan.
  • La corriente de entrada no es estable. Tal vez haya habido alguna variación en la entrada y ha provocado un mal funcionamiento.
  • El voltaje no es estable o tiene valores muy grandes o muy pequeños. Igual que antes, eso puede provocar un mal funcionamiento. Si le metemos 9V al chip sí que nos lo podemos cargar, pero si le introducimos 5V no se garantiza que el funcionamiento sea correcto. Lo mismo si le aplicamos menos de 3V.
  • Error en el programa. Normalmente el firmware original está muy probado pero puede tener errores. Asimismo si probamos con otro firmware pueden pasar muchas cosas. ¡Pero estamos aquí para jugar y experimentar!
  • La velocidad de nuestro terminal no es correcta. Es decir, que o nuestro ESP8266 o nuestro ordenador estén hablando a diferentes velocidades, lo que puede trabar la comunicación.
  • ¡Cualquier cosa! En el mundo del HW y el SW todo puede fallar. Y te agradecería que pusieras un comentario para completar esta respuesta.
  • Tu ESP8266 está muerto, Jim. Porque todo puede pasar.
  • Tu conversor USB está muerto o, al menos, moribundo. Porque no siempre va a tener la culpa el mismo.
  • Revisa tus cables. Me ha pasado muchas veces, cuando tienes muchos cables juntos, algunos valen, otros no valen, estás con la protoboard y no hacen buen contacto o realmente tus ojos te han traicionado. Si estás con una placa soldada revisa también tus soldaduras, puede que haya un problema. Si es problema de contactos tal vez sí hagan contacto pero no sea muy firme y fluctúe la corriente.

Reset del dispositivo

Cuando queremos reinicializar el chip cancelando conexiones y empezar de nuevo (también podríamos quitarle corriente y volver a aplicársela).

AT+RST
OK
ets Jan  8 2013,rst cause:2, boot mode:(3,6)
load 0x40100000, len 1856, room 16
tail 0
chksum 0x63
load 0x3ffe8000, len 776, room 8
tail 0
chksum 0x02
load 0x3ffe8310, len 552, room 8
tail 0
chksum 0x79
csum 0x79
2nd boot version : 1.5
SPI Speed      : 40MHz
SPI Mode       : DIO
SPI Flash Size & Map: 8Mbit(512KB+512KB)
jump to run user1 @ 1000
….
….
….
Ai-Thinker Technology Co. Ltd.
ready

Restaurar valores de fábrica

Si queremos restaurar la configuración del chip como venía cuando lo compramos podemos ejecutar:

AT+RESTORE

El chip se reiniciará cuando termine de reponer todos los valores.

Versión del firmware

Nos dará información básica de la versión, y su fecha. Nos ayudará para saber si podemos ejecutar ciertos comandos o saber si tenemos ciertas características. Podremos actualizar nuestro chip en el futuro si queremos.

AT+GMR
AT version:1.1.0.0(May 11 2016 18:09:56)
SDK version:1.5.4(baaeaebb)
Ai-Thinker Technology Co. Ltd.
Jun 13 2016 11:29:20
OK

Echo de comandos

Si queremos que al enviar un comando nos diga qué comando hemos enviado o no. Por ejemplo, si lo utilizamos con un Arduino, puede ser incómodo enviar un comando y recibir la respuesta de nuevo. Nos puede dificultar un poco el parseo de la misma.

ATE1
OK <---- Activa echo
ATE0
OK <---- DESactiva echo
[/simterm]
Velocidad de conexión
Lo ideal es dejarlo como está 115200 baudios no es mala velocidad. Sobre todo si este chip se va a encargar de gestionar la red y otro sólo se limitará a controlar, o queremos el puerto serie para depuración o enviar algún comando. Aunque puede ser que el chip con el que vamos a conectar nuestro ESP8266 no sea capaz de ir tan rápido. Por ejemplo muchos Arduinos Duemilanove no van a más de 57600 y eso puede ser un problema. Así que no nos queda otra que cambiar la velocidad de nuestro chip.
Las velocidades válidas que he podido ver son: 9600, 19200, 38400, 74880, 115200, 230400, 460800 y 921600 aunque puede que con otro firmware más nuevo haya más velocidades soportadas.
[simterm]
AT+IPR=9600

La salida, debería ser un OK, aunque dado que hay un cambio de velocidad no vamos a ser capaces de captar ese OK. A partir de este momento podremos conectar a 9600 baudios.
Si lo vamos a conectar con un Arduino la velocidad de 9600 puede ser más que suficiente si sólo vamos a enviar/recibir datos de control. Por ejemplo, estados de dispositivo, temperaturas, etc y luego que el ESP8266 se encargue de generar una respuesta web por ejemplo y la envíe por la red.

Antiguamente había un comando AT+CIOBAUD con el que podíamos consultar la velocidad actual. Aunque no tiene mucho sentido ya que hemos tenido que establecer dicha velocidad para hacer la conexión. Así que con AT+IPR sólo podemos definir una velocidad nueva.
Atención. AT+IPR define la velocidad que le digamos. Eso es, que si no es una velocidad estándar, lo va a aceptar y el chip empezará a funcionar o malfuncionar a esa velocidad y puede que no podamos acceder a él hasta que flasheemos de nuevo el firmware. No es un brickeo completo, pero un pequeño error nos puede amargar un buen rato de trabajo.

Dato que este comando es peligroso, en versiones más nuevas del firmware se incluye AT+UART_CUR y AT+UART_DEF en donde podemos modificar los bits de parada, comprobación de paridad y algunas cosas más.

Cambiar modo WiFi

El WiFi del ESP8266 puede funcionar de varias maneras:

  1. STA – Modo estación. Es decir, el chip se conecta a un punto de acceso.
  2. AP – Punto de acceso. Para que los dispositivos se conecten a nosotros.
  3. STA+AP – Lo mejor de los dos mundos.

Ahora bien, podemos consultar cómo está funcionando el dispositivo y también definir el modo de funcionamiento. Este modo se mantendrá después del reset. Incluso tras la perdida de energía.

AT+CWMODE_CUR?
+CWMODE_CUR:1
AT+CWMODE_CUR=3
OK
AT+CWMODE_CUR?
+CWMODE_CUR:3

Listar redes WiFi disponibles

Sólo podremos listar las redes visibles si estamos en modo STA o STA+AP. Si sólo estamos como AP nos devolverá ERROR.

AT+CWLAP
<ins class="adsbygoogle"
style="display:block"
data-ad-client="ca-pub-1713542931034615"
data-ad-slot="2358673881"
data-ad-format="auto">
(adsbygoogle = window.adsbygoogle || []).push({});
+CWLAP:(4,”dlink-EFFB”,-88,”1c:2f:2b:64:ea:2b”,2,18,0)
+CWLAP:(3,”vodafone218A”,-90,”58:2a:f7:a9:31:90″,4,20,0)
+CWLAP:(0,”WLAN_TA1″,-91,”d4:a0:2a:cd:8e:f8″,5,13,0)
+CWLAP:(4,”Jazztel_A5B717″,-80,”9c:97:26:a5:c7:17″,6,16,0)
OK

Veremos una lista de las redes (así conocéis a mis vecinos un poco. Además vemos más información como:
  • Seguridad de la red:
    • 0 – Open. Red abierta.
    • 1 – WEP
    • 2 – WPA_PSK
    • 3 – WPA2_PSK
    • 4 – WPA_WPA2_PSK
  • SSID. O nombre de la red.
  • RSSI. Fuerza de la señal.
  • MAC. Dirección MAC del punto de acceso.
  • CH. Canal.
  • freq. offset. Offset del punto de acceso en KHz
  • freq. calibration. Calibración para el offset anterior.

Si queremos personalizar esta salida podremos utilizar algo como:

AT+CWLAPOPT=1,127
OK

En este caso ordenará las redes de la salida por su intensidad de señal (el primer valor, 0 si no queremos ordenarlas). Y mostrará todos los datos (el segundo valor es una máscara de bits que activa o desactiva cada uno de los valores de la salida).
Por ejemplo AT+CWLAPOPT=1,7 ordenará las redes por SSID y mostrará los valores de seguridad, ssid e intensidad de señal solamente.

Conectarse a una red WiFi

¡Vamos a hacer algo de provecho! Conectémonos a una red. Primero, elegiremos si vamos a tener activo DHCP o no, para que nuestro dispositivo coja una dirección IP automáticamente (Si el router no lo soporta, olvidémonos):

AT+CWDHCP_CUR=1,0
OK

Con esto decimos que en el modo 1 (Station) ponemos DHCP a 0. Si quisiéramos hacerlo con el modo AP sería el modo 0. Y si queremos activar o desactivar ambos modos a la vez, pondremos modo2.
AT+CWJAP=”MiRed”,”MiPassword”
WIFI CONNECTED
AT+CWJAP?
+CWJAP:”MiRed”,”xx:xx:xx:xx:xx:xx”,9,-73

Si utilizamos DHCP, ya tenemos que tener dirección IP. Pero si queremos configurar una IP estática haremos:

AT+CIPSTA_CUR=”192.168.0.19″,”192.168.0.1″,”255.255.255.0″

Donde la primera dirección es la dirección IP del dispositivo, el segundo es la puerta de enlace y el tercero la máscara de subred. Los dos últimos valores no es obligatorio especificarlos para el ESP8266, pero tal vez sí lo sea para tu red. Y luego cuando consultemos nuestra dirección IP:
AT+CIPSTA_CUR?
+CIPSTA_CUR:ip:”192.168.0.19″
+CIPSTA_CUR:gateway:”192.168.0.1″
+CIPSTA_CUR:netmask:”255.255.255.0″
OK

Las DNS a utilizar se obtienen o bien del router (por DHCP) o se establece OpenDNS (208.67.222.222). En versiones antiguas como la mía no se permite cambiar esta información, aunque en versiones nuevas se puede hacer AT+CIPDNS=1,dns_server

Y cuando queramos desconectar…

AT+CWQAP
OK

Otra forma de mirar la IP es utilizar:

AT+CIFSR
+CIFSR:APIP,”192.168.4.1″
+CIFSR:APMAC,”62:01:94:0b:0a:1a”
+CIFSR:STAIP,”192.168.0.19″
+CIFSR:STAMAC,”60:01:94:0b:0a:1a”

Resolver un dominio

Un dominio debe ser resuelto a una dirección IP antes de conectarnos hacia él. Aunque podemos conectarnos a través del nombre de dominio, para probar que todo está bien podemos pedir la información de la resolución del nombre. Internamente se contactará con el servidor de nombres para obtener el valor:

AT+CIPDOMAIN=”google.com”
+CIPDOMAIN:216.58.214.174
OK

Ping a un servidor

Con esto sabemos cuánto tarda en responder un host. Lo podemos hacer tanto por IP como por dominio:

AT+PING=”google.com”
+14
OK

Google ha tardado en contestar 14ms.

Conectar con un servidor web

Vamos a poner vamos comandos con el fin de descargar contenido de un servidor web.

  • Primero con CIPMUX diremos que vamos a soportar múltiples conexiones, Porque nosotros lo valemos.
  • Luego iniciamos una conexión (le damos 2 como identificador, por ejemplo)
  • Tras ello iniciamos un envío de datos por la conexión 2 de 61 bytes
  • Una vez aceptada, enviamos la información.
  • Ahora recibimos la información del servidor.

La conexión la vamos a hacer al servicio ifconfig.me, para saber cuál es nuestra IP remota en Internet. Veamos los comandos

AT+CIPSTART=2,”TCP”,”ifconfig.me”,80
2,CONNECT
OK
AT+CIPSEND=2,61
OK
GET / HTTP/1.1
Host: ifconfig.me
User-Agent: curl/1.2.3
Recv 61 bytes
SEND OK
+IPD,2,193,153.121.72.211,80:HTTP/1.1 200 OK
Date: Tue, 25 Jul 2017 19:26:52 GMT
Server: Apache
Vary: Accept-Encoding
Connection: close
Transfer-Encoding: chunked
Content-Type: text/plain
32.111.222.123
2,CLOSED

Como la conexión se cierra sola no hacemos nada más, pero si queremos cerrarla manualmente podemos hacer:
AT+CIPCLOSE=2
OK

Si queremos hacerlo rápido, ya que muchos servidores HTTP requieren velocidad a la hora de pedirles información porque tienen timeouts muy ajustados, podemos hacer un script como este:
1
2
3
4
5
echo -e "AT+CIPSTART=2,"TCP","ifconfig.me",80\r" >/dev/ttyACM0;
sleep 3;
echo -e "AT+CIPSEND=2,61\r" > /dev/ttyACM0 ;
sleep 1;
echo -e "GET / HTTP/1.1\r\nHost: ifconfig.me\r\nUser-Agent: curl/1.2.3\r\n\r\n" > /dev/ttyACM0 ;

Como vemos, en la línea de CIPSTART especificamos el ID de conexión, el tipo de conexión que puede ser TCP, UDP o SSL (bien por la seguridad, aunque la pondremos algo a prueba), el host o IP con el que contactar y el puerto. Y luego para CIPSEND especificaremos el ID de conexión y el tamaño de los datos a enviar, cuando recibamos el OK con el prompt (petición de información) procedemos a enviar los datos en bruto. Se leerán tantos bytes como hayamos puesto en el tamaño.

Actualización del Firmware por WiFi

Este chip soporta auto-actualización del propio software del chip si lo conectamos a una red inalámbrica de la siguiente manera:

AT+CIUPDATE
+CIPUPDATE:1
+CIPUPDATE:2
+CIPUPDATE:3
+CIPUPDATE:4

Tarda un rato en actualizar y tal vez tengamos un problema en nuestros dispositivos por temas de memoria. Sobre todo porque el chip viene con poco espacio de almacenamiento y los nuevos firmwares son mucho más grandes.:
  1. Encontrar el servidor
  2. Conectar
  3. Descargar el software
  4. Actualizar!!

¿Hay más?

Por supuesto tenemos más comandos soportados en viejas y nuevas versiones del firmware. He sacado sobre todo comandos de conexión a un punto de acceso y conexión como cliente aunque también podemos ser un punto de acceso y crear un servidor. Además de los modos de sueño y bajo consumo de los que quiero investigar un poco más. Aunque lo dejo para futuros posts. De todas formas, podemos ver la referencia de comandos AT del ESP8266.

El primero de muchos

Este cacharro me ha encantado, así que le dedicaré algunos posts más a los nuevos descubrimientos que haga con él. Lo próximo será programarlo y tengo muchas ideas para poner en práctica.

También podría interesarte....

Leave a Reply