Arduino Intel Edison + Intel IoT Analytics
Este artículo está motivado por mi asistencia a hackathon celebrado entre el 25 y 27 de marzo en el World Hosting Days en Europa Park, Rust, Alemania. Más información: http://worldhostingdays.com/global/
Datos del hackathon: http://worldhostingdays.com/global/side-event/cloud-community-hackathon
En mi caso fui a participar en el proyecto conjunto de 1and1 e Intel donde el objetivo era comprobar las características del microprocesador Intel Edison manejando sensores y actuadores en combinación con el motor de analíticas de Intel para IoT hospedado en el cloud de 1and1. Los detalles del proyecto pueden verse en: http://worldhostingdays.com/global/project/1and1
El kit de herramientas que dispusimos fue:
- Intel framework
- Intel Edison Boards: http://www.intel.com/content/dam/support/us/en/documents/edison/sb/edison_pb_331179002.pdf
- Intel Edison Compute Module resources: https://software.intel.com/en-us/iot/hardware/edison
- Developer Kits for the Intel® Edison Module: https://software.intel.com/en-us/iot/hardware/edison/dev-kit
- Cloud infrastructure
- Open IoT Connector hosted by 1&1 which connects devices to the cloud. http://streammyiot.com/
- 1&1 Analytic Cloud Environment with MQTT broker and Node.js.
También dispusimos de la API para interactuar con el cloud de 1&1:
- Cloud API: https://cloudpanel-api.1and1.com/documentation/
- Python SDK: https://www.1and1.com/cloud-community/develop/11-python-cloud-server-sdk/get-the-sdk/
Arduino Edison
Intel Edison es un módulo de computación de Intel que es posible usarlo con el formato de Arduino. Está centrado en el IoT y wearables. Tiene un sistema linux yocto embebido pero es capaz de ejecutar los Sketch de Arduino que al ser compilados se guardan en un directorio del sistema de ficheros y es ejecutado. También dispone de conectividad Wi-Fi y Bluetooth.
El Intel Edison es un pequeño módulo desarrollado por Intel y orientado a la electrónica embebida incluso en proyectos comerciales. Es una pequeña placa llena de posibilidades y no es para menos ya que en su diminuto tamaño encontramos un Intel® Atom™ SoC dual-core con WiFi, Bluetooth LE integrado. Una funcionalidad importante es que dispone de un conector genérico de 70 pines para poder conectar todo tipo de periféricos y placas desarrolladas para esta plataforma.
Está pensado para aplicaciones de bajo consumo pero gracias al amplio soporte de software proporcionado por Intel, puede ser utilizado en poco minutos incluso por principiantes en electrónica.
Web Intel Edison:
- https://software.intel.com/en-us/iot/hardware/edison
- https://software.intel.com/es-es/iot/hardware/edison
Wikipedia: https://en.wikipedia.org/wiki/Intel_Edison
El kit de Arduino Edison incluye los pines hembra de Arduino, que permite conectar la mayoría de placas shields de Arduino al módulo de forma nativa. Todos los pines del 0 al 13 (junto con AREF y GND), pines analógicos 0 a 5, alimentación, ICSP y el UART están en el mismo sitio que el Arduino UNO R3 para guardar la máxima compatibilidad. Además la placa del Intel Edison incluye un zócalo para tarjetas de memoria Micro SD, un conector Micro USB conectado al UART2 y un conector estándar USB 2.0. En la documentación se dispone de librerías para gestionar los pines de Arduino disponibles.
Arduino Edison HW guide: http://www.intel.com/content/dam/support/us/en/documents/edison/sb/edison-arduino-hardware-guide.pdf
Arquitectura Intel Edison (microprocesador):
- Dual-core Intel® Atom™ processor at 500 MHz
- 1 GB DDR3 RAM, 4 GB eMMC flash
- 40 multiplexed GPIO interfaces
- Bluetooth* 4.0, Wi-Fi*
- Yocto Project*, Brillo*
- Arduino* compatible
- Open-source software development environment
- C/C++, Python*, Node.js*, HTML5, JavaScript*
Características: http://download.intel.com/support/edison/sb/edison_pb_331179002.pdf
Arduino Edison: https://www.arduino.cc/en/ArduinoCertified/IntelEdison
Características de la placa:
- 20 digital input/output pins, including 6 pins as PWM outputs.
- 6 analog inputs.
- 1 UART (Rx/Tx).
- 1 I2C.
- 1 ICSP (In-system programming ) 6-pin header (SPI).
- Micro USB device connector OR (via mechanical switch) dedicated standard size USB host Type-A connector.
- Micro USB device (connected to UART).
- SD card connector.
- DC power jack (7 to 15VDC input).
Documentación: https://software.intel.com/es-es/iot/hardware/edison/documentation
Intel ha desarrollado sus propias herramientas para programar el microprocesador Intel Edison, que ofrece más potencia a la hora de programarlo que con el lenguaje de Arduino y su IDE, pero tiene la desventaja de tener que aprender su SDK. El SDK puede encontrarse en descargas: https://software.intel.com/es-es/iot/hardware/edison/downloads
Al igual que el Arduino UNO el kit de Intel® Edison para Arduino hace posible tener 20 pines digitales de entrada/salida, 6 de los cuales pueden usarse como entradas analógicas. El Intel® Edison tiene 4 salidas PWM que pueden configurarse mediante jumpers para usarse en cualquiera de los 6 pines que soportan PWM en el Arduino UNO (pins 3, 5, 6, 9, 10, or 11).
Los pines de entrada/salida (I/O) y los analógicos pueden ser configurados para funcionar a 5V o 3.3V. Los pines en modo salida soportan hasta 24mA a 3.3V y 32mA a 5V
Arquitectura:
Para usar el microprocesador Intel Edison, hay también disponible una breakout board:
Breakout board: http://download.intel.com/support/edison/sb/edisonbreakout_hg_331190006.pdf
Esta breakout board ha sido diseñada para exponer los pines nativos a 1.8V del Intel® Edison y poder trabajar con ella. La placa se compone de una fuente de alimentación, una cargador de batería, USB OTG power switch, UART to USB bridge, USB OTG port y I/O header.
Pinout: http://www.intel.com/content/www/us/en/support/boards-and-kits/000006090.html
Hardware Guide: http://download.intel.com/support/edison/sb/edisonmodule_hg_331189004.pdf
Compra:
- https://www.sparkfun.com/products/13097
- https://store.arduino.cc/index.php?main_page=product_info&products_code=E000051
Comparativa de Intel Edison:
Edison no es una raspberry Pi, principalmente porque no hay una salida de video en Edison. Aquí hay una buena comparativa: https://www.sparkfun.com/news/1603
Más información de Intel Edison en: https://www.arduino.cc/en/ArduinoCertified/IntelEdison
Arduino Edison tiene una distribución de Yocto Linux corriendo en su interior. Más información sobre el proyecto Yocto en: https://en.wikipedia.org/wiki/Yocto_Project
Programación Arduino Edison
Arduino Edison es posible programarlo con el IDE de Arduino y es posible desde el sketch de Arduino hacer peticiones al kernel de Linux con llamadas al sistema.
Enlaces imprescindibles para empezar con Arduino Edison:
- Getting started: https://software.intel.com/es-es/get-started-edison-windows
- Getting started breakout board: https://communities.intel.com/docs/DOC-23878
- Getting started Arduino Edison: https://www.arduino.cc/en/guide/IntelEdison
- Conectar el terminal: https://software.intel.com/en-us/setting-up-serial-terminal-intel-edison-board
- Conectar a una red Arduino Edison: https://software.intel.com/en-us/connecting-to-a-network-intel-edison-board
- Code samples: https://software.intel.com/es-es/iot/documentation?search_api_views_fulltext=&page=0&value=80494;20780
Para poder usar Arduino Intel Edison con el IDE de Arduino, es necesario instalar el paquete para las Intel i686 Boards.
Los entornos de desarrollo para Intel Edison son:
- Arduino IDE (getting started: https://software.intel.com/es-es/get-started-arduino)
- Soporte Eclipse: C, C++ y Python
- Intel XDK soporta: node.JS y HTML5
IDEs para hardware Intel: https://software.intel.com/es-es/iot/tools-ide/ide
Development environment:
- Xdk: https://software.intel.com/en-us/intel-xdk
- Intel System Studio: https://software.intel.com/en-us/iot/tools-ide/ide/iss-iot-edition
Supported sensors:
- https://software.intel.com/en-us/industrial-sensors-with-upm-support
- https://iotdk.intel.com/docs/master/upm/modules.html
- Sensores: https://software.intel.com/es-es/iot/hardware/sensors
Sensor kits:
- https://www.seeedstudio.com/Grove-Starter-Kit-Plus-IoT-Edition-p-2634.html#
- https://www.seeedstudio.com/Grove-Indoor-Environment-Kit-for-Intel%26reg%3B-Edison-p-2427.html#
Intel XDK IoT Edition (programar con node.js):
- Download: https://software.intel.com/en-us/intel-xdk
- Tutorial: https://learn.sparkfun.com/tutorials/sparkfun-inventors-kit-for-edison-experiment-guide/installing-the-intel-xdk-iot-edition
- Downloads Intel Edison: https://software.intel.com/en-us/iot/hardware/edison/downloads
- https://software.intel.com/en-us/getting-started-with-xdk-and-iot
- https://software.intel.com/en-us/xdk/docs/getting-started-intel-xdk-nodejs-iot
- Docs: https://software.intel.com/en-us/xdk/docs/config-edison-iot-dev-board
- Tutorial: https://www.hackster.io/wesee/intel-edison-and-intel-xdk-iot-edition-101-c29599
Procedure to Autostart the Arduino Sketch on Intel® Edison: https://software.intel.com/en-us/blogs/2015/08/01/procedure-to-autostart-the-arduino-sketch-on-edison
Modo AP en Intel Edison: https://software.intel.com/en-us/getting-started-with-ap-mode-for-intel-edison-board
Ejemplos de uso de Arduino Edison:
- Añadir un sensor de luz con el Intel SDK: https://software.intel.com/en-us/node/623316
- Uso de websockets: https://software.intel.com/en-us/creating-an-application-to-communicate-using-web-sockets
- Modbus con Intel Edison: https://software.intel.com/en-us/blogs/2015/11/27/modbus-on-intel-edison
- Movie recomender: https://communities.intel.com/docs/DOC-23838
- Robot: https://communities.intel.com/docs/DOC-23864
- Ejemplo de watering system: https://software.intel.com/en-us/articles/how-to-intel-iot-code-samples-watering-system-in-cpp y https://github.com/intel-iot-devkit/how-to-code-samples/blob/master/watering-system/cpp/README.md
Arduino Galileo
Existen otros Arduinos con microprocesadores Intel, uno de ellos es el más reciente Arduino 101 que es el mismo concepto que Arduino UNO, pero con concepto de SoC del Arduino Edison también existe el Arduino Galileo. Este es un Arduino anterior y con menos capacidades que el Edison.
Para usar el Arduino Galileo con el IDE de Arduino es necesario instalarse el el paquete para las Intel i586 Boards.
Arduino Galileo (retirado): https://www.arduino.cc/en/ArduinoCertified/IntelGalileo
Arduino Galileo Gen2: https://www.arduino.cc/en/ArduinoCertified/IntelGalileoGen2
Web Intel: https://software.intel.com/es-es/iot/hardware/galileo
Wikipedia: https://en.wikipedia.org/wiki/Intel_Galileo
Arduino Galileo también usa Yocto Linux.
Edison vs Galileo:
- http://stackoverflow.com/questions/26978356/compare-intel-galileo-and-intel-edison
- http://aunclicdelastic.blogthinkbig.com/galileo-y-edison-pequenos-dispositivos-para-grandes-proyectos/
Plataforma Cloud IoT de Intel
Una vez aclarado qué es Arduino Edison y que ya sabemos que podemos programarlo como cualquier otro Arduino, veamos cómo combinar nuestra experiencia con Arduino con la plataforma cloud IoT de Intel para hacer proyectos de IoT.
Intel al igual que otras muchas empresa ha desarrollado sus recursos para IoT. La Web de recursos para IoT de Intel: https://software.intel.com/es-es/iot/home
Visión de Intel en el IoT: http://www.intel.la/content/www/xl/es/internet-of-things/overview.html
La plataforma cloud IoT de Intel está disponible en http://streammyiot.com/ y es posible registrarse y usarla de forma gratuita.
Intel® IoT Analytics Platform:
- Provides seamless Device-to-Device and Device-to-Cloud communication.
- Ability to run rules on your data stream that trigger alerts based on advanced analytics.
- Foundational tools for collecting, storing, and processing data in the cloud.
- Free for limited and noncommercial use.
Con los datos recogidos con esta plataforma luego es posible extraerlos, transformarnos, cargarlos y utilizarlos. Cuando son enormes cantidades es cuando se usa el big data: https://software.intel.com/en-us/bigdata
Esta plataforma IoT está alojado el los servidores cloud de 1&1: https://www.1and1.com/dynamic-cloud-server
Para empezar a usar esta plataforma tenemos toda la documentación en:
- Getting started: https://software.intel.com/en-us/intel-iot-platforms-getting-started-cloud-analytics
- Docs API: https://github.com/enableiot/iotkit-api/wiki/Api-Home
Tutorial excelente para uso de Arduino edison con Intel IoT Analytics: http://www.instructables.com/id/Intel-IoT-Analytics-Dashboard/
Otro tutorial: https://medium.com/@shonsh/visualizing-sensor-data-using-intel-iot-analytics-d2d1de9ae118#.5ktwz5lyl
Otras plataformas de cloud analytics con las que conectar el Arduino Edison: https://software.intel.com/en-us/iot/cloud-analytics:
- Google cloud Platform: https://software.intel.com/en-us/iot/cloud-analytics/google
- Amazon Web Services: https://software.intel.com/en-us/iot/cloud-analytics/aws
- Microsoft Azure: https://software.intel.com/en-us/iot/cloud-analytics/microsoft-azure
- IBM Watson: https://software.intel.com/en-us/iot/cloud-analytics/ibm
Uso de la Plataforma Intel IoT Analytics
Una vez aprendidos los conceptos vamos a ponerlos en práctica conectando el Arduino Edison a la plataforma Intel IoT Analytics, para ellos comencemos a recoger datos.
La programación del HW IoT tiene dos partes: recoger datos de los sensores y la de enviar los datos. Para empezar primero debemos configurar una cuenta de IoT analytics y luego seguir con la conectividad.
Pasos a dar para poner a subir datos a la plataforma:
- Darse de alta y configurar el usuario en la plataforma: http://streammyiot.com
- Obtener el token de usuario: https://github.com/enableiot/iotkit-api/wiki/Authorization. This token is derived using a user’s credentials. The token enables access to the user resource, the account resources associated with the user, device resources associates with those account resources, etc.
User JWT token is valid for 24h and contains user access information. On access change, token should be refreshed, to use new privileges.
Get user JWT token: https://github.com/enableiot/iotkit-api/wiki/Authorization#get-user-jwt-token - Dar de alta un dispositivo: https://github.com/enableiot/iotkit-api/wiki/Device-Management#create-a-device
- Activar el dispositivo: https://github.com/enableiot/iotkit-api/wiki/Device-Management#activate-one-device. Obtener token de dispositivo al activarlo y guardarlo en el momento de crearlo. Si se pierde el token, será necesario borrarlo y volver a crear el dispositivo y activarlo para obtener el device token.
- Añadir componente a un dispositivo: https://github.com/enableiot/iotkit-api/wiki/Device-Management#add-a-component-to-a-device, esto es opcional porque al grabar datos desde un dispositivo el componente se crea automáticamente.
Como componente se puede registrar una serie temporal que son las observaciones de un sensor y un actuador permite mandar comandos a un dispositivo. - A partir de este momento ya está la plataforma lista para recoger datos que los dispositivos envíen.
IMPORTANTE
- API Home: https://github.com/enableiot/iotkit-api/wiki/Api-Home
- Api services: https://github.com/enableiot/iotkit-api/wiki/Api-Home#api-services
- Authorization Header For REST methods which require an authorization token, the token must be sent using the HTTP ‘Authorization’ header, like this: Authorization: Bearer<space><token>
- Api entry point: /v1/api
Para entender la estructura en que los datos se guardan en la plataforma leer: https://github.com/enableiot/iotkit-api/wiki/Api-Home#data-structure
Una vez instalado todo vemos el dashboard:
Para mandar datos desde Arduino Edison a la plataform Intel IoT Analytics podemos hacerlo vía HTTP o MQTT. En este caso vamos a usar HTTP.
Disponemos de un repositorio en github con muchos ejemplo para el IoT Kit Intel: https://github.com/enableiot/iotkit-samples
Y un muy buen ejemplo de uso de la API client for python lo tenemos en: https://github.com/enableiot/iotkit-samples/blob/master/api/python/iotkit_client.py
Estas mismas llamadas para guardar datos en la plataforma usando la API se pueden aplicar a Arduino para que guarde los datos.
Para obtener el token de usuario: https://github.com/enableiot/iotkit-api/wiki/Authorization
POST /v1/api/auth/token HTTP/1.1
Host: 109.228.56.48
Content-Type: application/json
{
“username”: “aprendiendoarduino@gmail.com”,
“password”: “password”
}
Dar de Alta un dispositivo: https://github.com/enableiot/iotkit-api/wiki/Device-Management
PUT /v1/api/accounts/4d6398a7-49aa-45f0-8b53-54896778a736/devices/90-A2-DA-10-B3-BD/activation HTTP/1.1
Host: 109.228.56.48
Authorization: Bearer APIKEY
Content-Type: application/json
{
“activationCode”: “activationcode”
}
Añadir un componente a un dispositivo: https://github.com/enableiot/iotkit-api/wiki/Device-Management#add-a-component-to-a-device
POST /v1/api/accounts/4d6398a7-49aa-45f0-8b53-54896778a736/devices/90-A2-DA-10-00-00/components HTTP/1.1
Host: 109.228.56.48
Authorization: Bearer APIKEY
Content-Type: application/json
Cache-Control: no-cache
{
“cid”: “436e7e74-6771-4898-9057-26932f5eb7e1”,
“name”: “temperatura”,
“type”: “temperature.v1.0”
}
Código Arduino para poner en un actuador y que reaccione: https://github.com/enableiot/iotkit-samples/blob/master/arduino/IoTkit/examples/IoTKitActuationExample/IotKitActuationExample.ino
Data API para envío y recepción de datos: https://github.com/enableiot/iotkit-api/wiki/Data-API
- Para grabar un dato: https://github.com/enableiot/iotkit-api/wiki/Data-API#submit-data
Rule Management
https://github.com/enableiot/iotkit-api/wiki/Rule-Management
Alert Management
https://github.com/enableiot/iotkit-api/wiki/Alert-Management
Error Handling
https://github.com/enableiot/iotkit-api/wiki/Error-Handling
Hackathon WHD
Ahora que ya sabemos como manejar la plataforma y como mandar los datos desde el Arduino Edison, en el Hackathon del WHD planteamos un proyecto de una planta solar inteligente que en función de la demanda energética, es capaz de activar o desactivar paneles monitorizados en tiempo real y detectar cualquier incidencia o avería, dentro del proyecto de Intel y 1&1: http://worldhostingdays.com/global/project/1and1
El material usado en el hackathon fue:
- El kit https://www.seeedstudio.com/Grove-IoT-Developer-Kit-p-2666.html
- Los sensores: https://www.seeedstudio.com/Grove-Starter-Kit-Plus-IoT-Edition-p-2634.html
- Wiki sensores: http://wiki.seeedstudio.com/wiki/Grove_Starter_Kit_Plus_-_IoT_Edition
Repositorio con documentación y ejemplo para el hackathon del WHD: https://github.com/srware/WHD.global-2017
Repositorio de todo el trabajo hecho en el hackathon: https://github.com/jecrespo/aprendiendoarduino-iot/tree/master/04-Intel%20IoT%20Analytics
El grupo de Españoles trabajando con Arduino:
En el hackathon:
Para conectar a red Arduino Edison:
- Conectar a la red: https://software.intel.com/en-us/connecting-to-a-network-intel-edison-board
- Setup wifi: https://software.intel.com/en-us/connecting-your-intel-edison-board-using-wifi
Cómo cargar un programa en el Edison: https://www.arduino.cc/en/Guide/IntelEdison
Comandos interesantes en yocto linux
- configure_edison –help
- iotkit-admin
- systemctl stop iotkit-agent
- systemctl start iotkit-agent
- systemctl status iotkit-agent -l
- iotkit-admin catalog
- iotkit-admin register
- iotkit-admin observation
Dentro del Arduino Edison debe estar instalada la versión de yocto con el iotkit, que es un agente al que puede llamar para hacer determinadas tareas en la plataforma IoT de Intel. Explicación: “The agent is a program that runs as a daemon on the device, listening for simple messages from other processes and handling the necessary message formatting and security to send observations to the cloud. The agent comes with another program, iotkit-admin, which provides many utility functions, such as testing the network, activating a device, registering time series, and sending test observations. The agent is controlled by systemctl, the systemd service manager.”
Cuando cargamos un sketch de Arduino en el Edison, este se pierde después de reiniciar la placa. Para que funcione en el reinicio poner este fichero en el systemctl: /etc/systemd/system/arduino-sketch.service
Contenido del fichero:
systemctl daemon-reload
systemctl status arduino-sketch.service
systemctl enable arduino-sketch.service
Para resolver los problemas con el timezone debo realizar estos pasos
- timedatectl status
- ls -l /etc/localtime
- cd /usr/share/zoneinfo (ver dónde está configurado)
- timedatectl set-timezone Europe/Paris (y pongo esta)
Para ver el catálogo: iotkit-admin catalog
Para registrar componentes:
- iotkit-admin register panel_temperature temperature.v1.1
- iotkit-admin register solar_radiation radiation.v1.0
- iotkit-admin register onoffButton button.v1.1
- iotkit-admin register alarm powerswitch.v1.0
- iotkit-admin register status powerswitch.v1.0
Para cambiar protocolo:
- iotkit-admin protocol ‘mqtt’
- iotkit-admin protocol ‘rest+ws’
Con estos detalles que aprendimos de la gente de Intel que estuvo en el hackathon pudimos hacer nuestro proyecto de una planta solar conectada y el resultado se puede ver en https://github.com/jecrespo/aprendiendoarduino-iot/tree/master/04-Intel%20IoT%20Analytics
Vídeo del resultado:
Y nuestra presentación: https://www.slideshare.net/jecrespo/whd-global-2017-smart-power-plant
Nuestro proyecto: https://www.1and1.com/cloud-community/develop/hackathon-projects/11-and-intel/smart-solar-power-plant/
Y finalmente nuestro proyecto fue presentado en el WHD:
Más fotos y publicaciones de
- Proyectos: https://www.1and1.com/cloud-community/develop/hackathon-projects/
- Nuestro proyecto: https://www.1and1.com/cloud-community/develop/hackathon-projects/11-and-intel/smart-solar-power-plant/
- Recap: https://www.1and1.com/cloud-community/meet/hackathon-by-11/recap-11-cloudcommunity-hackathon/
- Photo gallery: https://www.1and1.com/cloud-community/meet/hackathon-by-11/photo-gallery/
Durante el hackathon también se presentó la cloud community de 1&1: www.1and1.com/cloud-community