Arduino UNO bootloader su un nuovo chip ATMEGA328

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

 

26 risposte a Arduino UNO bootloader su un nuovo chip ATMEGA328

  • Ciao, complimenti articolo molto interessante.
    Cosa hai utilizzato per disegnare lo schema?

    grazie,
    Luca

  • 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,
    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!

  • 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 (http://www.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.

  • Semplice e perfettamente funzionante !!
    Grazie per l’ottima guida.
    Sandro IZ1CIS

  • 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

Preferiti
Rimani aggiornato

Sondaggi
Sorry, there are no polls available at the moment.
Seguimi su Twitter