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.
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
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é.
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.
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.
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.
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é.
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
.
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
.
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.
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.
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 garde | Raspberry Pi | |
RST1 | connexion RUN | n'est pas polarisé |
RST2 | connexion RUN | |
HD- | broche GPIO XX | inverser la connexion si la DEL entre le connecteur et le relais clignote |
HD+ | broche masse |
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é.