Nel post precedente abbiamo visto come programmare un Arduino in modalità standalone.
Uno dei requisiti era quello che il bootloader fosse già precaricato.
Ma se avessimo un Atmega328 vergine, oppure volessimo programmare il nostro micro per essere utlizzato senza un oscillatore esterno come dobbiamo fare?
Se abbiamo già un programmatore AVR, la cosa è semplicissima, e non la descrivo qui, anche perchè non tutti possediamo tale accessorio.
Vediamo quindi come usare la nostra Arduino UNO come programmatore ISP.
Si dice che con la UNO non sia possibile ma in realtà con un piccolo escamotage, è possibile bypassare il problema.
Non scoraggiatevi se ci sono problemi di sincronizzazione durante l’upload del bootloader, per ogni problema c’è la soluzione… ma vediamo la procedura.
Per prima cosa consiglio vivamente di utlizzare la versione 0022 dell’IDE di Arduino. Con la versione 1.0 sono riuscito saltuariamente e con difficolta.
Consiglio quindi di tenere le due installazioni del software installate. In una cartella la 1.0 e in un’altra la 0022. Possono coesistere entrambe senza darsi fastidio più di tanto l’una con l’altra.
Apriamo quindi l’IDE 0022 a carichiamo dai file di esempio lo sketch ArduinoISP. Questo esempio permette di trasformare la nostra board in un programmatore AVR. Una volta che l’upload è stato eseguito possiamo collegare la nostra UNO secondo il seguente schema:
Dobbiamo quindi collegare come in figura il pin 10 della UNO al pin RESET dell’Atmega, e i pin 11, 12, 13 ai pin 17, 18, 19 del microcontroller (o ai pin 11, 12, 13 di un’altra board Arduino).
Nello schema non è segnato, ma prima di procedere oltre dobbiamo assolutamente collegare un condensatore da 22uF tra il GND e il RESET della board Arduino altrimenti durante l’upload avverrà l’autoreset e l’IDE darà un errore di sync in fase di upload.
A questo punto possiamo tranquillamente selezionare dal menu Tools –> Board –> Arduino Duemilanove or Nano w/ ATmega328 e lanciare Burn Bootloader –> w/ Arduino as ISP e se tutto è stato eseguito correttamente dovremmo avere il nostro bootloader caricato sul microcontroller, pronto per essere programmato tramite seriale come indicato nel post precedente. La nostra Arduino UNO possiamo invece riprogrammarla normalmente (ricordiamoci di togliere il conensatore inserito precedentemente).
Ovviamente possiamo caricare il bootloader non solo su un Arduino standalone o su breadboard, ma anche su un’altra scheda Arduino UNO, 2009, Mini, ecc.
Se invece volessimo programmare la board con una configurazione minmale, senza oscillatore esterno?
La procedura è leggermente diversa perchè nelle Board predefinite dell’IDE non c’è una configurazione di questo tipo.
Va aggiunta manualmente quindi nel file boards.txt che si trova nella cartella di arduino (sotto hardware\arduino) la seguente configurazione:
############################################################## atmega328bb.name=ATmega328 on a breadboard (8 MHz internal clock) atmega328bb.upload.protocol=stk500 atmega328bb.upload.maximum_size=30720 atmega328bb.upload.speed=57600 atmega328bb.bootloader.low_fuses=0xE2 atmega328bb.bootloader.high_fuses=0xDA atmega328bb.bootloader.extended_fuses=0x05 atmega328bb.bootloader.path=arduino:atmega atmega328bb.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex atmega328bb.bootloader.unlock_bits=0x3F atmega328bb.bootloader.lock_bits=0x0F atmega328bb.build.mcu=atmega328p atmega328bb.build.f_cpu=8000000L atmega328bb.build.core=arduino:arduino ##############################################################
A questo punto avremo uno schema tipo il seguente:
Ricordiamoci sempre di inserire il condensatore da 22uF tra GND e RESET, e verifichiamo che lo sketch ArduinoISP sia caricato sulla nostra board.
A questo punto possiamo caricare il bootloader selezionando Tools –> Board –> ATmega328 on a breadboard (8 MHz internal clock)
Se tutto va bene, dovremmo avere il nostro Atmega328 con il bootloader Arduino caricato e funzionante a 8Mhz. In questa modalità potremo alimentare il nostro circuito definitivo con 3.3V (se vogliamo) permettendo un consumo minore del nostro progetto.
Se l’upload a 16Mhz è andato a buon fine e quello a 8Mhz no, è perchè il primo caricamento di bootloader a 8Mhz va fatto con il circuito configurato ancora con il cristallo esterno, in quanto se togliamo l’oscillatore il circuito non è in grado di comunicare con il programmatore ISP. Successivamento ogni ulteriore caricamento può essere fatto senza il circuito oscillatore.
E qui anticipo una chicca che sarà oggetto del nostro prossimo post. Se io ho finito il mio progetto e quindi non mi serve più utilizzare il bootloader di Arduino (perchè non mi interessa più la possibilità di fare l’upload via seriale – vedi post precedente), posso fare l’upload dello sketch direttamente nella memoria dell’Atmega328 sovrascrivendo il bootloader. E per farlo devo semplicemente utilizzare gli stessi collegamenti visti qui sopra…
Ma per ora ci fermiamo e continueremo a parlarne nel prossimo post.
Ciao Toggio ottima guida.
Ho seguito passo passo ma ho sempre lo stesso errore e non capisco come procedere.
Ecco l’errore:
avrdude: Yikes! Invalid device signature.
Double check connections and try again, or use -F to override
this check.
Ho provato ad utilizzare sia la versione arduino IDE 1.0, 0022 e 0023 ma non cambia nulla. Ho inserito anche il condensatore da 22micro F. I passi che seguo sono:
Eseguo l’upload di ArduinoISP selezionando Arduino UNO come scheda.
Scollego il cavo USB e procedo coi collegamenti come da figura (senza crystal).
A questo punto, lasciando l’integrato sulla scheda arduino UNO e collegando su breadboard il resto seleziono Tools –> Board –> ATmega328 on a breadboard (8 MHz internal clock) poi Burn Bootloader –> w/ Arduino as ISP.
Niente da fare. Non capisco dove sia l’errore.
Caro Michele,
sapessi quanto ho tribulato anche io all’inizio a riuscire a farlo funzionare ‘sto cavolo di Atmega328… ore ed ore con quell’errore senza capire dove stava il problema…
Allora, innanzitutto il problema è abbastanza generico (se non colleghi del tutto l’Atmega328 ti da lo stesso errore!!!).
Detto questo, ti consiglio di effettuare le seguenti verifiche:
1 – Lo sketch ArduinoIsp contenuto nell’IDE 1.0 non funziona!!! Non tanto l’IDE in se, ma proprio lo sketch contenuto in esso, quindi indipendentemente da quali IDE usi, l’upload di ArduinoISP fallo aprendo l’esempio contenuto nella versione 0022 o 0023
2 – Prova innanzitutto a lanciare il “Burn Bootloader” usando come board “Arduino Duemilanove or Nano w/ ATmega328” con cristallo e condensatori (clock a 16Mhz) e verifichiamo se così funziona. Questo perchè se l’Atmega328 non è “vergine” ma è già programmato con il bootloader di Arduino, funziona a 16Mhz e quindi non puù comunicare senza oscillatore esterno
3 – Se la prova seguente è andata a buon fine, allora riprova a programmare l’Atmega328 a 8Mhz, ma LASCIA L’OSCILLATORE ESTERNO LA PRIMA VOLTA CHE ESEGUI QUESTA PROCEDURA
4 – Se invece la prova precedente non è andata a buon fine c’è qualche altro problema. Il problema tipico è quello del condensatore non messo bene che effettua il reset dell’Arduino UNO. Prova a ricollegare tutto da capo, prestando molta attenzione all’ordine del cablaggio. Un trucco potrebbe essere di seguire il seguente ordine: collegare tutto tranne il +5 volts all’Atmega328 da programmare, il condensatore e l’Arduino UNO tramite USB. Collegare Arduino UNO all’USB, collegare i +5 all’Atmega328 e collegare il condensatore
Fammi sapere se sei riuscito, altrimenti proviamo a rivedere il tutto.
Saluti
Ottimo ci sono riuscito grazie ai consigli. Sono arrivato a caricare su atmega328 il boot 8mhz. Fatto questo ho preso l’atmega pronto in configurazione minimal ho tolto da arduino l’atmega328.
Poi ho selezionato lo sketch blink e ho tentato l’upload su breadboard aggiungendo anche il condensatore ma nulla mi riporta errori di tipo stk500_getsync not in sync.
Ciao e grazie
CIao Michele, ricordati che il collegamento deve essere quello riportato qui:
https://arduinoelettronica.wordpress.com/2012/02/06/arduino-standalone-arduino-senza-arduino/
Il collegamento per caricare il bootloader è di tipo SPI, mentre quello per caricare gli sketch su Arduino con bootloader e ti tipo TTL.
Saluti
Ciao Toggio,
in effetti avevo scordato il collegamento corretto. Ora però ho un problema. Temo, nei vari giri e tentativi, d’aver caricato su i miei due ATMega328 il bottloader da 8Mhz.
Ora quando tento di caricare bootloader o altro mi riporta sempre l’errore di sync.
Sai come posso ripristinare il bootloader inziale?
Grazie e saluti
CIao Michele,
per ripristinare il bootloader iniziale, il collegamento è lo stesso, solo che se il bootloader attuale e a 8Mhz, devi fare l’upload del bootloader senza utilizzare i cristalli esterni, poichè in questo momento non è programmato per usare l’oscillatore esterno.
Saluti
Ciao a tutti quando si usa la scheda arduino uno in questa configurazione bisogna togliere il chip atmega che è installato sulla scheda oppure no?
Ovviamente no,
come spiegato nell’articolo devi caricare lo sketch Arduino ISP che va a finire proprio sul chip atmega che è installato sulla scheda. Se lo togli, non può funzionare. Ti confondi con l’altro sistema, quello che permette di caricare gli sketch su un Arduino Standalone con bootloader (vedi https://arduinoelettronica.wordpress.com/2012/02/06/arduino-standalone-arduino-senza-arduino/), in questo caso Arduino diventa un semplice convertitore usb/seriale e, solo in questo caso, va tolto l’atmega dalla scheda Arduino.
Spero di essere stato d’aiuto
A presto
Luca
Ciao, sto provando a programmare un atmega8 con cristallo interno a 8MHZ. La procedura è la stessa? Cosa dovrei mettere dentro il file boards.txt? Ho trovato della roba sui vari siti web, ma non ci riesco!! Vorrei fare un telecomando IR tascabile, senza il cristallo esterno è abbastanza preciso per inviare segnali a 38kHz, che tu sappia?
Grazie,
Daniele
Ciao Daniele,
sull’Atmega8, non è possibile caricare il bootloader di Arduino così com’è.
Puoi programmare però l’Atmega8 con la procedura descritta nel mio articolo “Atmega328 standalone senza il bootloader di Arduino”, oppure seguire la procedura che trovi qui:
http://todbot.com/blog/2009/05/26/minimal-arduino-with-atmega8/
Praticamente va aggiunto il bootloader “ATmegaBOOT.hex” nella cartella bootloader di Arduino.
In ogni caso in boards.txt devi aggiungere la seguente sezione:
##############################################################
atmega8noxtal.name=ATmega8-noxtal @8MHz
atmega8noxtal.upload.protocol=stk500
atmega8noxtal.upload.maximum_size=7168
atmega8noxtal.upload.speed=38400
atmega8noxtal.bootloader.low_fuses=0xe4
atmega8noxtal.bootloader.high_fuses=0xc4
atmega8noxtal.bootloader.path=atmega8_noxtal
atmega8noxtal.bootloader.file=ATmegaBOOT.hex
atmega8noxtal.bootloader.unlock_bits=0x3F
atmega8noxtal.bootloader.lock_bits=0x0F
atmega8noxtal.build.mcu=atmega8
atmega8noxtal.build.f_cpu=8000000L
atmega8noxtal.build.core=arduino
##############################################################
A presto
Luca
grazie mille!! Ho trovato anche una utilissima guida sul sito di menniti: https://arduinoelettronica.wordpress.com/2012/02/07/caricamento-bootloader-su-arduino-standalone-a-16mhz-o-8-mhz-arduino-uno-isp
Ho fatto le prove e funziona!!!
una domanda… per caricare il bootloader su ATMEGA2560 si può utilizzare la stessa procedura
grazie
Teoricamente si…
L’unico modo per scoprirlo è… provare!!! 🙂
Ciao
Ciao a tutti,
io ho cercato di replicare una Arduino Pro Mini da 3.3V e con oscillatore ESTERNO da 8Mhz.
Ho provato a caricare il bootloader con un’arduino Mega 2560, ma il risultato è che dopo aver finito la procedura, quando cerco di caricare un programma, l’IDE mi restituisce l’errore not in sync ecc ecc.
Esiste una soluzione per il problema??
La scheda è praticamente uguale all’arduino pro mini, ma non riesco a farla funzionare!!
Verifichi per filo e per segno tutte i passaggi: c’è sicuramente un problema nel collegamento.
Attenzione che se il voltaggio è 3.3V, deve essere 3.3V anche il convertitore USB seriale.
Inoltre se l’Atmega328 era preprogrammato a 16Mhz, il primo upload va fatto con l’oscillatore a 16Mhz per settare i fuse.
A presto
buona sera. Ho un Arduino Nano che ha funzionato correttamente al primo avvio ma al successivo mi ha chiesto di installare il driver della porta USB (FDTI). Effettuata l’operazione apre la porta COM assegnata (nel mio caso COM 11) ma quando cerco di utilizzare il dispositivo, avendo selezionato e la board Nano e la porta COM, mi dice che questa e’ gia’ occupata. Ho provato a cambiare varie porte ma il risultato non e’ cambiato. Deduzione ho un problema nel riconoscimento della porta COM che pero’ funziona regolarmente con tutte le altre periferiche, gli altri Arduino Uno e UNO32 nonche’ Nano che uso, non contemporaneamente. Ho anche tentato di reinstallare il bootloader ma senza risultati. Ora non so piu’ cosa fare e chiedo se qualcuno ha una qualche idea.
Grazie Steve