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 UNOChip vergine ATMEGA328
Pin 5Vda collegare ai pin 7 e pin 20
Pin GNDda collegare ai pin 8 e pin 22
Pin 10da collegare al pin 1
Pin 11da collegare al pin 17
Pin 12da collegare al pin 18
Pin 13da 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.

Caricare programma Arduino ISP

Ora carichiamo lo sketch sul nostro Arduino UNO utilizzando il pulsante upload e attendiamo il messaggio di conferma

Procedura per caricare il bootloader Arduino

Fase di caricamento dello sketch

caricamento ArduinoISP ultimato

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

Seleziona la scheda Arduino UNO

Non ci resta che avviare l’operazione tramite il menu Tools->Burn Bootloader-> w/ Arduino as ISP

Caricamento bootloader tramite 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.

Fase di scrittura del bootloader

dopo qualche minuto l’editor mostrerà un messaggio dell’avvenuta scrittura del bootloader

scritura bootloader eseguita con successo

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:

Disabilitare autoreset Arduino UNO

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.

Arduino ISP