ESP8266 (Parte 2) : Programación en C, Simba y FreeRTOS

nodemcu_pins

 

En este segundo artículo voy a contar dos soluciones para programar en C el módulo ESP8266. Estas soluciones son mucho más potentes pero también se tarda más en implementar los programas.

Simba

logo

Después de encontrarme con los problemas de memoria mencionados en la anterior entrada, busqué una forma de programar el ESP8266 en C, y encontré el sistema operativo Simba. Simba es un RTOS (Sistema Operativo de Tiempo Real) escrito en C y con numerosos drivers fáciles de usar.

La forma de usar Simba con el ESP8266 también es muy sencilla, solo hay que descargar e instalar el editor Atom y luego dentro de Atom añadir el paquete de PlatformIO (platformio-ide). PlatformIO es un ecosistema orientado a la programación de sistemas empotrados. La ventaja principal de este ecosistema es la facilidad de compilar, flashear el firmware y conectarse por puerto serie desde el propio Atom.

Para empezar a programar nuestro ESP8266, crearemos un nuevo proyecto de PlatformIO y seleccionaremos la placa que vamos a utilizar, en mi caso, NodeMCU 1.0 (ESP-12E Module). Si queremos usar Simba tendremos que abrir el fichero platformio.ini y cambiar el framework escribiendo “framework = simba”. Además tendremos que ir a la carpeta lib/ y abrir el fichero readme.txt donde sustituiremos todo el fichero por el árbol de ficheros que tenemos en la página de documentación de Simba: https://simba-os.readthedocs.io/en/latest/developer-guide/file-tree.html. Todo el código que queramos añadir se meterá en la carpeta src/ .

escritorio-simbaos

Por último solo tendremos que usar los siguientes botones:

Compilar

Flashear

Terminal puerto serie

 platformio-compilar platformio-flashear  platformio-puerto_serie

Pese a su sencillez de uso  y rápido aprendizaje, he dejado de usar este sistema operativo debido a que hay drivers que no están implementados completamente y algunos los he tenido que hacer yo mismo. En mi caso, hago uso de Websockets para la comunicación, y las funciones para conectar un cliente de Websocket a un servidor del mismo tipo no estaban correctamente implementadas. Además me he encontrado funciones muy útiles que no funcionaban y al mirar el código he visto que no estaban implementadas, solo estaban definidas.

Creo que es un sistema operativo muy fácil de aprender a usar y tiene la potencia de C a su vez, pero para llegar a ser mi primera opción tendrían que trabajar más con los drivers, no puede ser que publiquen drivers sin implementar.

Otro fallo que le he visto, sobre todo debido a que me interesaba trabajar a bajo nivel, es que el código del firmware se encuentra oculto en una carpeta. Personalmente sería más cómodo que ese firmware que se va a compilar apareciera en el proyecto directamente, por si fuera necesario adaptarlo o para consultarlo más cómodamente.

Toda la documentación se puede encontrar en los siguientes enlaces:

 

 

  1. FreeRTOS

logo_freertos

Por último, pero para mi la solución con mayor potencial es el framework ESP-OPEN-RTOS. Es un firmware basado en FreeRTOS y en el SDK oficial de Espressif. Ha sido desarrollado por la empresa SuperHouse pero es de código abierto. No solo incluye FreeRTOS, sino que además se agregan librerías probadas de terceros que aumentan su funcionalidad. Principalmente estas librerías son lwip, que implementa la pila TCP/IP para sistemas empotrados, y embedTLS para implementar los protocolos TLS y SSL.

Para comenzar a utilizar hay que seguir las instrucciones que se indican en el repositorio:

  1. Clonar el repositorio de esp-open-sdk y compilarlo con :

make toolchain esptool libhal STANDALONE=n

  1. Añadir al PATH la carpeta “esp-open-sdk/xtensa-lx106-elf/bin”.
  2. Clonar el repositorio de esp-open-rtos en modo recursivo:

git clone –recursive https://github.com/Superhouse/esp-open-rtos.git

  1. Compilar y cargar el proyecto desde la carpeta raíz del firmware:

make flash -j4 -C examples/http_get ESPPORT=/dev/ttyUSB0

 

Este framework contiene numerosos ejemplos con los que aprender cómo usar los drivers, por ejemplo, como conectarse a una red WiFi o usar determinados periféricos.

Su ventaja principal es que se puede controlar todo el sistema ya que es una ampliación del framework básico del fabricante. Además tiene buenas valoraciones en Github y sus actualizaciones son bastante recientes.

La desventaja de este framework es que se necesita un mayor conocimiento de programación y electrónica para usarlo, además de que su tiempo de desarrollo es mayor frente a las soluciones que expliqué en el primer artículo.

Toda la documentación de esta solución se puede encontrar en su repositorio:

Github: https://github.com/SuperHouse/esp-open-rtos

Si se desea utilizar una solución más sencilla pero a su vez más limitada, se puede consultar en la parte 1.

ESP8266 (Parte 1): Programación en Lua y Arduino

ESP8266 (Parte 1) : Programación en Lua y Arduino

NodeMCU_DEVKIT_1.0

 

Desde que llegara al mercado el módulo ESP8266, muchos desarrolladores han visto su potencial para crear nuevas aplicaciones sobre él gracias a su bajo coste pero gran funcionalidad, y seguramente todos ellos se hayan hecho la misma pregunta al principio, ¿cómo lo programo? Con estos dos artículos quiero contar las diferentes formas que he encontrado para programarlo, y así cada uno pueda usar la que más se ajuste a sus necesidades.

Antes de comenzar con la programación me gustaría comenzar por una breve explicación de la plataforma. Yo he trabajado con la placa de desarrollo NodeMCU, cuya única diferencia con respecto al módulo ESP8266 es que tenemos acceso a todos los pines del módulo y además cuenta con un microUSB para cargarle los programas. El ESP8266 lo fabrica la empresa Espressif y es un System-on-Chip (SoC) que integra el microcontrolador Tensilica L106 de 32bit. En la tabla siguiente podemos ver las especificaciones completas:

Procesador Tensilica L106 32bit RISC
Frecuencia 80 MHz OverClock 160 MHz
Memoria Flash 4 MB Memoria RAM 128 KB
Periféricos
GPIO 13 SPI 2
I2C 1 ADC 10 bit
PWM 4  UART  1
WiFi
Norma 802.11b/g/n Frecuencia 2,4 GHz

 

Todos estos datos se pueden consultar en la página oficial de Espressif:

https://espressif.com/en/products/hardware/esp8266ex/overview

 

En esta primera parte voy a explicar cómo programar el NodeMCU de las dos maneras más sencillas y más extendidas, usando el lenguaje de programación Lua y usando el framework de Arduino.

NodeMCU Firmware

nodemcu-style5-150px.png_150x150

Se trata de un firmware basado en el lenguaje de programación Lua. Ha sido implementado por los mismos desarrolladores que han creado la plataforma de desarrollo. Este firmware se encuentra escrito en C pero con instrucciones para que se usen con Lua, que es un lenguaje interpretado, como Python, por lo que es menos eficiente. La forma de programación es muy sencilla, por lo que es perfecto para proyectos poco complejos y ŕapidos, que no necesiten optimización.

Para usar este método, lo primero que tenemos que hacer es ir a la página de la documentación, al apartado de “Building the firmware” y crear nuestro firmware que cargaremos en la placa. El método más cómodo es usar su servicio basado en la nube, ya que indicamos qué módulos necesitamos, y nos envían por email el binario ya compilado que tenemos que flashear en la placa.

Después hay que flashear el firmware. Para ello el método que a mi siempre me ha funcionado es usar “esptool.py”. Leyendo el apartado “Flashing the firmware” encontramos cómo usar este programa sumamente útil. A la hora de cargar el firmware, es necesario ejecutar el script en modo superusuario para permitir acceder al puerto al que tengamos conectado el NodeMCU.

Por último, solo nos queda subir los scripts de Lua que hemos creado. Para ello la mejor herramienta es ESPlorer. La documentación para esta herramienta la encontramos en su página web: https://esp8266.ru/esplorer/ . Este programa cuenta con una zona donde escribir el código y otra que se conecta por puerto serie a la placa donde ver lo que imprimimos por pantalla desde el NodeMCU. Otras herramientas las podemos encontrar en el apartado “Uploading code”.

escritorio-esplorer

Yo personalmente descarté este método después de estar usándolo porque no tenía un control total de la memoria, sino que solo había un recolector de basura al que tú le indicabas cuando tenía que buscar memoria que liberar. Mi problema principal fue que el flujo de datos de entrada era más rápido que el tiempo que tardaba el NodeMCU en mandarlos por SPI, y se me llenaba la memoría.

La documentación de este firmware se encuentra en las siguientes páginas:

 

Arduino IDE

1200px-Arduino_Logo.svg

Una de las grandes razones por las que esta plataforma se ha hecho tan famosa, a parte del precio, es por ser conocida como “el Arduino barato con Wifi”, gracias a que los desarrolladores implementaron la compatibilidad para desarrollar programas en ella de la misma manera que con las placas de Arduino.

La ventaja de usar este método es que es muy sencillo y rápido de realizar, además cuentas con las numerosas librerías que se han desarrollado para Arduino y de una gran comunidad que puede ayudarte.

La desventaja es que tienes menos control de las capas más bajas del hardware y además cuentas con las limitaciones del IDE de Arduino.

Para desarrollar usando este método, hay que agregar la placa en el IDE como se hace habitualmente: Herramientas>Placa>Gestor de Tarjetas e instalamos el paquete “esp8266 by ESP8266 Community”. Una vez instalados los drivers, simplemente se programa, compila y suben los programas tal y como se hacen con el resto de placas de Arduino.

En el siguiente enlace dejo un tutorial en castellano que explica cómo utilizar este método, incluyendo algunos ejemplos:

https://programarfacil.com/esp8266/como-programar-nodemcu-ide-arduino/

 

En la siguiente entrada hablaré de métodos de programación usando C, donde se consigue un control mayor de todo lo que realiza el módulo.

ESP8266 (Parte 2): Programación en C, Simba y FreeRTOS

TFG: Diseño e implementación de una red de nodos inalámbricos para comunicaciones multipunto de contenido multimedia

dav

 

En estos últimos años las redes inalámbricas de nodos de bajos recursos han incrementado notablemente su presencia, y debido al auge de tendencias como el “Internet de las Cosas”, se espera que cada vez más estos nodos se encuentren presentes en nuestro día a día. La flexibilidad y bajo coste de su despliegue, frente a redes de nodos cableados, hacen que sean la primera opción al implementar un sistema.

 

Estas redes normalmente no son exigentes con las tasas binarias de transmisión, y es por ello, que transmitir contenido multimedia a través de una red inalámbrica con recursos limitados suponga un mayor reto. Debido al deseo de crear grandes redes capaces de intercambiar datos, no sólo se buscan comunicaciones inalámbricas entre nodos, sino que además es deseable que estas sean multipunto.

 

El objetivo de este Trabajo de Fin de Grado es diseñar e implementar un sistema sencillo, independiente y de bajo coste con el que se puedan intercambiar de forma inalámbrica contenido multimedia, de manera que se consiga un sistema de comunicación multipunto con mínimos recursos.