Meshtastic: El módulo Detection Sensor

¿Sabés cómo funciona el módulo Detection Sensor de Meshtastic? En este artículo analizo en profundidad esta funcionalidad incluida en el firmware estándar, que permite monitorear los pines GPIO de un nodo y enviar mensajes de alerta o de estado según su nivel lógico o sus cambios de estado.

Introducción

Meshtastic es una plataforma basada en LoRa sobre la que se pueden montar redes de comunicaciones independientes de otros servicios como los de Internet o telefonía celular. En los últimos años se ha hecho muy popular en todo el mundo, permitiendo la creación de redes comunitarias que brindan servicios básicos de comunicaciones en puntos remotos o que funcionan como alternativas a las redes comerciales en situaciones de emergencia.

Si bien es cierto que su aplicación fundamental es la de permitir el intercambio de mensajes cortos de texto, así como datos de posición GPS; como complemento también incorpora funciones básicas de telemetría, habilitando la transmisión de datos de sensores.

Para esto el firmware de Meshtastic incluye dos módulos especializados: Telemetry y Detection Sensor. En este tutorial describo en detalle el funcionamiento y las aplicaciones de este último, explicando cómo funciona y cómo configurarlo para que aproveches al máximo su potencial en tus propios proyectos.

El módulo Detection Sensor

Este módulo, incluido en el firmware oficial de Meshtastic, se encarga de monitorear el estado de los pines GPIO del hardware del nodo y enviar un mensaje a la malla cuando se cumplen determinadas condiciones configuradas.

El módulo trabaja únicamente con señales discretas en los pines GPIO: interpreta su estado (ALTO/BAJO, ON/OFF) y, si corresponde, sus cambios de estado (ALTO a BAJO o viceversa). No sirve para leer sensores que devuelvan un valor proporcional a una variable física, como puede ser un BMP280; esa es precisamente la función del otro módulo: Telemetry.

Entre sus aplicaciones típicas se incluyen: reportar movimiento detectado por un sensor PIR, informar la apertura/cierre de una puerta, notificar la activación de una alarma, indicar presencia o ausencia de la tensión de red eléctrica o avisar que una reserva de agua cayó por debajo de un umbral crítico. En todos los casos se trata de condiciones binarias, con solo dos estados posibles.

Características y aplicaciones del módulo Detection Sensor

Pines y conexiones

Para utilizar el módulo Detection Sensor se debe conectar el sensor a monitorear a un pin GPIO libre en la placa que se esté usando como nodo.

Ten en cuenta que los pines disponibles varían según la placa que uses. En este tutorial, todos los ejemplos se basan en el Kit Meshtastic para ESP32-S3 de Seeed Studio.

Este kit está compuesto por un XIAO ESP32-S3 y un módulo LoRa basado en el SX1262, que se monta sobre el XIAO y se conecta mediante el conector B2B.

Para su funcionamiento y control, el módulo LoRa utiliza muchos de los pines del XIAO, por lo que solo quedan tres pines libres para uso general: D5, D6 y D7.

En la siguiente imagen puedes ver la distribución de pines del módulo SX1262 y el uso de cada uno de ellos. Los pines marcados en verde son los que quedan libres y pueden usarse en combinación con el módulo Detection Sensor.

Pines libres en el kit Meshtastic para ESP32-S3 de Seeed Studio

Configuración del módulo

Una vez definido el pin donde se conectará el sensor a monitorear, hay que configurar el módulo indicando el numero de pin correspondiente, bajo qué condiciones se enviará el mensaje de alerta y cada cuanto tiempo, entre otros parámetros.

En la imagen de más abajo puede verse la pantalla de configuración en la app de Android para un nodo que corre la versión de firmware 2.7.26, aunque el procedimiento es el mismo en versiones anteriores.

Se accede a esta pantalla entrando a la configuración del nodo y seleccionando luego Configuración de módulo → Sensor de presencia.

Revisemos cada uno de los parámetros a configurar:

Pantalla de configuración
  • Sensor detector activado: activa y desactiva el funcionamiento del módulo.
  • Tiempo mínimo de transmisión (segundos): Es el tiempo mínimo entre dos alertas de activación.
  • Período entre transmisión de estado (segundos): Tiempo entre dos reportes de estado. El reporte de estado se envía periódicamente aunque el pin configurado no se active.
  • Mandar la campana con el mensaje de alerta: Permite manda el carácter de campana, además de un mensaje de texto como alerta. Esto permite activar la función External Notification en el extremo receptor para activar un aviso complementario.
  • Mote: Desafortunada traducción de «Friendly Name». Es el texto que se envía en el mensaje de alerta, seguido de la palabra «detected».
  • Pin GPIO para monitorizar: Pin que dispara el alerta. Debe especificarse el numero GPIO. En la placa para el XIAO ESP32 que uso de ejemplo, a D5 le corresponde el número 6, a D6 el 43 y a D7 el 44.
  • Tipo de detección para activar: Estado o cambio en el pin que dispara el alerta.
  • Utilizar el modo de entrada PULL_UP: Activa o no el pull_up interno en el pin GPIO seleccionado.

Cuando está activado, el módulo Detection Sensor puede enviar dos tipos de mensajes diferentes: Alerta de detección y Estado. El alerta de detección se envía cuando se detecta que el pin monitoreado esta ACTIVO, criterio que depende de la configuración y que analizaremos mas detenidamente a continuación. El mensaje de Estado en cambio se envía de manera periódica, aunque el pin no se active, sirviendo como una actualización de su condición.

La activación y configuración del módulo debe realizarse sólo en el nodo que tiene el sensor conectado. No es necesaria ninguna configuración en los nodos que van a funcionar como receptores.

Alerta de Detección

Este mensaje se envía cuando el pin seleccionado se activa, lo que significa que cumple con el criterio establecido en el parámetro Tipo de detección para activar. Este parámetro puede tener uno de los siguientes valores.

Los dos últimos son casos especiales en los que se envían los dos mensajes: Alerta de detección cuando el pin se activa y Estado cuando se desactiva.

Veamos con más detalle cada una de estas condiciones.

Logic low

Si se selecciona este criterio, el pin se vuelve ACTIVO cuando se detecta que tiene un nivel BAJO (LOW).

Se puede entender fácilmente el funcionamiento observando la imagen de abajo. En el punto 1, el pin se pone ACTIVO, porque esté en estado BAJO. Esto hace que se envíe el mensaje de alerta y se comience a contar el Tiempo mínimo de transmisión, que es otro parámetro de la configuración del módulo.

Si al terminar este tiempo, el pin sigue activo, como en el punto 2, se vuelve a enviar el Alerta.

Se puede comprender aquí la importancia del Tiempo mínimo de transmisión. Si no existiera, se estarían enviando mensajes de alerta constantemente, saturando el canal de radio.

Si el pin se hace activo nuevamente como en el punto 3, pero el tiempo mínimo no se ha cumplido, se ignora esta condición.

Finalmente, si se acaba el tiempo pero el pin ya no está activo porque volvió al estado ALTO o HIGH, tampoco se envía el alerta (4).

Un ejemplo de aplicación de este modo podría ser un detector de tensión de red eléctrica: se dispara un alerta cuando la tensión cae y el alerta se repite de manera periódica según el valor de tiempo mínimo de transmisión. Si la tensión se recupera, cesa el alerta.

El tiempo mínimo también cumple de alguna manera la función de filtro antirrebote: un sensor mecánico puede producir un tren de impulsos como consecuencia del rebote de sus contactos. Este tiempo de guarda evita que se envíe un alerta en cada uno de esos impulsos.

Logic High

Este criterio tiene un funcionamiento similar al anterior, pero con la lógica invertida:

Si el pin se vuelve activo por pasar al estado ALTO o HIGH (1) se dispara el mensaje de alerta y se empieza a contar el tiempo mínimo, como antes.

Si al expirar ese tiempo el pin sigue activo (2) se vuelve a enviar el alerta, pero si el pin se activa antes de que el tiempo termine (3), el alerta no se envía. Si al terminar el tiempo (4) el pin ya no está activo, el alerta tampoco es enviado.

Una aplicación de este criterio podría ser la de un circuito detector de temperatura máxima, que funciona con un sensor de temperatura y un comparador que pone en ALTO su salida si la temperatura medida es superior a un determinado valor y en BAJO en caso contrario.

Usando este criterio, se enviarían mensajes de alerta cuando se sobrepasa el límite y mientras se mantenga esa condición, deteniéndose cuando la temperatura baje.

Falling Edge

Este criterio determina que el pin se hace activo cuando pasa del nivel ALTO al nivel BAJO, es decir, cuando presenta un flanco descendente.

Esto se puede apreciar en la siguiente imagen. En (1) el pin se vuelve activo porque se detecta un flanco de bajada, lo que dispara el mensaje de alerta y el tiempo mínimo. En (2) el flanco se repite, pero como el tiempo mínimo no se ha cumplido, se lo ignora. En (3), luego de cumplirse el tiempo, el pin está en LOW, pero no está activo y por lo tanto no se manda el alerta. En (4) se vuelve a activar por otro flanco descendente y se envía el alerta.

Si usamos este criterio en el ejemplo anterior del detector de corte de tensión de red, se enviaría un alerta cuando la tensión cae y si no hay cambios, ningún otro. Si usamos sólo el mensaje de alerta como indicador, sabríamos cuando cae la tensión pero no cuando se restablece.

Rising edge

Este criterio es complementario del anterior.

Si el pin se vuelve activo porque sube de BAJO a ALTO (1), se dispara el mensaje de alerta y el tiempo mínimo. Si se vuelve a activar pero el tiempo no se cumplió (2), el alerta no se envía. Si al completarse el tiempo el pin está en estado alto (3), no se envía el alerta porque no se considera que el pin esté activo. Pero si se produce otro flanco de subida (4), si se produce activación y por lo tanto se dispara otra alerta nueva.

Si se usa este criterio con el comparador de temperaturas, se enviaría un alerta al sobrepasarse el nivel superior y luego ninguna otra, aunque la temperatura vuelve a su estado normal.

Either edge active Low

Este criterio es algo mas complejo, ya que combina detección de flanco y de estado y envía tanto el alerta de detección como el mensaje de estado.

La figura muestra su funcionamiento. Por simplicidad no he agregado el tiempo mínimo, pero también actúa aquí como en los casos anteriores.

En este caso el nivel  activo es LOW. Si se detecta un cambio que active el pin (1) se envía en alerta de detección, y si se detecta el fin de la activación porque vuelve al estado inactivo (HIGH), se envía un mensaje de Estado.

La diferencia de este modo de trabajo con los anteriores es que se envía un mensaje cuando el pin se hace activo y otro cuando se desactiva.

Aplicado al detector de tensión, avisa cuando la tensión cae y también cuando vuelve (aunque con mensajes de naturaleza diferentes).

Either edge active High

Para finalizar, este es el opuesto al anterior. Se envía el alerta de detección cuando el pin se activa (esto significa que cambia de BAJO a ALTO) (1) y luego se envía el mensaje de estado cuando el pin vuelve al estado inactivo BAJO (2).

Aplicado a nuestro ejemplo del sensor de temperaturas, usando este criterio recibiriamos el alerta cuando la temperatura comienza a ser excesiva y luego el mensaje de estado cuando esta situación finaliza y la temperatura baja por debajo del valor crítico.

Mensaje de estado

Independientemente del alerta de activación, el módulo detection Sensor también puede enviar de forma periódica una actualización con el estado del pin seleccionado.

Si en la configuración se establece un valor distinto de cero en el parámetro Período entre transmisión de estado, se enviará un mensaje con el siguiente texto:

  • state: 0 (pin inactivo)
  • state: 1 (pin activo)

Este valor 0 o 1 no representa el valor lógico del pin, sino que indica si está activo o inactivo. El significado de activo/desactivo depende la condición especificada en Tipo de detección para activar:

Así, por ejemplo, si la condición configurada es LOGIC_LOW y cuando llega el momento de enviar el mensaje de estado el pin seleccionado está en BAJO, se envía State: 1, porque el pin esta ACTIVO.

Canales

Algo muy importante es que tanto el Alerta de activación como el mensaje de Estado, al igual que otra telemetría que envía automáticamente el nodo, se envía unicamente por el canal primario o canal 0. Y como mecanismo de protección, para no enviar una multitud de mensajes por este canal que suele ser canal público, el firmware no transmite si este canal no tiene una clave PSK.

Esto implica que tanto en el nodo transmisor (el que tiene el sensor conectado) como en el nodo receptor (o nodos receptores) se debe crear un canal primario con un nombre a elección como Sensores o Telemetría y definir una clave PSK que será compartida entre todos ellos.

Al cambiar el nombre del canal primario, el firmware cambia automáticamente el slot de frecuencia y por lo tanto la frecuencia de transmisión. Revisar!

Se puede conservar un canal público (como LongFast) pero hay que definirlo en un canal secundario, como el canal 1 si no hay otro definido.

La siguiente imagen muestra un ejemplo de lo anterior, con dos canales definidos: Sensores (primario) y LongFast (secundario).

Configuración de los canales

Ejemplos

A continuación te muestro algunos ejemplos sencillos de aplicación del módulo Detection Sensor usando tanto el Alerta de activación como el Mensaje de estado.

Para todos los ejemplos utilicé la versión de firmware 2.7.26, instalada tanto en el transmisor (Kit Meshtastic para XIAO ESP32) como en el receptor (Wio Tracker L1 pro).

En las imágenes que ilustran los circuitos de cada uno de los ejemplos se ve solamente el módulo SX1262 que está montado sobre el XIAO ESP32. Si bien pareciera que las conexiones están hechas en este módulo, en realidad se hacen en los pines del XIAO que está debajo, como se puede apreciar en las fotografías.

Botón de emergencia

Este probablemente sea el ejemplo más simple: un botón o pulsador que dispara el Alerta de activación. Una aplicación práctica podría ser la de un pulsador de emergencia, ubicado en un lugar retirado como un parque o una reserva, sin otra cobertura que la de Meshtastic, que dispara un pedido de ayuda al ser presionado.

En la imagen de mas abajo pueden apreciarse el circuito y la configuración del módulo.

El pulsador está conectado entre el pin D5 (GPIO6) y GND. Al ser presionado, conecta el pin a masa introduciendo un valor BAJO.

En la configuración, está seleccionada la detección por nivel bajo (LOGIC_LOW) con el PULL_UP interno activado y un tiempo mínimo de transmisión de 15 segundos.

Si están correctamente configurados los canales, tanto de este nodo como del otro receptor, como vimos antes, al apretar el pulsador se envía el mensaje de activación. Si se mantiene el pulsador apretado, el alerta se repite cada 15 segundos.

Circuito, configuración y mensajes

Si presionas el pulsador luego de alimentar o reiniciar el nodo y no recibes el mensaje de alerta, no te preocupes. Espera aproximadamente un minuto y vuelve a intentarlo. Aparentemente luego de arrancar, el firmware inicializa el nodo, busca nodos cercanos y se ocupa de otras tareas antes de empezar a leer los pines.

En la imagen de arriba puede verse a la derecha el mensaje de alerta recibido en el nodo receptor. El mensaje consiste en el texto «Pulsador», tal como se ha configurado, más la palabra «detected» añadida por el firmware.

En la imagen de abajo puede verse el circuito montado para realizar pruebas.

Botón de emergencia

Detector de apertura de puerta

Imagina que quieres monitorear la apertura de una puerta en un sitio alejado, como puede ser un depósito o el obrador de una obra en construcción empleando Meshtastic. O que quieres complementar la seguridad de tu hogar con un nodo que envíe un alerta cuando se abre la puerta y estás ausente.

Esto puede lograrse con una variación del ejemplo anterior, reemplazando el pulsador por un sensor magnético de apertura de puerta.

El sensor magnético consta de un reed switch en la parte fija que tiene las conexiones y un imán en la otra. Cuando las dos partes están cerca (puerta cerrada) los contactos están cerrados y cuando se alejan porque la puerta se abre, los contactos también se abren.

Funcionamiento del sensor magnético de puerta

Activando el PULL_UP en la entrada GPIO del nodo, si la puerta está cerrada el pin D5 (GPIO6) está conectado a GND (nivel bajo) a través del sensor y si la puerta se abre, pasa a nivel ALTO.

Este cambio de estado, de BAJO a ALTO se denomina «flanco ascendente», así que para este ejemplo, la lógica de detección en la configuración del módulo será RISING_EDGE.  El resto queda sin cambios.

Cuando la puerta se abre, se envía un único alerta que no se repite, porque lo dispara solamente el cambio de estado.

Circuito, configuración y mensajes

En la siguiente imagen se pueden apreciar las conexiones del sensor a la placa.

Detector de apertura de puerta

Sensor de nivel de tanque

Otra posible aplicación es la de enviar un alerta cuando un depósito o tanque de agua ha alcanzado un nivel determinado. Por ejemplo cuando está totalmente lleno o cuando se ha vaciado hasta un nivel crítico.

La detección del nivel de agua puede hacerse por distintos medios. Una muy simple es usar un sensor como el XKC-Y25. Este es un sensor capacitivo capaz de detectar distintos tipos de líquidos (no sólo agua) contenidos en recipientes plásticos o de vidrio desde el exterior, sin entrar en contacto con el líquido.

El sensor está disponible en distintas variantes, la que usé para estas pruebas tiene un transistor PNP en su salida.

El circuito de aplicación puede verse mas abajo. El sensor se alimenta con 5V y GND. Cuando está al frente de un líquido se activa, uniendo su salida con 5V a través del transistor PNP interno. Para no dañar al ESP32 con esta tensión, las resistencias de 10K funcionan como un divisor resistivo disminuyendo el valor a unos 3,3 Voltios.

Entonces el sensor activa la salida (nivel ALTO) cuando detecta agua y la desactiva (nivel BAJO) cuando no detecta agua.

Si queremos que el nodo avise cuando el agua descienda por debajo de un determinado nivel, el alerta deberá activarse cuando la salida del sensor pase a BAJO. El módulo podría configurarse entonces para detectar una condición LOGIC_LOW o el cambio de ALTO a BAJO (FALLING_EDGE).

Para probar algo diferente, la opción seleccionada es EITHER_EDGE_ACTIVE_LOW, que envía un alerta cuando el pin pasa a BAJO y luego un mensaje de estado cuando vuelve a ALTO. De esta manera avisa cuando el agua ha descendido demasiado pero también cuando ha recuperado su nivel.

Configuración y mensajes

Como puede verse arriba, llega «Nivel bajo detected» cuando el agua bajó del nivel mínimo y luego «Nivel bajo state: 0» cuando vuelve a subir. En este caso «state: 0» no significa que la entrada esté en nivel BAJO (0) sino que está INACTIVA, que en este caso significa que tiene un NIVEL ALTO.

A continuación puedes ver el circuito armado

Circuito del sensor de nivel de tanque

La variante del sensor que tiene un transistor NPN a la salida no requiere de resistencias, ya que al activarse conecta la entrada (que debe tener el PULL_UP activo) a GND, produciendo un flanco de bajada (FALLING EDGE).

Sensor de nivel con flotante

Para terminar con estos ejemplos, en este último caso te muestro un circuito que cumple la misma función que el anterior, pero en vez de usar el sensor capacitivo usa un flotante.

Hay distintos tipos de flotantes. El que usé yo tiene en su interior un interruptor con dos salidas, una normal abierto (NA) y la otra normal cerrado (NC). Una pequeña bola de acero en su interior se mueve al modificarse el nivel del agua cambiando el estado del interruptor.

Flotante para tanque de agua

Para este circuito usaré el contacto normal cerrado del flotante, que se conecta al exterior a través de los cables Azul y Marrón. Según la posición en la que se ubique el flotante dentro del tanque, indicará si está por sobre o por debajo de un nivel considerado crítico.

Con estas conexiones, el funcionamiento del flotante es el siguiente:

  • Tanque por sobre el nivel crítico -> Interruptor abierto
  • Tanque por debajo del nivel crítico -> Interruptor cerrado

La forma mas sencilla de conectarlo al ESP32 es como se ve en la siguiente imagen. De esta forma, cuando el tanque está lleno, el pin D5 queda conectado a un nivel ALTO a través del PULL_UP interno y al vaciarse, el pin queda conectado a GND, introduciendo un nivel BAJO.

Conexiones del flotante

Para explorar otra opción dentro del módulo Detection Sensor, en este caso no configuré el alerta de detección sino que usé el mensaje de estado, con el período mínimo, que es de 15 minutos.

El tiempo mínimo del alerta quedo sin configurar y la lógica de activación, aunque no se use, la configuré en LOGIC_LOW.

Con esta configuración, cada 15 minutos se actualiza el estado del pin D5, sin importar como cambie su valor.

El valor reportado en el mensaje de estado no es directamente el valor lógico del pin sino un indicador de actividad, como ya dije antes. Como la lógica configurada es LOGIC_LOW, éste es el estado ACTIVO. Por lo tanto, «State: 1» significa que está activo (pin en estado BAJO) y «State: 0» que está inactivo (pin en estado ALTO). En resumen, tal como está conectado el flotante, «State: 0» significa que el tanque de agua está por sobre el nivel crítico y «State: 1», que está por debajo de ese nivel.

Configuración y mensajes

En la imagen anterior se puede ver a la derecha el comportamiento del circuito: primero por sobre el nivel crítico (state: 0), luego por debajo (state: 1) y en la última lectura otra vez por arriba. Cada lectura se hizo cada 15 minutos.

Los ejemplos anteriores intentan demostrar algunas aplicaciones prácticas y distintas opciones de configuración del módulo Detection Sensor. Seguramente se te ocurrirán muchas mas, con distintos tipos de sensores.

Un punto a destacar es que recibir mensajes de alerta o de estado en un equipo móvil o en la app del teléfono no es la forma mas cómoda de monitorear el estado de un sensor y mucho menos si se trata de un conjunto de varios sensores.

Afortunadamente, no es complicado extraer estos mensajes de la malla para procesarlos y representarlos de una forma mas gráfica. Por ejemplo, puede usarse Node-RED o un script de Python corriendo en una Raspberry o una PC conectada a un nodo para mostrar datos de múltiples sensores en un dashboard o panel y así tener una visualización más rápida y cómoda.

Conclusiones

El módulo Detection Sensor amplía considerablemente las posibilidades de Meshtastic, permitiendo convertir un nodo en un sencillo sistema de monitoreo remoto. Configurando adecuadamente los distintos párametros del módulo es posible implementar distintas aplicaciones usando sensores de tipo ON/OFF, como pulsadores, sensores de apertura de puerta o sensores de nivel de agua. A pesar de esta limitación, su integración dentro del firmware standar permite desarrollar soluciones simples y económicas aprovechando la infraestructura de una red ya instalada.

Espero que este artículo te haya sido de utilidad y te sirva como referencia para crear tus propias aplicaciones. Como siempre, puedes dejar tus comentarios y consultas más abajo.

Hasta la próxima! 🚀

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.