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.

// 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:

2 commentaires:

  1. a quoi sert la résistance de 1kohm? pourquoi ne pas utiliser la resistance interne de la carte?

    RépondreSupprimer
  2. reset 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