Je viens vous présenter ma dernière réalisation (concoctée avec la précieuse aide du grand Ratanof, star de l'électronique qui marche bien) car je me dis que cela pourra servir à d'autres
Certains savent que j'ai rencontré récemment quelques problèmes qui font que mon bac aujourd'hui tire la tronche
Un de ces problèmes est que j'ai voulu aller plus loin dans l'aventure Arduino en intégrant le contrôle par réseau et par SMS.
Le gros soucis, c'est qu'en phase de test, je me suis rendu compte (en général quand je suis pas à la maison sinon c'est pas drôle
) qu'il est possible que l'Arduino plante, aléatoirement, sans raison. Après tests, debug du code, essais... impossible de trouver la cause de ces "freezes" qui peuvent survenir après quelques heures, ou alors après plusieurs jours
J'ai donc fait des recherches, et je me suis rendu compte que je n'étais pas tout seul, surtout avec la carte Ethernet WS5100. Trouvant dommage d'abandonner, j'ai cherché une parade et j'ai trouvé le fameux Watchdog (chien de garde).
Mais qu'est-ce que c'est que ce truc ?
C'est tout simplement un outil qui permet de surveiller si l'Arduino exécute bien son programme.
Comment ça marche ? 2 solutions:
- Soit on utilise celui qui est intégré à l'Arduino, mais je ne sais pas si ça fonctionne bien et la manip n'est pas forcément super simple (il faut flasher le bootloader avec un autre spécifique à l'aide d'un autre Aruino).
- Soit on se fait un petit montage qui, s'il ne reçoit pas d'info de l'Arduino, redémarre ce dernier.
J'ai choisis la seconde idée
Quel est le principe ?
Je demande à l'Arduino d'envoyer toutes les secondes, une impulsion (10ms) à mon montage, si le montage ne reçoit rien pendant 2 secondes (Arduino planté), il tire le reset de l'Arduino à la masse pendant 10ms, ce qui redémarre mon Arduino.
Comment faire ?
J'ai utilisé un circuit intégré HCF4538 et quelques composants. Plutôt qu'un long discours, voici le schéma:
Le premier monostable à gauche reçoit les impulsions de l'Arduino. Il a une tempo de 2 secondes (circuit RC en haut, 220k x 10uF = 2.2 secondes). Si il ne reçoit rien pendant plus de 2 secondes, il bascule sa sortie (6) et le second monostable envoi une impulsion de 10ms (100nF x 100K = 0.01 secondes) sur la base du transistor qui tire le reset à la masse, l'Arduino redémarre.
Voici mon montage, comme vous le voyez, ça ne prend pas de place, ça coûte pas grand chose et ça évite d'avoir un Arduino qui plante et qui laisse le chauffage en route par exemple (vécu), ou qui ne fait plus l'osmolation jusqu'à ce que la pompe de remonté aspire de l'air et l'envoi dans le bac (vécu aussi), etc, etc...
J'en ai profité pour optimiser le démarrage de mon Arduino en plaçant les éléments critiques en premier, ce qui fait que l'on ne voit presque pas qu'il redémarre (Contrôle des Leds, des relais qui pilotent les pompes principalement). Je suis passer d'environ 2 secondes à 5ms
. Le reste se fait tranquillement ensuite, sans bloquer le processus.
Fini les soucis d'Arduino planté !