Arduino Leonardo non riconosciuto su Windows

Poco fa tutto funzionava correttamente, poi ho staccato la porta usb ma dopo averla ricollegata, Arduino Leonardo viene riconosciuto da Windows per qualche secondo e poi me lo rileva come Unknown Device


Ho provato a reinstallare i driver, ma mi dice che son già presenti, però non mi assegna l porta seriale!

Come faccio a risolvere?

Aggiornamento!

Sfruttando quei pochi secondi in cui veniva rilevato, ho ricaricato il bootloader. A questo punto viene riconosciuto ma dopo una sola scrittura si ripresenta il problema.

PROBLEMA RISOLTO!
Nello sketch che caricavo c'era un'istruzione che non andava bene, in particolare questa: attachInterrupt(0, ruota_sensore, LOW );

Anche a me è successa la stessa cosa con l'Arduino Micro (che ha lo stesso microcontrollore) e ho ricaricato il bootloader.
Lo stesso codice però, su Arduino Uno funziona correttamente. Tu hai capito perchè quel codice crea questo problema?

A quale pin hai collegato il sensore della ruota?
Hai dichiarato l'interrupt LOW, hai messo una pull-up?

Riscrivere il bootloader non serve a niente, non è che corregge il problema ma cancella solo lo sketch presente in memoria. Lo stesso effetto lo otterreste scrivendo sul micro un programma "innocuo" come potrebbe essere il Blink.

Ricordatevi poi che se usate la Seriale, sull'Atmega32U4 ce ne sono 2 ed una è usata per parlare col PC, l'altra con la periferica collegata sui pin 0 e 1.
Ricordo anche che ogni volta che resettate la scheda, il sistema rimappa l'Atmega32U4 su un'altra porta.

Infine, passo un link:
http://arduino.cc/en/Reference/AttachInterrupt
qui trovate la corrispondenza fra pin ed interrupt.

PS:
@walter4991:
la prossima volta che hai un problema software, per favore posta tutto lo sketch perché non sappiamo cosa fai nel tuo programma, di conseguenza non possiamo sapere cos'è che può far noia.

leo72:
Riscrivere il bootloader non serve a niente, non è che corregge il problema ma cancella solo lo sketch presente in memoria. Lo stesso effetto lo otterreste scrivendo sul micro un programma "innocuo" come potrebbe essere il Blink.

Nel mio caso non sono riuscito a caricare nessun programma perchè, anche sfruttando il breve tempo in cui l'Arduino Micro veniva riconosciuto, poi si bloccava il caricamento. Così ho caricato il bootloader utilizzando l'Arduino Uno come programmatore.

Per quanto riguarda il codice io ho provato ad utilizzare l'esempio presente in questa pagina Touch Shield - DEV-10508 - SparkFun Electronics (e molto lungo da postare qui, quindi lo potete scaricare semplicemente cliccando su "example code") con la touch shield attaccata all'Arduino Micro. Con l'Uno lo stesso programma funziona correttamente.

Quello sketh stampa su seriale ma non esegue nessun ciclo di attesa per verificare che la connessione venga effettivamente effettuata. Nello specifico, con l'Atmega32U4 si usa introdurre un

while(Serial());

altrimenti si rischia di intasare la seriale di dati prima che l'utente abbia modo di aprire il monitor seriale o un terminale lato computer.
Se la seriale è occupata, non si riesce neanche dall'IDE a spedire uno sketch.
Non so se il problema è questo e se esso può affliggere le Leonardo o comunque le schede col 32U4 sopra come le Arduino UNO ma è una probabile causa.

leo72:
Non so se il problema è questo e se esso può affliggere le Leonardo o comunque le schede col 32U4 sopra come le Arduino UNO ma è una probabile causa.

Di sicuro non è un problema della seriale, perchè un sacco di altre volte mi sono dimenticato di aggiungere while(Serial()); e non ho mai avuto problemi di questo genere. Credo che sia una questione di interrupt a questo punto, da quello che ha scritto walter4991

walter4991:
PROBLEMA RISOLTO!
Nello sketch che caricavo c'era un'istruzione che non andava bene, in particolare questa: attachInterrupt(0, ruota_sensore, LOW );

Se ci spiegasse in modo più chiaro come è arrivato a questa conclusione, sarebbe meglio.
Io non ho le conoscenze per capire quale sia la causa del problema, ma di sicuro non è la mancanza di while(Serial());

Attachinterrupt assegna all'interrupt 0 la funzione ruota_sensore con modalità LOW.
La piedinatura tra la UNO e la Leonardo è diversa.
I pin degli interrupt sono invertiti, quindi nella UNO è il pin 2 mentre nella Leo è il 3.
Se lui ha lasciato il pin flottante oppure collegato a massa, l'interrupt viene chiamata all'infinito bloccando il micro.
Bisogna però sapere come ha fatto i collegamenti.
Leonardo e UNO sono diverse e a volte incompatibili.

si è verificato anche a me questo problema, sto provando di tutto ma proprio non riesco a fargli niente...
non capisco il motivo di questo problema, stavo lavorando con la wifi shield ma il problema me lo da anche da solo senza niente collegato.. non sono sicuro di quale fosse l'ultimo codice che gli ho caricato ma io di solito metto sempre

  while(!Serial.available());

all'inizio di tutti i codici che usano internet così ho il controllo di quando iniziano a funzionare... mi pare, però, fosse un codice in cui c'era un errore con un ciclo for che andava a puntare fuori da un vettore, ma non credo che questo possa causare problemi così gravi perchè va ad agire sulla RAM.. magari potrebbe aver mandato in conflitto l'arduino con la shield, boh.. la shield funziona ancora..

proverò a ricaricare il bootloader, i sintomi sono gli stessi che ha avuto vectorel, speriamo bene..

Ho appena ricevuto un Arduino MICRO e ho dovuto eliminare nel setup l'istruzione while(!Serial.available());

Infatti, se non viene attivato il monitor seriale, il programma rimane bloccato nel setup.

Per ovviare al problema si potrebbe inserire un timeout in questa istruzione: se dopo X secondi non succede nulla esci dal while.

Mi correggo: l'istruzione(fatta apposta per Leonardo e MICRO) è:

while(!Serial);

cyberhs:
Ho appena ricevuto un Arduino MICRO e ho dovuto eliminare nel setup l'istruzione while(!Serial.available());

Infatti, se non viene attivato il monitor seriale, il programma rimane bloccato nel setup.

Per ovviare al problema si potrebbe inserire un timeout in questa istruzione: se dopo X secondi non succede nulla esci dal while.

ma io voglio che resti bloccato finchè non gli go il via.. comunque questo non credo sia il problema perchè l'ho sempre messo..

confermo l'esperienza di vectorel: ricaricando il bootloader è tornato a funzionare :slight_smile: