Sistema de “perro guardian” para Raspberry Pi

En esta nota nos basaremos en un hardware desarrollado por OMZLO de un sistema de perro guardián para Raspbery Pi. Nos pareció importante generar conciencia en la inclusión en los diseños de este tipo de circuitos que permiten dar estabilidad a los sistemas de control.  La combinación de operatorias repetitivas de software y un hardware de reinicio en caso de que estas no ocurran permiten sacar de una situación de parada de funcionamiento indeseada al sistema para reiniciarlo automáticamente.

¿Qué es un sistema de “perro guardian” o watchdog?

Este sistema consiste en un temporizador de hardware que si no es detenido genera el reinicio del sistema. Por consiguiente el software debe periódicamente y dentro de un tiempo máximo acceder a dicho temporizador para reiniciarlo y evitar así que llegue a su final de cuenta el microcontrolador reciba una entrada de reset.

Este tipo de sistemas es esencial cuando se requiere que el sistema no salga de funcionamiento ante una falla temporal de software o hardware. Este tipo de fallas puede ocurrir por ejemplo cuando la instalación o el medio que rodea al sistema pueda producir interferencias en su funcionamiento. Estas pueden deberse a interferencias electromagnéticas o eléctricas tanto sea en los circuitos de tierra como de alimentación. Recomendamos leer la nota: “Instalaciones de sistemas electrónicos y de telecomunicaciones en forma responsable” de la revista TECNOLOGIA HUMANIZADA número 2 del año 2019. Un desarrollo seguro y responsable desde el punto de vista de seguridad de su funcionamiento y situación de control de las variables físicas con que interaccionen, debe incluir un hardware y rutinas de software de timer de control o watch dog.

Las normas de seguridad internacionales como la IEC 60730-1 obligan a la implementación de estos sistemas de supervisión automática. Hay microcontroladores que incluyen ya en su diseño interno sistemas de supervisión perro guardián, pero lo conveniente es utilizar un sistema externo, con un capacitor y una resistencia. De esta manera se genera una temporización totalmente independiente del microcontrolador.

El software a desarrollarse periódicamente deberá resetear este temporizador, para que no restablezca el sistema. Algo así como que el software no se reporta al control periódicamente el sistema se reinicia volviendo a su funcionamiento estable.

Algunos de los sistemas que implementan este tipo de control de seguridad son los controladores de vehículos, los controladores de encendido de hornos, sistemas aeroespaciales, sistemas de alarma, etc…

Perro guardian para Raspberry Pi.

PiWatcher es una tarjeat electrónica muy pequeña que le ayudará a apagar o reiniciar completamente una Raspberry Pi, en caso de un incidente o simplemente para ahorrar energía. Incluso puede programar su PiWatcher para que se apague y reinicie automáticamente su Rasberry Pi unos minutos u horas más tarde. En esencia, el PiWatcher es un circuito de vigilancia programable para el Raspberry Pi, que se puede utilizar con el sencillo Pi Zero hasta el Pi 3. La nueva versión lanzada en enero de 2020 también funciona con el Raspberry Pi 4.

La placa debe instalarse en los primeros 6 pines del encabezado Raspberry GPIO y enchufarse a una fuente de alimentación micro USB que sea adecuada para la Raspberry Pi en uso. Luego, la placa encenderá o apagará la energía proporcionada a la Raspberry Pi según las instrucciones que recibe a través de I2C. El tablero también cuenta con un interruptor táctil en miniatura para permitir su control manual.

Esquema del circuito de perro guardian para Raspberry pi

Una solución para la administración de energía de Raspberry Pi

El PiWatcher está diseñado para resolver dos problemas con la administración de energía de un Raspberry Pi.

Primero, si apaga un Raspberry Pi a través del software, por ejemplo, emitiendo un comando shutdowno halt, el Raspberry Pi dejará de funcionar, pero no se apaga por completo. Entra en un estado de reposo donde continúa consumiendo de 30 a 50 mA, o a veces más dependiendo de los periféricos conectados. Esto es un desperdicio y puede convertirse en un problema en los sistemas alimentados con baterías.

El PiWatcher se puede programar para cortar completamente la energía a la Raspberry Pi después de un cierto retraso de inactividad. Por ejemplo, puede decirle al PiWatcher que corte la energía 10 segundos después de que shutdownse haya emitido un comando, dándole al Raspberry Pi suficiente tiempo para apagarse limpiamente.

El segundo problema con la administración de energía tiene que ver con la capacidad de recuperarse de situaciones en las que un Raspberry Pi se cuelga en un lazo irrecuperable. Si bien, en teoría, esto no debería suceder, una Raspberry Pi de larga duración puede «colgarse» o «congelarse», debido a fallas de software o hardware o incluso factores ambientales como el calor e interferencias. En algunos casos, el enfoque menos insatisfactorio para tratar este problema es simplemente apagar y volver a encender la Raspberry Pi, permitiendo que la aplicación continúe y / o envíe una alerta.

El PiWatcher se puede programar para encender y apagar automáticamente un Raspberry Pi si no recibe un «latido» del dispositivo después de un retraso seleccionable por el usuario. Esto puede permitir que algunas aplicaciones críticas continúen funcionando sin intervención humana.

Además, el PiWatcher se puede programar para que «duerma» durante un cierto tiempo después del apagado, desde unos pocos segundos hasta aproximadamente 36 horas, antes de reiniciar la Raspberry Pi.

La siguiente tabla resume el consumo de energía de un PiWatcher conectado a un Raspberry Pi (las mediciones se realizaron con un Pi Zero W).

Situación Consumo actual
PiWatcher se ejecuta normalmente 7 mA además del consumo de energía de la Raspberry Pi (generalmente> 130 mA).
PiWatcher está «durmiendo» hasta que se reinicie 3mA
PiWatcher se ha apagado por completo > 0.5mA

El PiWatcher tiene un LED. Cuando se enciende la Raspberry Pi, el LED estará encendido continuamente. Cuando el Raspberry Pi está «durmiendo» por un cierto tiempo, el LED parpadeará lentamente. Cuando la Raspberry Pi está apagada, el LED permanece apagado.

El PiWatcher también tiene un micro interruptor táctil :

  • Cuando su Raspberry Pi se está ejecutando:
    • Una pulsación larga (5 segundos) en el botón, seguida de una liberación del botón, apagará completamente la Raspberry Pi.
    • Una pulsación breve (medio segundo) sobre el botón enviará una señal de software que puede ser explotada para fines definidos por el usuario.
  • Cuando su Raspberry Pi se apaga, presionar brevemente el botón reiniciará la Raspberry Pi.

Usando el PiWatcher

Preparar

Para comenzar a usar PiWatcher, siga estos pasos.

Conecte el PiWatcher en los primeros 6 pines del encabezado GPIO Raspberry-Pi. Para una mayor estabilidad mecánica, se recomienda asegurar el PiWatcher al Pi con una separación estándar de 11 mm (2.5 mm).

Luego, conecte la fuente de alimentación USB al PiWatcher. A su vez, esto iniciará la Raspberry Pi.

Para usar PiWatcher en Raspberry Pi, deberá habilitar I2C en Raspberry Pi. Úselo sudo raspi-configpara este propósito.

Descargue la piwatcherherramienta de línea de comando:

wget -N http://omzlo.com/downloads/piwatcher

Deberá asegurarse de que el archivo sea ejecutable y de que esté ubicado en un directorio incluido en su RUTA (por ejemplo, /usr/local/binen un sistema Raspbian).

chmod a + x piwatchersudo mv piwatcher / usr / local / bin /

La piwatcherherramienta se puede utilizar para consultar y configurar PiWatcher.

Escribir piwatcher statusdebe volver:

OK 0x00

Si presiona el microinterruptor en PiWatcher y luego vuelve a ejecutarlo piwatcher status, debería ver el siguiente resultado:

OK 0x80 button_pressed

Puede borrar este evento button_press, restableciendo el estado del PiWatcher ejecutando piwatcher reset. Volver a ejecutar piwatcher statusmostrará nuevamente el estado 0x00.

Perro guardián

Ahora programaremos el PiWatcher para que apague el Raspberry-Pi después de 30 segundos si no recibe ningún mensaje del Raspberry Pi, con el comando piwatcher watch 30.

Después de que se haya emitido este comando, PiWatcher iniciará un contador de 30 segundos. Si el contador llega a 0, se cortará la alimentación de la Raspberry Pi. Sin embargo, este contador se restablecerá a 30 segundos cada vez que el PiWatcher reciba una ‘solicitud de lectura’ del Raspberry Pi. Una manera simple de emitir una ‘solicitud de lectura’ es emitir el comando piwatcher status.

En este ejemplo, una manera simple de mantener el formulario Raspberry-Pi cerrándose sería ejecutar el siguiente ciclo:

while true
do 
   piwatcher status
   sleep 25
done

El sleep 25 asegura que se llame al PiWatcher aproximadamente cada 25 segundos, tomando un margen de seguridad de 5 segundos desde nuestra fecha límite de 30 segundos. Si este bucle se interrumpe por algún motivo, el Raspberry-Pi se reiniciará después de 30 segundos como máximo.

Esta característica se puede explotar para apagar completamente un RaspberryPi después de un apagado. Suponiendo que el Pi tarda como máximo 15 segundos en apagarse, podemos emitir los siguientes comandos:

piwatcher wake 600

Reinicio automatizado

Por defecto, el PiWatcher apagará la Raspberry Pi hasta que el usuario presione el botón o hasta que se encienda el USB.

Podemos programar el PiWatcher para «despertar» el Raspberry Pi después de un cierto retraso (expresado en segundos).

Para reiniciar la Raspberry-Pi 10 minutos después del apagado, simplemente tecleamos:

Piwatcher wake 600

Un reloj debajo del capó

El PiWatcher se basa en un microcontrolador Microchip attiny45 de 8 bits, que funciona con un oscilador interno de 8Mhz.

Un reloj interno marca aproximadamente 25.04 veces por segundo (8.000.000 / (8192 * 39)). Los valores de vigilancia y tiempo de reinicio se convierten en tics de reloj internos al multiplicar su valor por 25. Debido a las variaciones de temperatura y voltaje, la precisión de estos tiempos puede estar desactivada en +/- 10%.

Puede ver el valor real del reloj emitiendo el comando piwatcher ticks.

Ejecutar piwatcher automáticamente

En la mayoría de los casos, no desea escribir comandos piwatchercada vez que se inicia su Raspberry Pi. En su lugar, querrá ejecutar PiWatcher automáticamente cada vez que se inicie Raspberry Pi, con la configuración correcta. Afortunadamente, esto es bastante fácil gracias a systemd .

Como ejemplo, consideraremos el caso en el que desea que la Raspberry-Pi se apague completamente automáticamente después de 30 segundos de inactividad, ya sea porque la detuvo o porque se « atascó ».

Para simplificar, asumiremos que está ejecutando una versión reciente de Raspbian Linux y que ha instalado el piwatcherbinario en el directorio /usr/local/bin/.

Se requieren 3 pasos para implementar nuestro escenario.

PASO 1. Cree un script de monitoreo

Use su editor favorito para crear el archivo /home/pi/piwatcher.shcon el siguiente contenido.

#!/bin/bash

/usr/local/bin/piwatcher watch 30

while true;
do
    /usr/local/bin/piwatcher status >> /dev/null
    sleep 15
done

Esto esencialmente establecerá un perro guardián de 30 segundos y comenzará un ciclo infinito que envía un mensaje al observador cada 15 segundos para asegurar que el perro guardián no se active.

Necesitamos hacer que este script sea ejecutable de la siguiente manera.

chmod a + x /home/pi/piwatcher.sh

PASO 2: cree un nuevo servicio systemd

Ahora crearemos un servicio systemd para el script creado anteriormente. Como necesitamos ‘permiso de root’ para crear el script, usaremos sudo:

sudo vim /etc/systemd/system/piwatcher.service

Puede reemplazar vimcon nanoo su editor favorito en la línea de arriba.

El contenido del archivo debe verse de la siguiente manera.

[Unit]
Description=PiWatcher Service
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=1
User=pi
ExecStart=/home/pi/piwatcher.sh

[Install]
WantedBy=multi-user.target

PASO 3: active e inicie el servicio

Finalmente, activaremos el servicio.

sudo systemctl enable piwatcher

Esto normalmente generará el siguiente mensaje: » Enlace simbólico creado /etc/systemd/system/multi-user.target.wants/piwatcher.service → /etc/systemd/system/piwatcher.service » .

También iniciaremos el servicio de la siguiente manera.

sudo systemctl start piwatcher

La activación (y el inicio) solo deben realizarse una vez. Piwatcher ahora se iniciará automáticamente cada vez que la máquina se inicie.

Configuración I2C

El PiWatcher utiliza un protocolo de comunicación muy sencilla basada en I2C. La placa esencialmente presenta una matriz de registro de 8 bytes que puede leer o escribir, en la dirección I2C 0x62 .

Esta matriz de registros está estructurada de la siguiente manera:

Registrarse Descripción
0 0 Byte de estado
1 Tiempo de espera de vigilancia en segundos, 0 = deshabilitado.
2-3 Retraso de activación en segundos dividido por 2 (5 significa 10 segundos). LSB primero. 0 = deshabilitado.
4-7 Reloj interno. LSB primero.

El byte de estado tiene la siguiente estructura:

Posición Nombre Descripción
Bit 7 BUTTON_PRESSED Un 1 indica que se ha presionado el botón PiWatcher . Escribir un 1 borrará el bit.
Bit 6 TIMER_BOOT Un 1 significa que el PiWatcher reinició el Pi después de un período de activación . Escribir un 1 borrará el bit. Sin embargo, esto no es confiable ya que PiWatcher puede haberse reiniciado.
Bit 5 BUTTON_BOOT Un 1 significa que el PiWatcher reinició el Pi porque el usuario presionó el botón. Escribir un 1 borrará el bit. Sin embargo, esto no es confiable ya que PiWatcher puede haberse reiniciado.
Bit 4-0 no usado

El comando ./piwatcher dump el contenido sin formato de todos los registros.

El contenido de los registros también se puede manipular i2c-tools(consulte las instrucciones aquí, por ejemplo). Por ejemplo, puede obtener el byte de estado con el comando i2cget -y 1 0x62 0.


Fuentes:

Esta nota fue publicada gracias a la autorización de Alain Pannetrat for Omzlo.

 

TECNOLOGIA HUMANIZADA
Acerca de TECNOLOGIA HUMANIZADA 39 Artículos
TECNOLOGIA HUMANIZADA tu editorial de Tecnología desde un contexto Crítico y Humanista.

Sé el primero en comentar

Dejá un Comentario

Tu dirección de correo no será publicada.


*