Watchdog per resettare automaticamente Arduino

Watchdog per resettare automaticamente Arduino

In questo articolo ti parlo di un sistema non ampiamente diffuso ma molto utile da conoscere per resettare automaticamente Arduino in caso di necessità.

Immaginiamo ad esempio di voler realizzare un sistema idraulico automatizzato con Arduino. Supponiamo quindi che in base a determinate condizioni Arduino debba azionare una elettro-valvola e riempire o svuotare un certo contenitore di liquido.

Cosa succede se per un motivo qualsiasi Arduino rimane bloccato in un loop infinito?
Magari in attesa della lettura di un sensore di livello che si è danneggiato o a causa di un forte campo elettromagnetico che ha influenzato il comportamento di Arduino?

Potremmo finire per rimanere allagati o a secco senza averlo esplicitamente deciso noi.

Il Watchdog

Il Watchdog, letteralmente cane da guardia, serve proprio a questo. Il suo compito è quello di assicurarsi che tutto proceda secondo i piani del programmatore e se qualcosa non va come previsto, si occuperà di resettare il micro controllore.

In realtà il watchdog è un timer, conosciuto anche con la sigla WDT (Watch Dog Timer). Esso viene abilitato e configurato in fase di setup del programma e ad ogni ciclo viene resettato e fatto ripartire. Naturalmente affinché possa funzionare anche in caso di stallo del programma, il clock che lo alimenta è indipendente da quello che gestisce il resto del programma.

Se a causa di qualche problema il programma dovesse rimanere bloccato da qualche parte e non riuscire quindi a resettare il timer, un meccanismo interno riavvierà il micro controllore.

Usare la libreria WDT con Arduino

Anche se il titolo parla di Arduino e Watchdog, è bene sapere che la libreria in questione non è propria di Arduino, ma fa parte del set di librerie standard C utilizzate sui micro controllori Atmel AVR.

Per utilizzare il Watchdog in Arduino per prima cosa occorre includere la libreria mediante: #include <avr/wdt.h>

Successivamente nella funzione di setup la prima cosa da fare è disabilitare il Watchdog (sembra strano lo so).

#include <avr/wdt.h>

void setup() {
  wdt_disable();
  //resto del codice di setup
}

Perché disabilito il Watchdog prima ancora di abilitarlo e configurarlo?
Il Watchdog rimane attivo anche dopo il reset e se non viene disabilitato in fase di setup potrebbe rendere quasi inutilizzabile il micro controllore a causa dei continui reset.
Mi è successo fidati…

A questo punto sempre nella funzione setup, configuriamo il timeout desiderato oltre il quale resettare automaticamente Arduino. Per farlo si utilizza il metodo wdt_enable(timeout) ed il timeout passato è definito attraverso queste costanti:

CostanteTimeout (approssimativo)
WDTO_15MS15 millisecondi
WDTO_30MS30 millisecondi
WDTO_60MS60 millisecondi
WDTO_120MS120 millisecondi
WDTO_250MS250 millisecondi
WDTO_500MS500 millisecondi
WDTO_1S1 secondo
WDTO_2S2 secondi
WDTO_4S4 secondi (non in tutti i micro controllori)
WDTO_8S8 secondi (non in tutti i micro controllori)
Costanti timeout Watchdog

Come già detto il clock che determina il conteggio del contatore è autonomo. Basato quindi su un oscillatore RC indipendente, fa si che l’indicazione della durata risulti approssimativa e non perfettamente coincidente con quanto riportato nella costante.

Inoltre tale approssimazione, è influenzata anche dall’alimentazione per cui più basso è il voltaggio, più lungo sarà l’arco temporale del timeout.

#include <avr/wdt.h>

void setup() {
  wdt_disable();
  //resto del codice di setup

  wdt_enable(WDTO_2S); //Timeout di 2 secondi
}

Resettare automaticamente Arduino

Il watchdog è adesso configurato e pronto a svolgere il suo lavoro. Per tenerlo a bada però ad ogni ciclo del loop dovremo resettarlo con il metodo wdt_reset()

#include <avr/wdt.h>

void setup() {
  wdt_disable();
  //resto del codice di setup

  wdt_enable(WDTO_2S); //Timeout di 2 secondi
}

void loop(){
  //il mio codice

  // se il mio codice impiegherà più di due secondi
  // per raggiungere la fine del ciclo
  // il watchdog resetterà Arduino

  //tengo a bada il watchdog
  wdt_reset();
}

Questo è quanto! Più avanti vedrò di utilizzarlo in qualche progettino cosi da rendere meglio il concetto.

È bene sapere inoltre che il Watchdog può essere impostato anche in altre modalità e non solo in maniera da far scattare un reset.

Infatti oltre al reset è possibile fare in modo che allo scadere del timeout esso generei un interrupt o un iterrupt seguito da un reset.

La configurazione come intterupt è un pò ostica da vedere per questo te la mostrerò più avanti con un articolo dedicato.

Spero possa esserti utile!

Potrebbero interessarti anche...