Arduino, il Watchdog

Giocando con Garagino ho scoperto che i carichi induttivi (leggi motori elettrici) o anche alimentatori Switching di dubbia qualità creano “spurie” che interferiscono con il corretto funzionamento di Arduino. Di fatto lo mandano in “tilt” anche se non ho ancora capito se il problema “entra” nel micro controllore dall’alimentazione (passando per 2 alimentatori switching con condensatori vari di livellamento e varistori) oppure dalla connessione i2c che uso per pilotare i relay.

Fatto sta che si inchioda e resta li, a far righette senza senso sul bel display rosso.

L’unica soluzione che sono riuscito a trovare per poterlo utilizzare un po più serenamente e’ il  Watchdog.

Questo “cane da guardia” non e’ altro che un timer che deve essere resettato ogni tot tempo dal programma in esecuzione, se questo non avviene il timer riavvia il micro controllore.

Questo meccanismo è solitamente implementato in hardware ed è presente sul microcontrollore ATMega328 cuore di arduino UNO e familia.

Per utilizzare il Watchdog bisogna inserire la libreria wdt.h

I tempi di reset del Watchdog sono:

Tempo reset Parola Chiave
15mS WDTO_15MS
30mS WDTO_30MS
60mS WDTO_60MS
120mS WDTO_120MS
250mS WDTO_250MS
500mS WDTO_500MS
1 Secondi WDTO_1S
2 Secondi WDTO_2S
4 Secondi WDTO_4S
8 Secondi WDTO_8S

Nel  setup() abilito il watchdog specificando il tempo di reset scrivendo:

In pratica se entro 8 secondi non resetto il time del watchdog questo riavvia il micro che probabilmente si e’ impallato.

Per resettarlo:

In pratica… se so’ che nessuna delle atività svolte dal programma dura 8Secondi… lo resetto ogni volta che ricomincia il loop e ciao, se si impalla si riavvia.

Beh, forse e’ meglio scegliere con piu’ cura dove posizionare il wdt reset() ma ci siamo capiti 🙂