Cree un juego de acelerómetro de IoT divertido y sencillo

Note:IBM Data Science Experience (DSX) is now IBM Watson Studio. Although the name has changed and some images may show the previous name, the steps and processes in this tutorial will still work.

Es posible crear un pequeño y divertido juego para que juegue con sus amigos y compañeros. Puede jugar a un juego que he llamado «Harlem Shake» con cualquiera que tenga un teléfono inteligente. (Véanos agitarlo en una reciente reunión de DeepLearning.)

Jugar es fácil: proporcione a alguien un URL al que pueda acceder desde su teléfono inteligente, y después haga que agite su teléfono inteligente tan fuerte como puedan. ¡La persona que utilice más energía gana!

Lo que ocurre en el trasfondo es bastante básico: los datos del acelerómetro del teléfono inteligente se trasmiten a la nube, se capturan en una base de datos y, después, un script calcula quién es el ganador. Parece sencillo y divertido. Pero primero tiene que construirlo. Y mientras tanto aprenderá mucho acerca de MQTT, NodeRED, ApacheCouchDB y ApacheSpark.

Este juego de IoT, como todas las aplicaciones de IoT, requiere de un sistema completo para trabajar. En este tutorial, utilizaremos IBM Cloud y los siguientes servicios de IBM Watson IoT Platform:

  • Node-RED, que utilizaremos para crear la aplicación IoT y que utilizamos para trasmitir los datos desde el sensor hasta la base de datos
  • IBM Watson IoT Platform, que utilizamos como el intermediario de mensajería MQTT para mantenerlo todo junto
  • Cloudant, un sistema de bases de datos NoSQL que utilizamos para almacenar los datos
  • Un script de ApacheSpark SQL, que ejecutamos en IBM Data Science Experience y que dice quién gana

Obviamente, todos los teléfonos inteligentes funcionarán como sensores, trasmitiendo los datos a nuestra aplicación de IoT.

Es posible construir el juego en seis pasos:

  • Implemente la aplicación del juego con la implementación de un clic.
  • Reemplace el servicio Internet of Things Platform.
  • Asegúrese de que el intermediario de mensajería MQTT pueda recibir los datos.
  • Cree una base de datos NoSQL para almacenar los datos.
  • Transmita los datos a Cloudant con Node-RED.
  • Analice los datos en un cuaderno de ciencias de datos.

Qué necesitará para construir su aplicación

  • Una cuenta de IBM Cloud. (Es posible solicitar una cuenta gratuita aquí.
  • Un teléfono inteligente. O uno o más amigos con teléfonos inteligentes para jugar al juego con usted.
  • Una cuenta de Data Science Experience.

1 Abra http://datascience.ibm.com/ 2 Haga clic en Registrarse. 3 Haga clic en Inicie sesión con su IBM ID. 4 Haga clic en Registrarse para DSX. 5 En la página de Crear Organización y Espacio, haga clic en Continuar. 6 Espere la inicialización del entorno y cuando esté disponible haga clic en comenzar.

1

Implemente la aplicación del juego con un clic

Después de tener disponible una cuenta de IBM Cloud, puede implementar la aplicación con tan solo un clic. Tendrá que configurar la implementación de forma manual. He creado la aplicación de muestra de un juego de IoT para usted y la he puesto en Github para que la descargue.

Nota: Con una cuenta freemium estándar no se puede utilizar la opción de autoimplementación porque no puede acceder a los servicios para construir el canal.

  1. Inicie sesión en cuenta de IBM Cloud.
  2. Vaya a discover-iot-sample mi repositorio de GitHub, y en las instrucciones de README, haga clic en Deploy to IBM Cloud button. screen capture of the github readme deploy to IBM Cloud button
  3. En IBM Cloud, haga clic en Deploy. screen capture of the deploy button
  4. Haga clic en el mosaico Entregar tubería. screen capture deliver pipeline tile
  5. En el mosaico Implementar etapa, haga clic en el icono de engranaje y luego seleccione Configure Stage. screen capture of the deploy stage and gear icon menu
  6. Seleccione la pestaña Entrada, cambie el Input Type to Git Repository, and then click Save. screen capture of the input tab on the deploy stage dialog
  7. En el mosaico Build Stage, haga clic en el ícono Ejecutar (junto al ícono de ajustes). screen capture of the build stage tile (next to the deploy stage tile
  8. Después de un tiempo, en el mosaico Deploy Stage, debería ver la URL de su aplicación en la sección Resultado de la última ejecución. Haz clic en la URL. Se muestra la URL que necesita para jugar en un teléfono inteligente.
  9. Copie la URL (y cree una URL corta o un código QR para la URL) y envíela por correo electrónico. Usarás este enlace más tarde para jugar. screen capture of the build stage tile (next to the deploy stage tile

Ahora puede enviar datos del acelerómetro hacia la nube, pero no se almacenarán. Después, tenemos que configurar el almacenamiento de datos.

2

Reemplace el servicio Internet of Things Platform

Después de que implemente la aplicación del juego necesitará una manera de poner los datos de acelerómetro en la nube. Para poner los datos en la nube, utilizará Node-RED, que es un editor de flujos gráficos de código abierto. Usted utiliza Node-RED para suscribirse a los datos de MQTT que vienen del teléfono inteligente y que se están almacenando en la base de datos en la nube. Sin embargo, antes de comenzar cono Node-RED, necesitamos reemplazar el servicio de la plataforma predeterminada con el servicio que he incluido como parte de la aplicación que acabamos de implementar.

2a

Borre el servicio IoT Platform predeterminado

El boilerplate de Internet of Things Platform Starter contiene un motor de Node-RED que usted utilizará para procesar los mensajes de IoT. Primero, tiene que remover del arranque el servicio Watson IoT predeterminado.

  1. Ya debería haber iniciado sesión en su cuenta de IBM Cloud. Si no es así, inicie sesión.
  2. Vaya a Internet of Things Platform Starter in the IBM Cloud catalog. (de forma alternativa, es posible navegar a este Starter seleccionando Catalog > Boilerplates > Internet of Things Platform Starter.)
  3. En el campo App name, ingrese un hombre único para su aplicación, como myharlemshake, y después haga clic Create.
  4. Espere hasta que el estado cambie de Starting a Running. screen capture of the starting status
  5. En el menú de la izquierda, haga clic en Connections. screen capture of the Connections menu
  6. Para el servicio de Internet of Things Platform predeterminado, haga clic en el menú de la parte superior derecha, y después haga clic en Unbind service .
  7. En el mensaje emergente que se muestra, seleccione Delete this service instance, y después haga clic en OK.
  8. Cuando se le pida restablecer su aplicación, haga clic en Cancel.
2b

Conéctese al servicio IoT de la aplicación del juego implementado

Ahora que ha borrado el servicio iotf-service-free predeterminado, necesita crear una conexión hacia el servicio IoT de la aplicación del juego implementado y establecer el nivel de seguridad correcto.

  1. Haga clic en el botón Connect existing.
  2. Seleccione discover-iot-try-service, y después haga clic en Connect.
  3. Cuando se le pida restablecer su aplicación, haga clic en Restage.
  4. Espere hasta que el estado cambie a Running.
  5. aga clic en discover-iot-try-service, y después haga clic en Launch. Esto inicia IBM Watson IoT Platform en IBM Cloud.
  6. Pase el mouse por encima de la columna de los iconos de la izquierda. En el menú de la izquierda, seleccione Security.
  7. Editar Connection Security.
  8. En la sección de Regla Predeterminada, bajo Security Level, seleccione TLS Optional, y después haga clic en Refresh compliance.
  9. En la parte superior izquierda de la ventana, haga clic en Save .
3

Asegúrese de que el intermediario de mensajería MQTT pueda recibir los datos

Ahora que hemos conectado con éxito con el servicio IoT que he brindado en la aplicación del juego, necesitamos utilizar Node-RED para almacenar en la nube los datos del sensor (acelerómetro).

3a

Proteja el editor de flujos de Node-RED

Antes de poder abrir Node-RED usted debe configurar un nombre de usuario y una contraseña para acceder a los flujos de Node-RED en su aplicación.

  1. Tiene que volver a la página de Cloud Foundry Apps para la aplicación de su juego. En su navegador, ubique la pestaña Detalles del Servicio. Desde la lista desplegable de hamburger menu, seleccione Cloud Foundry Apps.
  2. Desde la tabla, seleccione el nombre de la aplicación de su juego.
  3. En el menú de la izquierda, seleccione Connections. screen capture of the left menu
  4. En la parte derecha de estado haga clic en Visit App URL. El URL debería ser el nombre de su aplicación seguido por mybluemix.net (por ejemplo, https://myharlemshake.mybluemix.net). Nota: Escriba este URL porque puede utilizarlo para abrir su instancia Node-RED.
  5. Para proteger su instancia de Node-RED, haga clic en Next.
  6. Elija un nombre de usuario y una contraseña. Anótelos. Haga clic en Next.
  7. Haga clic en Finish.
  8. Haga clic en Go to your Node-RED flow editor. screen capture of the go to your Node-RED flow editor
  9. Ingrese su nombre de usuario y su contraseña para iniciar sesión en Node-RED.

Ahora tiene todo preparado para capturar y almacenar los datos. Ha implementado la aplicación de su juego y ha creado una conexión entre la aplicación de su juego y su intermediario de mensajería. El canal de comunicaciones está funcionando, pero necesita un lugar para almacenar los datos que va a enviar.

3b

Suscríbase al flujo de datos

Ahora que tenemos acceso a Node-RED, vamos a comprobar si los datos que salen de su teléfono inteligente llegan a la nube (el intermediario de mensajería MQTT es un servicio que forma parte de IBM Watson IoT Platform).

Tenemos que utilizar Node-RED para suscribirnos al flujo de datos. Las depuraciones del servicio se realizarán con el panel de depuración de Node-RED.

  1. Ya debería tener abierta su instancia de Node-RED desde la última sección. Si no es así, abra la instancia de Node-RED utilizando el Visit App URL que escribió cuando inició el motor de Node-RED. Inicie sesión en la instancia de Node-RED de la aplicación de su juego con el nombre de usuario y la contraseña que se asignó usted mismo. screen capture of the log in for Node-RED
  2. Para borrar todos los nodos existentes en el flujo predeterminado, selecciónelos todos y después pulse las teclas Retroceso or Borrar key. (Nota: El acceso directo CTRL-A del teclado no selecciona todos los nodos.) Después, se muestra un espacio vacío.
  3. En la paleta de izquierda, seleccione y arrastre el nodo de entrada IBM IoT (no utilice el nodo de salida) y el nodo de salida depuración del panel de la derecha. Conéctelos seleccionando un círculo de conexión de un nodo y arrastrándolo a otro círculo de conexión de otro modo. screen capture showing the connection between nodes
  4. Haga doble clic en el nodo IBM IoT.
  5. Para Autenticación, seleccione IBM Cloud Service, y haga clic en Done. Esto le dice al nodo que obtenga las credenciales para conectarse al intermediario MQTT con la inyección de credenciales de Cloud Foundry, lo que es una función muy útil porque en IBM Cloud la aplicación que ha implementado está conectada con el intermediario MQTT (que es el servicio Watson IoT Platform).
  6. Haga clic en el botón de Desplegar.
  7. En la parte derecha del padre, bajo el botón Desplegar, seleccione la pestaña depuración.
  8. En su teléfono inteligente, abra la aplicación del juego con el nombre de aplicación que creó en la Sección 1. En mi caso es discover-iot-sample-romeokienzler-1412.mybluemix.net/iot-phone
  9. Proporcione un nombre alfanumérico de 8 caracteres; por ejemplo, qwer1234.
  10. Proporcione una contraseña de 8 caracteres que solo contenga caracteres alfabéticos entre la a y la z. screen capture showing the connected smartphone device En Node-RED, en la pestaña de depuración, debería ver el resultado de la depuración screen capture of the debug tab
3c

Revise los datos del sensor en el panel de instrumentos de IBM Watson IoT Platform

Otra forma de ver los datos del acelerómetro es mirar a la lista de todos los jugadores del juego.

  1. Abra IBM Watson IoT Platform. Desde la vista Aplicaciones de Cloud Foundry, haga clic en discover-iot-try-service, y después haga clic en Lanzar. screen capture of the Cloud Foundry Apps view
  2. En el menú de la izquierda, seleccione Devices. screen capture of the devices view
  3. Haga clic en un dispositivo, y luego haga doble clic en un evento de sensorData para ver más detalles. screen capture showing example sensor data

Felicidades, ya casi hemos acabado. Ha verificado que los datos se pueden transmitir desde un teléfono inteligente a nuestra aplicación de Node-RED com el intermediario de mensajería MQTT de Watson IoT Platform. El siguiente paso es trasmitir estos datos a una base de datos y analizarlos.

4

Cree una base de datos NoSQL para almacenar los datos

Cuando jugamos a Harlem Shake estamos enviando datos de un sensor IoT a través de un intermediario de mensajería MQTT de la nube. Tenemos que enviarlos a una base de datos NoSQL. Vamos añadir la función de la base de datos.

  1. Ya debería tener abierta su instancia de Node-RED desde la última sección. Si no es así, abra la instancia de Node-RED utilizando el Visit App URL que escribió cuando inició el motor de Node-RED en el Proteja el editor de flujos de Node-RED. Inicie sesión en la instancia de Node-RED de la aplicación de su juego con el nombre de usuario y la contraseña que se asignó usted mismo.
  2. En el panel de la izquierda, arrastre el nodo función entre los otros dos nodos, que se conectarán automáticamente a esos nodos. screen capture showing function between IBM IoT and msg.payload nodes
  3. Primero tenemos que nivelar los mensajes jerárquicos de JSON hacia un esquema relacional. Haga doble clic en el nodo función, y pegue el siguiente código de JavaScript..
    
    msg.payload =
    {
    X : msg.payload.d.ax,
    Y : msg.payload.d.ax,
    Z : msg.payload.d.ax,
    SENSORID : msg.payload.d.id
    }
    return msg;
    

    The final result should look like this. screen capture showing insertion of function code
  4. Haga clic en Done.
  5. Haga clic en Deploy. En la pestaña debug, el resultado debería ser similar a este. screen capture showing example debug results

Ahora que hemos añadido la función de NoSQL, estamos preparados para almacenar los datos en Cloudant.

5

Transmita los datos a Cloudant con Node-RED

Utilizaremos ApacheCouchDB basado en IBM Cloudant para trasmitir los datos a la función de la base de datos NoSQL que acabamos de crear. Cloudant está basado en ApacheCouchDB de código abierto, y lo utilizaremos para almacenar los datos intermedios de nuestro sensor.

  1. En el panel de la izquierda, elija el conector de almacenamiento cloudant out (el icono de la nube está a la derecha), y conéctelo a la salida del nodo de función. screen capture showing Cloudant node added to the function
  2. Haga doble clic en el nodo cloudant out, y seleccione su base de datos Service. Nota: Solo debería haber un servicio de base de datos a no ser que usted haya conectado más de una base de datos de Cloudant a esta aplicación en la consola de IBM Cloud. (De nuevo, IBM Cloud aquí está haciendo uso de la inyección de credenciales de Cloud Foundry, y básicamente está haciendo el trabajo de configurar el punto final de la base de datos por usted.)
  3. Llame a la base de datos harlemshake.
  4. Seleccione Only store msg.payload object. screen capture showing the edit of the cloudant out node
  5. Haga clic en Done.
  6. Haga clic en Deploy.

Ahora es el momento de verificar si los datos llegan a la tabla. Asegúrese de que la aplicación del juego de su teléfono inteligente todavía está enviando datos mirando el panel de depuración de Node-RED.

6

Analice los datos en un cuaderno de ciencias de datos

Todo debería parecer correcto. El teléfono inteligente se agita, los datos se trasmiten hacia la nube y la base de datos está reteniendo los datos. Pero, ¿quién está manteniendo la puntuación? Algo tiene que analizar los datos y, después, anunciar el ganador. Utilizaremos Data Science Experience.

  1. Inicie sesión en IBM Watson Studio.
  2. En la parte superior derecha, haga clic en Crear nuevo > Cuaderno.. Siga los pasos en este tutorial.
  3. Haga clic en From URL, en el campo Name añada un hombre, y en el campo Notebook URL, pegue el siguiente URL: https://raw.githubusercontent.com/romeokienzler/developerWorks/master/boomboomshakeshakesparkv2.ipynb
  4. Haga clic en Create Notebook.
  5. Para crear una nueva conexión de datos de origen, haga clic en el ícono Encontrar y Añadir Datos > Conexiones > página del proyecto. screen capture showing where the links are located
  6. Haga clic en Connections > Create Connection.
  7. En el campo Name, especifique un nombre, y después, bajo Instancia de Servicio, seleccione la base de datos. Haga clic en Crear. Nota: Solo se debería enumerar una base de datos de Cloudant de su boilerplate de Node-RED instalado previamente.
  8. Vuelva a su cuaderno y recárguelo. Ahora podrá ver la conexión. Seleccione la primera celda vacía de su cuaderno y haga clic en Insertar código. Las credenciales han sido creadas y ya puede comenzar a ejecutar el cuaderno. screen capture showing the credentials have been created
  9. Haga clic en Cell > Run All.

Después de que usted y sus amigos hayan jugado al juego podrá verificar quién ha ganado. En su cuaderno, busque la declaración de spark spark.sql Parece que «Seb» es el ganador con la mayor cantidad de energía introducida.

screen capture showing the results of the game

Cómo entender la ciencia de los datos que está detrás de los resultados

Lo que la declaración spark.sql hace es estimar la energía que nuestros jugadores generaron durante la duración del juego mediante el cálculo de la energía general a través de las tres dimensiones de los datos del acelerómetro.

En un único eje, la serie de tiempo de los datos de la vibración se parece al siguiente gráfico:

graph of a single axis of vibration data

Si desea conocer la energía que representa esta serie temporal, puede estimar este valor tomando la integral de la función.

graph showing when you approximate by taking the integral of the function

Recuerde que nos hemos deshecho de los valores negativos y los hemos convertido en positivos. Para estimar la integral sumamos todos los valores positivos individuales.

graph showing results of getting rid of the negative values

Ahora que ha aprendido cómo estimar la integral de una serie temporal, vamos a calcular la energía general de las tres dimensiones (recuerde, tenemos tres señales individuales para cada dimensión de la vibración) utilizando la siguiente fórmula:

formula of the sum of each measurement and taking the square root

Sumamos el cuadrado de cada medida y calculamos la raíz cuadrada.

Nota: Para obtener la energía real también necesitaríamos incorporar la masa del dispositivo.

Utilizar SQL, este cálculo se presenta por la siguiente declaración:


select 
    id, // select ID of the device because we need to know who the winner is
    sqrt(sum(axax+ayay+az*az)) //calculate energy
  as energy  // give this new feature a name
    from unconfshake // specify temporary query table of ApachSparkSQL
    group by id // calculate on a per device basis
    order by energy desc // make top performers appear on top

Conclusión

Ha hecho su parte y ha construido el juego. Ahora es el momento de jugar.

  1. Encuentre un amigo o un compañero que tenga un teléfono inteligente. Proporcione a su amigo el URL de la aplicación del juego.
  2. Tiene que ingresar su propio y único ID alfanumérico de 8 dígitos y una contraseña alfabética (a-z) de 8 caracteres.
  3. Pida a su amigo que agite el teléfono inteligente en todas las direcciones. Esto envía los datos a la nube. Puede verificarlo en Node-RED y en Data Science Experience con la consulta SQL que se brinda en el cuaderno que usted ha importado. Simplemente vuelva a ejecutar de vez en cuando la celda que contiene la declaración SQL, y observará que la lista de ganadores cambia a medida que pasa el tiempo.
  4. Puede verificar quién es el ganador haciendo clic en Cell > Run all el cuaderno de la ciencia de datos. Para jugar de nuevo tiene que completar los siguientes pasos:

  5. Cambie el nombre de la base de datos de destino (harlemshake) en Node-RED, y después actualice el nombre del cuaderno.

  6. Abra de nuevo IBM Watson IoT Platform, seleccione todos los dispositivos y después seleccione Delete devices. screen capture showing where to select all devices and delete them

Nota: Puede borrar los resultados de la base de datos para jugar de nuevo, pero es más fácil cambiar el nombre de la base de datos y restablecer la conexión.

Este juego se puede dejar funcionando para probarlo durante los descansos para comer y, así, ¡permanecer despierto después de una comida copiosa!

Aviso

El contenido aquí presentado fue traducido de la página IBM Developer US. Puede revisar el contenido original en este link.