Soluzione definitiva anti auto-reset +info flash firm ATmega8u2 x Arduino Uno R2

Ciao a tutti, dopo aver cercato per giorni finalmente ho trovato una soluzione decente per il problema dell'auto-reset che non implica modifiche hardware, condensatori, resistenze, ne gestioni di flag particolari lato software prima di effettuare la connessione seriale...

Si avete capito bene: il funzionamento più logico di tutti cioè che il reset non avviene quando mi collego normalmente alla seriale ma solo quando flasho sketch dall'arduino ide (o anche da linea di comando) senza che debba fare nulla di particolare! Sembra incredibile che questa possibilità non esista già di default e sembra incredibile che non sia neppure scritta nella documentazione ufficiale!

In ogni caso io ho solo trovato il trucco è lo voglio condividere con voi, il merito è di questo blogger "Rob":

che ha modificato il firmware del ATmega8u2 che gestisce la porta USB

qui il link diretto ai file (per Uno e Mega 2560):
https://github.com/giseburt/Arduino/downloads
io ho provato la versione per l'Arduino Uno sul mio Arduino R2 e funziona! con un paio di anomalie (non gravi) che riporto sotto

La modifica apportata da Rob consiste semplicemente nell'effettuare il reset solo nel caso in cui l'ATmega8u2 rilevi un collegamento seriale che viene aperto e subito chiuso dopo mezzo secondo (cosa che l'arduino-ide fa già automaticamente prima di caricare gli sketch, mentre da linea di comando si può fare con uno script perl di una riga), se il collegamento seriale dura di più ovviamente non viene fatto nessun reset.

ATTENZIONE la procedura per caricare il firmware dell'ATmega8u2 sulla revisione R2 di Arduino Uno è diversa, e molto più semplice rispetto alla revisione R1 (dove era necessario saldare una resistenza), il firmware comunque va bene anche per la R1, sulla documentazione ufficiale c'e' solo la procedura per la R1 (la trovate qui: http://arduino.cc/en/Hacking/DFUProgramming8U2 )

io vi riporto quella per la R2 che ho testato personalmente (su Windows 7)

Scaricate il programma FLIP dal sito della Atmel

entrare nella modalita di aggiornamento firmware dell'ATmega8u2:

Con l'arduino acceso mandare e mantenere a terra il piedino di reset dell'ATmega8u2, si tratta del piedino maschio più in alto a sinistra di tutti come potete vedere dall'immagine.

poi mandare brevemente a terra il lato sinistro del condensatore che si vede nell'immagine, si tratta di quello più in basso dei due condensatori fra RX e RESET-EN.

scollegate il piedino reset che avevate mandato a terra prima

in gestione dispositivi di windows vedrete una nuova periferica, sicuramente non vi troverà automaticamente i driver quindi dovete farglieli trovare voi nella cartella di FLIP, nel mio caso C:\Program Files\Atmel\Flip 3.4.3\usb

ora potete aprire FLIP (per sicurezza fatelo come amministratore)

cliccare "select a target device"
selezionare AT90USB82
cliccare "select a communication medium"
scegliere "usb"
cliccare "open"
cliccare "load hex file" e selezionare il file da caricare
cliccare "run" in basso a sinistra

se tutte le lucine diventano verdi siete a posto
(a me una volta si era bloccato sulla "programazione" ho chiuso e riaperto flip e la seconda volta è andato tutto liscio)

cliccate "start application" (non so se questo passaggio serve o meno ma io l'ho fatto) e chiudete FLIP

scollegate e ricollegate l'usb per far rilevare l'arduino

PRIMA ANOMALIA (solo per utenti windows)

Noterete che i driver non vengono caricati automaticamente

il motivo è che questo firmware modificato cambia il VID/PID della periferica dall'originale
USB\VID_2341&PID_0001&REV_0001
a
USB\VID_03EB&PID_204B&REV_0001
sembra essere un bug nel source ufficiale arduino che imposta un VID PID di test... avrei anche trovato dove cambiare il codice ma non riesco a fare la build del firmware, se qualcuno è in grado mi faccia sapere!

La soluzione comunque è molto semplice: andate nuovamente in gestione dispositivi e forzate il driver di arduino prendendolo dalle cartelle dell'arduino-ide, non basta dirgli di cercare nella cartella dovete proprio forzare il driver scegliendo l'opzione "carica driver da disco" o qualcosa di simile.

SECONDA ANOMALIA

quando vi collegherete all'arduino con il serial monitor dell'arduino-ide potreste notare che l'arduino riceve sulla seriale uno o più caratteri "strani" come questo:

ð

io l'ho notato utilizzando uno sketch che ripete in output l'input ricevuto sulla seriale

la mia teoria è che l'arduino-ide durante la connessione seriale di mezzo secondo che attiva il reset tenti di inviare anche qualche dato, sostengo questo perchè non ho notato questi caratteri in altri collegamenti seriali diversi dal serial monitor dell'arduino-ide, probabilmente conoscendo la baud rate si potrebbe capire anche cosa invia esattamente (ma a 115200 si vedono solo caratteri strani)

Spero di esservi stato utile! Ciao

wergio:
la mia teoria è che l'arduino-ide tenta di inviare comunque un reset ogni volta che si collega via seriale, sostengo questo perchè non ho notato questi caratteri in altri collegamenti seriali diversi dal serial monitor dell'arduino-ide

confermo questa teoria, ogni apertura dell'ide equivale ad inviare un reset

Per esser sicuri di ciò andrebbe analizzato sia il firmware dell'8U2 (disponibile nell'IDE) sia il sorgente dell'IDE per vedere quest'ultimo all'avvio come e cosa comunica con il primo.

lesto:

wergio:
la mia teoria è che l'arduino-ide tenta di inviare comunque un reset ogni volta che si collega via seriale, sostengo questo perchè non ho notato questi caratteri in altri collegamenti seriali diversi dal serial monitor dell'arduino-ide

confermo questa teoria, ogni apertura dell'ide equivale ad inviare un reset

NON ad ogni apertura dell'IDE, forse, certamente ad ogni apertura del serial monitor (sperimentato!)

menniti:

lesto:

wergio:
la mia teoria è che l'arduino-ide tenta di inviare comunque un reset ogni volta che si collega via seriale, sostengo questo perchè non ho notato questi caratteri in altri collegamenti seriali diversi dal serial monitor dell'arduino-ide

confermo questa teoria, ogni apertura dell'ide equivale ad inviare un reset

NON ad ogni apertura dell'IDE, forse, certamente ad ogni apertura del serial monitor (sperimentato!)

si scusa intendevo ogni apertura del serial monitor... la notte devo dormire :cold_sweat:

ho testato questa soluzione su linux.

non ho riscontrato le tue anomalie, però in compenso l'upload non funziona, ma fare il reset a mano diventa più semplice (quando si spegne TX molli il reset)

Ciao, come non funziona l'upload?! Cosa usi per fare l'upload? L'arduino ide sotto linux? o direttamente avrdude da linea di comando?

Se usi l'avrdude devi ricordarti di dare tu l'impulso al dtr immediatamente prima dell'upload, puoi farlo anche da linea di comando con una riga di perl:

perl -e 'use Device::SerialPort; Device::SerialPort->new("$(ARD_PORT)")->pulse_dtr_on(500);'

io sto utilizzando il makefile che ho riportato in quest'altro mio post e mi funziona alla perfezione:

uso l'IDE direttamente... ma magari è l'optifix che blocca l'autoreset

Leo ma tu hai gia' una R2 ?
mi riprometto di aggiornare anche la mia a R2, quindi l'evoluzione finale e'
R2+Optifix+FW8u2 nuovo

Allora può essere che sia l'optifix (io ho il bootloader standard e finchè non ho problemi lascio quello), potresti provare se lanciando la linea di comando perl ti fa almeno il reset? se non te lo fa potresti provare ad aumentare un po' la durata l'impulso: pulse_dtr_on(1000). il problema è che non so se poi nell'arduino ide si può modificare la durata dell'impulso...

L'Optifix non blocca l'autoreset per l'aggiornamento degli sketch sull'Arduino. Serve solo per bloccare l'autoreset sul funzionamento con lo sketch ArduinoISP o comunque come programmatore ISP (l'avevo provato anche con avrdude direttamente da terminale e funzionava, prima del problema con il kernel 3.0).

@Testato:
no, ho la UNO R1.

@ wergio:

Can't locate Device/SerialPort.pm in @INC (@INC contains: /usr/lib/perl5/site_perl /usr/share/perl5/site_perl /usr/lib/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5/core_perl /usr/share/perl5/core_perl .) at -e line 1.
BEGIN failed--compilation aborted at -e line 1.

per l'IDE non ti preoccupare, so come modificare i sorgenti :slight_smile:

L'Optifix è nato per risolvere i problemi dell'Arduino originale.
Se però andate a modificare il firmware dell'8U2 ci sta che possa succedere qualcosa.

Probabilmente le 2 modifiche non vanno fatte contemporaneamente.

lesto:
Can't locate Device/SerialPort.pm in @INC (@INC contains: /usr/lib/perl5/site_perl /usr/share/perl5/site_perl /usr/lib/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5/core_perl /usr/share/perl5/core_perl .) at -e line 1.
BEGIN failed--compilation aborted at -e line 1.

devi installare il modulo SerialPort del perl !

cpan
'yes' a tutto
install Device::SerialPort
'yes' a tutto

:wink:

uff

Files found in blib/arch: installing files in blib/lib into architecture dependent library tree
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ERROR: Can't create '/usr/bin/site_perl'
mkdir /usr/bin/site_perl: Permesso negato at /usr/share/perl5/core_perl/ExtUtils/Install.pm line 494

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 at -e line 1
make: *** [pure_site_install] Errore 13
  COOK/Device-SerialPort-1.04.tar.gz
  /usr/bin/make install  -- NOT OK
Failed during this command:
 COOK/Device-SerialPort-1.04.tar.gz           : install NO

cpan[2]>

dev'essere un problema con "cpan", l'unica cosa che mi viene in mente è di eseguirlo come root, altrimenti non saprei

Salve ragazzi, io ho provato questo firmware sul mio arduino uno r2, l'ho caricato direttamente con la mia scheda stk500, poiché quando vado ad aprire flip, mi da un errore quando vado a selezionare il dispositivo da usb. Fatto sta che il problema è un altro. Quando collego arduino via usb, gestione periferiche di windows 7 lo trova, ma non mi fa installare il driver. Come mai? C'è bisogno di qualche altro driver?

intendi che prima dell'aggiornamento riuscivi ad installare il file .inf (presente nelle cartelle dell'ide) ed ora no ?
ti allego l'inf mio (non chiamiamolo driver :))

Arduino UNO.inf (3.23 KB)

intendevo questo :stuck_out_tongue: comunque anche utilizzando il tuo .inf mi da errore. Dice "impossibile trovare software driver per il dispositivo". Come posso fare? Ho provato a reinstallare il vecchio firmware e viene riconosciuto normalmente.

ma hai seguito questo ?

PRIMA ANOMALIA (solo per utenti windows)

Noterete che i driver non vengono caricati automaticamente

il motivo è che questo firmware modificato cambia il VID/PID della periferica dall'originale
USB\VID_2341&PID_0001&REV_0001
a
USB\VID_03EB&PID_204B&REV_0001
sembra essere un bug nel source ufficiale arduino che imposta un VID PID di test... avrei anche trovato dove cambiare il codice ma non riesco a fare la build del firmware, se qualcuno è in grado mi faccia sapere!

La soluzione comunque è molto semplice: andate nuovamente in gestione dispositivi e forzate il driver di arduino prendendolo dalle cartelle dell'arduino-ide, non basta dirgli di cercare nella cartella dovete proprio forzare il driver scegliendo l'opzione "carica driver da disco" o qualcosa di simile.