Fino a qualche settimana fa, nemmeno io sapevo con precisione qual’era la differenza tra Arduino, ed il suo “core” Atmega328.
Leggevo qua e la che l’Atmega328 può lavorare in stand-alone, con o senza il bootloader di Arduino, e addirittura, nella sua configurazione minimale, senza alcun componente esterno.
Ero confuso quindi su cosa facesse esattamente Arduino e su cosa facesse l’Atmega328 “senza Arduino”, non trovando nemmeno tante informazioni in merito su Internet.
Alla fine, con tanta pazienza, “sbocconcellando” qua e la qualche informazione sui vari blog, leggendo riviste e libri specializzati, e facendo delle prove sul campo, finalmente mi si è accessa la lampadina (o il LED) in testa e tutto mi è apparso più chiaro.
Ho deciso quindi di pubblicare questo post dove spiego brevemente ed in maniera semplice (e probabilmente anche in maniera non del tutto professionale – chiedo quindi scusa se ci sono delle imprecisioni) cos’è Arduino e cosa lo differenzia dall’Atmega328 (che è inserito nelle schede Arduino di ultima generazione).
Se dovessi definire il progetto Arduino, lo definirei una piattaforma Hardware e Software opensource, che permette di sfruttare in maniera più semplice e rapida le potenzialità offerte dal microcontrollore Atmega328.
La parte Hardware, tipicamente è rappresentata dalle schede elencate sul sito ufficiale, con tanto di schemi aperti che ci permettono di realizzare da noi le varie schede Arduino o di modificarle e personalizzarle a nostro piacimento. La parte Software invece è raprresentata dal tanto citato bootloader, dalle librerie (presenti sempre sul sito) e dall’IDE, l’interfaccia che permette di programmare e “debuggare” la nostra scheda Arduino.
Ma quali sono le differenze tra Arduino e il suo microcontrollore Atmega328 e quali vantaggi ci offre Arduino nella programmazione del microcontrollore?
Dal punto di vista Hardware, la scheda di Arduino (prendiamo come esempio Arduino UNO) è pronta all’uso: ha tutto quello che ci serve per programmare il microcontrollore collegando la scheda semplicemente alla porta USB del PC; contiene al suo interno un connettore di alimentazione, una porta usb, un integrato che fa da convertitore USB/Seriale, un LED ci accensione, un LED di controllo collegato al PIN 13, due led di segnalazione TX/RX, le strip header femmina per il collegamento degli ingressi/uscite tramite cavetti per breadboard e ovviamente il nostro microcontrollore Atmega328 con bootloader Arduino già caricato.
In questo modo aprendo l’IDE e selzionando la porta seriale del PC possiamo caricare i nostri sketch con un semplice tasto ed in pochi secondi (tipicamente 2-3). L’upload avviene tramite la porta seriale emulata dall’USB, che va a collegarsi ai PIN TX e RX dell’Atmega (piedini rispettivamente 3 e 2).
Dal punto di vista Software , il bootloader precaricato sull’Atmega (indipendentemente che sia montato su una scheda Arduino o semplicemente su una breadboard), è quello che permette la comunicazione seriale con il nostro PC. Senza il bootloader, per caricare gli sketch (i nostri “programmi”), avremmo bisogno di un programmatore per AVR, più costoso, un po’ più macchinoso da utilizzare e più lento nel caricare gli sketch. Il bootloader è quindi un programma, un firmware potremmo dire, il cui compito è praticamente quello di caricare i nostri sketch compilati all’interno della memoria flash del microcontrollore tramite comunicazione seriale, facendo si che tale programmazione non vada a sovrascrivere la zona di memoria dove è presente il bootloader. Quindi quando facciamo l’upload di uno sketch andiamo a scrivere in una zona di memoria libera e il bootloader non viente toccato e rimane integro.
Il vantaggio rispetto all’Atmega senza bootloader come abbiamo già visto è quello di poter effettuare l’upload tramite una semplice comunicazione seriale, e ad una velocità maggiore rispetto a quello che avremmo caricando direttamente gli sketch tramite programmatore AVR.
L’altra parte che riguarda il software sono le librerie incluse nell’IDE di Arduino. Tali librerie aggiungono svariate funzioni e costanti che permettono di semplificare enormemente il codice che andiamo a scrivere rendendolo molto più fruibile rispetto a quello standard del microcontrollore. Il tutto viene gestito tramite l’IDE, che è l’intefaccia di Arduino con cui noi scriviamo gli sketch, li “uploadiamo” e li “debugghiamo”.
Fatta questa premessa (sperando di non avervi tediato e di essere riuscito a spiegare senza creare ulteriore confusione) nei prossimi post andremo a vedere come fare a costruire un’Arduino stand-alone e come programmare un’Atmega328 senza bootloader, soluzione che a volte può risultare vantaggiosa.
Ciao!
mi chiamo Mario, ed ho apprezzato TANTISSIMO il tuo “Facciamo Chiarezza”.
Mi ha aiutato molto.
Sono un veterano dei microprocessori, ed ho SEMPRE COMPILATO i miei programmi per darli “in pancia” al uP. Ora ho voluto provare arduino, e mi sono trovato letteralmente nei casini!
Ho il mio bravo file .hex compilato, che vorrei infilare in qualche modo in un ATMEGA328, ma non ci riesco.
Ho costruito una board, pretendendo di poterlo programmare IN CIRCUIT, come facevo ai miei tempi…
Niente di tutto questo. Non ci riesco. E pare, da quanto scrivi, non sia possibile senza usare sketch.
Ho provato il Ponyprog2000 con un’interfaccia seriale fatta con un cavo USB-seriale, ma niente da fare.
Inoltre, il mio ATMEGA328 l’ho acquistato già programmato con il bootloader.
Non so se serve, se mi da’ fastidio per programmarlo, come cancellarlo/inibirlo per fare la programmazione… insomma sono in alto mare!
Mica potresti darmi qualche dritta?
Ciao Mario,
è tutto abbastanza semplice, soprattutto se provieni già dal mondo dei microcontrollori…
Per programmare IN CIRCUIT, non va bene il cavo USB/Seriale… Quello funziona solo per programmare gli Atmega328 con bootloader Arduino.
Devi usare un programmatore per Atmega (tipo USBTinyISP), e collegarlo correttamente come indicato nel mio articolo sulla programmazione senza bootloader
A questo punto puoi caricare il tutto con Arduino IDE (se hai il programma sorgente) usando il comando “File –> Upload using programmer”. In questo modo sovrascriverai il bootloader di Arduino (che altro non è che un file .hex scritto per permettere il caricamento via seriale).
Se hai già il file .hex e non vuoi usare Arduino IDE, hai varie possibilità. Il Ponyprog2000 non l’ho mai provato, ma probabilmente funziona a patto che tu lo usi un programmatore come USBTinyISP.
Alternativamente puoi usare il programma da riga di comando AVRDUDE:
C:\Arduino\hardware/tools/avr/bin/avrdude -CC:\Arduino\hardware/tools/avr/etc/avrdude.conf -v -v -v -v -patmega328p -cusbtiny -Uflash:w:C:\Users\Luca\AppData\Local\Temp\build297348768681355585.tmp\Blink.cpp.hex:i
Questo è praticamente il comando che usa Arduino IDE quando compili e fai l’upload via programmatore… Facendo così non dovresti avere probelmi…
A presto
Ciao,
ti ringrazio della tua cortese e velocissima risposta!!!
Ti chiedo di scusarmi se approfitto a della tua pazienza, ma ti chiedo ancora un pò d’aiuto per risolvere questo dannato (per me) problema al più presto….
Come ti ho scritto, il programma l’ho già editato e compilato con il compilatore BASCOM, in basic (che conosco, il C++ di Arduino non lo conosco purtroppo).
Non voglio e neanche posso, riscriverlo in C++ (non ne sarei capace, per lo meno in tempi brevi).
Purtroppo, non dispongo della piastrina Arduino (anche se l’ho acquistata DI CORSA su ebay, ieri).
Ora, tu mi dici di acquistare USBTinyISP.
E’ necessario che lo acquisti, se tra qualche giorno dovrei avere l’ARDUINO?
O mi servirà comunque?
Ed inoltre, mi sorge spontanea la domanda: Ma è proprio necessario usare l’ IDE di ARDUINO visto che non programmo in C?
Per me è paradossale, addirittura, dover ricorrere alle righe di programma, tipo DOS, per effettuare una programmazione!!!
Perciò avevo pensato di usare Ponyprog2000, e ho costruito un’interfaccia al micro, seguendo le istruzioni sullo stesso sito di ponyprog, usando un adattatore USB-seriale: ma purtroppo senza successo.
Ponyprog mi dà errore (-24) come se non “sentisse” l’ ATMEGA328.
Inutile dirti, ovviamente, che non ci sono errori di collegamento avendo ricontrollato
A questo proposito, Volevo anche chiederti: ma quanto tempo ci si mette per programmare un ATMEGA328? (più o meno).
Domando, perché ho letto in giro sulla rete, che anche con Arduino è un processo LUNGHISSIMO!
Infine: Ho acquistato dei micro ATMEGA328 con già il bootloader incorporato: ho sbagliato?
E’ possibile “cancellarlo”?, o si può tranquillamente ignorare, seguendo una particolare procedura (che ignoro, anche questa, al momento)?
Chiedo scusa, di nuovo, ma veramente non saprei come districarmi senza aiuto.
ciao
Mario
Ciao Mario,
non preoccuparti, sono qui per questo… 🙂
Cerco di fare un po’ più di chiarezza…
Il sistema ufficiale per programmare l’Altmega328 (lasciando perdere Arduino), è utilizzare AvrStudio e il programmatore dedicato AvrISP mkII… Il software è gratuito, ma il programmatore costicchia…
Arduino è quandi nato come sistema per programmare un’Atmega328 via seriale, utilizzando l’apposito bootloader (un software che permette appunto di fare l’upload e download via seriale standard)…
Se tu vuoi programmare l’Atmega328 senza utilizzare Arduino, e senza utilizzare l’Arduino IDE, o usi il sistema ufficiale di cui sopra, oppure usi un programmatore di terze parti (l’economico USBTinyISP per esempio), e per fare l’upload usi avrdude come indicato nella mia risposta precedente…
Può darsi, ma non se sono sicuro, che possa funzionare anche con Ponyprog2000, con AvrStudio e forse anche con qualche altro software. Il sistema più semplice per me rimane avrdude da riga di comando…
Usando questo sistema sovrascrivi (e quindi cancelli) il bootloader di Arduino.
Altra cosa se invece vuoi programmare l’Atemga328 con bootloader Arduino.
In questo caso o usi sempre avrdude indicando il file .hex, ma usi il convertitore seriale per fare l’upload del file, oppure più semplice usi XLoader, software studiato appunto per fare l’upload di file .hex su piattaforme Arduino.
In questo caso però il tuo Atmega328 avrà comunque sempre il bootloader di Arduino, se vuoi usare l’Atmega328 come vero e proprio microcontroller standalone, devi usare uno dei sistemi indicati prima.
L’unico sistema reale per programmare “In Circuit” resta comunque il programmatore dedicato.
Per quanto riguarda i tempi di programmazione, con Arduino siamo intorno ai 2-3 secondi, con un programmatore dedicato intorno ai 6-7 secondi…
Spero di esserti stato utile
A presto
Ciao,
Grazie moltissime per la tua risposta …. e della tua pazienza! 🙂
Allora, siccome (come ti ho già detto) ho acquistato di corsa una piastra ARDUINO, non vorrei comperare materiale ridondante/inutile.
Mi piace moltissimo l’ Xloader e spero di poterlo utilizzare con successo.
Se non dovessi riuscirci, ricorrerò all’ AVRDUDE come dici tu.
Allora: cerco di “inventare” una procedura passo passo, seguendo quanto mi hai scritto:
Partendo dal fatto che mi piacerebbe utilizzare il programma Xloader, posso usare l’ARDUINO che mi arriverà, per riprogrammare l’atmel, secondo la procedura “PROGRAMMAZIONE SENZA BOOTLOADER” che mi hai indicato prima?
O devo per forza acquistare anche l’ USBtinyISP? Ti chiedo di essere chiaro su questo: ho visto infatti che questa piastrina si trova su ebay o in Inghilterra o peggio ancora in Cina, e io, purtroppo, non ho molto tempo.
Tieni presente inoltre, che a me il bootloader non mi interessa che ci sia o non ci sia.
L’essenziale è che non mi dia “fastidio” sia nella programmazione che nel funzionamento dopo la programmazione, del micro.
Questo perché, una volta programmato, il micro deve funzionare da solo. Sempre.
Altra domanda: Cosa intendi per programmazione IN CIRCUIT? Io intendo il fatto che si possa programmare il micro una volta saldato sul circuito finale e collegandosi solo al conn. ISP (o ICSP). Giusto?
Se è così, perché dici che mi serve il programmatore dedicato? E quale sarebbe? l’ AvrISP mkII ??
In questo caso, stà tranquillo: non voglio acquistarlo (spero!).
Ma dopo tutto questo: Una volta effettuata la fatidica programmazione, come faccio ad essere sicuro che la programmazione è andata a buon fine?
Dalla schemata di Xloader non ci sono “tasti” che mi permettono di leggere l’ ATMEL!
ciao
Mario
Ciao Mario,
mi sa che invece che semplificare, ti ho complicato ulteriormente le cose…
Dimentica tutto quello che ho detto e ricominciamo da capo…
1 – Installa Arduino IDE
2 – Segui la procedura “Programmazione senza bootloader”, fino al punto 3
3 – Usa Avrdude per programmare l’Atmega, con la differenza che al posto del paramentro -cusbtiny devi usare -cavrisp
Questa è la procedura più veloce in assoluto se hai fretta, ma è anche la più complessa…
La più semplice è quella con USBTinyISP, ma devi avre tale programmatore…
Per quanto riguarda le tue domande:
1 – XLoader funziona solo se c’è il bootloader di Arduino
2 – Il bootloader può “dare fastidio”… Principalmente c’è dall’altro codice che viene eseguito dal micro, e questo porta per esempio ad un ritardo di circa 1/2 secondo all’accensione del micro
3 – Per “In Circuit” intendo proprio quello che hai detto tu… Per programmatore dedicato intendo: A) ArduinoISP – B) UsbTinyISP – C) AvrISP mkII – sono tutti equivalenti.. Il concetto è che per fare programmazione “In Circuit”, non puoi usare la seriale, ma un programmatore
4 – Per essere sicuro che la programmazione è andata a buon fine, usando avrdude, ti fa federe la percentuale di completamento, alla fine fine ti dice “avrdude done”
5 – Questa guida ti spiega più o meno come fare quello che vuoi fare tu, cioè programmare un’Atmega328 usando una board Arduino (http://www.sparkfun.com/tutorials/200)
Spero di averti aiutato, rimango comunque a tua disposizione per ulteriori delucidazioni.
A presto
Aggiungo anche qualche link utile:
– Programmatore seriale compatibile Ponyprog: http://it.emcelettronica.com/programmatore-seriale-avr-atmel
– Spiegazione su come programmare AVR in standalone: http://www.logicaprogrammabile.it/caricare-sketch-atmega328-programmatore-av/
– Altro programmatore AVR venduto da sito italiano: http://www.robot-italy.com/it/1300-pololu-usb-avr-programmer.html
Fammi sapere
A presto
ciao! :-)))
Grazie, e grazie ancora per la tua PREZIOSA cortesia!
Il tuo “tutoraggio” sta dando i suoi PREZIOSI risultati!!!
Ieri sera sono riuscito a programmare l’ATMEGA328 utilizzando Ponyprog2000 e un’interfaccia PARALLELA!
“L’inghippo” era spiegato anche nel manuale di Ponyprog:
All’avviso di “Device not present (-24)” dovevo cliccare
su “ignore” anziché “abort” ! ! !
Incredibile!
Comunque ora posso leggere e scrivere comodamente, senza nessun problema e…. SENZA ARDUINO!
Ora però c’è un altro problema:
Il file .hex che ho compilato e programmato NON FUNZIONA!
Nulla di particolare, dirai… è la prima volta che programmi su questo micro..e sono d’accordo!
Però NON MI FUNZIONA NESSUN PROGRAMMA, neanche quelli che sono dati come esempio nel BASCOM.
Ed è in questo che “sniffo” lo zampino del bootloader Arduino, già programmato nel chip.
A questo indirizzo, trovi lo schema elettrico che ho implementato:
Fai clic per accedere a Trash%20Compactor%20-%20Schematic.pdf
potresti darmi un tuo parere, secondo te dove sbaglio ancora?
ciao
Mario59
Ciao Mario,
il bootloader non esiste più… nel momento che programmi, il bootloader viene sovrascritto…
Prova a caricare questo hex: http://www.techsys.it/ajaxplorer/data/public/1cf6105d41e1d75905e16704200e8dab.php?lang=en
Dovrebbe accendere e spegnere una volta al secondo il LED1 collegato alla porta “PC2″…
L’ho scritto e compilato con Arduino IDE.
Se non funziona prova a fare l’upload usando avrdude invece che con il software Ponyprog.
Se non va ancora, a quel punto probabilmente è collegato male qualcosa, oppure sono settati male i fuse per l’oscillatore…
Prova evenutalmente a scollegare l’oscillatore che magari è programmato per andare a 8Mhz invece che a 16Mhz…
Fammi sapere
A presto
Ciao Toggio!
Innanzitutto voglio ringraziarti per aver compilato il programmino! Molto gentile da parte tua!
Ho programmato il chip con Ponyprog2000 e.. voilà! tutto funziona!
Guarda qui un piccolo video della scheda appena programmata!
https://dl.dropbox.com/u/18252828/sdc10887.mpeg
A questo punto sembra lampante che è un problema di parametri di compilazione.
Quindi vorrei farti vedere il sorgente ed il compilato prodotto da BASCOM.
Può darsi che tu riesca a vederci qualcosa di errato:
Il sorgente: https://dl.dropbox.com/u/18252828/tc.bas
Il compilato: https://dl.dropbox.com/u/18252828/tc.hex
ti sarei molto grato se tu potessi fornirmi una qualche dritta.
grazie e… attendo trepidante!!!
ciao
Mario59
Ciao Mario,
dal video il lampeggio sempra che dura 2 secondi, invece che 1 secondo, quindi c’è un primo problema sul clock direi…
Inoltre ho provato a caricare il tuo hex con Xloader su Arduino ed effettivamente non funziona…
Secondo me c’è qualche problema con il compilatore…
Visto che il programma è molto corto io lo rifarei con Arduino…
Il C++ di Arduino è un po’ più semplice di quello dell’AVR e ci sono migliaia di esempi in giro…
Secondo me è la via più semplice…
A presto
Luca
Aspetta…
forse ho trovato…
Prova a sostituire la riga $regfile = “m8def.dat” con $regfile = “m328pdef.dat” o “m328def.dat”!!!
Fammi sapere
A presto
per vedere i links che ti ho messo, apri la pagina con Chrome, IE non funziona bene. ciao!
Ciao Toggio,
si in effetti il problema (per lo meno, penso, il primo di quelli a venire) era proprio nella direttiva $regfile. Infatti adesso, programmato di nuovo il chip, non si blocca più e sul display appaiono i primi “farfugliamenti”…
Ora, vorrei chiederti questo: dato che il compilatore ha già in sè delle macro per pilotare gli LCD, non penso debba preoccuparmi delle tempistiche dei segnali dati allo stesso, non ti pare?
Infatti, per scrivere sul display, devo dare il comando lcd “ciao” per scrivere ciao.
Poi, il simulatore presente nel compilatore, non effettua proprio una simulazione in “tempo reale”, in quanto gli effetti che vedo sul display reale, sono differenti da quello in quello simulato.
Tu che ne pensi?
ciao e grazie infinite di avermi aiutato!
Mario59
Ciao Toggio,
Mi è arrivata una board, l’ Arduino Duemilanove. Ora vorrei chiederti: usando questa pagina che mi hai indicato giorni fa:
http://arduino.cc/en/Tutorial/ArduinoISP
E’ possibile caricare UN QUALSIASI SOFTWARE sul secondo ATMEGA328? Oppure questo schema di collegamento serve soltanto per caricare e/o ricaricare un bootloader in un ATMEGA “vergine”?
Inoltre vorrei chiederti: Come è possibile che il mio compiler BASCOM generi un codice errato, per cui non riesco a pilotare correttamente l’LCD?
Vorrei sapere se a te è mai capitata una cosa del genere.
Grazie se potrai rispondermi.
ciao
Mario
Ciao Mario,
si, Arduino Duemilanove dovrebbe essere ingrado di caricare qualsiasi software sul secondo Atemga328,
Per quanto riguarda BASCOM, non so esattamente quale sia il problema, ma per mia esperienza ci vuole un po’ a collegare correttamente l’LCD, quindi credo sia un problema di connessione.
Un consiglio spassionato: passa al C++ per la programmazione… Anche se inizialmente può sempbrare più difficile, hai i seguenti vantaggi:
1 – E’ più standard
2 – E’ più potente e flessibile
3 – Trovi infinitamente più esempi in giro per la rete
Io non sapevo (e non so) minimamente programmare in C++, ma prendendo gli esempi già fatti e cercando nei vari tutorial ho imparato il C++ di Arduino senza difficoltà…
A presto
Luca