Full text
i Equation Chapter 1 Section 1 Trabajo Fin de Grado Grado en Ingeniería de las Tecnologías de Telecomunicación Mención en Telemática Red de sensores para la detección de agua en vehículos autónomos de superficie Autor: Jesús de Medinaceli Sánchez Galisteo Tutor: Daniel Gutiérrez Reina Cotutor: Samuel Yanes Luis Dpto. Ingeniería Electrónica Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2024
ii
iii Trabajo Fin de Grado Grado en Ingeniería de las Tecnologías de Telecomunicación Mención en Telemática. Red de sensores para la detección de agua en vehículos autónomos de superficie Autor: Jesús de Medinaceli Sánchez Galisteo Tutor: Daniel Gutiérrez Reina Profesor titular Cotutor: Samuel Yanes Luis Investigador Postdoctoral Dpto. de Ingeniería Electrónica Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2024
iv
v Trabajo Fin de Grado: Red de sensores para la detección de agua en vehículos autónomos de superficie Autor: Jesús de Medinaceli Sánchez Galisteo Tutor: Daniel Gutiérrez Reina Cotutor: Samuel Yanes Luis El tribunal nombrado para juzgar el Proyecto arriba indicado, compuesto por los siguientes miembros: Presidente: Vocales: Secretario: Acuerdan otorgarle la calificación de: Sevilla, 2024 El Secretario del Tribunal
vi
vii A mi familia A mis maestros
viii
ix Agradecimientos En primer lugar a mis padres, por creer en mí y facilitarme oportunidades para desarrollarme. A Mariluz por apoyarme siempre y embarcarse en mis ocurrencias. A Samuel por descubrirme este proyecto tan interesante. Y a todos aquellos amigos y profesores que a lo largo de la vida han dejado algo de su ser en mí y han contribuido definitivamente a mi identidad. Jesús de Medinaceli Sánchez Galisteo Sevilla, 2024
xvi
xvii ÍNDICE DE FIGURAS Figura 1. Arquitectura de la red IoT empleada en este trabajo 1 Figura 2. ROV VLBV950 de Teledyne Seabotix. 2 Figura 3. USV SB100 Pro de GPAseabots. 2 Figura 4. Ejemplo de ubicación para las probetas del sensor de humedad 3 Figura 5. Detalle de las conexiones del sensor SOS Leak Sensor de Blue Robotics 6 Figura 6. Modelo Publicador/Suscriptor 7 Figura 7. Detalle de la cabecera de un paquete MQTT 8 Figura 8. Representación conceptual de Node-RED 9 Figura 9. Arquitectura básica de Node-RED 9 Figura 10. Mapa de pines del NodeMCU v1.0 /V3 11 Figura 11. NodeMCU v1.0 /V3 11 Figura 12. Configuración del NodeMCU en Arduino IDE 12 Figura 13. Configuración del NodeMCU en Arduino IDE (2) 13 Figura 14. Configuración de la librería MQTT en Arduino IDE 13 Figura 15 Compilación en Arduino IDE 14 Figura 16. Detalle de las conexiones y accesorios incluidos en el SOS Leak Sensor de Blue Robotics 11 Figura 17. Detalle del pineado entre SOS Leak Sensor de Blue Robotics y NodeMCU 12 Figura 18. Ejemplo básico de detección de humedad 12 Figura 19. De izq. a der: sonda sin almohadilla, con almohadilla nueva y con almohadilla mojada 13 Figura 20. Detalle de conexionado para Deep Sleep 20 Figura 21. Sistema completo 21 Figura 22. Funcionamiento normal, puerto serie 22 Figura 23. Funcionamiento normal, Node-RED 22 Figura 24. Alarma de humedad, puerto serie 23 Figura 25. Alarma de humedad, Node-RED 24 Figura 26. Conexión MQTT perdida, puerto serie 25 Figura 27. Conexión MQTT perdida, Node-RED 25 Figura 28. Conexión WiFi perdida en NodeMCU 26 Figura 29. Servidor Node-RED y bróker MQTT en Docker 27 Figura 30. Visión general de la interfaz de Node-RED 27 Figura 31. Bloques MQTT en Node-RED 28 Figura 32. Configuración del bróker mosquitto en Node-RED 28 Figura 33. Ejemplo de comunicación y alerta en Node-RED 29
1 1 INTRODUCCIÓN Sic parvis magna. La grandeza nace de pequeños comienzos. - Nathan Drake - El desarrollo de vehículos autónomos ha experimentado un notable avance en los últimos años [1], impulsado por la necesidad de mejorar la eficiencia y seguridad en diversas aplicaciones. Entre estos vehículos, los barcos autónomos han demostrado ser herramientas valiosas para la monitorización y control de la contaminación en ríos, lagos, y océanos [2]. Estos vehículos son capaces de operar de manera independiente, recolectando datos cruciales para la preservación del medio ambiente y ofreciendo una solución sostenible para la vigilancia de ecosistemas acuáticos. Una de las principales preocupaciones en el diseño y operación de estos barcos es la protección de la electrónica a bordo [3]. La entrada de agua en los compartimentos que contienen componentes electrónicos puede causar fallos críticos, comprometiendo la funcionalidad del vehículo. El objetivo principal de este trabajo de fin de grado es desarrollar y evaluar un sistema de detección de agua fiable y eficiente que pueda integrarse en la infraestructura de un barco autónomo y proporcionar alertas en tiempo real. Este sistema no sólo busca mejorar la seguridad de los componentes electrónicos a bordo, sino también garantizar la continuidad operativa del vehículo para realizar misiones de monitorización ambiental. Figura 1. Arquitectura de la red IoT empleada en este trabajo Para cumplir con este objetivo, este trabajo se centra en la implementación de una red de sensores IoT para la detección de filtraciones de agua en barcos autónomos de superficie, utilizando un sensor de humedad SOS Leak Sensor de Blue Robotics y un microcontrolador NodeMCU (Arduino con chip ESP8266) para la comunicación a un servidor Node-RED a través de un bróker MQTT [4].
Introducción 2 2 1.1 Barcos autónomos para monitorizar la contaminación La contaminación de los cuerpos de agua es un problema ambiental grave que afecta la biodiversidad, la calidad del agua y la salud humana. Los métodos tradicionales de monitoreo requieren de embarcaciones tripuladas y pueden ser costosos, peligrosos y limitados en cuanto a cobertura y duración de las misiones. Los barcos autónomos de superficie (ASV, autonomous surface vehicles) han surgido como una solución prometedora para superar estas limitaciones. [5] Los ASV están equipados con una variedad de sensores que permiten la recopilación de datos ambientales, tales como la temperatura del agua, niveles de pH, conductividad, turbidez, y la presencia de nutrientes o contaminantes específicos como metales pesados e hidrocarburos. [5]. Estos vehículos pueden programarse para seguir rutas específicas o patrullar áreas designadas, recolectando datos de manera precisa sin la necesidad de intervención humana constante. Además, los ASV pueden operar en condiciones peligrosas o inaccesibles para las embarcaciones tripuladas, como en zonas de derrames de petróleo, áreas contaminadas por productos químicos o regiones con condiciones climáticas adversas. En este contexto, la integración de sensores IoT junto a tecnologías de comunicación inalámbrica permiten desarrollar sistemas de alerta temprana que mejoran significativamente la fiabilidad de estos vehículos, contribuyendo a la protección del medio ambiente y la prevención de desastres ecológicos. Figura 3. USV SB100 Pro de GPAseabots. Figura 2. ROV VLBV950 de Teledyne Seabotix.
3 3 Red de sensores para la detección de agua en vehículos autónomos de superficie 1.2 Necesidad de los sistemas de seguridad en los barcos (electrónica a bordo) La electrónica a bordo incluye sistemas de comunicación, navegación, y control, los cuales son vitales para la operación autónoma del barco. Estos sistemas deben ser protegidos contra posibles fallos causados por la infiltración de agua. Figura 4. Ejemplo de ubicación para las probetas del sensor de humedad Para mitigar este riesgo se han desarrollado sistemas de detección temprana mediante redes de sensores que permiten activar medidas de protección tales como el cierre de válvulas, la activación de bombas de achique o la orden de retorno al punto de lanzamiento antes de que se produzcan cortocircuitos, corrosión u otros daños significativos. 1.3 Redes IoT en vehículos autónomos Una red IoT (Internet of Things) consiste en una serie de dispositivos conectados que pueden comunicarse entre sí y con sistemas centralizados a través de Internet. Esta capacidad de conexión permite la recopilación y el intercambio de datos en tiempo real, proporcionando una visión integral del estado y rendimiento del vehículo. [6] En el caso de los barcos autónomos, las redes IoT facilitan la integración de sensores y actuadores que pueden provenir de distintos fabricantes y emplear diferentes protocolos de comunicación. El uso de redes IoT en vehículos autónomos permite analizar los datos históricos y en tiempo real, haciendo posible identificar patrones y prever posibles fallos antes de que ocurran. Además, la conectividad IoT permite la actualización remota del software y la configuración de los dispositivos, lo que facilita la gestión y el despliegue de mejoras en el sistema. Algunas de las tecnologías de comunicación más populares para implementar redes IoT son: • WiFi: alta velocidad, mayor consumo de energía, alcance limitado. Útil cuando el vehículo se encuentra en una red local.
Introducción 4 4 • LoRaWAN (Long Range Wide Area Network): baja velocidad, gran alcance (15 km). Útil en entornos rurales. • NB-IoT (Narrowband IoT): alta eficiencia energética y alcance. Se apoya en redes de datos móviles, útil en entornos urbanos. • Zigbee: bajo consumo y velocidad, alcance medio (100m). Útil para comunicar sensores y actuadores en el vehículo. • 5G: muy alta velocidad, baja latencia, muchos dispositivos. Depende de una infraestructura que está principalmente en entornos urbanos. En este trabajo la comunicación del microcontrolador se realizará por WiFi debido a que es la solución incorporada tanto en el barco como en el NodeMCU, si bien sería posible utilizar adaptadores de antenas de otros protocolos.
5 2 METODOLOGÍA Radicalidad en los fines, flexibilidad en los medios. - Platón - Este proyecto consiste en la implementación de una red IoT mediante un NodeMCU, que actúa como nodo central para el sensor de humedad, comunicándose mediante WiFi con un bróker MQTT. Esta configuración permite la transmisión eficiente de datos al servidor Node-RED, donde se gestionan las alertas y se toman decisiones en tiempo real para proteger la electrónica del barco. Para ello, se han llevado a cabo las siguientes etapas: 1. Investigación: documentación del funcionamiento de cada dispositivo y tecnología empleada. 2. Experimentación: comenzando por la puesta en marcha del NodeMCU, se ha iterado añadiendo funcionalidades paso a paso hasta alcanzar la solución final (firmware y código básico del NodeMCU, depuración por puerto serie, lectura del sensor de humedad, conexión WiFi, configuración y conexión al bróker MQTT y servidor Node-RED, gestión de interrupciones de comunicación, optimización energética) 3. Redacción: estructuración del conocimiento obtenido y análisis de los resultados. 2.1. Sensores de detección de agua Los sensores de humedad son un componente crítico en la detección de filtraciones de agua, especialmente en embarcaciones autónomas. Su misión es la de detectar rápidamente la presencia de agua dentro de un compartimento sellado y proporcionar alertas antes de que ocurra algún daño significativo. Existen varios tipos de sensores de humedad, cada uno con un principio de operación distinto [17]: 1. Sensores Capacitivos: • Utilizan una delgada capa de material dieléctrico entre dos electrodos. Cuando la humedad del aire cambia, también lo hace la constante dieléctrica del material, alterando la capacitancia que puede ser medida. • Son comunes en aplicaciones meteorológicas, industriales y comerciales debido a su precisión y estabilidad a largo plazo. 2. Sensores Resistivos: • Están hechos de materiales con baja resistividad que cambian significativamente con la humedad. La resistencia del material varía con la cantidad de vapor de agua, lo que puede ser medido con un circuito eléctrico. • Son usados en aplicaciones industriales y domésticas por su bajo costo y tamaño compacto. 3. Sensores Térmicos: • Utilizan dos termistores: uno expuesto al aire húmedo y otro sellado en aire seco. La diferencia en la resistencia térmica entre los dos sensores se usa para calcular la humedad. • Son adecuados para entornos con altas temperaturas y condiciones corrosivas.
Metodología 6 6 Para este trabajo se ha empleado el SOS Leak Sensor de Blue Robotics[10]. Este es un sensor resistivo con salida digital: emite HIGH si detecta agua y LOW en caso contrario. Esto permite una fácil integración como input en los pines del NodeMCU, un bajo consumo energético y bajo coste. Algunas características destacables del SOS Leak Sensor son: • Sondas reutilizables: El sensor viene con cuatro sondas terminadas en esponja, que pueden colocarse estratégicamente dentro del compartimiento estanco del vehículo, asegurando una monitorización integral de todas las áreas críticas. • Compatibilidad: Es compatible con varios microcontroladores y sistemas, incluidos Arduino y Raspberry Pi , facilitando su integración en diversos proyectos. • Especificaciones eléctricas: Funciona con un voltaje de operación de 3.3V a 5V y tiene un consumo máximo de corriente de 20 mA. El sensor utiliza un conector de salida de 3 pines y 4 conectores de entrada de 2 pines JST-GH. • Alertas visuales: En caso de detección de agua el sensor activa una señal LED roja, proporcionando una indicación in situ de la presencia de una fuga. Figura 5. Detalle de las conexiones del sensor SOS Leak Sensor de Blue Robotics 2.2. Descripción de MQTT MQTT (Message Queuing Telemetry Transport) es un protocolo de mensajería ligero y eficiente que se utiliza ampliamente en aplicaciones de IoT. Su diseño está orientado a la eficiencia y la simplicidad, lo que lo hace ideal para dispositivos con recursos limitados y redes de bajo caudal. [7]. Fue desarrollado por IBM y posteriormente estandarizado por OASIS.
7 7 Red de sensores para la detección de agua en vehículos autónomos de superficie 2.2.1. Aplicaciones en IoT El protocolo MQTT es ampliamente utilizado en aplicaciones de IoT. Algunas aplicaciones comunes incluyen: • Monitorización remota: Sensores que recopilan datos ambientales (temperatura, humedad, calidad del aire) y los envían a una plataforma centralizada para su análisis. • Automatización del hogar: Dispositivos inteligentes que controlan luces, termostatos, y sistemas de seguridad, comunicándose entre sí y con el usuario a través de MQTT. • Agricultura inteligente: Sensores de humedad del suelo y sistemas de riego automatizados que optimizan el uso del agua y mejoran los rendimientos de los cultivos. • Transporte y logística: Rastreo de vehículos y mercancías, proporcionando actualizaciones en tiempo real sobre la ubicación y el estado de los envíos. En este proyecto, la elección de MQTT se debe a su capacidad para proporcionar comunicación en tiempo real y eficiente entre el sensor de humedad, el NodeMCU, y el servidor Node-RED, asegurando que las alertas se transmitan de manera rápida y fiable en caso de detección de agua. 2.2.2. Definición y funcionamiento El protocolo MQTT opera sobre TCP/IP y sigue un modelo publicador-suscriptor. En este modelo, los dispositivos pueden actuar como "publicadores" (publishers) que envían mensajes a un "bróker" MQTT, o como "suscriptores" (subscribers) que reciben mensajes del bróker. El bróker es responsable de distribuir los mensajes a los suscriptores interesados, lo que permite una comunicación eficiente y desacoplada entre los dispositivos. Figura 6. Modelo Publicador/Suscriptor Funcionamiento básico de MQTT: 1. Publicación: Un dispositivo publicador envía un mensaje a un tema específico en el bróker. En este proyecto, el NodeMCU actúa como publicador, enviando alarmas del sensor de humedad al bróker MQTT. 2. Suscripción: Un dispositivo suscriptor se suscribe a uno o más temas en el bróker. El servidor Node- RED en este proyecto se suscribe a los temas relevantes para recibir y procesar las alertas de detección de agua. 3. Distribución de mensajes: El bróker recibe los mensajes de los publicadores y los distribuye a todos los suscriptores interesados. Los brókers MQTT más comunes son Mosquitto (utilizado para este proyecto) y HiveMQ.
Metodología 14 14 El lenguaje de programación de Arduino es una versión simplificada de C++. La estructura básica de un programa para NodeMCU es la siguiente: /* Parámetros de inicio*/ // Aquí se incluyen las librerías necesarias y se definen constantes void setup() { // Código de inicialización, se ejecuta solo al encender el dispositivo // En esta sección se establecen los pines que se utilizan y se configuran parámetros de conexión como el puerto serie y WiFi } void loop() { // Código principal, se ejecuta en bucle // Este bucle implementa la funcionalidad principal del programa: leer y escribir en pines, realizar cálculos, llamar a funciones, iniciar transmisiones de datos… } void una_funcion() { // Se pueden abstraer partes del código como funciones para facilitar su reutilización y legibilidad } Una vez preparado el código, basta con conectar por USB el NodeMCU, seleccionar en ArduinoIDE el puerto al que está conectado y hacer click en la flecha para compilar y cargar el código. Figura 15 Compilación en Arduino IDE
11 3 EXPERIMENTOS Un hombre con una idea nueva es un loco hasta que la idea triunfa. - Mark Twain - 3.1. Sensibilidad del sensor de humedad El sensor de humedad SOS Leak Sensor de Blue Robotics consta de una pequeña placa con la lógica electrónica para detectar humedad, 4 puertos JST-GH donde se conectan hasta 4 probetas, 3 pines para alimentación y conexión con el microcontrolador NodeMCU y 1 indicador LED. Opera entre 3.3 y 5V y consume un máximo de 20mA. Figura 16. Detalle de las conexiones y accesorios incluidos en el SOS Leak Sensor de Blue Robotics Para realizar la prueba más básica de su funcionamiento, se conectan los pines de alimentación del sensor (VCC y GND) a los pines de 3V y G (tierra) del NodeMCU. El pin de señal (Leak) se conecta a cualquier pin de entrada del NodeMCU (p.ej D1) y se sumerge la probeta en agua.
Experimentos 12 12 Figura 17. Detalle del pineado entre SOS Leak Sensor de Blue Robotics y NodeMCU En cuanto el agua disminuye la resistencia eléctrica entre ambos terminales de la probeta, se enciende el LED rojo de detección de agua. En este ejemplo he retirado la almohadilla para mostrar claramente su funcionamiento; Figura 18. Ejemplo básico de detección de humedad
13 13 Red de sensores para la detección de agua en vehículos autónomos de superficie En pruebas con la almohadilla, bastan 1 o 2 gotas de agua para que la esponja transmita la humedad a los terminales. Figura 19. De izq. a der: sonda sin almohadilla, con almohadilla nueva y con almohadilla mojada 3.2. Diseño del programa del NodeMCU con MQTT El programa debe cumplir con los siguientes requisitos: Requisitos Funcionales: • Leer las alertas del sensor de humedad. • Transmitir mediante WiFi al bróker MQTT las alertas de humedad. • Reestablecer conexión al AP WiFi o al bróker MQTT si estas se pierden. • Entrar en modo deep sleep para minimizar el consumo. Requisitos No Funcionales: • Comunicar por puerto serie trazas de ejecución para depurar el programa.
Experimentos 14 14 3.2.1. Estructura del Código A continuación se comenta brevemente la función de cada bloque de código. El código completo puede consultarse en el ANEXO A. Parámetros de Inicio // Descomentar para mostrar debug monitor serie #define DEBUG_SERIAL //Librerias #include <ESP8266WiFi.h> #include <PubSubClient.h> //Pines constexpr int leakPin = 5; // Leak Signal Pin (D2) // Configuracion WiFi constexpr const char* ssid = " WiFi Arduino"; // SSID-WIFI constexpr const char* pass = " tfgarduino "; // PASS-WIFI WiFiClient clienteWifi; // Configuracion MQTT PubSubClient clientMqtt(clienteWifi); constexpr const char* servidorMqtt = "192.168.1.20"; //IP-BRÓKER-MQTT constexpr const char* topicAlarma = "/barco/humedad"; ///casa/puerta/alarma //Configuracion Sleep constexpr uint32_t deepSleepTime = 10e6; // DeepSleep durante 10 segundos (en microsegundos) y vuelve al principio. El max posible es 71 min. El programa comienza definiendo una macro DEBUG_SERIAL para mostrar la salida por puerto serie si está activada. Cuando se despliegue en un entorno real, comentar esta macro permite ahorrar ciclos de ejecución y energía. A continuación: • Se incluyen las librerías necesarias para manejar la conexión WiFi y el cliente MQTT. • Se define el pin (p.ej D2) que estará conectado al sensor de humedad. • Se configura el cliente MQTT, incluyendo la dirección del servidor (bróker) MQTT y el tema donde se publicará la alarma de humedad (p.ej: "/barco/humedad) • Se establece que el dispositivo entrará en modo de bajo consumo (deep sleep) durante 10 segundos antes de despertarse y repetir el ciclo. Este tiempo se ha decidido con propósitos de experimentación, en campo interesará definir un valor de varios minutos para optimizar el consumo de energía.
15 15 Red de sensores para la detección de agua en vehículos autónomos de superficie Setup void setup() { // Configuracion pines pinMode(leakPin, INPUT); #ifdef DEBUG_SERIAL pinMode(LED_BUILTIN, OUTPUT); Serial.begin(9600); Serial.println("\n\n=================================================\nESP82 66 NodeMCU con sensor de humedad 'SOS Leak Sensor'\n=================================================\nIniciando configuracion de arranque...\n"); #endif // Conexion con la red WiFi WiFi.mode(WIFI_STA); WiFi.setAutoConnect(true); WiFi.begin(ssid, pass); #ifdef DEBUG_SERIAL Serial.print("[WIFI]Intentando conectar a:\t"); Serial.println(ssid); #endif // Configuración MQTT clientMqtt.setServer(servidorMqtt, 1883); } La función setup() se ejecuta una vez cuando el microcontrolador se enciende o se reinicia. En esta función: • Se configura el pin leakPin como entrada para leer el estado del sensor de humedad. • Si DEBUG_SERIAL está definido, se configura el LED integrado como salida y se inicia la comunicación serie, además de habilitar las distintas trazas del código. • A continuación configura el ESP8266 en modo cliente WiFi (WIFI_STA) e inicia la conexión con la red WiFi usando el SSID y la contraseña definidos. • Por último, se configura el cliente MQTT para que se conecte al servidor MQTT especificado (servidorMqtt) en el puerto 1883.
Experimentos 16 16 Loop void loop() { // Comprobamos conexión con bróker MQTT if (!clientMqtt.connected()) { reconnectMqtt(); } clientMqtt.loop(); //Deteccion de humedad int leak = digitalRead(leakPin); // Lee el pin asignado al sensor de humedad. HIGH = humedad detectada #ifdef DEBUG_SERIAL digitalWrite(LED_BUILTIN, leak); // Enciende led interno del NodeMCU #endif if (leak == HIGH) { // 1 #ifdef DEBUG_SERIAL Serial.println("[ALARMA]Humedad detectada!"); #endif // Enviamos mensaje al bróker clientMqtt.publish(topicAlarma, "[ALARMA]Humedad detectada!"); delay(1000); } else { // Entra en modo ESP8266 deep sleep #ifdef DEBUG_SERIAL Serial.print("[NodeMCU]Entrando en deep sleep durante "); Serial.print(deepSleepTime); Serial.println(" microsegundos."); #endif ESP.deepSleep(deepSleepTime); } } Este es el bucle principal del programa. Su propósito es comprobar la conexión con el bróker MQTT, leer el estado del sensor de humedad, enviar una alerta si se detecta humedad y poner el dispositivo en modo de bajo consumo (deep sleep) si no se detecta humedad. Para ello: • Si el cliente MQTT no está conectado, se llama a la función reconnectMqtt(). Luego, clientMqtt.loop() mantiene la conexión MQTT activa y procesa los mensajes entrantes y salientes. • A continuación lee el estado del pin conectado al sensor de humedad. Si se detecta humedad, leerá HIGH (1) y enviará un mensaje de alarma al bróker MQTT en el tema definido en topicAlarma. • Si no se detecta humedad, entra en modo de bajo consumo (ESP.deepSleep(deepSleepTime)) durante el tiempo especificado en deepSleepTime.
17 17 Red de sensores para la detección de agua en vehículos autónomos de superficie ReconnectMqtt void reconnectMqtt() { // Repetimos hasta conectar while (!clientMqtt.connected()) { // Comprobar conexion WiFi if (WiFi.status() != WL_CONNECTED) { WiFi.reconnect(); // Reintentar hasta conectar WiFi while (WiFi.status() != WL_CONNECTED) { #ifdef DEBUG_SERIAL Serial.print("[WIFI]Fallo al conectar. WiFi.status = "); Serial.print(WiFi.status()); Serial.println(". Reintentando..."); #endif delay(3000); } // Informacion de la conexion WiFi establecida #ifdef DEBUG_SERIAL Serial.print("\n[WIFI]Conectado a la red:\t"); Serial.println(WiFi.SSID()); Serial.print("[WIFI]IP asignada:\t"); Serial.println(WiFi.localIP()); Serial.print("[WIFI]Mascara de red:\t"); Serial.println(WiFi.subnetMask()); Serial.print("[WIFI]IP gateway:\t"); Serial.println(WiFi.gatewayIP()); Serial.print("[WIFI]Direccion MAC:\t"); Serial.println(WiFi.macAddress()); Serial.print("[WIFI]RSSI:\t"); Serial.println(WiFi.RSSI()); Serial.println(); #endif } #ifdef DEBUG_SERIAL Serial.println("[MQTT]Esperando conexión con MQTT..."); #endif // Intentamos conectar al broker MQTT if (clientMqtt.connect("SENSOR_HUMEDAD")) { #ifdef DEBUG_SERIAL Serial.println("[MQTT]Conectado"); #endif clientMqtt.publish(topicAlarma, "OK"); // Se envia cada vez que vuelve del deep sleep } else { #ifdef DEBUG_SERIAL Serial.print("[MQTT]Fallo al conectar. clientMqtt.state = "); Serial.print(clientMqtt.state());
Experimentos 18 18 Serial.println(". Reintentando..."); #endif delay(5000); } } } La función reconnectMqtt() intenta reconectar el NodeMCU a la red WiFi y al bróker MQTT si la conexión se pierde. La función se ejecuta en un bucle hasta que ambas conexiones se restablecen con éxito. Primero se comprueba la conexión WiFi e intenta reconectar cada 3 segundos si es necesario. Una vez que la conexión WiFi se restablece, imprime detalles sobre la conexión (SSID, IP, máscara de red, puerta de enlace, dirección MAC y señal RSSI) si DEBUG_SERIAL está definido. Sólo cuando se establece la conexión WiFi se intenta la conexión con el bróker MQTT, pues es innecesario intentar la conexión con el bróker si no se ha conectado al WiFi. Si la conexión es exitosa, imprime un mensaje de éxito y publica un mensaje "OK" en el tema definido en topicAlarma. Este mensaje de “OK” permite saber en Node-RED que el dispositivo sigue funcionando. Si la conexión con el bróker falla, imprime un mensaje de error con el estado del cliente MQTT y espera 5 segundos antes de reintentar. Los tiempos de espera entre reintentos de 3 y 5 segundos se han elegido por conveniencia para la experimentación, pero pueden modificarse en el despliegue en campo según el criterio que se estime (aumentar la velocidad de restablecimiento de conexión o disminuir la energía consumida). 3.3. Implementación del deep sleep en NodeMCU El modo deep sleep en el ESP8266 es una característica que permite reducir significativamente el consumo de energía del dispositivo, esencial para proyectos que funcionan con baterías y requieren una larga duración. La energía consumida es la suma de dos categorías: • Energía estática: energía consumida en reposo. • Energía dinámica: energía consumida al acceder a componentes analógicos, módulo WiFi etc. Hay 4 modos de consumo en un ESP8266: • Modo activo: el módulo WiFi está siempre encendido. Es el modo de mayor consumo. • Modem sleep: modo por defecto cuando se conecta a un punto de acceso. Permite habilitar y deshabilitar el módulo WiFi. • Light sleep: igual que el anterior y además apaga el reloj del sistema y suspende la CPU. • Deep sleep: en este modo sólo queda encendido el RTC para poder contar el tiempo.
19 19 Red de sensores para la detección de agua en vehículos autónomos de superficie Según el modo de consumo elegido, el fabricante del ESP8266 proporciona los siguientes consumos [13]: Tabla 1. Consumos teóricos del chip ESP8266 El modo activo puede oscilar entre 56mA y 170 mA. No obstante, el ESP8266 se implementa en diferentes microcontroladores como: • NodeMCU • Wemos D1 • ESP-12 Y los consumos varían en función del microcontrolador empleado debido a la elección de los fabricantes de conectar el pin de alimentación 3V3 al regulador de tensión (mayor consumo) o no hacerlo (menor consumo). En el caso del NodeMCU, el consumo que se puede esperar en Deep Sleep está en torno a 8 mA. En caso de resultar indispensable reducir el consumo del microcontrolador para su integración en el barco autónomo, la que menor consumo ofrece sería la ESP-12, que sí alcanza los 20 µA, seguida de la Wemos D1 Mini, que alcanza 78 µA [14]
Experimentos 26 26 3.4.4 Conexión WiFi perdida en NodeMCU Puerto serie NodeMCU: Figura 28. Conexión WiFi perdida en NodeMCU Para este ejemplo se ha cambiado en el código la red WiFi a la que intenta conectarse el NodeMCU, quedando este en el bucle de reconexión hasta que se encuentre disponible. 3.5. Diseño de la interfaz gráfica en el servidor Node-RED El diseño de la interfaz gráfica en el servidor es una parte crucial del proyecto, ya que permite a los usuarios visualizar en tiempo real los datos recolectados por los sensores y gestionar las alertas de manera efectiva. En este proyecto, la plataforma Node-RED se utiliza para crear una interfaz gráfica que presenta los datos de detección de agua y otros parámetros relevantes del barco autónomo. Para realizar pruebas con un servidor Node-RED en local, se ha seguido este procedimiento: 1. Configuración de Node-RED: Node-RED puede ejecutarse en diferentes plataformas, incluyendo Raspberry Pi, servidores locales basados en Linux o Windows, y servicios en la nube como AWS o Azure. En este trabajo se ha elegido desplegar el servidor en Windows mediante un contenedor de Docker [15]. Un contenedor de Docker es una unidad estandarizada de software que empaqueta el código y todas sus dependencias para ejecutar un determinado programa. Los contenedores Docker son una tecnología que facilita la creación, despliegue y ejecución de aplicaciones al aislarlas del entorno del sistema operativo [16]. El paquete empleado en este trabajo incluye 2 contenedores: • nodered-1: el servidor Node-RED con interfaz gráfica donde se configuran los flujos. • mosquitto: el bróker MQTT que comunicará los paquetes del NodeMCU con el servidor Node-RED
27 27 Red de sensores para la detección de agua en vehículos autónomos de superficie Figura 29. Servidor Node-RED y bróker MQTT en Docker El bróker mosquitto expone el puerto 1883 a la espera de recibir paquetes de los publicadores (NodeMCU) y suscriptores (Node-RED) El servidor Node-RED expone el puerto 1880 con la interfaz web donde se administra y visualiza su funcionamiento. Figura 30. Visión general de la interfaz de Node-RED
Experimentos 28 28 2. Creación de los flujos: Para diseñar los flujos se utilizan los nodos predefinidos para suscribirse a temas específicos y recibir mensajes en tiempo real del NodeMCU (mqtt in). Figura 31. Bloques MQTT en Node-RED Haciendo doble click sobre el nodo se configuran sus propiedades. En el caso de este proyecto: • Tema al que se suscribe el nodo: /barco/humedad • Nombre y puerto del bróker MQTT: mosquitto:1883 • Calidad de servicio (CdS – QoS): 2 Figura 32. Configuración del bróker mosquitto en Node-RED
29 29 Red de sensores para la detección de agua en vehículos autónomos de superficie 3. Instanciación y pruebas Al hacer click en el botón “Instanciar”, Node-RED verifica la configuración y si no hay errores, la despliega. El resultado final se muestra a continuación. El lienzo, sus módulos y configuraciones pueden consultarse y replicarse con el JSON exportado en el Anexo B. Figura 33. Ejemplo de comunicación y alerta en Node-RED Este flujo de Node-RED se ha creado para mostrar la mínima funcionalidad de las alertas de humedad. Para ello se ha añadido un botón que permite publicar un valor simulado (true) en el bróker MQTT. Este se recibe del mismo bróker y se muestra correctamente en el panel de depuración, quedando probada la comunicación básica entre el bróker y Node-RED. Al conectar el nodo SENSOR_HUMEDAD (el NodeMCU), se reciben 2 tipos de mensaje: • OK. Este mensaje se recibe cada vez que el NodeMCU despierta del deep sleep y conecta con el bróker. Sirve como señal de keep-alive. • [ALARMA] Humedad detectada!. Este mensaje se recibe continuamente cuando el sensor detecta humedad. Una vez recibida la alerta, podría extenderse la funcionalidad de Node-RED: • Ordenando apagar componentes electrónicos a bordo. • Ordenando Return to Launch Point para poder inspeccionar el estado del barco. • Reenviando la alerta a un dashboard de Node-RED o a otros canales (p.ej un bot de Telegram).
31 4 CONCLUSIONES Y FUTURAS MEJORAS La ciencia nunca resuelve un problema sin crear otros diez más. - George Bernard Shaw- 4.1. Resumen de resultados Este TFG ha tenido como objetivo principal desarrollar y evaluar un sistema fiable y eficiente para la detección de filtraciones de agua en barcos autónomos de superficie. A lo largo del trabajo, se han alcanzado los siguientes resultados clave: 1. Implementación y configuración del hardware: • Se ha integrado con éxito el sensor de humedad SOS Leak Sensor de Blue Robotics con un microcontrolador NodeMCU basado en el chip ESP8266. La configuración de los pines y la programación del microcontrolador han permitido la detección precisa de agua en las pruebas de laboratorio. 2. Comunicación mediante MQTT y Node-RED: • Se ha implementado una comunicación eficiente entre el NodeMCU y el servidor Node-RED a través de un bróker MQTT (mosquitto), utilizando WiFi para la transmisión de datos y Docker para el despliegue del servidor y el bróker. Esta red IoT ha permitido la transmisión en tiempo real de las alertas de humedad al servidor, donde se pueden gestionan y visualizar adecuadamente. 3. Optimización energética mediante el uso de deep sleep: • Se ha implementado el modo deep sleep en el NodeMCU, logrando una significativa reducción del consumo energético del sistema. Las pruebas de consumo han demostrado que el uso del deep sleep permite extender la vida útil de la batería, lo cual es crucial para la operatividad continua del barco autónomo. • Las mediciones experimentales del consumo energético con una alimentación de 5V han mostrado que el NodeMCU consume entre 0.06A-0.07A durante la transmisión de datos y alrededor de 0.00A-0.01A en modo deep sleep, confirmando la eficiencia de este modo de consumo. 4. Desarrollo de la interfaz gráfica en Node-RED: • Se ha diseñado una interfaz gráfica en un servidor Node-RED que permite visualizar en tiempo real las alertas de detección de agua, así como el estado de comunicación entre el NodeMCU y el servidor. Esta interfaz facilitará la gestión de las alertas y la integración con el resto de parámetros del barco.
Conclusiones y Futuras Mejoras 32 32 5. Pruebas de funcionamiento y debugging: • Se han realizado diversas pruebas para verificar el funcionamiento del sistema en diferentes escenarios, incluyendo la detección de humedad con 1 o 2 gotas, la reconexión con el bróker MQTT y la reconexión WiFi. Estas pruebas han permitido identificar y corregir posibles errores en el diseño del código, asegurando la robustez y fiabilidad del sistema. • La configuración del puerto serie para la depuración ha facilitado el proceso de debugging, permitiendo obtener información detallada sobre el estado del NodeMCU y la comunicación con el servidor. En resumen, el sistema desarrollado ha demostrado ser eficaz para la detección de agua en barcos autónomos de superficie, proporcionando alertas en tiempo real y optimizando el consumo energético mediante el uso del modo deep sleep. La integración con Node-RED y el uso de MQTT han permitido una comunicación eficiente y la gestión centralizada de las alertas, contribuyendo a la protección de la electrónica del barco. 4.2. Posibles mejoras Estos resultados sientan las bases para futuras mejoras y extensiones del sistema, incluyendo la integración de otros sensores y tecnologías IoT, la optimización adicional del consumo energético y el desarrollo de nuevas funcionalidades para mejorar la seguridad y operatividad de los barcos autónomos. A continuación, se detallan algunas vías de mejora: 1. Optimización del Consumo Energético: • Problema: Aunque se ha reducido el consumo energético con el modo deep sleep, el consumo aún puede reducirse más para incrementar la operatividad en misiones prolongadas. • Mejoras: o Sustituir el NodeMCU por el Wemos D1 Mini (78 µA), trabajar directamente sobre el ESP-12 (20 µA) o utilizar una versión más nueva, el ESP32 (5 μA). o Implementar técnicas de backoff exponencial en las reconexiones MQTT y WiFi, de modo que en desconexiones prolongadas aumente el tiempo entre reintentos y se evite un consumo excesivo de la antena WiFi. o Si el pin RST se conectara con el sensor de humedad, el microcontrolodor podría permanecer en deep sleep periodos muy largos cuando no hay alertas (máximo 71 minutos) y ser despertado justo cuando se detecte humedad para iniciar la transmisión. Para ello sería necesario alimentación externa para el sensor y algún circuito lógico auxiliar (el sensor emite HIGH cuando detecta humedad y el pin RST actúa al recibir LOW, además de que una vez efectuado el reset habría que impedir la acción sobre el pin RST hasta que vuelva a entrar en deep sleep). • Problema: las mediciones de consumo se han realizado con instrumental de baja precisión (±0.01V y ±0.01A). • Mejora: realizar de nuevo las mediciones con instrumental más preciso, especialmente para la corriente (al menos ±1μA). 2. Mejoras de seguridad • Problema: la conexión entre el NodeMCU y el servidor Node-RED se realiza sin cifrar. • Mejora: utilizar TLS entre ambos y/o un túnel VPN entre el router WiFi del barco y el router donde se encuentra el servidor Node-RED.
33 33 Red de sensores para la detección de agua en vehículos autónomos de superficie 3. Mejoras de comunicación • Problema: el diseño actual implica estar frente al servidor Node-RED para conocer las alertas de humedad. • Mejora: implementar alertas multicanal. El servidor Node-RED podría redirigir alertas a un bot de Telegram, una dirección de email o SMS. También podrían darse de alta otro tipo de suscriptores directamente al bróker MQTT. 4. Mejoras de operatividad: • Problema: para modificar el comportamiento del NodeMCU es necesario recuperar el barco autónomo y acceder físicamente al NodeMCU. • Mejora: estudiar la implementación de actualizaciones de firmware para el NodeMCU vía WiFi (OTA, Over The Air). 5. Pruebas en diversos entornos reales • Mejora: el sistema completo debe testearse en diferentes entornos y condiciones climáticas para asegurar su fiabilidad en distintas situaciones. Implementar estas mejoras incrementará la robustez, versatilidad y eficiencia del sistema, mejorando significativamente la protección de la electrónica a bordo de los barcos autónomos y contribuyendo a la conservación del medio ambiente a través de una monitorización más efectiva y fiable.
Conclusiones y Futuras Mejoras 34 34
35 BIBLIOGRAFÍA [1] Autonomous vehicles in support of naval operations, 2005. 1st ed. Washington, D.C: National Academies Press. ISBN 0-309-18123-2. [2] PATTERSON, R.G., LAWSON, E., UDYAWER, V., BRASSINGTON, G.B., GROOM, R.A. y CAMPBELL, H.A., 2022. Uncrewed Surface Vessel Technological Diffusion Depends on Cross-Sectoral Investment in Open-Ocean Archetypes: A Systematic Review of USV Applications and Drivers. Frontiers in Marine Science, vol. 8, ISSN 2296-7745. DOI 10.3389/fmars.2021.736984. [3] LIU, Z., ZHANG, Y., YU, X. y YUAN, C., 2016. Unmanned surface vehicles: An overview of developments and challenges. Annual reviews in control, vol. 41, ISSN 1367-5788. DOI 10.1016/j.arcontrol.2016.04.018. [4] SHAO, Z., HUANG, M., WU, D., ZHANG, X. y HUANG, A., 2019. Design of a Simplified Wireless Sensor Network Node based on MQTT Protocol. , DOI 10.48550/arxiv.1906.10540. [5] MANLEY, J.E., 2008. Unmanned surface vehicles, 15 years of development. OCEANS 2008. S.l.: IEEE, pp. 1-4. ISBN 1424426197. DOI 10.1109/OCEANS.2008.5152052. [6] GUBBI, J., BUYYA, R., MARUSIC, S. y PALANISWAMI, M., 2013. Internet of Things (IoT): A vision, architectural elements, and future directions. Future generation computer systems, vol. 29, no. 7, ISSN 0167-739X. DOI 10.1016/j.future.2013.01.010. [7] HILLAR, G.C., 2017. MQTT essentials - a lightweight IoT protocol : the preferred IoT publish-subscribe lightweight messaging protocol. 1st edition. Birmingham, England ; Packt Publishing. ISBN 1-78728-514-6. [8] HAGINO, T., 2021. Practical Node-RED programming : learn powerful visual programming techniques and best practices for the web and IoT. London, England: Packt Publishing, Limited. ISBN 1-80020-766-2. [9] PULVER, T., 2019. Hands-on internet of things with MQTT : build connected IoT devices with Arduino and MQ telemetry transport (MQTT). 1st edition. Birmingham, England: Packt. ISBN 1-78934-500-6. [10] SOS Leak Sensor with an Arduino. Blue Robotics. Disponible en: https://bluerobotics.com/learn/sos-leak-sensor-with-an-arduino/. [11] NODEMCU documentation. NodeMCU Documentation. Disponible en: https://nodemcu.readthedocs.io/en/release/. [12] Introduction. MQTT Version 3.1.1. (n.d.). https://docs.oasisopen.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html
ANEXO B 42 42 "lightTheme": { "default": "#0094CE", "baseColor": "#0094CE", "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif", "edited": true, "reset": false }, "darkTheme": { "default": "#097479", "baseColor": "#097479", "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif", "edited": false }, "customTheme": { "name": "Untitled Theme 1", "default": "#4B7930", "baseColor": "#4B7930", "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif" }, "themeState": { "base-color": { "default": "#0094CE", "value": "#0094CE", "edited": false }, "page-titlebar-backgroundColor": { "value": "#0094CE", "edited": false }, "page-backgroundColor": { "value": "#fafafa", "edited": false }, "page-sidebar-backgroundColor": { "value": "#ffffff", "edited": false }, "group-textColor": { "value": "#1bbfff", "edited": false }, "group-borderColor": { "value": "#ffffff", "edited": false }, "group-backgroundColor": { "value": "#ffffff", "edited": false }, "widget-textColor": { "value": "#111111", "edited": false },
43 43 Red de sensores para la detección de agua en vehículos autónomos de superficie "widget-backgroundColor": { "value": "#0094ce", "edited": false }, "widget-borderColor": { "value": "#ffffff", "edited": false }, "base-font": { "value": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif" } }, "angularTheme": { "primary": "indigo", "accents": "blue", "warn": "red", "background": "grey", "palette": "light" } }, "site": { "name": "Node-RED Dashboard", "hideToolbar": "false", "allowSwipe": "false", "lockMenu": "false", "allowTempTheme": "true", "dateFormat": "DD/MM/YYYY", "sizes": { "sx": 48, "sy": 48, "gx": 6, "gy": 6, "cx": 6, "cy": 6, "px": 0, "py": 0 } } }, { "id": "741c6c55.0d1bd4", "type": "mqtt in", "z": "7042507f.0ab0b", "name": "button/1", "topic": "example1/button/1", "qos": "0", "datatype": "auto-detect", "broker": "f5279b01.b328d8", "nl": false, "rap": false, "inputs": 0, "x": 280, "y": 320, "wires": [ [ "cf9f3773.2f3578"
ANEXO B 44 44 ] ] }, { "id": "cf9f3773.2f3578", "type": "debug", "z": "7042507f.0ab0b", "name": "", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "statusVal": "", "statusType": "auto", "x": 510, "y": 400, "wires": [] }, { "id": "a7192ce2.ef2cb", "type": "mqtt out", "z": "7042507f.0ab0b", "name": "button/1", "topic": "example1/button/1", "qos": "0", "retain": "false", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "f5279b01.b328d8", "x": 280, "y": 260, "wires": [] }, { "id": "9321eaae.4175f8", "type": "inject", "z": "7042507f.0ab0b", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "",
45 45 Red de sensores para la detección de agua en vehículos autónomos de superficie "payload": "true", "payloadType": "bool", "x": 150, "y": 260, "wires": [ [ "a7192ce2.ef2cb" ] ] }, { "id": "2b6e7991f6704f73", "type": "mqtt in", "z": "7042507f.0ab0b", "name": "SENSOR_HUMEDAD", "topic": "/barco/humedad", "qos": "2", "datatype": "auto-detect", "broker": "f5279b01.b328d8", "nl": false, "rap": true, "rh": 0, "inputs": 0, "x": 240, "y": 400, "wires": [ [ "cf9f3773.2f3578" ] ] } ]