Polls

A quale categoria appartienni?

Visualizza risultati

Loading ... Loading ...
Seguimi su Facebook
Seguimi su Twitter
Categorie

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 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.

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=0×00 avrdude: stk500_disable(): protocol error, expect=0×14, resp=0×51.
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

Risorse e letture consigliate

Problemi di Sync (Arduino Forum)

http://arduino.cc/en/Main/Standalone

http://arduino.cc/en/Tutorial/ArduinoToBreadboard

26 risposte a Arduino UNO bootloader su un nuovo chip ATMEGA328

    • Marco scrive:

      Ciao
      per usare l’USBasp devi selezionarlo nell’apposito menu dell’arduino ide, Strumenti->Programmatore->USBasp

      prova e fammi sapere
      a presto
      Marco

      • Raffaello scrive:

        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

          • Raffaello scrive:

            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

            • Marco scrive:

              Ottimo!
              certo puoi usare un classico usb-seriale abbinandoci un MAX232 oppure MAX233 per la conversione RS232-TTL

              A presto
              Marco

  • Sandro Tomasi scrive:

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

  • Enrico scrive:

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

    • Marco scrive:

      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

      • Enrico scrive:

        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=0×14, resp=0×64
        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.

  • Denis scrive:

    Scusate l’ingnoranza, ma questa guida mi interessa parecchio. Cosa significa bootloader?? non riesco a trovare il significato!

    • Marco scrive:

      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

  • AndreaCH scrive:

    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.

    • Marco scrive:

      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

      • AndreaCH scrive:

        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.

        • Marco scrive:

          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

  • Francesco scrive:

    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=0×14, resp=0×50
    avrdude: initialization failed, rc=-1
    Double check connections and try again, or use -F to override
    this check.

    avrdude: stk500_disable(): protocol error, expect=0×14, resp=0×51

    Hai qualche consiglio?
    Grazie mille,
    Francesco

    • Marco scrive:

      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

  • Pixel scrive:

    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?

  • luca scrive:

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

    grazie,
    Luca