Nel post precedente abbiamo visto come programmare il bootloader di Arduino su un Atmega328 standalone, mentre in un’altro post abbiamo visto come effettuare l’upload degli sketch sul microcontrollere con bootloader Arduino.
In questo post vogliamo invece evidenziare quella che a mio parere è l’obiettivo finale dei progetti prototipizzati con Arduino: programmare l’Atmega328 senza bootloader, in maniera tale da sovrascrivere con i nostri sketch completamente la memoria del microcontrollore.
Ma per quale motivo dovremo farlo? I principali vantaggi sono l’esecuzione immediata del nostro programma all’accensione dell’Atmega e maggiore spazio a disposizione per i nostri programmi nella memoria del microcontrollore. Lo svantaggio è dato dal fatto che non è più possibile programmarlo tramite semplice seriale (a meno di ricaricargli il bootloader), ma occorre utilizzare un programmatore dedicato (o un ArduinoISP) e il tempo di upload dello sketch e parecchio più lungo. Consiglio quindi di utilizzare eventualmente questa modalità solo a progetto finito, mentre di utilizzare il bootloader di Arduino quando stiamo facendo il debug dei nostri programmi (quindi upload continui).
Ma veniamo alla pratica. La programmazione si attua nella stessa modalità del post precedente, con una piccola modifica. Dobbiamo editare il solito file boards.txt ed aggiungere la riga xxxxxxx.upload.using=arduino:arduinoisp nella configurazione della board che ci interessa programmare, dove xxxxxxx corrisponde al nome della board. Facciamo un’esempio pratico, prendiamo la configurazione da inserire nel file boards.txt che abbiamo visto l’altra volta per l’Atmega a 8Mhz, con questa nuova aggiunta diventerebbe così:
############################################################## atmega328bb.name=ATmega328 on a breadboard (8 MHz internal clock) atmega328bb.upload.protocol=stk500 atmega328bb.upload.maximum_size=32768 atmega328bb.upload.speed=57600 atmega328bb.upload.using=arduino:arduinoisp 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 ##############################################################
Con questa aggiunta specifichiamo che l’upload dello sketch non deve andare a finire sulla nostra Arduino UNO, ma sull’Atmega che vogliamo programmare.
Da notare anche la modifica (opzionale) di atmega328bb.upload.maximum_size il cui valore diventa 32768. Praticamente è lo spazio massimo in byte a disposizione per caricare il nostro sketch. Non essendoci più il bootloader lo spazio liberato rimane a nostra disposizione.
1 – Carichiamo tramite la IDE (versione 0022) lo sketch d’esempio ArduinoISP sulla nostra Arduino UNO
2 – Spegniamo il tutto e poi colleghiamo un condensatore da 22uF tra il RESET e il GND di Arduino UNO
3 – Colleghiamo il pin 10 di Arduino UNO al pin di RESET dell’Atmega e i pin 11,12,13 ai pin 17,18,19 del microcontrollore (o ai pin 11,12,13 di un’altra board Arduino) come nella figura:
4 – Eseguiamo l’upload dello sketch usando il comando tradizionale File –> Upload to I/O board
E il gioco è fatto… Abbiamo programmato il microcontrollore per lavorare in standalone senza bootloader Arduino e senza (o quasi) componenti esterni.
Come vedete è molto semplice e ci permette non solo di programmare gli Atmega328 standalone, ma anche una scheda Arduino completo.
Ad esempio io utilizzo questo sistema con le Arduino Mini Pro. Sono schede economiche, che hanno praticamente tutte le funzionalità della Arduino UNO, ma sono molto piccole. Di solito invece che utilizzare un Atmega328 in standalone all’interno di un progetto ben definito, utilizzo queste piccole schedine, e una volta che il tutto è pronto per essere inscatolato, gli faccio l’upload dello sketch bypassando il bootloader, in particolare modo per renderlo più veloce all’accensione.
Le scheda Arduino Mini Pro è prodotta da Sparkfun ed è disponibile a 3,3V, 5V e con Atmega168 e Atmega328. Io consiglio se gli sketch non superano i 16kB di utilizzare l’Atmega168 e di usare la versione 8Mhz a 3,3V soprattutto se il vostro progetto funziona a batteria perchè consuma parecchio meno.
Ovviamente in fase di programmazione dovremo selezionare la scheda corrispondente dall’elenco delle boards, ad esempio Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega168.
Ma il bello non finisce qui…
Con questo sistema possiamo programmare anche gli Attiny, i fratelli minori degli Atmega. Ne esistono diverse versioni ma i più interessanti sono gli Attiny85 a 8 piedini e l’Attiny2313 a 20 piedini. Hanno il vantaggio che consumano pochissimo, sono più piccoli e più economici.
L’Attiny85 ha solo 5 I/O, ma per tanti progetti va più che bene, considerando anche il costo di circa 2,50 € in Italia.
Inoltre lavorando con clock interno ad 1Mhz il consumo è veramente bassissimo, e la dimensione è come quella di un NE555.
Pensate quindi quanti progetti che possiamo semplificare utlizzando gli Attiny. Anche solo per esempio un controllo PWM di una striscia LED, che richiederebbe operazionali, condensatori, NE555 ecc. con un semplice Attiny85, un potenziometro, un transistor, pochissimi altri componenti e 2 righe di codice, il gioco è bello che fatto…
Al prossimo post allora!
“un altro” e “un esempio” si scrivono senza apostrofo
Hai ragione… lasciamela passare come licenza poetica… 🙂
“… Spegniamo il tutto e poi colleghiamo un condensatore da 22uF tra il RESET e il GND di Arduino UNO …”
Innanzitutto complimenti per le tue guide, finalmente grazie a te sto imparando qualcosa in questo misterioso e affascinante mondo di Arduino. Scusami, ma da newbie non riesco proprio a capire dove va collegato il condensatore, hai una foto?
Ah ok,ho risolto, trovato il reset!! Hem.. ma il condensatore da 22uF da quanti Volts deve essere?
5V è sufficiente!!!
Su molte fonti ho trovato un valore diverso per la capacità del condensatore tra reset e ground, ossia 10uF. Come mai hai scelto proprio 22uF?
E poi un’altra domanda: funziona con l’IDE 1.0.5?
Ho scelto 22uF perchè da 10uF non ce l’avevo, poi ho visto che ha funzionato e per me andava bene così 🙂
Per quanto riguarda la secondo domanda non l’ho testato quindi non saprei!!!
Saluti
Salve, e’ possibile utilizzare Arduino mega al posto della uno per programmare atmega 328.