2019-12-07
md
Chien de garde matériel pas cher pour le Raspberry Pi
<-Raspberry Pi and Domoticz Watchdog

Espérant améliorer la fiabilité de mon système de domotique, j'ai commandé deux types de chiens de garde matériels auprès de fournisseurs chinois sur eBay et AliExpress en début septembre. Deux colis sont arrivés environ quatre semaines plus tard. Un colis contenait deux soit disant chiens de garde USB pour plate-forme d'extraction de cryptomonnaie.

Comme c'est souvent le cas avec des articles provenant de l'Empire du Milieu, aucune instruction n'était incluse. Cependant la page Web du fournisseur contenait l'information suivante.

Voilà qui n'était pas très clair, car il n'y a ni fil blanc ni fil vert et il semble y avoir contradiction au sujet de la polarité de la connexion HD.

Un appel à l'aide lancé le 14 octobre sur un billet en anglais seulement n'a donné aucun résultat. Alors j'ai décidé de m'attaquer au problème avec les moyens du bord.

Première constatation: le connecteur USB ne sert qu'à l'alimentation du dispositif. En effet rien de nouveau n'était affiché avec la commande lsusb après avoir branché le chien de garde à l'ordinateur de bureau. Puis il a été possible de confirmer que les broches de données du connecteur USB n'étaient reliées à aucun composant sur la carte.

Dès lors, on comprend assez facilement le principe de fonctionnement du chien de garde. Le relais active le commutateur de réinitialisation de la carte mère d'un ordinateur lorsque l'indicateur d'accès au disque dur est silencieux pendant trop longtemps. Il reste a déterminer quel est ce délai d'inactivité et ce qui se passe à la mise sous tension. Puis il faut vérifier les caractéristiques électriques, car les composants du chien de garde fonctionnent à 5 volts alors qu'un Raspberry Pi fonctionne sur 3,3 volts.

J'ai vérifié que les contacts du relais étaient isolés du reste du circuit ce qui permettait de vérifier en toute sécurité l'activité du relai avec un Wemos D1. Quand HD+ HD1 ne sont pas connectés, il y a un délai de 2,5 minutes pendant lequel le relais est ouvert, puis il est fermé (les broches RST1 et RST2 sont court-circuitées) pendant une période de 9 secondes puis ouvert pendant 9 secondes. Ceci est répété 8 fois, puis le relais est ouvert pendant 2,5 minutes. Le tout se répète tant que le chien de garde n'est pas alimenté, c'est-à-dire tant qu'il n'y a pas de signal sur HD+ HD1. Le graphique est plus éloquent.

On note que le relais reste fermé tant que le chien de garde n'est pas sous tension, ce qui est, à mon avis, une erreur de conception.

Pour poursuivre les tests, J'ai récupéré un vieux Raspberry Pi de 2e génération du fond d'une boîte de rangement. Inutile de mettre en danger un Pi plus récent. En fait, la probabilité d'un incident avec conséquences fâcheuses semblait assez faible. Après l'installation de Raspbian Buster Lite et sa mise à jour, un environnement Python virtuel a été créé. Puis deux modules Python pour gérer les broches entrée/sortie du Raspberry Pi, RPi.GPIO (0.7.0) et gpiozero (1.5.1), ont été ajoutés à l'environnement avec pip. Un script Python très simple, nommé wdfeed.py émule un indicateur d'activité du disque dur de l'ordinateur.

pi@oldpi:~ $ ve .syspy (.syspy) pi@oldpi:~ $ cd .syspy (.syspy) pi@oldpi:~/.syspy $ pip install rpi.gpio ... Successfully installed rpi.gpio-0.7.0 WARNING: You are using pip version 19.3; however, version 19.3.1 is available. You should consider upgrading via the 'pip install --upgrade pip' command. (.syspy) pi@oldpi:~/.syspy $ pip install --upgrade pip ... Successfully uninstalled pip-19.3 Successfully installed pip-19.3.1 (.syspy) pi@oldpi:~/.syspy $ pip install gpiozero ... Successfully installed colorzero-1.1 gpiozero-1.5.1 (.syspy) pi@oldpi:~/.syspy $ nano wdfeed.py

Notez comment j'ai suivi consciencieusement les conseils pour mettre à jour pip avant procéder à l'installation du deuxième module. Ci-dessous le contenu de /home/woopi/.syspy/wdfeed.py

from gpiozero import LED from time import sleep led = LED(4) while True: led.on() sleep(0.1) led.off() sleep(0.1) led.on() sleep(0.1) led.off() sleep(1)

J'ai ensuite connecté HD+ du chien de garde à la broche 7 du connecteur de GPIO du Raspberry Pi GPIO (c'est-à-dire la broche BCM 4 ou GPIO4) et HD- à la broche 9 (la masse) du connecteur. Après avoir inséré la prise USB du chien de garde dans l'un des ports USB du Raspberry Pi, le script est lancé.

(.syspy) pi@oldpi:~/.syspy $ python wdfeed.py

Il était agréable de voir le double clignotement de la DEL rouge située entre le relais orange et le connecteur HDD LED. Plus tard, il était déconcertant d'entendre le déclic du relais signifiant que le chien de garde n'était pas "alimenté". Les instructions concernant la polarité reliant les broches d'activité du disque dur étaient ambiguës. En inversant la connexion, la DEL ne clignote plus, mais le relais est parfaitement silencieux. Cela a donc confirmé que le signal HIGH du Raspberry Pi, qui est nominalement de 3,3 volts, mais pourrait être aussi faible que 1,6 volt, a été correctement décodé par le chien de garde qui fonctionne à 5 volts. Il est temps de passer au vrai test.

La première étape consistait à ajouter une entrée dans les taches de cron pour lancer le script au démarrage.

pi@oldpi:~ $ sudo crontab -e

Il faut ajouter la ligne commençant avec @reboot pour commander à cron d'exécuter la commande qui suit à chaque démarrage du Raspberry Pi.

... # For more information see the manual pages of crontab(5) and cron(8) # # m h dom mon dow command @reboot /home/pi/.syspy/bin/python /home/pi/.syspy/wdfeed.py &

Il faut utiliser l'interpréteur Python de l'environnement virtuel pour exécuter le script, car le module gpiozero nécessaire au fonctionnement du script n'est pas installé dans Buster Lite (il peut être installé dans les versions de bureau de Raspbian Buster). Le & en fin de ligne, qui laisse le script s'exécuter en arrière-plan est nécessaire.

La deuxième étape requiert un peu de bricolage, car si une connexion de réinitialisation matérielle existe sur le Raspberry Pi, il faut y souder les plots. Après, rien de plus facile que de connecter les deux broches RST du chien de garde aux broches de réinitialisation du Raspberry Pi. Il n'y a pas de polarité à respecter, ce n'est qu'un interrupteur.

Pi with connected watchdog La flèche jaune pointe vers le connecteur de réinitialisation du Raspberry Pi.
Un capteur de crépuscule basé sur la photorésistance visible au-dessus du boîtier est également connecté.

La photographie montre le « chien de garde pour plate-forme minière de crypto-maonnaie » tirant son alimentation depuis le connecteur USB du Raspberry Pi modèle 1. Cela n'a pas fonctionné sur un modèle 3 B. Je suppose que le connecteur USB est alimenté durant la séquence de démarrage qui n'est jamais lancé parce que le relais est normalement fermé lorsque le chien de garde n'est pas alimenté. Par conséquent, le bouton RUN reste toujours court-circuité à la masse. Donc, le chien de garde matériel doit avoir une alimentation indépendante.

Après que le Raspberry Pi a été mis sous tension, le chien de garde lui a accordé amplement de temps pour terminer sa séquence de démarrage, y compris le démarrage du script wfeed.py afin que le chien de garde ne fasse rien. J'ai vérifié qu'il fonctionnait avec htop.

htop showing script

Le script n'utilise que 0,6% à 0,7% du temps processeur lors de l'écriture sur le port d'entrée pendant quelques millisecondes par seconde et 0% en mode veille.

Une « fork bomb » est un bon moyen de tester l'efficacité du chien de garde. Voici le script enregistré sous le nom forkbomb.sh.

#!/bin/bash swapoff -a :(){ :|:& };:

Pour voir ce qui se passe, htop a été laissé en marche dans une session ssh tandis que la "bombe" a été lancée dans une autre sesssion.

pi@oldpi:~ $ sudo bash forkbomb.sh

Presque immédiatement, htop s'est figé. Ensuite, la session au cours de laquelle forkbomb a été lancée ne répondait plus clavier puis finalement la connexion a été interrompue.

pi@oldpi:~ $ sudo bash forkbomb.sh pi@oldpi:~ $ pi@oldpi:~ $ pi@oldpi:~ $ pi@oldpi:~ $ packet_write_wait: Connection to 192.168.0.131 port 22: Broken pipe

Après quelques minutes, le chien de garde a commencé à fermer et ouvrir le relais et après un peu plus d'une minute, il a ouvert le relais assez longtemps en laissant suffisamment de temps (150 secondes) au Raspberry Pi, pour redémarrer et commencer à alimenter le chien de garde. Une réussite!.

En résumé, le chien de garde USB bon marché peut être utilisé avec un Raspberry Pi. Exécutez un script qui bascule la broche XX du GPIO toutes les secondes environ, puis connectez les quatre broches du chien de garde au Raspberry Pi comme indiqué ci-dessous.

Chien de gardeRaspberry Pi
RST1connexion RUNn'est pas polarisé
RST2connexion RUN
HD-broche GPIO XXinverser la connexion si la DEL entre le connecteur et le relais clignote
HD+broche masse
Sur les modèles plus anciens, le connecteur RUN ou P6 fournissait une broche connectée à la masse et une deuxième broche connectée à la broche RUN du système sur puce qui est tirée à 3,2 V par un diviseur de tension relié au bus de 5 V. Soyez prudent avec les nouveaux modèles 3B+ et 4 car les connexions des broches ont été modifiées. Selon le schéma du RPi 3B+, la broche 1 est connectée à l'entrée GLOBAL_EN du circuit intégré de gestion de l'alimentation XR77004 et la broche 2, étiquetée RUN, est connectée à PG2 de la même puce. Les deux sont tirées à environ 3,3 V, la broche 1 à travers un diviseur de tension relié à 5 V, la broche 2 à travers une résistance de 10 K connectée à 3,3 V. Je suppose que ces broches ne doivent pas être court-circuitées. Pour mettre à la terre la broche RUN, il sera nécessaire de connecter un fil à l'une des broches de terre sur l'en-tête GPIO. Le schéma du RPi 4 montre que le connecteur RUN a trois broches, la broche 1 est à nouveau étiquetée GLOBAL_EN, la broche 2 est mise à la terre et la broche 3 est étiquetée RUN_PG2. La note suivante apparaît à droite ** NOTE RUN IS 3V3, GLOBAL_EN IS 5V **. En effet, la connexion du GLOBAL_EN est tirée à 5 V via une résistance de 100 K ohms, mais elle pourrait être mise à la terre par un MOSFET contrôlé par le signal GLOBAL_RESET au sujet duquel je n'ai aucune information. Cependant, il semble que les broches 2 et 3 pourraient être utilisées directement comme décrit ici. Je n'ai vérifié rien de tout cela, car je ne possède ni l'un ni l'autre de ces modèles plus récents du Raspberry Pi. De plus, je n'ai aucune idée à quoi sert GLOBAL_EN et de son mérite relatif à l'entrée RUN_PG2. Pour plus d'informations, chercher "RUN reset header" dans le Forum Raspberry Pi.

Bien que ce dispositif fonctionne, il n'est pas parfait. Une réinitialisation matérielle pourrait corrompre la carte SD; c'est l'équivalent de couper brusquement l'alimentation puis de remettre rapidement le Raspberry Pi sous tension. Non seulement le chien de garde lance une réinitialisation matérielle sans d'abord tenter un redémarrage, il effectue environ huit réinitialisations avant de donner enfin au Raspberry Pi un temps suffisant pour démarrer.

Il y a un autre petit écueil. Si la commande shutdown ou quelque chose d'équivalent est lancé, on ne dispose que d'une minute ou deux pour couper manuellement l'alimentation du Raspberry Pi. Sinon, le chien de garde réinitialisera l'ordinateur et il redémarrera.

J'utiliserai cet appareil pour le moment seulement. Un autre retraité avec un penchant pour ce genre de choses avec qui j'ai le plaisir de correspondre envisage d'utiliser un Raspberry Pi Zero comme chien de garde. Je suis sûr qu'il sera en mesure de faire quelque chose de mieux avec des tentatives de redémarrage moins brutal avec reboot avant de recourir à une seule réinitialisation matérielle si rien d'autre ne fonctionne. J'utiliserai peut-être cette approche. En attendant, j'espère encore obtenir le deuxième type de chien commandé.

Il semble que ce type de chien de garde soit bien plus flexible, car il utilise véritablement la connexion USB, il peut être programmé et, avec deux relais, pourrait lancer un script avant de faire une réinitialisation matérielle (voir How to create your own usb watchdog script de David Gouveia).

Mon fournisseur s'est excusé d'avoir envoyé les objets suivants et a promis d'expédier les deux chiens de garde USB désirée. On verra, mais plus d'un mois s'est déjà écoulé.

<-Raspberry Pi and Domoticz Watchdog