ciao a tutti.
Un progetto personale mi ha spinto a cercare in rete un modo per resettare arduino o un micro controller che andrò a utilizzare in via definitiva la possibilità questo necessiti di un reset nel caso che questo non sia raggiungibile per premere il tasto indicato.
In realtà ci sarebbe una funzione dormiente, quindi non attiva chiamata "Watchdog" ma non tutte le versioni arduino le supportano.
La mia per esempio, un arduino uno compatibile non la supporta e visto che il progetto definitivo riguarda l'attiny 85 mi sono posto il problema di come effettuare un reset hardware come se fossi presente fisicamente e premere il tasto qual'ora questo sia necessario.
La prima cosa da fare, vale per ogni controllore, e comprendere come questo effettui il reset.
Nel caso di arduino uno e le sue varianti economiche mi sono preso la briga di vedere cosa succede con un multimetro quando questo e in stato normale,quando viene premuto il tasto e cosa accade quando alle porte in/out analogiche e digitali quanto si effetua il reset.
Monitorando sul piedino di reset post sulla board ho potuto constatare che questo e in stato logico alto (+5v) ma non solo, lo stesso pin reset e collegato al piccolo interrutore saldato sulla board.
Se premiamo il tasto reset questo si riavvia, ma come? sempliceissimo, l'altro capo e a massa o negativo.
Quando arduino o il micro controller come l'attiny 85 vengono resettati portano allo stato logico basso (0v) tutte le porte quindi perchè non sfruttare una porta logica attivano lo stato logico alto verso massa?.
Il problema però e che il pin reset ha uno stato logico alto quindi una semplice soluzione e far fare il lavoro sporco via hardware ad un transistor NPN.
Le correnti in gioco sono di circa 0,0015ma (1,5ma) circa quindi posso assicurare per chi e meno pratico che il collegamento e totalemtne sicuro e per chi e pratico di elettronica e film già visto.
Sostanzialmente come da schema non sto facendo altro che utilizzare il Q1 come interrutore e portare in saturazione a massa
dal collettore verso l'emettitore il Q1 quando una delle porte di arduino di nostra scelta porta in stato logico alto (+5v) alla base.
In questo modo la tensione da collettore ed emettitore viene passata a massa ed ecco che arduino si resetta.
Come potete vedere sul collettore Naturalmente ho collegato il pin reset di arduino che come spiegato e in uno stato logico alto
(+5v).
Non ho fatto altro che creare una sorta di interruttore digitale, comandato via software ma con il pin reset che quando passa a
condurre verso massa il controller si riavvia.
Lo sketch non necessita di accorgimenti particolari perchè quando arduino si resetta porta, come già spiegato, tutte le porte digitali in/out e analogiche a 0v per il tempo necessario per riavviarsi.
La resistenza da 10k sulla base e precauzionale, anche se le correnti in gioco sono quasi inesistenti ho preferito proteggerla in
caso questo con il tempo dovesse andare in perdita non accadrà nulla.
Se dovesse mai capitare per difetto senza la resistenza questo applicherebbe tutta la corrente disponibile verso massa con il
rischio di danneggiare la porta o il microcontroller quindi consiglio di lascialra.
lo sketck di esempio e molto semplice non credo necessiti di commenti ulteriori.
void setup()
{
pinMode (10,OUTPUT);// setto il pin 10 per l'uscita
pinMode (11,INPUT);// setto il pin 11 per comandare il pulsante di esempio via software
}
void loop()
{
if (digitalRead(11) == HIGH) {digitalWrite(10,HIGH);} //tasto premuto arduino si resetta in tutta sicurezza.
}
come potere notare il lavoro viene fatto sostanzialmente dal transitor.
Il pulsante serve solo da esempio per dimostrare che il controllo del reset e totalmente via software.
E vero che forse impiego un pin, ma ricordiamoci che con un semplice shift register possiamo moltiplicare le nostre porte in
raporto 1/8 per un 8 bit e così via quindi credo che sia sacrficabile.
ho allegato l'immagine di esempio dello schema.
per le mie esigenze e una soluzione adeguata ed evita listati di codice che ho visto spesso e la maggior parte non funzionare.
ciao a tutti ![]()
