Nov 252016
 

Vediamo oggi in maniera piuttosto semplice, cos’è il wdt (watchdog timer), scopriamo un bug di Arduino Nano ad esso legato e vediamo come sistemare il problema sovrascrivendo il bootloader con l’optiboot.

Il watchdog timer (wdt)

Pensiamo al nostro Arduino. Noi scriviamo un software che gira costantemente sul nostro microcontrollore, ma il nostro software come tutti, non sarà perfetto per cui esiste la possibilità che il microcontrollore si blocchi determinando il crash di tutto il sistema. Il wdt serve proprio a intercettare questo tipo di problematica e nel caso accada, determina il riavvio del sistema. Comodo vero? Vediamo come funziona. Non è nulla di complicato, di fatto si tratta di un contatore interno che incrementa con il passare del tempo e quando raggiunge una soglia da noi determinata il sistema si resetta. Così facendo però il sistema andrebbe in reset di continuo, non appena viene raggiunta la soglia di cui accennavamo.

Infatti all’interno del nostro sketch dovrà essere presente una istruzione che riporta a zero il contatore per impedirgli di raggiungere la “soglia di reset”. In questo modo l’unico modo perchè la soglia venga raggiunta è fare in modo che la nostra istruzione non venga eseguita, cosa che accade proprio quando il nostro software si è bloccato. Per attivarlo non vi è nulla di complesso, dobbiamo solamente fare in modo che fra un’istruzione di reset e la successiva non si raggiunga la soglia di riavvio, cosa che potrebbe accadere se si effettuano calcoli particolarmente complessi.

#include <avr/wdt.h>

void setup()
{
  wdt_disable(); // prima di tutto accertati di disabilitarlo.....
  wdt_enable(WDTO_8S); //... poi lo abiliti con la soglia che preferisci....
}


void loop()
{
 ....
  wdt_reset(); //ed effettui il reset dentro il tuo sketch
 ...
}

Probabilmente è intuibile che con WDTO_8S viene impostata una soglia di 8 secondi. Ve ne sono altre, in particolare 4 2 e 1 che possono essere selezionate in base alle vostre esigenze. A dirla tutta ne esistono anche di inferiori al secondo, ma a quel punto mi chiedo se siano realmente utili per lo scopo che ci prefiggiamo, anzi, a dirvela tutta io avrei preferito una soglia superiore agli 8 secondi, infatti in uno dei miei progetti ho dovuto modificare il codice per riuscire a rientrare entro quella soglia. Teniamo comunque presente che il reset è solo una delle possibilità del wdt, esistono infatti altre applicazioni di cui però non parleremo in questo articolo.

Qui sotto vi riporto uno sketch di esempio che vi permette di testare il dwt sulla vostra scheda. Sul monitor seriale vengono stampati dei puntini, dopo 10 secondi dovrebbe avvenire il riavvio del sistema, cosa che non avviene con l’arduino Nano in mio possesso. Ad ogni riavvio sul monitor seriale ricompare la scritta “Start” in quanto è presente nel setup del nostro software.

#include <avr/wdt.h>
 
 void setup()
 {
   wdt_disable(); // prima di tutto accertati di disabilitarlo.....
   Serial.begin(9600);
   while (!Serial) {} // wait for serial port to connect. Needed for Leonardo only
   wdt_enable(WDTO_8S); //... poi lo abiliti con la soglia che preferisci....
   Serial.println("Start");
 }
 
 
 void loop()
 {
   wdt_reset(); //ed effettui il reset dentro il tuo sketch
   double tempo=millis();
   for(int i=0;millis()<tempo+10000;i++)
   {
     if(i%5000==0) Serial.print(".");
   }
 }

Il nano problematico

Non ho mai avuto problemi con il wdt finchè non l’ho applicato ad un Arduino Nano e con mio disappunto ho notato che al raggiungimento della soglia di reset si impalla entrando in un loop di reset infinito in cui il led lampeggia freneticamente ma la scheda non si riavvia più per cui diventa necessario togliere l’alimentazione. Una breve ricerca in rete mi ha fatto scovare il problema che pare essere legato al bootloader. Ok, non ne abbiamo parlato molto in passato, ma il bootloader è un software caricato sui nostri amati Arduino che ci permette alcuni vantaggi, fra essi la possibilità di caricare gli sketch attraverso la porta usb senza l’utilizzo di programmatori esterni. Questo piccolo software viene avviato per primo all’accensione di Arduino ed è quello che poi a sua volta determina l’avvio del nostro sketch. Bene, pare proprio che quello installato su Arduino Nano abbia un problema con il wdt. Infatti quello “del nano” è l’ATmegaBOOT a differenza ad esempio di quello di Arduino UNO che è l’optiboot e sul quale non si verifica questo problema. Visto però che Arduino UNO e Nano utilizzano lo stesso microcontrollore e su Arduino UNO non c’è il problema del wdt, è possibile installare il bootloader di Aduino UNO su Arduino Nano.

Riprogrammiamolo

La soluzione è perciò semplice, non dobbiamo far altro che riprogrammare il bootloader della scheda. Ci sono diversi metodi per farlo, noi però ci limitiamo alla via più semplice. icspQuesta via prevede comunque l’utilizzo di un programmatore, ossia un hardware che si interfaccia con il pc da una parte e con la scheda da riprogrammare dall’altra. Esistono dei programmatori che permettono di fare questa operazione (e non solo), ma la cosa interessante è che possiamo usare anche una seconda scheda Arduino per assolvere a questo semplice compito.

Ricapitoliamo abbiamo una scheda Nano da riprogrammare ed una seconda scheda Arduino che farà da programmatore. Io per semplicità e per non creare confusione, userò il più classico degli Arduino Uno. Su questa seconda scheda dobbiamo caricare lo sketch che troviamo fra gli esempi e che prende il nome di ArduinoISP. A questo punto il nostro Arduino UNO si è trasformato magicamente in un programmatore e dobbiamo procedere con il collegare le due schede insieme. E’ a questo punto che se guardate in rete si scatena la confusione più incredibile. Nella realtà non vi è nulla di più semplice, si tratta solamente di collegare le interfacce SPI delle due schede ed il pin di reset. Per farlo possiamo usare i connettori ICSP o utilizzare i relativi pin ad essi connessi. Vi riporto qui sotto la solita tabellina con i vari pin, giuto per averla sotto mano. Qui a lato vi riporto anche lo schemino del connettore ICSP di Arduino UNO. Colleghiamo perciò la linea MISO della scheda programmatore alla linea MISO della scheda da programmare, allo stesso modo per le linee MOSI ed SCK. L’unica cosa a cui fare maggior attenzione è che il pin 10 del programmatore deve essere collegato al pin reset della scheda da programmare. Non dimenticate infine di condividere fra le due VCC e GND.

warnig32Attenzionewarnig32: se usate come programmatore una scheda con processore non avr, come ad esempio Arduino DUE, non scordate che i livelli di quest’ultima sono a 3.3V mentre le schede AVR sono a 5V per cui non potete fare un collegamento diretto ma dovete usare degli shift level o attrezzarvi con dei partitori di tensione.

Arduino Board MOSI MISO SCK SS (slave) SS (master)
Uno / Duemilanove / Pro / Nano / Fio 11 or ICSP-4 12 or ICSP-1 13 or ICSP-3 10
Mega1280 or Mega2560 51 or ICSP-4 50 or ICSP-1 52 or ICSP-3 53
Leonardo / Micro / YUN ICSP-4 ICSP-1 ICSP-3
Due ICSP-4 ICSP-1 ICSP-3 4, 10, 52
Mini 11 12 13

Una volte collegate insieme le due schede, ricolleghiamo il programmatore (UNO) al PC attraverso la porta USB.

Ora nel menu strumenti dell’IDE di Arduino selezionate la scheda DA RIPROGRAMMARE. Ma non fatevi ingannare. Voi volete programmare la Arduino Nano e se fosse ad esempio priva di bootloader questa procedura andrebbe benissimo. Ma noi NON vogliamo scrivere il bootloader di Arduino Nano perchè contiene il baco del wdt che vogliamo invece eliminare, per cui in realtà dobbiamo selezionare “Arduino UNO” in quanto vogliamo inviare quel bootloader alla nostra Nano. 

Fatto ciò dobbiamo tornare al menu strumenti e modificare una voce che di rado andiamo a toccare, ossia programmatore, che di default è importato su AVRISP mkII. Adesso selezionate “Arduino as ISP” (Attenzione, non ArduinoISP). Se, come nel nostro caso, usiamo Arduino UNO come programmatore è indicato aggiungere un condensatore da 10uF fra i pin di reset e massa. Ciò è necessario per disabilitare la funzione di auto-reset, anche se a dirvela tutta ho provato sia con che senza condensatore senza alcun problema in entrambi i casi.

Sempre dal menu strumenti selezioniamo “Scrivi il bootloader” (“Burn bootloader”) e la procedura di programmazione farà il suo corso.

Bene, a questo punto il nostro Arduino Nano avrà il nuovo bootloader che oltre a non presentare il problema con il wdt, è più piccolo per cui ci lascia più risorse per i nostri sketch ed inoltre ci permette di caricare gli stessi ad una velocità considerevolmente maggiore. Fate attenzione che una volta installato il bootloader di Arduino UNO, la scheda si comporta come se fosse tale, per cui da ora in poi gli skecth devono essere compitati ed inviati selezionando “Arduino UNO” come board.

Questa volta ho fatto anche un video che vi mostra le varie fasi e che vi allego qui sotto. Visto che nel mio caso non ho avuto problemi di tale natura, non ho utilizzato il condensatore sulla linea di reset dell’Arduino UNO. Ho fatto anche qualche piccolo errore ma sono stato onesto e non li ho tagliati, anzi, li ho sottolineati in modo che non facciate lo stesso.

Salva

Salva

Salva