Comenzando con ESP8266



ESP8266

Internet de las cosas ya no forma parte del ámbito de la  ciencia ficción, lo cierto es que ya está aquí para quedarse y empieza poco a poco a implantarse en nuestra sociedad. Cuando en un pasado no muy lejano nos hablaban de un frigorífico con capacidad para conectarse a internet para hacer la lista de la compra en caso de necesidad, parecía asunto de película, sin embargo poco a poco, cosas como estas nos parecerán cada vez más cotidianas en nuestras vidas y veremos toda clase de cacharros tecnológicos con capacidad de conexión a internet para volcar a servidores un chorro continuo de datos. Además en estos últimos meses estamos asistiendo al nacimiento comercial de los llamados wareables o dispositivos que podemos portar en nuestra ropa o en nuestro propio cuerpo con funciones avanzadas que precisan de conexión a internet. Por tanto, ya se están fraguando de forma sólida los cordones umbilicales que permitirán alimentar de internet a los pequeños y grandes dispositivos que hasta la fecha han permanecido aislados y privados de la comunicación, lo que supone una revolución sin precedentes en el mundo de la tecnología.

Aunque pensemos en principio que Internet de las cosas es algo reservado a las grandes compañías que fabrican los dispositivos electrónicos, podemos aseverar categóricamente que esto no es así ya que existe un universo paralelo, una revolución en el que caben todos, denominada DIY (hazlo tu mismo) que en el sector tecnológico está calando fuerte en una legión de entusiastas que fabrican sus propios aparatos electrónicos y que están formando sólidas comunidades. En gran parte el culpable de que se popularice este nuevo mundo, ha sido sin duda, el afamado Arduino con sus diversas placas para el desarrollo de prototipos, haciendo de esta manera más asequible la programación y el aprendizaje de la electrónica.

Como hemos dicho anteriormente para asomarse a la ventana de Internet con estos dispositivos y explotar su infinidad de posibilidades, es necesario contar con el canal de comunicación que lo permita, y en este sentido existen múltiples opciones como las soluciones cableadas o inalámbricas, siendo la comunicación sin cables la que generalmente es empleada de forma mayoritaria y especialmente el  WIFI (con sus ventajas y sus inconvenientes).

De la fábrica del mundo y de la mano de una empresa llamada Espressif, nos viene un pequeño, pero capaz dispositivo llamado ESP8266, que nos permite conectar cualquier cosa electrónica a Internet con un precio realmente competitivo. De sus características principales podemos mencionar que se alimenta con 3.3v con un consumo máximo según su hoja de especificaciones de 215 mA y que resumimos en la siguiente tabla.






Mode
Min
Typical
Max
Units
802.11b, CCK 1Mbps, POUT=+19.5dBm

215

mA
Standby

0.9

uA
Deep sleep

10

mA
Shutdown

0.5

uA

A continuación listamos algunas de las especificaciones destacadas, para ampliar esta información podemos consultar el datasheet:

  • 802.11 b / g / n
  • WPA /WPA2
  • Wi-Fi Direct (P2P), soft-AP
  • Built-in TCP / IP protocol stack
  • Built-in TR switch, balun, LNA, power amplifier and matching network
  • Built-in PLL, voltage regulator and power management components
  • 802.11b mode + 19.5dBm output power
  • Built-in temperature sensor
  • Support antenna diversity
  • off leakage current is less than 10uA
  • Built-in low-power 32-bit CPU: can double as an application processor
  • SDIO 2.0, SPI, UART
  • STBC, 1x1 MIMO, 2x1 MIMO
  • A-MPDU, A-MSDU aggregation and the 0.4 Within wake
  • 2ms, connect and transfer data packets
  • standby power consumption of less than 1.0mW (DTIM3)

Es digno de mencionar del anterior listado entre otras cosas, la seguridad mediante encriptación, la comunicación serie (para conectarlo por ejemplo con arduino), y la posibilidad de usarlo sin microcontrolador externo. Para colofón decir que tiene puertos GPIO digitales, que permite por ejemplo, conectar sensores o actuadores  y un puerto ADC (convertidor analógico a digital), que nos permite conectar sensores analógicos como un sensor de luz. Esto es de gran importancia ya que se puede usar el dispositivo de forma independiente de microcontroladores externos y posee a su vez de conectividad a internet incorporada.

El dispositivo ESP8266, no es un módulo wifi sino una familia de dispositivos enumerados de ESP-1 a ESP-12, cada uno con sus ventajas y características propias. Sin duda el más famoso y común es el ESP-1 de pequeño tamaño y con sólo dos GPIO habilitados.
download_20150304_184017.jpeg
 

En la siguiente imagen se muestra parte de la familia, (falta ESP-12)


Podemos ver en la siguiente tabla algunas de las características de importancia:

Modulo

Dimensiones

Antena

GPIO

ESP-01
14.3mmx24.8mm
PCB Antenna
GPOI0/2/16
ESP-02
14.2mmx14.7mm
U-FL connector
GPOI0/2/15
ESP-03
17.4mmx12.2mm
Ceramic Antenna
GPOI0/2/12/13/14/15/16
ESP-04
14.7mmx12.1mm
none
GPOI0/2/12/13/14/15/16
ESP-05
14.2mmx14.2mm
U-FL connector
NONE
ESP-06
14.2mmx14.7mm
None
GPOI0/2/12/13/14/15/16
ESP-07
22mmx16mm
Ceramic Antenna & U-FL connector
GPOI0/2/4/5/12/13/14/15/16
ESP-08
17mmx16mm
None
GPOI0/2/12/13/14/15/16
ESP-09
10mmx10mm
None
GPOI0/2/12/13/14/15
ESP-10
14.2mmx10mm
None
None
ESP-11
19.3mmx13mm
Ceramic Antenna
GPOI0/1
ESP-12
24mmx16mm
PCB Antenna
ADC + GPOI0/2/4/5/12/13/14/15/16

Según la tabla anterior, algunos de los módulos tienen una antena integrada, cerámica, o externa. En este aspecto destacamos ESP-07 que además de contar con una antena cerámica permite conexiones externas. En cuanto al los puertos disponibles destacamos ESP-12 ya que tiene un convertidor de analógico a digital además de varios GIPIO digitales.

Como podéis ver en las fotos anteriores los módulos se entregan sin tira de pines y sin conector usb para programar, hay algunos fabricantes que añaden una placa con la tira de pines ya soldada (facilitando su conexión a protoboard) e incluso un convertidor USB-SERIE,


Imagen cortesía de Electrohobby



OBJETIVOS DEL TUTORIAL

  • Conocer los materiales que necesitamos para empezar.
  • Realizar la conexión de alimentación y serie con el PC.
  • Actualizar el firmware (con linux).
  • Familiarizarnos con algunos de los comandos AT.
  • Enviar la primera información a internet en modo Estación.
  • Pasar a modo Punto de acceso y conectarnos desde el móvil al ESP8266
  • Hacer un test de potencia según distancia

MATERIALES EMPLEADOS

  • Módulo ESP8266 ESP-1
  • Convertidor USB-SERIE CP2102 (o similar)
  • Cargador de pared 5v 1.2 A (suministra corriente suficiente)
  • Regulador de Tensión 3.3v 800 mA (sólo si no tienes una fuente que proporcione 3.3v)
  • Cables macho/hembra

CONEXIÓN

En este tutorial hemos empleado un cargador de pared de 5v y lo hemos pasado por un regulador de tensión que permite el flujo de corriente de hasta 800 mA,
Como hemos dicho anteriormente  hay que tener en cuenta que funciona a 3.3v y puede tener en determinadas circunstancias (transmisión de datos) picos de consumo de  215 mA, por lo tanto es recomendable no suministrarle la energía mediante la salida 3.3v de Arduino ni con el convertidor USB-Serie ya que éstos no son capaces de ofrecer la suficiente corriente.

En la siguiente tabla podemos observar que para la elaboración de este tutorial,  no se ha usado en ningún caso la alimentación de 3.3v del convertidor USB-Serie para el suministro de energía del módulo sino que proviene de una fuente externa (en este caso un cargador normal que pasa por un regulador). Para activar el módulo el pin CHPD debe ir conectado a los 3.3v


CP2102
ESP8266 ESP-1
FUENTE 3.3V
RX
TX
-
TX
RX
-
-
CH_PD
VCC
-
RST
-
VCC:NO CONECTAR
3.3v
VCC
GND
GND
GND

GPIO2


GPIO0
*GND
(*) Se conecta a GND, sólo cuando se actualiza el firmware.
Una vez conectado, verás la nueva red inalámbrica con la SSID tipo “ESP_9CC14” o “AI-THINKER” (esto depende del firmware que lleve instalado), está configurado por defecto como punto de acceso. Lo primero que vamos a hacer es comprobar la versión del firmware para ello necesitamos conectarnos por el terminal serie. En las pruebas se ha usado Putty pero puedes utilizar cualquier otro.

Una vez arrancado Putty, hay que seleccionar el tipo de conexión serial y poner (en linux) el puerto dev/ttyUSB0 (o el que corresponda). En cuanto a la velocidad prueba primero con 9600. No olvides guardar la configuración para no tener que escribirla cada vez.



Importante: antes de conectar el módulo wifi abre la conexión de PC al convertidor USB-SERIE pulsando en “open” de Putty, tras lo cual se abrirá una ventana en negro y se quedará a la espera de que conectemos el módulo WIFI. Posteriormente alimenta al módulo ESP8266 con lo que conseguiremos ver el mensaje de bienvenida en la consola de Putty. Hecho esto ya estaremos en disposición de introducir comandos AT, así que lo primero que podemos hacer es comprobar el firmware instalado de la siguiente forma:

AT+GMR

Nota sobre Putty: es posible que obtengas un error después de introducir el comando y pulsar Intro, esto es porque Putty no añade a los comandos caracteres de retorno de carro de la comunicación serial. Sin embargo en Putty se puede hacer de forma automática pulsando la combinación de teclas  Ctrl+j (en vez de Intro). Existen muchos programas terminal que puedes probar como CoolTerm (Mac y Windows), o CuteCom para linux. En las siguiente imagen se puede ver cómo se marca la opción de  “LF line end”    para añadir los caracteres /r/n de forma automática con el software Cutecom.

cutecom.png


La respuesta al comando anterior nos indicará la versión instalada. A fecha de escribir este tutorial la última versión es la 0.95. Si tu versión no es la última es muy recomendable actualizar, dado que se avanza en la corrección de errores y mejoras. Existen algunos firmwares disponibles pero en esta ocasión instalaremos la versión oficial, aunque cabe destacar una versión modificada de el vendedor Electrodragón (permite manejar GPIO con comandos AT) y otra versión muy interesante que usa el lenguaje de programación LUA, llamado Nodemcu que nos permite interactuar con el módulo de forma sencilla.

Como hemos dicho anteriormente  vamos a instalar el firmware oficial, para lo cual necesitamos una utilidad para flashear el dispositivo que se llama ESptool (necesita de  pySerial, así que si no dispones de esta utilidad deberás instalarla en tu sistema). En este caso vamos a realizar la actualización mediante linux, pero existen utilidades para realizarlo bajo el sistema de las ventanas y de las manzanas.

Descarga el programa de flasheo aquí:


Y la versión original del firmware aquí


Colocamos  la herramienta Esptool y el firmware en la misma carpeta tal cual aparece en la siguiente imagen.

esptool.png

y ponemos el siguiente comando en la consola de linux (deberás de cambiar en su caso el puerto usado y el nombre del firmware)

sudo ./esptool.py -p /dev/ttyUSB0  write_flash 0x000000 AI-v0.9.5.0_AT_Firmware.bin

El proceso de actualización comenzará tan pronto como pulses la tecla intro y verás el progreso como se muestra en la siguiente imagen

update.png


PRIMEROS COMANDOS AT

Tenemos a nuestra disposición documentación oficial que nos proporciona valiosa información sobre los comandos AT, así como ejemplos de uso, dicha documentación puede ser descargada a través de la siguiente dirección de internet:


En el interior encontrarás una carpeta de documentación extensa sobre varios asuntos relacionados con el módulo

MODO STATION

El modo STATION, es aquel en el que el dispositivo se conecta a un router para obtener conexión a internet, captando del router los parámetros necesarios para conectarse. En definitiva es igual a cuando usamos nuestro teléfono inteligente para conectarnos a nuestra red wifi de casa o del trabajo, en el que previamente debemos seleccionar una red visible de nuestro entorno y proporcionar la clave de seguridad.

Como ya hemos mencionado anteriormente cuando iniciamos el ESP8266 por primera vez, este viene por defecto en modo punto de acceso por lo que deberemos cambiar a modo STATION. Una vez cambiado de modo buscaremos las redes disponibles en nuestro entorno y seleccionaremos aquella a la que deseemos conectarnos.

En primer lugar consultaremos el modo actual con el siguiente comando:

AT+CWMODE=?

La respuesta puede ser cualquiera de las siguientes:

  • 1 modo estación: actúa como un dispositivo que se conecta a un router y obtiene de él la dirección IP, y resto de parámetros de internet (el router al que se conecta tiene un servidor DHCP)
  • 2 modo punto de acceso: Actúa como un router, puede asignar direcciones IP a los dispositivos que se conecten a él, si tiene activado la opción DHCP
  • 3 modo estación + punto de acceso: los dos modos anteriores

Vamos a cambiar a modo estación:

AT+CWMODE=1

La respuesta será ok, podemos comprobar de nuevo el modo con

AT+CWMODE=?

Si el cambio de modo no se hace efectivo prueba a  hacer un reset

AT+RST

A continuación, vamos a hacer un listado de las redes del entorno:

AT+CWLAP
La respuesta en mi caso es

(3,"CASICA",-63,"38:72:c0:c1:17:3d",1)
(2,"WLAN_765F",-90,"00:1a:2b:af:cb:7c",6)

  • El primer número de la frase es la encriptación de la red, en mi caso encontré dos tipos de encriptaciones (el la documentación están todos los modos)

2 WPA_PSK
3 WPA2_PSK

  • En segundo lugar va el nombre de la red (por ejemplo “CASICA”).
  • Interesante es el tercer parámetro que se refiere a la potencia de la señal, en el ejemplo -63 es más potente que -90.
  • Después viene la dirección MAC
  • El último parámetro el canal wifi usado.

Una vez conocidos las redes disponibles vamos a conectarnos con una de ellas (ten a mano la contraseña si se trata de una red cifrada). El comando para hacer estos procesos es AT+CWJAP, antes bien vamos a consultar si estamos ya conectados a un punto de acceso de la siguiente forma

AT+CWJAP?

Evidentemente la respuesta sería  “No AP”

Para conectar a la red debemos escribir el siguiente comando, sustituyendo los parámetros para nuestro caso particular

AT+CWJAP=<ssid>,<pwd>

Ejemplo:

AT+CWJAP="MI RED","1234567890"

Si todo ha ido como se espera el resultado es OK, por defecto al encender el dispositivo, recordará los parámetros del punto de acceso y conectará automáticamente. Si consultas la documentación verás que esto puede configurarse de tal manera que no se recuerde la conexión automáticamente.

TCP IP

En primer lugar vamos a realizar una consulta para saber la IP que nos ha asignado el router

AT+CWLIF

Respondiendo a esta orden con nuestra IP local y la dirección mac.

Para conectarnos a un servidor primero confirmamos que vamos a realizar múltiples conexiones.

AT+CIPMUX=1

La siguiente orden hace la conexión propiamente dicha, en primer parámetro es la id de conexión (1-4), el segundo parámetro corresponde con el tipo de conexión (TCP/UDP), el tercer parámetro la dirección del servidor y el último parámetro es el puerto de conexión que normalmente es el puerto 80.


AT+CIPSTART=4,"TCP","www.google.com",80

Una vez realizada y confirmada la conexión con el servidor, hay que decirle de nuevo la id de conexión y el número de bytes se van a enviar por lo que previamente tendremos que hacer el conteo.

AT+CIPSEND=4,40

Después de indicar el tamaño de mensaje que le vamos a enviar nos aparecerá en la consola el signo > para que insertemos el mensaje. En nuestro caso vamos a componer el siguiente mensaje


GET / HTTP/1.0\r\n\r\n


La primera línea tiene 18 bytes y la segunda línea contiene 22 bytes, por lo que el mensaje tiene un total de 40 bytes.Si analizamos los datos comprobaremos que el primer parámetro corresponde al tipo de petición (GET, POST, PUT..) en segundo lugar se escirbe la URL que solicitamos (en el ejemplo se hace peticion de la raiz /), en tercer lugar el protocolo usado y su versión todo ello seguido de los caracteres de retorno.

La segunda línea corresponde al encabezado del mensaje que en este caso se envía HOST. Otros encabezados que podrían enviarse son User-Agent:, Accept:Content-Type:, etc. En cualquier caso puedes ampliar esta información usando el buscador


MODO PUNTO DE ACCESO

De fábrica vienen con esta configuración actuando como si fueran un router con IP por defecto 192.168.4.2, asì que cualquier dispositivo que se le conecte obtendrá una dirección IP automáticamente, se podría por tanto hacer una red local de dispositivos conectados. Este modo puede configurarse mediante los comandos AT y cambiar parámetros de interés como el el SSID, la encriptación usada, la IP por defecto y si actúa como servidor DHCP o no, asignando automáticamente IP a los dispositivos conectados a él. Con la siguiente instrucción de ejemplo tendremos configurado todo lo que hemos dicho.

AT+CWSAP="MIRED","1234567890",5,4

Dónde “MIRED” el nombre de la red, seguido de la contraseña, en canal wifi a usar y por último el tipo de encriptación según la siguiente tabla:




0 OPEN
2 WPA_PSK
3 WPA2_PSK
4 WPA_WPA2_PSK


Una vez se ha configurado el punto de acceso podrás ver la red desde tu dispositivo móvil o desde tu ordenador. Se pueden hacer pruebas muy interesantes para conocer el alcance de la red con aplicaciones de android que analizan las redes wifi, puedes por ejemplo ver la potencia del punto de acceso desde distintas lugares de tu hogar y meterlos en sitios como cajas, cajones o lugares poco accesibles para ver cómo afecta el rendimiento de la red.



Esta última imagen corresponde a la aplicación de android denominada PING TOOLS, con la que podrás, entre otras cosas analizar la potencia de la red WIFI, y comprobar si se pierden paquetes haciendo PING. He hecho pruebas incluso metido el montaje dentro de una caja metálica completamente cerrada y sorprendentemente he captado señal a varios metros

IMG_20150309_230219.JPG

En próximos tutoriales os enseñaré a cómo instalar el firmware Nodecmu y realizaremos programas sin microcontrolador externo manejando los puertos GPIO, usando por ejemplo LED y pulsadores. También es de mi intención hacer un tutorial entrar en modo servidor, instalar un sensor de temperatura digital e incluso volcar todos estos datos en una plataforma en la nube hecha ad hoc para almacenar todos estos datos y procesarlos denominada thingspeak.

Nota final: Te animo a que hagas aportaciones, comentarios y sugerencias al tutorial para mejorarlo, y en su caso a que notifiques si encuentras errores.

5 comentarios:

  1. Hola buenas, te comento, el tema es que me he fabricado un termostato con el ESP8266 y puedo gestionar la temperatura de la caldera desde cualquier parte del mundo desde mi móvil, viendo en todo momento Tª y humedad. El problema me surge cuando han pasado unas horas, el módulo se desconecta del wifi y me toca reiniciarlo físicamente. Había implementado un watchdog, pero al final no me sirve puesto que al reiniciar el módulo mediante SW tb me reinicia las patillas GPIO y la conexión con la caldera se pierde.

    ¿alguna sugerencia?

    Yo el circuito lo tengo sobre una pcb y lo alimento con un cargador de móvil del que saco 5v y 3.3v, las dos estabilizadas, así que supongo que no será ese el problema, igual es algo del código, pero como me pasa a las horas, no sé por donde pillarlo.

    Gracias

    ResponderEliminar
  2. A mi me pasa lo mismo se desconecta del wifi al cabo de un tiempo y hay que resetearlo à mano. Pensaba hacer watchdog también. Como lo has implementado?

    ResponderEliminar
  3. A mi me pasa lo mismo se desconecta del wifi al cabo de un tiempo y hay que resetearlo à mano. Pensaba hacer watchdog también. Como lo has implementado?

    ResponderEliminar
  4. Hola. Me ha pasado. Configure el Autoconn en 1 para que se conecte automaticamente y evito el hacerlo manual. Igual sigue el misterio del por que se desconecta

    ResponderEliminar