In questo nuovo articolo vedremo cos'è a cane da guardia, per cosa può essere utilizzato e come utilizzarlo nei tuoi progetti Arduino. Tutto quello che devi sapere su questa funzione interessante ma sconosciuta. E sì, come suggerisce il nome (watchdog), può essere utilizzato per rintracciare alcuni problemi.
Qui vedremo tutto ciò che devi sapere per quanto riguarda…
Cos'è un cane da guardia?
In informatica, un cane da guardia è un meccanismo di supervisione utilizzato per monitorare il funzionamento di un sistema o programma. La sua funzione principale è rilevare e rispondere a situazioni anomale o guasti del sistema, come arresti anomali o blocchi, e adottare misure correttive per garantire il funzionamento continuo o il ripristino del sistema.
Il cane da guardia funziona con un timer configurato per un intervallo di tempo specifico. Se il sistema o il programma non esegue un'azione specifica o non alimenta il watchdog (ovvero, non lo riavvia) entro tale intervallo di tempo, il watchdog presuppone che il sistema sia in uno stato indesiderato o abbia smesso di rispondere correttamente e intraprende un periodo predeterminato azione. Questa azione può variare in base all'implementazione e può includere il riavvio del sistema, la generazione di log degli errori, la generazione di allarmi o l'adozione di azioni specifiche per correggere il problema.
Il watchdog viene utilizzato su una varietà di sistemi e dispositivi informatici, dai sistemi operativi e server ai dispositivi sistemi real-time embedded e critici, incluso Arduino. Il suo obiettivo principale è migliorare l'affidabilità e la disponibilità del sistema rilevando e rispondendo automaticamente ai problemi, riducendo così la necessità di intervento manuale in situazioni di guasto.
Cos'è il watchdog di Arduino?

Il timer watchdog di Arduino deve essere impostato in base alle esigenze dell'applicazione. Lui Timer del cane da guardia utilizza una sorgente di clock interna da 128 kHz (può variare a seconda della scheda e dell'MCU utilizzati). Quando attivato, inizia a contare da zero fino a un valore predeterminato dall'utente. Se il timer del watchdog non si reimposta quando raggiunge questo valore, reimposta il microcontrollore.
Il timer del cane da guardia ATmega328P, che è implementato in Arduino UNO, offre 10 diverse impostazioni orarie, ciascuna delle quali determina quando il timer trabocca e quindi causa un ripristino. I diversi intervalli di tempo sono i seguenti: 16 ms, 32 ms, 64 ms, 0.125 secondi, 0.25 secondi, 0.5 secondi, 1 secondo, 2 secondi, 4 secondi e 8 secondi, come vedremo più avanti nella tabella che allego.
Se ancora non ti è chiaro cosa puoi fare con il Watchdog Timer di Arduino UNO, vedremo Un esempio così puoi capirlo graficamente. In questo esempio utilizzeremo un semplice lampeggio dei LED. I LED lampeggiano per un periodo prestabilito prima di entrare nel ciclo while(). Questo ciclo while() viene utilizzato come alternativa a un sistema bloccato. Poiché il timer del watchdog non viene reimpostato durante il ciclo while(), causerà il riavvio del sistema e i LED inizieranno a lampeggiare nuovamente prima che il sistema si arresti in modo anomalo e si riavvii. Questo ciclo continuerà …
Considerazioni e caratteristiche
Il timer del cane da guardia È disabilitato all'inizio del codice. Viene incorporato un ritardo di x secondi prima di abilitare il Watchdog. Questo ritardo è fondamentale per consentire al bootloader di Arduino di verificare se viene caricato nuovo codice e per concedere tempo sufficiente per scrivere il codice nella memoria flash. Questo aspetto è rilevante a titolo precauzionale. Può verificarsi una situazione in cui, a causa di una codifica errata o di considerazioni errate, il codice scritto resetta il microcontrollore a intervalli molto brevi e all'infinito. Ciò può danneggiare la scheda Arduino e impedire il corretto caricamento dei codici su di essa. Se ciò accade, è necessario masterizzare il bootloader utilizzando un altro Arduino come ISP sull'Arduino bloccato...
Quando utilizziamo il watchdog Arduino, è necessario utilizzare registri di bit per definire il comportamento del chip. I relativi registri e il loro significato sono dettagliati nel datasheet del microcontrollore presente sulla scheda Arduino. Tuttavia, l'ambiente di sviluppo integrato (IDE) di Arduino è dotato di alcune funzioni e macro progettate per semplificare questo processo, che possono essere importate includendo la libreria #includere per utilizzare il watchdog del chip AVR.
In questo modo possiamo configurare il watchdog attivandolo utilizzando la funzione wdt_enable(). L'argomento di questa funzione determina il tempo prima del reset della scheda se il timer non è stato resettato. Per quanto riguarda i valori che è possibile configurare nel codice, li inserisco qui:
| Tempo prima che venga attivato il watchdog | argomento wtd_enable() |
| ms 15 | WDTO_15MS |
| ms 30 | WDTO_30MS |
| ms 60 | WDTO_60MS |
| ms 120 | WDTO_120MS |
| ms 250 | WDTO_250MS |
| ms 500 | WDTO_500MS |
| 1 s | WDTO_1S |
| 2 s | WDTO_2S |
| 4 s | WDTO_4S |
| 8 s | WDTO_8S |
Esempio di utilizzo del watchdog su Arduino

Infine vediamo come si utilizza praticamente il watchdog con un esempio nell'IDE di Arduino. Come possiamo vedere, è abbastanza semplice, puoi trovare diversi codici sorgente come questo su Internet, così puoi esercitarti, modificare e creare i tuoi codici per utilizzare watchdog nei tuoi progetti. Vediamo il nostro esempio:
#include <avr/wdt.h> // Incluir la biblioteca watchdog (wdt.h)
void setup()
{
wdt_disable(); // Desactivar el watchdog mientras se configura, para que no se resetee
wdt_enable(WDTO_2S); // Configurar watchdog a dos segundos
}
void loop()
{
wdt_reset(); // Actualizar el watchdog para que no produzca un reinicio
//Aquà irÃa el código de tu programa...
}
Come si può vedere in questo esempio di sketch per Arduino, ci sono tre funzioni del notevole linguaggio di programmazione per la gestione del watchdog, e questi sono:
- wdt_disable() per disabilitare il timer durante la configurazione di Arduino.
- wdt_enable(tiempo) per assegnare un intervallo al timer ed avviarlo, specificando l'orario corrispondente come ho indicato nella tabella precedente.
- wdt_reset() per rinnovare l'intervallo assegnato e il programma non si riavvia.