Autoreset disabilitato e caricamento nuovo sketch senza premere reset. POSSIBILE

Ciao ragazzi,
sto realizzando un progetto nel quale ho la necessità di collegarmi ad arduino senza che esso si resetti.
Ho quindi bloccato l’autoreset tagliando la pista sulla scheda di arduino, ma ho anche la necessità di poter caricare uno sketch dall’IDE senza poter accedere fisicamente al tasto reset di arduino.
Dopo vari esperimenti ho realizzato questa curiosa soluzione software che vorrei condividere con voi.
Ho scritto in fretta questo sketch per riassumerne il funzionamento all’essenziale:

In pratica il programma comincia attendendo un qualsiasi input esterno (nell’esempio ho utilizzato un comando da seriale ma potrebbe essere un pulsante ecc ecc).
Una volta ricevuto un qualsiasi carattere dalla seriale (lo possiamo inviare dal monitor seriale) arduino impegna in trasmissione la seriale con il while loop di 5000ms.
A questo punto possiamo lanciare tramite l’IDE il caricamento del programma senza preoccuparci del momento in cui resettare arduino (cosa che invece andrebbe fatta se utilizzassimo il tasto reset).
Dopo un tempo che io ho impostato in 5000ms arduino si resetta utilizzando il watchdog timer.
E il programma viene correttamente caricato.
Inutile dire che ho provato e riprovato, ma senza inviare continuamente una stringa sulla seriale durante tutto il tempo di compilazione, questo workaround non funziona.
Per poter funzionare, il programma che andiamo a caricare, deve venir compilato in un tempo inferiore al
tempo_compilazione che nell’esempio ho impostato a 5000 ms.

#include <avr/wdt.h>  //watch dog timer

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  int tempo_compilazione = 5000;   //tempo minimo di compilazione in millisecondi
  unsigned long timer;             //variabile timer

  delay(1000);

  Serial.print("Invia un comando da seriale e sucessivamente avvia il caricamento del programma");
  while (Serial.available() < 1);   //attendi comando da seriale

  timer = millis();                 //resetta timer

  while (millis() - timer <= tempo_compilazione)  
  {
    Serial.println("Avvia ora il caricamento");
  }
  
  wdt_enable(WDTO_15MS);    //resetta arduino
}

Il tutto l’ho testato con un clone Mega 2560 e IDE 1.8.10.
Sarei curioso di sapere se riscontrate lo stesso funzionamento, e se conoscete dei sistemi diversi e migliori per poter caricare uno sketch con l’autoreset disabilitato.

Mi pare che senza autoreset, se premi il tasto reset poco prima che lui faccia upload, dovrebbe caricare. Mi pare.

nid69ita:
Mi pare che senza autoreset, se premi il tasto reset poco prima che lui faccia upload, dovrebbe caricare. Mi pare.

Si, è così, ma se non puoi accedere fisicamente al tasto reset, non potresti caricare lo sketch. Con questo sistema invece lo puoi caricare comunque.