Procedura per caricare il bootloader su un chip vergine.
La cosa che apprezzo maggiormente di Arduino è la possibilità di realizzare una propria compatible-board. Questo permette di creare soluzioni integrate che si adattano meglio alle proprie esigenze di sviluppo e di implementazione.
Una volta realizzato un prototipo funzionante con la board ufficiale possiamo rimuovere il chip Atmel per adattarlo su una nostra scheda.
Per realizzare questo lavoro è sufficiente acquistare degli Atmega328P-PU vergini, caricare il bootloader, lo sketch e montare tutto sulla scheda dedicata.
Per poter programmare i nuovi chip con gli sketch è necessario prima di tutto caricare il bootloader al loro interno, questa procedura solitamente viene eseguita tramite un programmatore dedicato che costa qualche decina di euro.
Fortunatamente esiste una tecnica che permette di utilizzare la nostra board Arduino UNO per programmare il nuovo chip. Sul web sono presenti molti esempi che illustrano i collegamenti e spiegano come caricare il bootloader, quasi tutti in lingua inglese; ho deciso, quindi, di scrivere questo articolo per dare la possibilità, soprattutto per i neofiti, di imparare questa utile tecnica.
Prima di iniziare dobbiamo realizzare il circuito seguente:
La tabella seguente riassume i collegamenti tra l’Arduino UNO e il chip ATMEGA328
Arduino UNO | Chip vergine ATMEGA328 |
Pin 5V | da collegare ai pin 7 e pin 20 |
Pin GND | da collegare ai pin 8 e pin 22 |
Pin 10 | da collegare al pin 1 |
Pin 11 | da collegare al pin 17 |
Pin 12 | da collegare al pin 18 |
Pin 13 | da collegare al pin 19 |
Inoltre il pin1 del nuovo chip deve essere collegato alla +5Vdc tramite una resistenza da 10Kohm. I pin 9 e 10 devono essere collegati al quarzo da 16Mhz e ai due condensatori ceramici.
Lo schema proposto utilizza il canale SPI per caricare il bootloader nel chip vergine. Via software è necessario predisporre l’Arduino UNO in modo che funga da programmatore.
Non dobbiamo inventare niente, è sufficiente caricare lo sketch ArduinoISP presente nel menu File->Examples dell’ambiente di sviluppo.
Ora carichiamo lo sketch sul nostro Arduino UNO utilizzando il pulsante upload e attendiamo il messaggio di conferma
A questo punto si potrebbero caricare sul nuovo chip diversi bootloader, a seconda del tipo di board che intendiamo realizzare (l’unica raccomandazione è comunque utilizzare una board compatibile col chip ATMEGA328).
A noi, per ora, ci interessa caricare il bootloader dell’Arduino UNO, quindi dal menu Tools->Board selezioniamo Arduino UNO
Non ci resta che avviare l’operazione tramite il menu Tools->Burn Bootloader-> w/ Arduino as ISP
La scrittura del bootloader richiede qualche minuto. Durante l’operazione i led L, TX e RX sulla board Arduino Uno lampeggiano costantemente e si spengono solo quando la scrittura è completata.
dopo qualche minuto l’editor mostrerà un messaggio dell’avvenuta scrittura del bootloader
Su diversi blog ho letto che questa operazione potrebbe concludersi con l’errore avrdude: stk500_getsync(): not in sync: resp=0x00 avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51.
Ciò può dipendere da errori di connessione risolvibili controllando la corretta porta dove è collegato l’Arduino (Tools->Serial Port) o scollegando e ricollegando il cavo usb.
Se il problema persiste questo può allora dipendere all’autoreset dell’Arduino UNO. Per risolverlo è sufficiente modificare lo schema elettrico aggiungendo una resistenza da 120 Ohm e un condensatore da 10microF che hanno il compito di disabilitare l’autoreset. Ecco lo schema:
Ultimati i collegamenti eseguiamo nuovamente la procedura per il caricamento del bootloader.
Ora che il nuovo chip è dotato di bootloader possiamo montarlo sulla board Arduino Uno per programmarlo con gli sketch di esempio e verificare che tutto funziona regolarmente.
Related posts
26 Comments
Lascia un commento Annulla risposta
Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.
Articoli popolari
Sorry. No data so far.
.Net micro framework Arduino Arduino Webserver Domotica Flyport I2C IOT Netduino OpenPicus raspberry RTC Speed Test
Ciao, complimenti articolo molto interessante.
Cosa hai utilizzato per disegnare lo schema?
grazie,
Luca
Grazie dei complimenti!
per disegnare gli schemi ti faccio fare una risata, uso Paint, proprio quello di Windows!!
Comunque per le cose più serie utilizzo Eagle della Cadsoft (http://www.cadsoftusa.com/)
A presto
Marco
Ciao,
Ottimo articolo, domandina… io ho acquistato e dovrebbe arrivarmi tra pochi gg. un ATmega con Bootloader precaricato per caricare gli sketch devo utilizzare lo stesso schema? come faccio a selezionare su quale Chip fare l’upload dello sketch?
Ciao Pixel
per caricare lo sketch devi utilizzare un diverso schema, precisamente devi utilizzare un convertitore usb-seriale, come questo (http://www.coolcomponents.co.uk/catalog/product_info.php?products_id=356) e collegare tx e rx del convertitore alla porta tx rx dell’atmega. Controlla questa pagine (http://arduino.cc/en/Tutorial/ArduinoToBreadboard) alla sezione Uploading Using an Arduino Board, puoi notare che rimuovendo l’Atmega dalla scheda Arduino puoi utilizzala come semplice convertitore usb seriale. Lo schema da usare è quello che trovi sempre nella stessa pagina.
Se incontri qualche difficoltà fammi sapere se ti posso dare una mano
Ciao e grazie
Ciao,
io è da qualche giorno che provo a caricare il bootloader su un chip vergine seguendo le tue indicazioni, ma non riesco lo stesso a farlo funzionare!
esce sempre questo messaggio:
avrdude: stk500_program_enable(): protocol error, expect=0x14, resp=0x50
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51
Hai qualche consiglio?
Grazie mille,
Francesco
Hai controllato bene i collegamenti? Prova a caricare l’ArduinoISP prima di effettuare i collegamenti e vedi se l’operazione si conclude con successo.
Seleziona la board Arduino Uno e poi riprova a caricare il bootloader.
Fammi sapere…
prova a fare anche questa manovra
1) aprire l’IDE
2) caricare uno sketch qualunque, anche il “blink” modificato (prova a mettere un delay doppio)
3) prendere l’Arduino e tenere premuto il pulsante “reset”.
4) MENTRE si tiene questo tasto pigiato, collegare l’Arduino al PC.
5) adesso, MENTRE si continua a tenere pigiato il pulsantino, premere il tasto di upload dello sketch
6) ora rilasciare il pulsantino di reset
7) se si è trovato la sincronizzazione giusta tra la pressione del pulsante grafico di upload dello sketch ed il rilascio del reset, verrà caricato lo sketch
controlla su questa pagina per altre info
http://arduino.cc/playground/Italiano/Pobleminoti#blocco
Ciao
Marco
Purtroppo niente, da sempre lo stesso errore.
Non so piu dove battere la testa!
Ma questo errore esce ogni volta che carichi uno sketch?
Ciao Marco,
complimenti x l’ottima guida!!!! Sono riuscito a caricare il bootloader, ma se inserisco il chip appena programmato sulla ARDUINO UNO quando accendo lampeggia il LED L e rimane in loop; appena apro la seriale allora manda in run lo sketch. Il caricamento degli sketch è corretto e partono subito appena caricati, ma se spengo e riaccendo rimane in loop con il led che lampeggia (due flash brevi).
Oramai credo di aver consumato i contatti dello zoccolo !!!!! ;-)
Ciao, grazie, Andrea.
Ciao AndreaCH, grazie per i complimenti!
sinceramente non so che tipo di problema sia. Si potrebbero effettuare alcune prove. Potresti provare a caricare lo scketch utilizzando il metodo che ho descritto in questo articolo (https://logicaprogrammabile.it/caricare-sketch-atmega328-stand-alone/), una volta caricato metti l’atmega328 sulla board Arduino UNO e verifica che sia tutto a posto.
Potresti provare anche a caricare uno sketch vuoto:
void setup() {}
void loop() {}
in questo modo il led L dovrebbe rimanere spento.
Da qualche parte avevo letto che potrebbe essere un problema di alimentazione, alimenta la board con una tensione esterna.
Prova un pò e fammi sapere.
Buona sperimentazione
Marco
Ciao Marco,
ho provato con un’alimentatore esterno e tutto funziona regolarmente, come se con i chips programmati da me non funzionassero correttamente alimentati con l’USB.
Grazie x l’aiuto!!!!!
Ciao, Andrea.
Figurati, è stato un piavere!
Probabilmente hai molte periferiche collegate alle porte usb e non riescono ad erogare suficiente corrente per alimentare la board Arduino UNO.
buon lavoro
Marco
Scusate l’ingnoranza, ma questa guida mi interessa parecchio. Cosa significa bootloader?? non riesco a trovare il significato!
Ciao
il bootloader è un piccolo programma che risiede nel chip ATMEGA328. il suo compito è quello di ricevere un programma dalla porta seriale e di memorizzarlo nella rom. In questo modo non hai bisogno di sofisticati programmatori per scrivere i nuovi sketch nell’Atmega328 ma basta semplicemente inviarli tramite la porta seriale.
a presto
Marco
ciao! grazie per questo articolo credo che tu abbia risolto una grande problema a tutti noi semplificandoci la ricerca in internet!
ho una domanda: con board arduino uno è anche possibile caricare il bootloader su altri atmega diversi dal 328? Mi spiego meglio, io vorrei caricare il boot loader su un atmega 168, è possibile farlo con una board arduino uno? grazie mille!!
ciao Enrico
grazie a te per aver letto e commentato l’articolo. Per caricare il bootloader sul 168 devi eseguire la stessa procedura tranne per il fatto che quando scegli la board devi selezionare la voce ‘Arduino Diecimila or Duemilanove w/ ATmega168’. Non ho mai eseguito questa procedura ma credo che dovrebbe funzionare senza problemi.
Divertiti e fammi sapere!
a presto
Marco
ciao Marco, ho seguito il tuo consiglio e i tuoi schemi, ma purtroppo non sono riuscito a caricare il bootloader nel atmega168; ho provato due diverse strade: per prima la tua, con lo schema con il partitore sul reset per evitare problemi in partenza, in questa maniera il compilatore mi da il seguente errore: ( avrdude: stk500_paged_write(): (a) protocol error, expect=0x14, resp=0x64
avrdude: stk500_cmd(): protocol error ) prima di fare il bootloader ho selezionato tra le board la duemilanove con 168, poi ho provato aggiungendo dei condensatori 10nF sui Vcc, e delle resistenze di pull down sugli ingressi per evitare disturbi, ma l’errore è sempre quello.. quando avvio la procedura i tre led lampeggiano per pochi secondi poi si spengono e compare l’errore; ho visto che anche sul sito di arduino è presente un tutorial simile al tuo, ma quello dice che non va bene per board Arduino uno, è forse questo il problema?
grazie dell’aiuto.
Come da mail privata, utilizza la versione 0022 dell’ide piuttosto che la 1.0
ciao
Marco
Semplice e perfettamente funzionante !!
Grazie per l’ottima guida.
Sandro IZ1CIS
Figurati!
Grazie a te del commento e della visita
Marco
Ciao,
complimenti per questo tuo interessante sito su Arduino. Ho comprato questo programmatore che praticamente è un USBasp:
http://www.hobbyking.com/hobbyking/store/uh_viewitem.asp?idproduct=21321&aff=61689
Posso utilizzarlo per caricare il bootloader su un chip vergine usando la tua procedura, al posto della scheda Arduino?
Ciao e grazie!
Ciao
per usare l’USBasp devi selezionarlo nell’apposito menu dell’arduino ide, Strumenti->Programmatore->USBasp
prova e fammi sapere
a presto
Marco
Ho provato, ma ottengo questi errori:
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: error: programm enable: target doesn’t answer. 1
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.
Un dubbio, mentre ricontrollo i collegamenti: cambia qualcosa per il fatto che utilizzo un 168A anziché un 328? Ovviamente nel sottomenu ‘board’ ho provato le varie impostazioni con ‘168’…
ciao
Raffaello
Dovresti usare un 328 e selezionare Arduino UNO come board. L’errore lo ottieni quando carichi il booloader?
Risolto.
C’era un errore nel collegamento del quarzo.
Ho poi selezionato dalla voce ‘board’ una di quelle con il 168, e mi ha caricato il BL :)
Ora, per caricare gli sketch compilati devo usare la seriale, mi chidevo, sarà possibile utilizzare un convertitore USB-seriale (adattando i livelli ovviamente…)
ciao e grazie mille
Ottimo!
certo puoi usare un classico usb-seriale abbinandoci un MAX232 oppure MAX233 per la conversione RS232-TTL
A presto
Marco