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
#include <avr/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:
1
2
|
//abilito Watchdog e imposto il reser ogni 8 secondi
wdt_enable(WDTO_8S);
|
In pratica se entro 8 secondi non resetto il time del watchdog questo riavvia il micro che probabilmente si e’ impallato.
Per resettarlo:
1
2
|
//resetto il timer del watchdog
wdt_reset();
|
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 🙂