Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Si tratta di una piccola scheda con un microcontrollore, ideata ad Ivrea per consentire a designer e
creativi di realizzare prototipi di progetti in breve tempo (prototipazione veloce).
Principalmente :
- Economicità
A differenza di altri sistemi di sviluppo, l’ambiente di programmazione è gratuito.
Il costo di una scheda arduino Uno originale è di circa 20 euro, ma esistono cloni che si possono
acquistare per una decina di euro (Amazon) o anche meno (ebay, Ali express, ecc…).
Sempre su Amazon, si possono acquistare 5 schede arduino Nano per 15 euro.
- Multi piattaforma
L’ambiente di sviluppo (IDE=Integrated Development Environment) può essere installato su PC
dotati di sistemi operativi Windows, Mac OS, Linux, senza grandi differenze prestazionali.
- Sistema aperto
Oltre a tutti i sorgenti della IDE e delle librerie, sono liberamente disponibili gli schemi elettrici e il
disegno dei circuiti stampati di tutte le schede arduino.
E gli svantaggi ?
Le schede arduino
Ci sono molti tipi di schede arduino in commercio, alcune originali prodotte in Italia, altre
legalmente prodotte altrove (Cina, USA).
Riporto solo quelle più diffuse.
La più utilizzata e copiata è senza dubbio arduino Uno, dotata di microcontrollore ATMega 328 con
32KB di memoria flash (per contenere i programmi), 2KB di RAM (per le variabili), 1KB di
EEPROM (per i dati che devono essere mantenuti anche in assenza di alimentazione), frequenza di
clock 16 Mhz (1 istruzione in linguaggio macchina ogni 62,5 ns), ADC a 10 bit con 6 canali,
contenitore 28 piedini dual in line e svariate periferiche.
La scheda dispone di 14 piedini di ingresso – uscita digitali, 6 ingressi analogici che all’occorrenza
possono essere utilizzati come ingressi – uscite digitali, interfaccia USB per l’alimentazione ed il
trasferimento dei programmi, connettore per alimentazione esterna da 7 a circa 12 V.
Inoltre sono presenti un pulsante di reset, 4 LED che segnalano: presenza di alimentazione (ON),
traffico dati sulla porta seriale (TX e RX) ed un LED (L) collegato al piedino 13. I piedini 0 e 1
sono anche ingresso e uscita della porta seriale e non sono utilizzabili durante il trasferimento dei
programmi. I piedini contrassegnati con ~ sono utilizzabili come uscite in PWM, come descritto più
avanti. Sui piedini POWER sono disponibili le tensioni di 5V (max 200 mA) e 3,3V (max 50 mA),
che si possono usare per alimentare dispositivi esterni. Il “Francobollo” nero vicino alla porta USB
è un altro microcontrollore (ATMega 16U2) che si incarica della conversione da USB a seriale e
viene utilizzato per il trasferimento dei programmi. Tutti i piedini digitali lavorano a livelli logici
TTL (0 e 5V), mentre gli ingressi analogici accettano tensioni da 0 a 5V che convertono in un
Qui di seguito viene riportato uno schema che evidenzia le funzioni assegnate ai vari piedini.
Talvolta il numero di piedini risulta insufficiente per le applicazioni più complesse; in tal caso è
disponibile la scheda arduino Mega 2560. L’inconveniente è che il microcontrollore ha un
contenitore SMD, se si brucia non conviene sostituirlo ma buttare la scheda. I cloni cinesi sono
venduti a 13 – 15 euro (Amazon).
Vi sono ben 54 ingressi – uscite digitali, 16 ingressi analogici e 4 porte seriali. La memoria flash è
di 256KB e aumenta anche la RAM (8KB) e la EEPROM (4KB).
Per applicazioni che richiedono spazi ridotti, una valida alternativa è costituita dalla scheda arduino
Nano. Il processore è sempre un ATMega 328, ma in versione SMD ed i segnali disponibili sono
praticamente gli stessi di arduino Uno. Fanno eccezione gli ingressi analogici che salgono a 8.
Il connettore USB è dipo MINI-USB, meno diffuso rispetto al MICRO-USB. I cloni di arduino
Nano si possono reperire su Amazon (5 schede a 15 euro), ebay, Ali express, ecc...
Sul lato inferiore della scheda si trova l’integrato preposto alla comunicazione con il PC. Nelle
schede originali è un FT232, in quelle cinesi è un CH340 o CH341 e richiede, sui sistemi operativi
Windows, un driver particolare reperibile in rete. Il sistema operativo linux riconosce la scheda
senza la necessità di scaricare alcunchè.
Da notare che gli ingressi – uscite digitali sono numerati in modo diverso, la porta seriale non viene
più utilizzata per comunicare con il PC e dispone di soli 4 ingressi analogici (ma altri sono
disponibili in condivisione con i piedini digitali).
In commercio esistono molte altre schede arduino, alcune dotate di connessione WiFi, con
processori ARM a 32 bit, inseribili nei capi di vestiario, ecc…, ma quelle elencate sono, a mio
avviso, le più interessanti per applicazioni didattiche.
L’ambiente di sviluppo (d’ora in poi denominato IDE) è scritto in Java e pertanto, multi piattaforma.
La programmazione avviene tramite linguaggio C/C++ ampliato con funzioni specificatamente
scritte per le schede arduino. Non sono utilizzabili le comuni istruzioni di input – output su
terminale (printf, scanf, cin, cout), com’è ovvio quando si lavora con i microcontrollori.
Vediamo ora quali sono i comandi principali della IDE, riferendoci alla figura che segue.
La IDE comprende una serie di programmi esemplificativi e di librerie di base, accessibili dal menù
File→Esempi; ulteriori librerie possono essere scaricate dal menù Sketch→#include libreria →
Gestione librerie (è necessario essere connessi a internet).
Ogni libreria, a sua volta, contiene una serie di esempi di utilizzo che possono essere modificati e
inclusi nei nostri programmi.
Qualora si volesse utilizzare una libreria scaricata da internet e che non viene elencata tramite
Gestione librerie, è possibile utilizzare la voce del menù Sketch→#include libreria → aggiungi
libreria da file zip (ovviamente dovrà essere un file compresso .zip).
La IDE comprende molte altre funzionalità, come la numerazione delle righe, ecc… ma per iniziare
possono bastare le precedenti informazioni.
I microcontrollori delle schede arduino contengono un piccolo programma, il “Bootloader”, situato in
un’area protetta della memoria flash. Tale segmento di codice si occupa della comunicazione tra scheda e PC
e, nell’arduino Uno occupa 512 Byte.
Ogni programma per arduino deve contenere obbligatoriamente almeno due funzioni: setup() e
loop().
La funzione setup() non ritorna alcun valore (void) e viene eseguita una sola volta, in genere
all’inizio del programma. In questa funzione si inseriscono le istruzioni di inizializzazione, ad
esempio se un dato piedino deve essere d’ingresso o d’uscita.
Anche la funzione loop() non ritorna alcun valore (void) ma le istruzioni al suo interno vengono
eseguite ciclicamente come se fossero all’interno di un ciclo infinito for(; ;) o while (1).
Ciò rispecchia il modo tipico di programmare i microcontrollori: dopo una fase di inizializzazione si
passa ad un ciclo infinito che viene interrotto solo dall’assenza di alimentazione.
Nota per i più smaliziati: sì, arduino gestisce anche gli interrupt (attenti alle variabili dichiarate volatile).
Riassumendo, la tipica struttura di un programma per arduino può essere la seguente:
- commento che spiega cosa fa il programma, quando è stato scritto, come lo fa, chi ne è l’autore
- eventuale inclusione di librerie esterne
- dichiarazione / inizializzazione delle costanti
- prototipi delle eventuali proprie funzioni
- dichiarazione / inizializzazione delle variabili globali
- void setup() {
- istruzioni di inizializzazione (porte di ingresso / uscita, ecc…)
-}
Tipi di dati
Arduino riconosce quasi tutti i tipi di dati del linguaggio C, ma ne aggiunge alcuni e altri li tratta in
maniera particolare. Teniamo presente che stiamo lavorando con un microcontrollore a 8 bit che ha
una quantità di memoria (in particolare, RAM) esigua se paragonata ad un PC.
E’ opportuno fare allora una raccomandazione: usiamo le grandezze in virgola mobile (float) solo se
indispensabili; infatti, la gestione dei float richiede una libreria, caricata automaticamente, che
occupa qualche kilobyte di memoria flash e rallenta notevolmente l’esecuzione del programma
(millisecondi, invece di microsecondi).
E’ chiaro tuttavia, che se ho bisogno di visualizzare la temperatura rilevata da un sensore con una
risoluzione di un decimo di grado centigrado, non posso esimermi dall’utilizzare i float, a meno di
contorsioni logiche che riducono la leggibilità del mio programma.
Arduino riconosce, tra gli altri, i seguenti tipi di dati:
Una nota particolare riguarda i sistemi di numerazione riconosciuti da arduino. Oltre al sistema
decimale, viene accettato quello esadecimale del C (esempio: 0x12f4) ed anche quello binario.
Una costante binaria deve essere preceduta dalla lettera B (es: int binario_triste = B0111001;).
Inserito il programma, bisogna verificarne la sintassi (icona col segno di spunta) e trasferirlo (icona
con freccia verso destra) alla scheda precedentemente collegata al PC mediante cavo USB.
Godersi lo spettacolo e manifestare ampia soddisfazione.
Nel secondo esempio, buono per le prossime feste natalizie, vengono collegati 9 LED con le
relative resistenze in serie (330 o 390 o 470 ohm) ai piedini indicati nel programma seguente (dal 5
al 13). I catodi dei LED vanno collegati alla massa (terminale GND) di arduino, gli anodi, ciascuno
in serie con la propria resistenza, ai piedini di arduino.
void setup() {
for (int i = 0; i < 9; i++)
pinMode(led[i], OUTPUT);
}
void loop() {
for (int i = 0; i < 9; i++) {
digitalWrite(led[i], HIGH);
delay(100);
digitalWrite(led[i], LOW);
delay(100);
}
for (int i = 0; i < 7; i++) {
digitalWrite(led[7-i], HIGH);
delay(100);
digitalWrite(led[7-i], LOW);
delay(100);
}
for (int i = 0; i < 9; i++) {
digitalWrite(led[i], HIGH);
Sempre per i più esigenti: come faccio a comandare più uscite con una sola istruzione ?
Usando le vere istruzioni del micro in C, che si possono inserire anche nella IDE di arduino.
Lo ATMega328 dispone di 3 porte: la porta B (6 bit), la porta C (7 bit, ma il 7° è il reset, lasciatelo stare per carità) e la
porta D (8 bit, i bit 0 e 1 sono associati alla seriale). Ciascuna porta ha due registri: un registro di direzione DDRx
(x=B,C,D) e un registro dati PORTx (x=B,C,D).
Per porre un bit di una porta in ingresso bisogna settare a 0 il bit corrispondente nel registro DDR. Per porre un bit di
una porta in uscita bisogna settare a 1 il bit corrispondente nel registro DDR.Esempio: con l’istruzione
DDRB = B111111; imposto i 6 bit come uscite; poi con l’istruzione PORTB = B010101; mando in uscita sui 6 bit la
configurazione 010101. Posso usare gli operatori sui bit (&, |, ^, ~, >>, <<) per manipolare uno o più bit alla volta (ad
esempio, per mascherarne alcuni).
Perchè non c’è la porta A ? Per compatibilità con il resto della famiglia dei microcontrollori AVR ATMega.
Dopo aver illustrato hardware e software di arduino Uno e dopo aver visto come inserire, compilare
e provare il programma che fa lampeggiare un LED, solitamente propongo agli studenti di
realizzare in laboratorio un gioco di luci, come quello trattato in precedenza. Questo serve per
familiarizzarsi con le uscite digitali e ripassare un po’ di linguaggio C (cicli, vettori e funzioni).
Poi, in classe, spiego come funzionano i display a 7 segmenti (anodo e catodo comune) e propongo
di realizzare un programma che visualizza il conteggio da 0 a 9, ciclicamente. Le soluzioni degli
studenti prevedono un numero enorme di digitalWrite per accendere e spegnere i segmenti del
Abbiamo visto come arduino rappresenti una valida piattaforma per la prototipazione veloce; ma
una volta testato il prototipo, come si fa a realizzare il circuito finale ?
In effetti, una volta programmato il microcontrollore, la porta USB non ci serve più e con essa
anche il micro che si occupa della conversione seriale TTL – USB.
In commercio esistono degli ATMega-328P-PU già programmati con il bootloader (costo: circa 5
euro); è sufficiente uno di questi, un quarzo da 16 Mhz, un paio di condensatori da 22 pF e una
resistenza da 10 K per realizzare un arduino su breadboard.
Basterà allora, programmare il microcontrollore inserendolo nello zoccolo di una scheda arduino
Uno, toglierlo e spostarlo nel progetto finale.
Con qualche complicazione in più si può anche evitare lo scambio di integrati e programmare
direttamente il microcontrollore target attraverso il bus SPI usando come programmatore una
scheda arduino Uno. In rete si trovano tutorial che spiegano come fare.
Ma dal punto di vista economico, ha senso una tale operazione quando si possono acquistare 5
arduino Nano per 15 euro, perciò con un costo unitario di 3 euro ?
Direi di no.
Volendo comunque intraprendere questa strada, occorre tenere presente la corrispondenza tra la
piedinatura delle schede arduino e quella del microcontrollore ATMega-328P-PU che riporto nella
figura seguente.
Sitografia
www.arduino.cc Il sito del progetto arduino, in inglese, contiene una moltitudine di tutorial,
progetti, il riferimento per il linguaggio di programmazione, esempi di interfacciamento con i più
disparati tipi di trasduttori, ecc…
www.arduino.cc/en/Main/Software sito dove si effettua il download della IDE per i diversi sistemi
operativi.
www.mauroalfieri.it In italiano, sito di un collega che contiene corsi online a diversi livelli di
difficoltà e moltissime informazioni e progetti utili.
www.instructables.com/ Qui si trovano molti progetti realizzati dagli utenti della rete, spiegati in
modo semplice, passo dopo passo.
Poi, su YouTube, si trovano moltissimi video tutorial, anche in italiano, ma fate attenzione perché ci
sono anche esempi errati.