AWS IoT, Raspberry Pi 4 : Obteniendo datos de un sensor de ultrasonido en tiempo real

Actualmente, uno de los términos que se viene escuchando es el IoT, o más conocido como el Internet de las Cosas.

Para IBM, el IoT se refiere a la creciente gama de dispositivos conectados que envían datos a través de Internet y también añade que una “cosa” es cualquier objeto con electrónica integrada que puede transferir datos a través de una red, sin ninguna interacción humana.

Se dice que este 2020 serán más de 50 mil millones de dispositivos conectados a internet.

Gartner dice que más del 40 por ciento de las organizaciones esperan que proyectos IoT transformen su negocio y ofrezcan nuevas oportunidades significativas de ingresos o ahorros de costos en los próximos tres años.

Casos de uso donde el IoT nos puede ayudar:

  • Detección de personas desconocidas (en viviendas, empresas, universidades, etc) con alertas en tiempo real.
  • Prevención de incendios con sensores de humo.
  • Desarrollo de soluciones de Digital Twins.
  • Control de las luces, el aire acondicionado desde tu celular.
  • Ahorro de electricidad al ajustar automáticamente el brillo de las luces de las calles en función de la presencia de automóviles y peatones.
  • Desarrollo de soluciones de Smart Cities.
  • Notificar automáticamente cuando es hora de tomar medicamentos o cuando el paciente omite la dosis.
  • Transmisión de la biometría del rendimiento atlético, como la frecuencia cardíaca, la intensidad del movimiento y la producción de energía de las personas al realizar deporte.
  • Monitoreo en tiempo real de máquinas para saber si algún componente presenta un desperfecto.
  • Monitoreo de llenado y peso de contenedores de residuos urbanos.
  • Monitoreo de la ubicación de tu bicicleta si es que te gusta el ciclismo.
  • Detección del nivel de la humedad del suelo, para activar el sistema de riesgo en un cultivo.
  • Detección de gases, humo, polvo, etc.
  • Etc.

Como bien hemos enumerado, existen múltiples casos de uso donde el IoT puede ayudarnos.

En este breve post, explicaremos como realizar una solución IoT que obtenga los datos de un sensor de ultrasonido (HC-SR04) conectado a una Raspberry, que a su vez envía datos a AWS IoT, y los datos ya estando en AWS, se puedan analizar (Kinesis Data Analytics) los valores medidos por el sensor y de acuerdo a un valor específico se pueda notificar por correo y SMS (SNS) y registrar los datos en una tabla en DynamoDB.

Para hacerlo un poco más dinámico y divertido lo que se realizará es obtener los datos del sensor de ultrasonido, de acuerdo a la distancia (en cm) en la que se encuentra un funko de Forrest Gump a la meta (pensemos que a Forrest lo han mandado a una maratón), cabe destacar que este sensor estará midiendo la distancia cada 2 segundos, y una vez que llegue a la meta dejará de enviar los datos a AWS IoT.

Obtención de la distancia en cm entre Forrest Gump y la meta con el sensor de ultrasonido.
Funko de Forrest Gump llegando a la meta

Para esta solución se ha empleado lo siguiente:

  1. Raspberry Pi 4 Modelo B

Es uno de los ordenadores más básicos que podemos encontrar, también uno de los más vendidos de toda la historia informática. Su atractivo precio ha hecho que se vendan millones y millones de unidades generación tras generación.

La Raspberry con la que se va a trabajar ya tiene instalado el SO Raspbian dentro de la memoria micro SD.

Raspberry PI 4 Modelo B

2. Sensor de ultrasonido HC-SR04

Es un sensor de distancia de bajo costo que utiliza ultrasonido para determinar la distancia de un objeto en un rango de 2 a 400 cm. Destaca por su pequeño tamaño, bajo consumo energético, buena precisión y excelente precio. El sensor HC-SR04 es el más utilizado dentro de los sensores de tipo ultrasonido, principalmente por la cantidad de información y proyectos disponibles en la web.

Este sensor consta de 4 pines, alimentación (Vcc), un disparador (Trig), el receptor (Echo) y masa (GND). Para el correcto funcionamiento del sensor es necesario el conectar estos 4 pines.

Sensor de ultrasonido HC-SR04

Las características básicas de este sensor son las siguientes:

¿Cómo funciona este sensor?

El principio en el que se basa su funcionamiento es muy sencillo, tan solo hay que generar una onda sónica en el emisor mediante un pulso en la patilla que pone “trig” (trigger o disparador), esta onda al encontrarse con algún obstáculo rebotará, volviendo al sensor y siendo registrada por el receptor, traduciéndose esta en un pulso en la patilla “Echo”.

Con esto podemos hacer dos cosas, detectar un obstáculo esperando simplemente que la Raspberry reciba un “Echo” o contar el tiempo que transcurre desde que se manda el pulso por el trigger hasta que se recibe, de esta forma, y conociendo cual es la velocidad del sonido, podemos determinar de forma muy sencilla la distancia exacta a la que se encuentra el objeto en el que esta rebotando la señal.

3. Servicios de AWS

3.1. AWS IoT

Es una plataforma que permite conectar dispositivos a servicios de AWS y a otros dispositivos, proteger datos e interacciones, procesar y actuar sobre datos de dispositivos y habilitar las aplicaciones para que interactúen con dispositivos aunque no estén conectados.

En este caso lo usaremos para poder enviar los datos obtenidos del sensor de ultrasonido mediante el protocolo MQTT.

3.2. Kinesis Data Streams

Es un servicio de streaming de datos en tiempo real con un alto nivel de escalabilidad y durabilidad. KDS puede registrar de manera continua gigabytes de datos por segundo de cientos de miles de orígenes, como transmisiones de clics de sitios web, transmisiones de eventos de bases de datos, transacciones financieras, etc.

Los datos recopilados se encuentran disponibles en milisegundos para posibilitar los casos de uso de análisis en tiempo real, como paneles en tiempo real, detección de anomalías en tiempo real y precios dinámicos, entre otros.

En este caso se usará Kinesis Data Streams para recibir los datos que envía AWS IoT luego de haber leído los datos del sensor desde la Raspberry.

3.3. Kinesis Data Analytics

Es un servicio que te permite analizar datos de streaming, obtener información procesable y atender las necesidades de los clientes y su negocio en tiempo real. Amazon Kinesis Data Analytics reduce la complejidad de construir, administrar e integrar las aplicaciones de streaming con otros servicios de AWS. Puede escribir rápidamente consultas SQL.

Para esta solución, usaremos también Kinesis Data Analyitics que recibirá los datos que se ingesten en Kinesis Data Streams, y de acuerdo a una consulta con un filtro SQL generará una salida para ingestar a otro stream de KDS.

3.4. Lambda

Es un servicio de informática sin servidor que ejecuta código en respuesta a eventos y administra automáticamente los recursos informáticos subyacentes.

Lambda ejecuta el código en una infraestructura informática de alta disponibilidad y se encarga de la administración integral de los recursos informáticos, con Lambda solo pagas cuando tu código se ejecute, lo cual lo hace eficiente a la hora de reducir costos.

En este caso usaremos una función Lambda que leerá los datos registrados en el segundo stream (output) de Kinesis Data Streams, luego insertará un ítem en DynamoDB y enviará una notificación por correo y SMS mediante SNS indicando que Forrest Gump llegó a la meta.

3.5. DynamoDB

Es un servicio flexible de bases de datos no relacionales para cualquier escala. DynamoDB permite a los clientes evitar la carga administrativa que supone tener que utilizar y escalar bases de datos distribuidas, de lo que pasa a encargarse AWS. De esta manera, no tienen que preocuparse del aprovisionamiento, la instalación ni la configuración del hardware, ni tampoco de la planificación de la capacidad de procesamiento, la replicación, los parches del software o el escalado de clústeres.

Usaremos una tabla en DynamoDB para grabar los datos de la llegada de Forrest Gump.

3.6. SNS

Es un servicio de mensajería de publicación/suscripción completamente administrada, de alta disponibilidad, seguro y con durabilidad que permite desacoplar microservicios, sistemas distribuidos y aplicaciones sin servidor.

SNS lo usaremos para enviar notificaciones por correo y SMS cuando Forrest Gump haya llegado a la meta.

3.7. CloudWatch

Es un servicio de monitorización y observación creado para ingenieros de DevOps, desarrolladores, ingenieros de fiabilidad de sitio (SRE) y administradores de TI. Es importante considerar el uso de CloudWatch para el monitoreo de toda la solución.

Implementando la solución IoT

a. Integración entre el sensor de ultrasonido y la Raspberry

Para iniciar con el desarrollo de esta solución IoT, primero debemos realizar la conexión del sensor de ultrasonido con la Raspberry Pi 4B.

Para esto usaremos:

  • Protoboard
  • Resistencia de 1K Ω
  • Resistencia de 2K Ω
  • Cables macho-macho y macho-hembra

La conexión que se debe realizar es la siguiente, la resistencia que está en forma vertical es de 1K Ω y la de forma horizontal es de 2K Ω.

Diagrama realizado en el software Fritzing.
Integración física entre la Raspberry Pi 4B y el sensor de ultrasonido

b. Uso de los servicios de AWS

Luego, accedemos a la consola de AWS, e ingresamos al servicio de AWS IoT.

Los dispositivos conectados a AWS IoT están representados por objetos de IoT en el registro de AWS IoT. El registro le permite mantener un registro de todos los dispositivos que están registrados a su cuenta de AWS IoT.

En este caso necesitamos registrar la Raspberry en AWS IoT para que pueda enviar los datos obtenidos por el sensor de ultrasonido.

Clic en Administración -> Objetos -> Crear

Aparecerá la siguiente pantalla, clic en Crear un solo objeto

Nos aparece la siguiente pantalla, le damos clic en Siguiente:

Clic en Crear un certificado, esto generará un certificado X.509 y un par de claves.

Los certificados se han generado, descargar los 3 archivos.

Elija Descargar para la CA raíz de Amazon. Se muestra una nueva página web. Elija RSA 2048 bit key: Amazon Root CA 1 (Clave RSA de 2048 bits: Amazon Root CA 1). Se abrirá otra página web; elija CA Certificates for Service Authentication (Certificados de CA para autenticación del servicio). En la siguiente página web, seleccione Amazon Root CA 1 (CA 1 raíz de Amazon) para mostrar una página con el texto del certificado de CA raíz. Copie este texto y péguelo en un archivo denominado Amazon_Root_CA_1.pem.

Todos estos archivos subirlos a la Raspberry.

Clic en Activar y siguiente.

Ahora crearemos una política en AWS IoT.

Agregamos los siguientes valores a la política y clic en Crear.

Añadimos la política al certificado.

Asociamos la política que hemos creado.

Seleccionamos la política y clic en Asociar.

Ahora nos vamos al servicio de Kinesis Data Streams para crear dos streams, ambos stream solo deben tener 1 shard, para evitar cobros indebidos.

El primer stream (input-stream-forrest) recibirá los datos que envíe el servicio de AWS IoT.

El segundo stream (output-stream-forrest) recibirá los datos que Kinesis Data Analytics filtre de acuerdo a una condición SQL.

Regresamos al servicio de AWS IoT, para añadir una regla que enviará los datos recbidos del sensor al primer stream input-stream-forrest.

Clic en Actuar -> Reglas -> Crear

Definir un nombre para la regla.

En Instrucción de consulta de regla, escribir lo siguiente:

SELECT * FROM ‘raspi4/forrest’

Luego clic en Añadir acción.

Seleccionar la opción: Envía mensajes a un flujo de Amazon Kinesis y clic en Configurar acción.

Seleccionamos el stream input-stream-forrest, en el campo Clave de partición: ${newuuid()} y elegimos una política, sino existe la creamos, clic en Añadir.

Subir el archivo python ReadSensorForrest.py al nivel donde se subieron los certificados.

Lo dejamos ejecutando, para configurar el siguiente paso de la solución.

Nos dirigimos al servicio de Kinesis Data Analytics, para crear una aplicación.

El nombre de la app puede llamarse: app-analytics-forrest, clic en Crear aplicación.

Clic en Connect streaming data.

Elegimos el primer stream input-stream-forrest.

Clic en Discover schema.

Aparecerán los valores obtenidos desde la Raspberry que se integra con el sensor. Clic en Save and continue.

Clic en Go to SQL editor y clic en Yes, start application.

Pegar el siguiente script sql:

CREATE OR REPLACE STREAM “DESTINATION_SQL_STREAM” (
“value_sensor” DOUBLE,
“date_reg” TIMESTAMP,
“name” varchar(20));

CREATE OR REPLACE PUMP “OUTPUT_PUMP” AS INSERT INTO “DESTINATION_SQL_STREAM”
SELECT STREAM “value_sensor”,”date_reg”,”name” FROM “SOURCE_SQL_STREAM_001” where “value_sensor” < 5
WINDOW FIVE_SECOND_SLIDING_WINDOW AS (RANGE INTERVAL ‘5’ SECOND PRECEDING);

Lo que hace este script cada 5 segundos, obtiene los datos del stream input-stream-forrest, y filtra si hay un valor menos de 5, en este caso solo filtra cuando se haya llegado a la meta.

Clic en Save and run SQL, clic en Destination.

Seleccionar Kinesis data stream y elegir el streams output-stream-forrest y clic en Save and continue.

Ahora crearemos una función Lambda que obtenga los datos que se registren en el segundo stream output-stream-forrest.

La función puede llamarse (opcional): ReadKinesisForrest

Con el lenguaje de programación : Python 3.7

Agregar un desencadenador a la función Lambda para que se ejecute automáticamente, clic en Añadir desencadenador.

  • Servicio : Kinesis,
  • Flujo de Kinesis : output-stream-forrest
  • Consumidor : Sin consumidor
  • Tamaño del lote : 100
  • Intervalo del lote : 0

Editar el las políticas asociadas al rol de la función Lambda, reemplazarla por contenido del archivo policy-lambda.json.

En la línea 11 y 27 reemplazar las XXXXXXXXXXXX por el id de cuenta.

Crearemos una tabla en DynamoDB llamada maratonforrest con la principal id de tipo Cadena.

Ahora, crearemos un tema en SNS llamado SnsTopicForrest.

Escribir el nombre del tema y clic en Crear un tema.

Copiar el ARN del tema en un notepad, pues lo usaremos en un momento.

Es necesario, crear una suscripción para notificar mediante correo cuando Forrest Gump haya llegado a la meta, clic en Crear una suscripción.

Seleccionamos en protocolo correo electrónico y en punto de enlace nuestro correo, clic en Crear una suscripción.

Aparecerá la siguiente pantalla.

Ahora necesitamos confirmar la suscripción. Entramos a nuestro correo y abrimos el correo que nos ha enviado AWS, lo confirmamos así podremos recibir mensajes de correo.

Y procedemos a confirmar, dando clic en Confirm suscription.

Por último volvemos a la función Lambda y pegamos el código que se encuentra en el archivo lambda.txt.

En la línea 36, agregamos nuestro ARN del tema que creamos anteriormente.

Al ejecutar en la Raspberry el siguiente comando:

python3 ReadSensorForrest.py

Como la distancia es menor a 5cm quiere decir que se llegó a la meta, también hemos recibido un correo electrónico y un SMS.

El SMS es el siguiente:

Verificamos si se agregó un ítem en la tabla maratonforrest en DynamoDB.

IMPORTANTE: Al finalizar esta solución, eliminar los stream de Kinesis Data Streams, la aplicación de Kinesis Data Analytics y la tabla maratonforrest en DynamoDB, esto es para que AWS no nos cobre.

En un próximo post realizaré una nueva solución IoT, usando los servicios que ofrece Google Cloud Platform.

Si te pareció interesante este post, puedes compartirlo.

#aws #iot #realtime #iot #Raspberry Pi

--

--

--

Data Managment Lead, Data Architect #aws #bigdata #cloud #serverless #gcp https://www.linkedin.com/in/luisgrados

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Luis Grados Salinas

Luis Grados Salinas

Data Managment Lead, Data Architect #aws #bigdata #cloud #serverless #gcp https://www.linkedin.com/in/luisgrados

More from Medium

Tech Bits #1: An NGINX DNS resolution issue

Should I buy cloud services directly from the provider?

Ship First Development

What is AWS Proton?