Comment faire un Reset d'Arduino par logiciel - 3 options
Il est parfois utile qu'un Arduino reboot tout seul sans avoir physiquement besoin de quelqu'un pour pousser sur le bouton Reset.
Il y a plusieurs façon d'atteindre ce but.
Option 1 - Reset de type logiciel
Cette solution (pas très "propre") consiste à déplacer le curseur d'exécution d'Arduino au début de programme à l'aide d'une instruction de saut (jump) en assembleur.
C'est une solution relativement incomplète parce qu'elle ne réinitialise pas le matériel connecté sur votre Arduino. Cela signifie que la configuration matérielle par défaut ne sera restaurée.
Voici la fonction pour faire ce reset logiciel.
Option 2 - Watchdog Arduino
Le Watchdog se traduit littéralement par "Chien de garde". Le but d'un chien de garde sur un matériel technique est de désactiver un processus s'il met trop de temps à répondre.
En gros, si votre programme Arduino prends trop de temps d'exécution alors le chien de garde (Watchdog) entrera en action et fera un "reset" de votre Arduino.
Je pense qu'il s'agit là d'une approche assez propre... le but du watchdog étant justement de faire le Reset en cas de problème.
Pour utiliser le watchdog, vous aurez besoin d'inclure le fichier avr/wdt.h et d'appeler ensuite la fonction wdt_enable().
La fonction wdt_enable accepte le temps à attendre avant de lancer le Reset automatique de la carte s'il n'y a pas d'autre appel au watchdog.
Vous pouvez choisir entre plusieurs valeurs prédéfinies :
15mS WDTO_15MS
30mS WDTO_30MS
60mS WDTO_60MS
120mS WDTO_120MS
250mS WDTO_250MS
500mS WDTO_500MS
1S WDTO_1S
2S WDTO_2S
4S WDTO_4S
8S WDTO_8S
Pour forcer le reset de la carte, il suffit alors d'implémenter une courte boucle, le système reboot lorsque le temps choisi expire (timeout).
L'exemple suivant utilise la plus petite valeur pour le timeout. Il suffit d'appeler la fonction software_Reboot pour rebooter la carte.
Option 3 - Reset matériel
Si vous utilisez déjà le Watchdog à d'autres fins alors vous pouvez encore faire un Reset matériel.
Il faut raccorder une résistance de 1K entre la broche réset et une broche digitale (ex: la pin 12).
Ensuite, il suffit d'utiliser le code suivant:
Avez-vous trouvé cet article est utile?
MCHobby investi énormément de temps dans ses documentations et ses tutoriels qui restent pourtant accessibles librement.
Si vous aimez nos articles/tutos/docs, soutenez nos efforts en achetant vos produits Arduino/Raspberry/DIY/AdaFruit/Flora/... chez MCHobby
Source:
Il y a plusieurs façon d'atteindre ce but.
Option 1 - Reset de type logiciel
Cette solution (pas très "propre") consiste à déplacer le curseur d'exécution d'Arduino au début de programme à l'aide d'une instruction de saut (jump) en assembleur.
C'est une solution relativement incomplète parce qu'elle ne réinitialise pas le matériel connecté sur votre Arduino. Cela signifie que la configuration matérielle par défaut ne sera restaurée.
Voici la fonction pour faire ce reset logiciel.
// Redémarre le programme depuis le début mais ne // réinitialiser pas les périphériques et les registres void software_Reset() { asm volatile (" jmp 0"); }
Option 2 - Watchdog Arduino
Le Watchdog se traduit littéralement par "Chien de garde". Le but d'un chien de garde sur un matériel technique est de désactiver un processus s'il met trop de temps à répondre.
En gros, si votre programme Arduino prends trop de temps d'exécution alors le chien de garde (Watchdog) entrera en action et fera un "reset" de votre Arduino.
Je pense qu'il s'agit là d'une approche assez propre... le but du watchdog étant justement de faire le Reset en cas de problème.
Pour utiliser le watchdog, vous aurez besoin d'inclure le fichier avr/wdt.h et d'appeler ensuite la fonction wdt_enable().
La fonction wdt_enable accepte le temps à attendre avant de lancer le Reset automatique de la carte s'il n'y a pas d'autre appel au watchdog.
Vous pouvez choisir entre plusieurs valeurs prédéfinies :
15mS WDTO_15MS
30mS WDTO_30MS
60mS WDTO_60MS
120mS WDTO_120MS
250mS WDTO_250MS
500mS WDTO_500MS
1S WDTO_1S
2S WDTO_2S
4S WDTO_4S
8S WDTO_8S
Pour forcer le reset de la carte, il suffit alors d'implémenter une courte boucle, le système reboot lorsque le temps choisi expire (timeout).
L'exemple suivant utilise la plus petite valeur pour le timeout. Il suffit d'appeler la fonction software_Reboot pour rebooter la carte.
#include <avr/wdt.h> void software_Reboot() { wdt_enable(WDTO_15MS); while(1) { } }
Option 3 - Reset matériel
Si vous utilisez déjà le Watchdog à d'autres fins alors vous pouvez encore faire un Reset matériel.
Il faut raccorder une résistance de 1K entre la broche réset et une broche digitale (ex: la pin 12).
Ensuite, il suffit d'utiliser le code suivant:
// Cette fonction simule la pression du bouton Reset void pushReset() { int pin=12; // active la broche en sortie (OUTPUT) pinMode(pin, OUTPUT); // Déactive le reset forçant la sortie au niveau bas digitalWrite(Pin, LOW); }
Avez-vous trouvé cet article est utile?
MCHobby investi énormément de temps dans ses documentations et ses tutoriels qui restent pourtant accessibles librement.
Si vous aimez nos articles/tutos/docs, soutenez nos efforts en achetant vos produits Arduino/Raspberry/DIY/AdaFruit/Flora/... chez MCHobby
Source:
- Cet article de gg1.
a quoi sert la résistance de 1kohm? pourquoi ne pas utiliser la resistance interne de la carte?
RépondreSupprimerreset materiel testé sur Arduino nano (clone) v3. Au démarrage, la pin Dx (peut-etre en tristate?) tire RESET vers 0v , la carte est bloquée. Différents essais (resistance , etc) sans succes. PP
RépondreSupprimer