Soluzione per LED integrato sempre acceso su UNO R3

Il buon Alberto (pighixxx) al raduno di Bassano mi ha omaggiato di una UNO R3 (grazie ancora a te ed agli sponsor che hanno messo a disposizione il materiale).

Tornato a casa l'ho collegata al PC ed ho visto il led integrato blinkare (sketch Blink precaricato). Tutto OK.
Quel led che lampeggiava mi ha fatto tornare a mente il problema che alcuni utenti avevano manifestato sulla UNO R3, e cioè che il led integrato era acceso anche se non era impostato da codice. Ho caricato un semplice sketch che non faceva uso del led e magicamente ho visto come esso si accendesse da solo e si spengesse facendo ponte con un dito sul retro della scheda tra il pin 13 ed il pin di massa che c'è accanto. Tutto ciò, come spiegò bene Uwe, è causato dall'op-amp che è utilizzato per pilotare il led 13.

Mi è venuto da pensare ad una soluzione per rimediare a questo problema, perché proprio non mi piace avere un led acceso quando vuole lui. Ecco quindi in allegato il bootloader Optiboot 4.4.1, evoluzione del bootloader dell'IDE 1.0.5 che disattiva il led mettendo il pin su output con segnale low al termine dell'esecuzione del bootloader, prima che venga avviato lo sketch utente.

Ricordatevi quindi che all'avvio dello sketch quel pin non è più in condizione di alta impedenza, situazione di default di tutti i pin dopo un reset del microcontrollore.

Istruzioni per l'installazione del nuovo bootloader:

  1. aprite la cartella che contiene l'eseguibile di Arduino
  2. entrate in /hardware/arduino/bootloaders/optiboot
  3. rinominate il file optiboot_atmega328.hex in optiboot_atmega328.orig in modo da avere una copia del file originale (se saltate questo passaggio, potete sempre riscaricare l'IDE e recuperare il file originale da lì)
  4. decomprimente l'archivio allegato e copiate il file .hex allegato nella suddetta cartella. Questo è il nuovo bootloader
  5. adesso aprite l'IDE e procuratevi o un altro Arduino oppure un programmatore esterno (esempio: USBtinyISP) per poter scrivere il bootloader sul chip dell'Arduino UNO R3
  6. caricate il bootloader e poi montate il chip così preparato sulla vostra UNO R3.

Dando alimentazione, il led integrato dovrebbe dare adesso 4 flash:

  • i 3 iniziali sono quelli classici dell'Optiboot, che segnalano l'avvio del bootloader
  • il 4° flash che vedete non è un flash vero e proprio ma è il passaggio veloce dalla condizione di acceso causata dall'op-amp integrato a quella di spento data dal pin messo su output/low dal nuovo bootloader.

PS:
nel file allegato trovate anche il sorgente del bootloader, nel caso vogliate compilarvelo per proprio conto. Tenete presente che dovete rispettare il limite dei 512 byte: con la modifica da me proposta siamo a 506.

optiboot-4.4.1.zip (7.48 KB)

Grazie :slight_smile:

Anche da parte mia grazie. Finalmente la soluzione.

Grazie dei... ringraziamenti :wink:
Vorrei avere un feedback, per sapere se funziona correttamente anche su altre schede con lo stesso problema. La mia senz'altro ha gradito, dato che quel LED non sta più acceso da solo. XD

La soluzione è certamente idonea, non mi convince la "spiegazione". Quel LED è alimentato dallo stato del pin 13 amplificato dall'op amp U5B LM358, usato in configurazione NON invertente, per cui il LED si accende solo ce il pin 13 va su HIGH o comunque se il + del 358 rileva una certa soglia di tensione positiva, quindi se colleghi il pin a massa mediante un dito il LED non può accendersi, semmai dovrebbe spegnersi :sweat_smile:; ciò detto temo che non sia semplice trovare una soluzione hardware al problema senza smanettare oltre la decenza, penso che basterebbe diminuire il fattore di amplificazione dell'U5B per risolvere il problema a monte.

Difatti se faccio ponte fra il pin D13 e massa si spenge:

si spengesse facendo ponte con un dito sul retro della scheda tra il pin 13 ed il pin di massa che c'è accanto

Comunque questa è una soluzione temporanea, nel senso che serve tappare la falla hardware in attesa che provvedano, come disse astrobeed nel thread in cui Uwe dava la soluzione del problema, a mettere anche una R di pull-down da 100K per dare un segnale basso all'op-amp.
Se l'utente non usa quel pin, il led rimarrà spento (come dovrebbe essere e com'era sulle vecchie versioni della scheda). Se lo usa, invece, esso seguirà lo stato del pin ma a questo punto poco ce ne importa perché la cosa sarà appunto voluta dall'utente stesso.

aaah ho letto a pipa sorry! :smiley:
io stavo per suggerire una pull-down da 10k a poi ho pensato che si sarebbe persa l'alta impedenza, con 100k il problema sarebbe relativo ma non so se sufficiente, inoltre si verrebbe a trovare in parallelo ad una eventuale pull-down; credo che più elegantemente andrebbe cambiata la configurazione; la configurazione attuale (voltage follower) in realtà non amplifica, come ho scritto prima, ma semplicemente separa i due stadi; la loro idea era quella di non sovraccaricare il pin 13, ma non hanno fatto i conti con questo problema

Esattamente. Probabilmente i primi prototipi non hanno manifestato il problema ed hanno mandato la scheda in produzione.
Comunque la mia è una soluzione software per cui non devi metter mano alla scheda in nessun modo ed è inoltre reversibile nel senso che puoi comunque riportare la scheda all'originale semplicemente ricaricandoci sopra il bootloader di serie.

Il problema é che col LED attaccato direttamente al PIN 13 (come nei Arduino piú vecchi) se usi il pin 13 come entrata hai un tipo di resistenza pullup. Percui il Pin 13 non si comporta in modo uguale come gli altri pin digitali. Mettendo un operazionale il LED é disaccoppiato e il pin 13 come entrata si comporta uguale come gli altri pin digitali. Il LED 13 acceso in certe circostanze é un problema minore di quello di avere un pin che si comporta diversamente dagli altri.
Ciao Uwe

Ma non era uscito l'optiboot 5.0? (http://forum.arduino.cc/index.php/topic,159722.0.html)
Il tuo dovrebbe essere il 5.0.1

Nella mia R3 non si accende. Credo faccia parte di uno dei primi lotti visto che la ho da quando mi sono iscritto qui. (25-11-2011)

PaoloP:
Ma non era uscito l'optiboot 5.0? (http://forum.arduino.cc/index.php/topic,159722.0.html)
Il tuo dovrebbe essere il 5.0.1

Nella mia R3 non si accende. Credo faccia parte di uno dei primi lotti visto che la ho da quando mi sono iscritto qui. (25-11-2011)

Secondo me ha la sua influenza anche il funzionamento dell'impianto di terra, sarebbe interessante se qualcuno che ha il problema potesse provare ad alimentare Arduino con una batteria e vedere come si comporta, secondo me resta spento....

PaoloP:
Ma non era uscito l'optiboot 5.0? (http://forum.arduino.cc/index.php/topic,159722.0.html)
Il tuo dovrebbe essere il 5.0.1

Il 5.0 serve per supportare la seconda seriale sui 1284. Sui 328 non cambia nulla. Ho quindi usato quello allegato all'IDE.

Non sono a casa. Domani faccio dei test rimettendo il bootloader originale.