Seguimiento GPS en Tiempo Real con Helium, Azure IoT Hub y Power BI
Componentes y suministros
| Módulo de Prototipado Helium Atom | × | 1 |
| Arduino Zero | × | 1 |
| Módulo GPS Adafruit Ultimate GPS Breakout | × | 1 |
| Protoboard (genérica) | × | 1 |
Aplicaciones y servicios en línea
- Microsoft Azure
- Arduino IDE
Sobre este proyecto
Helium existe para ayudar a los desarrolladores a crear dispositivos conectados, seguros y de bajo consumo. En este proyecto, recorreremos el uso del módulo Helium Atom Prototyping con un Arduino Zero y el Adafruit Ultimate GPS Breakout para enviar datos sin problemas a Azure IoT Hub y, a continuación, a un informe de Power BI para visualizarlos.
Puedes obtener más información sobre los productos inalámbricos de largo alcance, seguros y de bajo consumo de Helium y comprar todo el hardware necesario en helium.com/store.
Hardware
Lo primero que debes hacer es conectar tu módulo Helium Atom Prototyping al adaptador Helium Atom para Arduino y, a continuación, a tu Arduino. En esta guía usamos un Arduino Zero, pero puedes usar un Uno, Due, M0 o cualquier otro Arduino que prefieras.
Una vez que hayas conectado el Atom al Arduino, deberías tener algo parecido a esto:

A continuación, conectaremos el Adafruit Ultimate GPS Breakout al conjunto Arduino. Usaremos una protoboard para que sea más fácil y claro, pero también podrías cablear el GPS directamente al Arduino. El cableado debe ser:
- Arduino 5V → GPS VIN
- Arduino GND → GPS GND
- Arduino D12 → GPS TX
- Arduino D10 → GPS RX
Deberías obtener algo así:

Ahora que tenemos el hardware Arduino y Atom listos, necesitamos conectar y encender el Helium Element. Si tienes un Element Cellular, solo necesitas encenderlo y esperar a que la luz se vuelva color verde azulado. Si tienes un Element Ethernet, o prefieres usar conexión Ethernet para tu Element Cellular, conecta el puerto Ethernet del Element a un puerto habilitado para DHCP (como la parte trasera de un módem por cable o router inalámbrico). Una vez que enciendas el Element y la luz frontal se ponga verde, estarás listo.

Con el hardware Arduino y Atom configurado, y el Element encendido y conectado, es hora de configurar todo en el Panel de Control de Helium.
Panel de Control de Helium y Canales
Primero, debemos añadir nuestro Atom y Element a nuestra cuenta de usuario en el panel. Si no tienes una cuenta de usuario pero tienes el equipo en mano, envía un correo a support@helium.com; de lo contrario, inicia sesión con las credenciales que recibiste al comprar tu hardware de Helium.
Una vez dentro, activaremos primero el Element. Haz clic en Elements a la izquierda y luego en Add New en la esquina superior derecha. Introduce los últimos 4 dígitos de la dirección MAC y el HVV de la etiqueta en la parte trasera del Element, dale un nombre y, opcionalmente, añade algunas etiquetas. Haz clic en Activate Element para ponerlo en marcha.

Repetiremos el mismo proceso para el Atom. Haz clic en Atoms a la izquierda, luego en Add New, y proporciona el MAC y el HVV de la etiqueta del Atom, opcionalmente añade etiquetas, y haz clic en Activate Atom.

A continuación, crearemos un Azure IoT Hub que actuará como punto de ingesta en Azure para todos tus dispositivos Helium Atom. Asumimos que ya tienes una cuenta de Azure; si no, deberás crear una.
Una vez dentro de Azure, crea un IoT Hub. Haz clic en el signo + en la esquina superior izquierda, luego en Internet de las cosas y después en IoT Hub:

Deberás elegir cómo configurar tu IoT Hub y luego pulsar Crear. Recomendamos seleccionar Pin to Dashboard en la parte inferior para encontrarlo fácilmente después:

Cuando termine el despliegue (puede tardar unos minutos), haz clic en él desde tu panel. Para configurar el Canal de Helium necesitaremos un dato del hub. Dentro del IoT Hub elige Directivas de acceso compartido a la izquierda, selecciona RegistryReadWrite y haz clic en el icono de copiar junto a Connection string - primary key a la derecha. Esto copiará la cadena de conexión al portapapeles, que usaremos luego en el Panel de Helium. Ten cuidado de no compartir esta cadena con nadie en quien no confíes.

De vuelta en el Panel de Helium, crearemos un Canal que se mapee al Azure IoT Hub que acabas de crear. Haz clic en Channels a la izquierda y luego en Azure IoT Hub bajo Create New Channel. Pega la Connection String que copiaste de Azure para crear el Canal en Helium:

Dale un nombre al Canal y pulsa Create. Es importante recordar el nombre, ya que lo necesitarás en tu código de Arduino para enviar datos a este Canal.
Sketch de Arduino
Con el Azure IoT Hub configurado y un Canal de Helium creado, ahora necesitamos un Sketch de Arduino adecuado que use las librerías Helium Arduino y Adafruit GPS para enviar ubicaciones GPS a Helium y, de ahí, a nuestro nuevo Canal de Azure.
Primero, necesitas instalar tanto la librería Helium Arduino como la librería Adafruit GPS en tu Arduino IDE. La forma más fácil es ir al menú Sketch → Include Library → Manage Libraries dentro del IDE, buscar Helium y Adafruit GPS y pulsar Install.

El siguiente sketch inicializa el Atom, crea un Canal que coincide con el Canal Azure IoT Hub que creamos en el paso anterior, recopila datos GPS de la placa Adafruit GPS, los formatea en JSON y los envía a través de la red Helium.
/*
* Copyright 2017, Helium Systems, Inc.
* All Rights Reserved. See LICENCE.txt for license information
*/
#include "Arduino.h"
#include "avr/dtostrf.h"
#include "Helium.h"
#include
#include
#include "wiring_private.h" // pinPeripheral() function
#define atom_serial Serial1
#define PIN_SERIAL2_RX (34ul)
#define PIN_SERIAL2_TX (36ul)
#define PAD_SERIAL2_TX (UART_TX_PAD_2)
#define PAD_SERIAL2_RX (SERCOM_RX_PAD_3)
Uart Serial2(&sercom1, PIN_SERIAL2_RX, PIN_SERIAL2_TX, PAD_SERIAL2_RX, PAD_SERIAL2_TX);
void SERCOM1_Handler() {
Serial2.IrqHandler();
}
Helium helium(&atom_serial);
Channel channel(&helium);
// GPS stuff
#define gps_serial Serial2
Adafruit_GPS GPS(&gps_serial);
void setup() {
pinPeripheral(10, PIO_SERCOM);
pinPeripheral(12, PIO_SERCOM);
Serial.begin(115200);
Serial.println("Starting");
// Begin communication with the Helium Atom
helium.begin(helium_baud_b115200);
// Connect the Atom to the Helium Network
Serial.print("Connecting - ");
int status = helium.connect();
while (status != helium_status_OK) {
status = helium.connect();
}
Serial.println("Succeeded");
// Begin communicating with the channel
int8_t result;
Serial.print("Creating Channel - ");
status = channel.begin("Hackster Guide", &result);
if (helium_status_OK == status && result == 0) {
Serial.println("Succeeded");
} else {
Serial.println("Failed");
}
delay(1000);
// Init GPS
GPS.begin(9600);
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
GPS.sendCommand(PGCMD_NOANTENNA);
delay(2000);
}
uint32_t timer = millis();
void loop() {
char c = GPS.read();
if (GPS.newNMEAreceived()) {
if (!GPS.parse(GPS.lastNMEA())) return;
}
if (timer > millis()) timer = millis();
if (millis() - timer > 2000) {
timer = millis();
if (GPS.fix) {
char lat[10];
char lon[10];
char data[100];
dtostrf(GPS.latitudeDegrees, 4, 4, lat);
dtostrf(GPS.longitudeDegrees, 4, 4, lon);
// Format JSON object of lat/lon to send to Azure
sprintf(data, "{\"lat\": \"%s\", \"lon\": \"%s\"}", lat, lon);
// Send the location data to the configured channel
int8_t result;
Serial.print("Sending - ");
int status = channel.send(data, strlen(data), &result);
if (helium_status_OK == status && result == 0) {
Serial.print("Successfully sent ");
Serial.println(data);
} else {
Serial.println("Failed");
}
} else {
Serial.println("No GPS fix!");
}
}
}
Con las librerías instaladas, crea un nuevo sketch (File → New en el Arduino IDE) y pega el código anterior. Conecta tu sándwich Arduino/Atom vía USB y pulsa el botón Upload (flecha hacia la derecha).
Tras unos segundos verás que las luces del Atom empiezan a parpadear en rojo y azul, y luego se estabilizan en un parpadeo rojo constante. Esto significa que el Atom está conectado a la red Helium. La luz FIX del GPS también debería parpadear en rojo lento. Cuando se detenga, el módulo GPS ha fijado tu ubicación y comenzará a enviar datos a Helium. Ayuda colocar el GPS cerca de una ventana o, idealmente, completamente en el exterior.
Puedes revisar el Monitor Serie (Tools → Serial Monitor) en el Arduino IDE para ver la salida de depuración. Deberías ver mensajes mostrando la conexión, creación del canal y luego una secuencia de mensajes No GPS fix! hasta que se adquiera una fijación por satélite.
Verificar que los datos se envían correctamente
Ahora que el Arduino, Atom y GPS están funcionando, podemos volver al Panel de Helium y asegurarnos de que los datos llegan al canal de Azure.
Haz clic en Channels a la izquierda y selecciona el canal de Azure que creaste en la sección Active Channels. Desplázate hacia abajo hasta el Registro de Eventos, donde deberías ver algo como la captura de abajo. Esto muestra la marca de tiempo y el tamaño de los datos, así como si se enrutaron correctamente a Azure:

Si miras tu Azure IoT Hub bajo la navegación Device Explorer, también deberías ver tu dispositivo Helium Atom listado bajo su dirección MAC. Al hacer clic en él confirmarás que hemos asegurado este dispositivo automáticamente, sin configuración requerida, usando un certificado X509 firmado por hardware.

Llevar los datos a Power BI
Asumiremos que ya tienes una cuenta de Power BI configurada y un área de trabajo creada. (Si no, ve a www.powerbi.com y configúrala).
Con tu cuenta de Power BI lista, ahora necesitaremos crear un Trabajo de Azure Stream Analytics para tomar los datos del Azure IoT Hub y entregarlos a Power BI.
Desde el panel de Azure, haz clic en New en la esquina superior izquierda y busca Stream Analytics Job, selecciónalo cuando aparezca. Haz clic en Create en la esquina inferior izquierda, selecciona las opciones y pulsa crear para configurarlo.
Una vez desplegado, debemos indicar al Trabajo de Streaming que use el IoT Hub como entrada y Power BI como salida. Desde la página del Trabajo de Streaming, haz clic en Inputs en el menú izquierdo y luego en Add.
Dale un alias (nombre) al trabajo, selecciona IoT Hub en el desplegable de origen. Elige el IoT Hub apropiado en el desplegable de IoT Hub y deja todo lo demás por defecto. Deberías obtener algo así:

Una vez creada la entrada, crearemos una salida que conecte con Power BI. Desde la página del Trabajo de Streaming, haz clic en Outputs en el menú izquierdo y luego en Add. Elegiremos Power BI en el desplegable Sink. Tendrás que autorizar tu cuenta de Power BI y seleccionar el Área de trabajo que quieras usar. Crea un nombre para la tabla. Obtendrás algo así:

El paso final es crear una Consulta que vincule la entrada con la salida. De nuevo, haz clic en Query en el menú izquierdo. Querrás que tu consulta tenga básicamente la forma que se muestra en la captura siguiente, dependiendo de cómo hayas nombrado tus entradas y salidas en el paso anterior. Esto seleccionará todos los datos que vengan del IoT Hub y los enviará al área de trabajo de Power BI.

Pulsa Save en la esquina superior izquierda y, asumiendo que nombraste todo correctamente, casi has terminado. Vuelve a la página Overview y pulsa Start en la barra de navegación superior, y tras unos minutos tendrás datos fluyendo hacia Power BI.
Visualización en Power BI
Ahora que los datos fluyen, podemos hacer una visualización rápida en Power BI para mostrar dónde está todo en un mapa.
Ve a tu Área de trabajo de Power BI y haz clic en + Create en la esquina superior derecha, y selecciona Report. Seleccionarás el conjunto de datos que creaste en el Trabajo de Streaming de Azure y pulsarás Create.

A continuación, elige la visualización de mapa en el panel derecho (parece un globo blanco). A la extrema derecha verás los campos de datos que hemos estado enviando desde el Arduino. Arrastra lat a Latitud y lon a Longitud en el panel de la izquierda. También puedes arrastrar EventProcessedUTCTime a Tooltips si quieres ver cuándo se envió al pasar el ratón. Luego pulsa Save en la esquina superior derecha. ¡Listo! Ahora tendrás un mapa que muestra la ubicación de tu Helium Atom conectado al Arduino.

Código
Atom + Arduino + Adafruit GPS (C/C++)
/*
* Copyright 2017, Helium Systems, Inc.
* All Rights Reserved. See LICENCE.txt for license information
*/
#include "Arduino.h"
#include "avr/dtostrf.h"
#include "Helium.h"
#include
#include
#include "wiring_private.h"
#define atom_serial Serial1
#define PIN_SERIAL2_RX (34ul)
#define PIN_SERIAL2_TX (36ul)
#define PAD_SERIAL2_TX (UART_TX_PAD_2)
#define PAD_SERIAL2_RX (SERCOM_RX_PAD_3)
Uart Serial2(&sercom1, PIN_SERIAL2_RX, PIN_SERIAL2_TX, PAD_SERIAL2_RX, PAD_SERIAL2_TX);
void SERCOM1_Handler() {
Serial2.IrqHandler();
}
Helium helium(&atom_serial);
Channel channel(&helium);
#define gps_serial Serial2
Adafruit_GPS GPS(&gps_serial);
void setup() {
pinPeripheral(10, PIO_SERCOM);
pinPeripheral(12, PIO_SERCOM);
Serial.begin(115200);
Serial.println("Starting");
helium.begin(helium_baud_b115200);
Serial.print("Connecting - ");
int status = helium.connect();
while (status != helium_status_OK) {
status = helium.connect();
}
Serial.println("Succeeded");
int8_t result;
Serial.print("Creating Channel - ");
status = channel.begin("Hackster Guide", &result);
if (helium_status_OK == status && result == 0) {
Serial.println("Succeeded");
} else {
Serial.println("Failed");
}
delay(1000);
GPS.begin(9600);
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
GPS.sendCommand(PGCMD_NOANTENNA);
delay(2000);
}
uint32_t timer = millis();
void loop() {
char c = GPS.read();
if (GPS.newNMEAreceived()) {
if (!GPS.parse(GPS.lastNMEA())) return;
}
if (timer > millis()) timer = millis();
if (millis() - timer > 2000) {
timer = millis();
if (GPS.fix) {
char lat[10];
char lon[10];
char data[100];
dtostrf(GPS.latitudeDegrees, 4, 4, lat);
dtostrf(GPS.longitudeDegrees, 4, 4, lon);
sprintf(data, "{\"lat\": \"%s\", \"lon\": \"%s\"}", lat, lon);
int8_t result;
Serial.print("Sending - ");
int status = channel.send(data, strlen(data), &result);
if (helium_status_OK == status && result == 0) {
Serial.print("Successfully sent ");
Serial.println(data);
} else {
Serial.println("Failed");
}
} else {
Serial.println("No GPS fix!");
}
}
}
Proceso de manufactura
- Sistema de Asistencia RFID Fiable con Arduino y Python
- Registrador GPS con Análisis Espacial en Azure IoT Hub
- Mando universal Android con Arduino, 1Sheeld y control IR
- Construye un Voltímetro Inteligente con Arduino y Smartphone – Proyecto DIY Fácil
- Monitor de Frecuencia Cardíaca IoT en Tiempo Real con Arduino y MAX30100
- Control Remoto IoT de Brazo Robótico Personalizado con Arduino MKR1000 y ThingSpeak
- Construye un tarro inteligente IoT con ESP8266, Arduino y sensor ultrasónico: Monitorización en tiempo real
- Medición precisa de frecuencia y ciclo de trabajo con Arduino UNO
- Medición de Distancia en Tiempo Real con Sonar Arduino y Visualización en Processing
- Control de brillo LED sin interrupciones con Bolt IoT y Arduino UNO
- Sistema de Control de Piscina con Azure IoT: Sensores Inteligentes y Monitorización Remota