Una de las consecuencias más interesantes del crecimiento experimentado por la IoT en los últimos años (aunque casi se podría decir décadas), han sido las constantes novedades en ecosistemas IoT y la reducción de barreras para el acceso. Cuando hablamos de un ecosistema nos referimos al conjunto de placas hardware, servicios y software (lenguajes, entornos de desarrollo, etc.) que están específicamente diseñados para ser compatibles y facilitar el desarrollo de soluciones completas, desde el prototipado hasta el desarrollo de soluciones comerciales.
Podría argumentarse que los dos ecosistemas más relevantes actualmente (especialmente fuera del entorno industrial) son MicroPython y Arduino. Ambos están basados en hardware y software abiertos, ofreciendo una serie de herramientas de comunicación que permiten la interacción con multitud de sensores e interfaces. Comparten una sencillez y flexibilidad que los hace muy atractivos a la hora de llevar a cabo despliegues de sistemas IoT.
Arduino es un framework de desarrollo de aplicaciones IoT en C/C++ que define una API común de alto nivel para acceso al hardware—esta API permite por ejemplo abstraer operaciones como el acceso a entradas/salidas digitales o la gestión de interrupciones. El desarrollador debe tener en cuenta que Arduino no implementa la especificación completa de C/C++. Una consecuencia de esto es la ausencia de la C++ Standard Library; es decir, no hay contenedores o hilos, aunque se pueden utilizar librerías de terceros para suplir estas deficiencias.
En cuanto a MicroPython es importante destacar que cuando hablamos de él nos referimos también de manera implícita a CircuitPython por simplicidad. Ambas son implementaciones de Python optimizadas para ejecutarse en microcontroladores que soportan un subconjunto de las funcionalidades de Python 3. Son muy similares, pero no estrictamente compatibles. La diferencia principal es que CircuitPython es un fork de MicroPython patrocinado por Adafruit Industries con algunas modificaciones en cuanto a compatibilidad con microcontroladores y modificaciones en las APIs, especialmente para hacer que el acceso a periféricos hardware (por ejemplo, I2C) sea más sencillo.
Cada ecosistema dispone de una serie de placas comerciales compatibles. Una placa incluye el procesador, circuitos integrados (reguladores de tensión) para la alimentación, puertos hardware, interfaces de comunicación inalámbricas (WiFi, Bluetooth), etc. Hay multitud de placas con diferentes capacidades, aunque todas ellas comparten una característica importante: ofrecen una solución autocontenida a un coste razonable.
A continuación, comentamos un conjunto destacable de familias de placas. Obviamente hay mucha más oferta en el mercado, pero estas tienen bastante presencia y disponen de bastantes recursos y documentación.
Esquema de alto nivel de familias de placas consideradas
Probablemente la familia más reconocible de placas es la que fabrica Arduino. Como hasta este punto hemos dicho que Arduino es un framework C/C++ es posible que surja alguna confusión acerca de los productos y servicios ofrecidos bajo ese nombre. Arduino es también una marca registrada que fabrica placas compatibles con el framework del mismo nombre, aunque hay que tener en cuenta que una placa puede ser compatible con el framework Arduino sin estar fabricada por la propia compañía. De hecho, hay productos de terceros que son copias más o menos exactas de placas de Arduino; esto es posible porque los diseños están publicados bajo licencias de hardware abierto.
Las placas de Arduino incluyen las notablemente famosas Uno o Nano basadas en el microcontrolador ATmega328 - éstas han sido probablemente el primer punto de contacto de muchos desarrolladores con la IoT debido a su popularidad. Arduino también ofrece placas más modernas con conectividad inalámbrica, más memoria y procesadores más rápidos como por ejemplo la línea MKR. Otro ejemplo destacable es la Arduino Yun, que incluye dos procesadores, uno integrado en un microcontrolador AVR de bajas prestaciones para gestión del hardware y otro más potente capaz de ejecutar un SO Linux. La oferta de Arduino es bastante extensa así que recomendamos revisar el catálogo oficial para hacerse una idea del conjunto completo.
Adafruit también dispone de una gama muy completa que recibe el nombre comercial de Feather. Todas estas placas son compatibles con el framework Arduino, mientras que una selección destacable también lo son con CircuitPython; es decir, se pueden programar con C/C++ o con Python. El soporte de Arduino en las placas Feather simplifica mucho la portabilidad del código entre ambos ecosistemas. Obviamente hay diferencias en el número de entradas y salidas, o las capacidades, pero las APIs son iguales en la mayoría de los casos.
El ecosistema Feather ofrece una extensa variedad de placas “complementarias” agrupadas bajo el nombre comercial Feather Wings. Estas se pueden acoplar a las placas Feather base para añadir funcionalidades diversas; por ejemplo, GPS, chips de decodificación y amplificación de música o pantallas táctiles TFT. Una de las ventajas más interesantes de las Feather Wings es que están diseñadas para maximizar la compatibilidad con las placas Feather. Todas ellas incluyen librerías y documentación explícita, de manera que la experiencia de uso suele ser normalmente más ágil que con placas complementarias de terceros en otros ecosistemas (especialmente cuando se intenta utilizar más de una placa complementaria a la vez).
La comunidad ha demostrado mucho interés y aceptación por los microcontroladores ESP8266 y su sucesor ESP32. Esta popularidad reside en una combinación de bajo coste, velocidad del procesador, un volumen respetable de memoria y conectividad WiFi. Hay muchas placas disponibles que integran estos microcontroladores, sin ir más lejos la propia línea Feather de Adafruit ofrece la placa HUZZAH32 basada en el ESP32; NodeMCU es un ejemplo bastante popular de una placa basada en ESP8266 (compatible con el framework Arduino y MicroPython).
Pycom es otro fabricante de relevancia que ofrece un catálogo integrado de placas con amplia variedad de interfaces de comunicación, software y servicios asociados. Las placas Pycom se programan principalmente en MicroPython—es posible programarlas con Arduino, pero el soporte no es oficial. La mayoría de las placas de Pycom están basadas en el microcontrolador ESP32 descrito anteriormente.
Una de las características diferenciadoras de Pycom es la verticalidad de su ecosistema, que permite diseñar una solución de principio a fin utilizando servicios con mínimo trabajo de integración y adaptación por parte del desarrollador. Un ejemplo de esto es la capacidad que ofrece Pybytes para gestionar remotamente el firmware y la configuración de red de las placas de un despliegue.
Existen varios entornos de desarrollo compatibles con uno o ambos ecosistemas. Estos entornos ayudan en el desarrollo del código y gestión de librerías de terceros. Pueden aportar herramientas tanto para el despliegue como para la ejecución de código directamente sobre las placas (generalmente conectadas por USB) aunque también hay opciones de despliegue mediante WiFi.
Dos de las opciones más populares en Arduino son el Arduino IDE y su homólogo Web; estos están desarrollados por la propia compañía y ofrecen soporte de primer nivel para las placas Arduino, aunque carecen de funcionalidades de IDEs más avanzados. La extensión PyMakr para Atom y Visual Studio Code es una buena opción para desarrollo en MicroPython, especialmente dentro de la familia de placas Pycom.
Captura de Atom con la extensión PyMakr
El conjunto de herramientas de PlatformIO merece mención aparte. PlatformIO es una plataforma de desarrollo de aplicaciones para placas IoT que simplifica enormemente la gestión de toolchains de compilación y librerías; está disponible como una extensión para Visual Studio Code y CLion.
Está basado en el concepto de entornos, cada entorno permite definir (entre otras cosas):
- El framework: el conjunto de abstracciones software y APIs sobre las que se va a llevar a cabo el desarrollo (en el caso que nos ocupa la opción más interesante es Arduino).
- La plataforma: el microcontrolador o arquitectura objetivo sobre el que se va a desplegar el software desarrollado en el framework definido previamente (por ejemplo, Atmel AVR, la familia de microcontroladores que contiene a Arduino Uno).
- La placa: la instancia concreta del microcontrolador dentro de la plataforma que especifica la distribución de entradas y salidas, los periféricos, la memoria, flash, etc (por ejemplo, Arduino Uno).
La definición de un entorno automatiza casi por completo todo el proceso de compilación, ya que PlatformIO se encarga de descargar las herramientas necesarias para compilar y cargar el firmware en la placa correspondiente, siendo además capaz de auto-detectar la presencia de la placa conectada en muchos casos. Esto nos permite centralizar el desarrollo del software para un amplio rango de placas dentro de un mismo IDE.
PlatformIO ofrece además servicios adicionales como análisis de código o la capacidad para desarrollar contra dispositivos conectados a una máquina remota.
Captura de Visual Studio Code con la extensión PlatformIO
Los dos ecosistemas comentados comparten una serie de principios básicos (entradas y salidas, buses internos, etc.), pero a su vez tienen diferencias en otros aspectos como capacidad de cómputo, memoria o conectividad. En la siguiente tabla podemos ver una comparativa de las diferencias más relevantes:
|
Arduino |
Micropython |
Programación |
Código en C/C++, permite una ejecución más rápida y con menos gasto de energía, a costa de una complejidad en el código. |
Subconjunto de instrucciones de Python 3, instrucciones más lentas, mayor gasto de energía pero más simple. |
Estructura de código |
Tiene una estructura predefinida, basada en 3 secciones: inicialización de librerías y variables; setup donde se declaran los objetos y métodos a utilizar y loop donde se estructuran las tareas a realizar. Las librerías van a parte del código. |
Árbol de directorios. Permite una programación modular más sencilla, al igual que Python. Las librerías se estructuran en un directorio específico. |
Despliegue |
Requiere compilación previa, antes de enviar el código a la placa. Cada modificación debe hacerse en una máquina a parte donde se aloja el compilador. |
No requiere compilación, en la placa se monta el sistema de ficheros. Los archivos de código pueden modificarse a través de WiFi directamente sobre la placa. |
OTA |
Requiere placa con conectividad inalámbrica. Ciertas librerías facilitan el despliegue de versiones automático. No todas las placas son capaces ya que requieren de una memoria interna lo suficientemente amplia para realizar los cambios oportunos. |
|
Energía |
Al llevar código precompilado, su consumo ronda los 50 mAh en un Arduino UNO, pudiendo bajar hasta los 15 mAh en el Arduino NANO. Estas placas no cuentan con conectividad inalámbrica, por lo que su consumo no es tan alto en la mayoría de ocasiones. |
El intérprete de Python genera un consumo de unos 80-180 mAh en un ESP32 genérico, debido tanto al intérprete como a que la mayoría de las placas integran un chip WiFi que genera un gran consumo. En placas más comparables a las de Arduino que no tienen conectividad inalámbrica, como la Pyboard, los consumos pueden llegar a ser de 20-60 mAh |
Ambas tecnologías ofrecen soluciones tanto en el aspecto del prototipado como en los despliegues comerciales. Por la construcción de las placas, así como por el código utilizado, cada arquitectura es más adecuada para unos u otros aspectos. Arduino, gracias al código precompilado, resulta generalmente más robusto, rápido y eficiente, por tanto, más adecuado en muchas ocasiones para despliegues finales. Por su parte, Micropython ofrece un desarrollo muy rápido con el intérprete de Python y conectividad WiFi en casi todas sus variantes, lo cual lo hace en gran medida adecuado para prototipos.
Un ejemplo de utilización de MicroPython en CTIC es el proyecto HEART. En este proyecto, MicroPython juega un papel fundamental en la monitorización de cientos de sensores situados en equipos de aire acondicionado distribuidos en varios edificios. Para las comunicaciones, el chip WiFi integrado en las placas seleccionadas (Pyboard) nos permite una comunicación rápida con los sensores, utilizando tecnologías web para acceder a los datos.
Las tecnologías, frameworks y soluciones IoT expuestas están enfocadas desde sus inicios en el marco del prototipado. Arduino y MicroPython proporcionan unas herramientas sencillas y rápidas a la hora de acercarse al mundo del IoT, y los entornos de desarrollo antes descritos facilitan en mayor medida su uso. Es de esperar que ambas tecnologías coexistan y evolucionen hacia soluciones más eficientes, potentes y flexibles, que permitan la integración de las últimas tecnologías en comunicaciones de una forma barata y sencilla.
- Equipo WoT -