Desarrollar aplicaciones de red para ESP8266 utilizando Mongoose en Linux
Vamos a discutir cómo empezar a desarrollar aplicaciones de red para el chip ESP8266 utilizando Mongoose Embedded Web Server en Linux. Utilizaré Ubuntu, pero todo se puede adaptar fácilmente a cualquier distribución de Linux.
Quién es quién
Ya que has empezado a leer este artículo, asumo que conoces Linux, ESP8266 y Mongoose. Así que sólo una breve introducción.
ESP8266
Chip barato con WiFi integrado, desarrollado por Expressif. Si quieres profundizar en más detalles, consulta el sitio oficial.
Mangosta
Mongoose es una completa biblioteca multiprotocolo con un núcleo de menos de 40kB desarrollada por Cesanta. Encuentra información sobre el modo en el sitio de Cesanta.
Linux
¿En serio? 🙂
Conectar el ESP8266 al ordenador
Bien, primero tenemos que conectar el chip ESP8266 a tu ordenador. Puedes hacerlo de varias formas.
NodeMCU
Si tienes un módulo NodeMCU, con convertidor UART a USB incorporado, todo lo que tienes que hacer es conectar el módulo al ordenador por USB. ¡KISS!
Conexión con un conversor UART-USB externo
Si tu módulo ESP no tiene un conversor UART-USB interno, necesitas uno externo. Hay montones de ellos, búscalos en Google.
Selecciona uno que funcione con Linux (básicamente, la mayoría de ellos) y que tenga un pin de 3,3V y recuerda: la mayoría de los convertidores UART-USB tienen pines tanto para 3,3V como para 5V, pero no debes conectar el ESP a pines de 5V. Este dispositivo no tolera el voltaje y es posible quemar tu módulo.
Ahora conecta (ESP -> Convertidor):
VCC -> 3,3V
GND -> GND
RX0 -> TX (no RX)
TX0 -> RX
CH_PD -> 3,3V
Conexión con Arduino
Si no tienes un conversor UART-USB, pero tienes Arduino con patillas de 3,3V, puedes utilizarlo fácilmente para conectar el ESP:
- Conecta Arduino al ordenador mediante USB
- Conecta el RESET del Arduino a su GND: es necesario para desactivar el procesador host, porque sólo necesitamos el módulo UART-USB
- Conecta el ESP (ESP -> Arduino)
- VCC -> 3,3V
- GND -> GND
- RX0 -> RX0 (no TX)
- TX0 -> TX
- CH_PD -> 3,3V
Verificación de la conexión
Si tu conexión es correcta, el ESP debería aparecer como un nuevo dispositivo tty. Normalmente, NodeMCU y ESP conectados a través del conversor UART-USB aparecen como /dev/ttyUSBx (x = 0, 1, 2 etc) y la versión de Arduino aparece como /dev/ttyACMx (x = 0, 1, 2 etc)
Puedes utilizar el comando dmesg | grep usb para encontrar tu dispositivo.
Por ejemplo, después de conectar NodeMCU verás algo así
[ 1496.765417] usb 2-3.3: new full-speed USB device number 15 using xhci_hcd
[ 1496.867729] usb 2-3.3: New USB device found, idVendor=10c4, idProduct=ea60
[ 1496.867736] usb 2-3.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 1496.867740] usb 2-3.3: Product: CP2102 USB to UART Bridge Controller
[ 1496.867743] usb 2-3.3: Manufacturer: Silicon Labs
[ 1496.867745] usb 2-3.3: SerialNumber: 4202
[ 1497.900384] usbcore: registered new interface driver usbserial
[ 1497.900423] usbcore: registered new interface driver usbserial_generic
[ 1497.900457] usbserial: USB Serial support registered for generic
[ 1497.903897] usbcore: registered new interface driver cp210x
[ 1497.903989] usbserial: USB Serial support registered for cp210x
[ 1497.904382] usb 2-3.3: cp210x converter now attached to ttyUSB0
Como puedes ver, NodeMCU está ahora disponible como /dev/ttyUSB0.
Como comprobación final, utiliza cualquier terminal para conectarte a un nuevo dispositivo; yo voy a utilizar picocom. Se trata de un terminal ligero. En Ubuntu se puede instalar con:
sudo apt install picocom
Probando:
picocom /dev/ttyUSB0 -b 115200
Si todo va bien, deberías ver «Terminal listo» en la salida de picocom.
Solucionar el error «Acceso denegado
Si picocom dice «Acceso denegado», suele significar que el usuario actual no es miembro del grupo de acceso telefónico: en Linux, para acceder a los puertos serie el usuario debe ser miembro de este grupo.
Ejecuta
sudo usermod -aG docker $USER
comando, cierra la sesión, vuelve a entrar e intenta conectarte de nuevo ESP. El «Acceso denegado» debería desaparecer.
Construir Mongoose
Descarga la última versión de Mongoose desde aquí.
Mongoose se entrega con un ejemplo para ESP8266 y RTOS SDK. El turorial y el código de ejemplo se encuentran aquí.
Nota: ESP8266 tiene dos versiones del SDK. La primera no está basada en SO y la segunda está basada en RTOS. En este artículo utilizaré esta última. Para encontrar las diferencias entre ellas, busca en Google o lee esta respuesta en el foro oficial.
Para construir el ejemplo tienes dos opciones:
- Utilizar docker e imágenes docker listas para usar
- Instalar el SDK y la cadena de herramientas en tu ordenador
Utilizar Docker
Esta es la forma más sencilla y creo que la mejor. Las imágenes docker de Cesanta contienen todo lo que necesitas para construir Mongoose para ESP (y no sólo Mongoose: cualquier aplicación ESP). Así, no necesitas instalar cosas localmente y puedes compartir fácilmente tu código con amigos y colegas para que puedan compilar tu firmware y obtener exactamente el mismo resultado.
La guía de instalación de Docker está disponible aquí. Pruébalo, es realmente sencillo, sólo tienes que añadir el repositorio de docker a tu Linux e instalarlo como un programa habitual con apt.
Una vez instalado docker ve a la carpeta mongoose/examples/ESP8266_RTOS y ejecuta build.sh
En la primera compilación, docker descargará la imagen necesaria. Puede tardar un poco, dependiendo de tu canal de Internet. Pero, una vez que build.sh se haya completado, en la carpeta ./bin encontrarás dos archivos .bin.
Ese es el firmware. ¡Ya lo has hecho!
Utilizar el SDK local
Si Docker es demasiado sencillo para ti o por cualquier razón quieres utilizar herramientas instaladas localmente, también puedes hacerlo.
Es un poco más difícil y aburrido, pero nada demasiado complicado. Especialmente, dado que Cesanta ha construido algunas herramientas para ti y no necesitas construirlas desde el código fuente.
Así es como funciona
- Clona ESP RTOS SDK de este repositorio. El makefile del ejemplo lo busca en la carpeta /opt/ESP8266_RTOS_SDK, por lo tanto, puedes poner una repo clonada en esta carpeta o modificar la ruta a ella antes de construir el ejemplo (ver más abajo).
- Descarga xtensa-lx106-elf.tar.bz2 de esta carpeta pública.
- Descomprime el archivo xtensa-lx106-elf.tar.bz2. Por ejemplo, en la carpeta /opt:sudo tar -xvf xtensa-lx106-elf.tar.bz2 -C /opt
- Modifica tu variable PATH, por ejemplo, si has desempaquetado la cadena de herramientas en la carpeta /opt utiliza el siguiente comando:export PATH=/opt/xtensa-lx106-elf/bin:$PATH
(también te recomiendo que añadas este comando a tus carpetas .bashrc o .profile, para mantener los cambios después de reiniciar el sistema)
Ahora ejecuta:
$ export SDK_PATH=/opt/ESP8266_RTOS_SDK # Put your path to SDK here
$ export BIN_PATH=./bin; mkdir ./bin
$ make clean; make BOOT=none APP=0 SPI_SPEED=40 SPI_MODE=dio SPI_SIZE_MAP=0
Y ahora, si todo está instalado correctamente tendrás el firmware en la carpeta ./bin
¡Lo has vuelto a hacer!
Flashear ESP
Hay muchas herramientas disponibles para flashear el ESP8266. Nosotros vamos a utilizar esptool. Para utilizarlo, clona este repositorio y añade la ruta a esptool.py en tu variable PATH (esto es opcional, y sólo conveniente).
Ahora, desconecta picocom, si aún está conectado (Sugerencia: pulsa Ctrl+A; Ctrl+D para salir de él) y ejecútalo:
esptool.py --port /dev/ttyUSB0 --baud 230400 \ write_flash --flash_mode=dio --flash_size=4m \ 0x00000 ${BIN_PATH}/eagle.flash.bin \ 0x20000 ${BIN_PATH}/eagle.irom0text.bin \ 0x7e000 ${SDK_PATH}/bin/esp_init_data_default.bin
Nota importante: si tu módulo no es una NodeMCU, tienes que conectar a tierra el GPIO0 antes de flashear (al conectar a tierra el GPIO0, el módulo pasa al modo de flasheo). Tras el flasheo, desconecta GPIO0 de tierra y reinicia el ESP.
Si no se ha producido ningún error, verás una salida como ésta:
Connecting...
Erasing flash…
Took 0.58s to erase flash block
Wrote 35840 bytes at 0x00000000 in 1.8 seconds (157.5 kbit/s)…
Erasing flash…
Took 2.02s to erase flash block
Wrote 301056 bytes at 0x00020000 in 15.4 seconds (156.7 kbit/s)…
Erasing flash…
Took 0.11s to erase flash block
Wrote 1024 bytes at 0x0007e000 in 0.1 seconds (163.5 kbit/s)…
Leaving…
¡Listo! Ahora el dispositivo está flasheado con tu firmware.
Primeros resultados
Ahora deberías ver aparecer una red WiFi «Mangosta». El ejemplo configura un AP. Utiliza la contraseña «Mangosta» para conectarte, luego navega a http://192.168.4.1/, y verás una página de saludo «Hola, mundo».
¡Enhorabuena! ¡Acabas de ejecutar el Servidor Web en el ESP8266!
Pasos siguientes
Los siguientes pasos dependen de ti. Puedes utilizar el ejemplo descrito como punto de partida.
Mira su archivo user_main.c . Configura un punto de acceso WiFi e inicia el servidor web. Puedes cambiar fácilmente el modo AP a un modo estación (y conectarte a tu red WiFi) y utilizar la API de Mongoose para implementar lo que quieras. Esta es una forma común de utilizar Mongoose, así que, puedes utilizar otro ejemplo de Mongoose para construir tu programa y tener http, tcp, udp, mqtt y más funciones en tu dispositivo ESP.
Utiliza los documentos de Espressif (por ejemplo éste ) para aprender a gobernar el módulo WiFi ESP8266 (y no sólo WiFi) y la documentación de Mongoose para descubrir las características de Mongoose.
¡Los punks no han muerto!