In generale Arduino è una scheda elettronica con microcontrollore integrato ideata qualche decennio fa da Massimo Banzi con la quale si possono realizzare diversi progetti interessanti, come ad esempio una casa domotica oppure una serra smart.
Si tratta di un prodotto che si è diffuso rapidamente nel tempo e questa crescita esponenziale ha fatto si che venissero create diverse versioni della scheda stessa per rispondere alle varie esigenze degli utenti.
In questo articolo ci concentreremo sul modello Arduino Uno, ovvero il modello base dal quale poi sono state create diverse varianti.
Cos’è Arduino Uno
Arduino Uno è un dispositivo che permette di realizzare circuiti elettronici, e offre la possibilità di interagire con il sistema esterno tramite pin.
La scheda oltre a possedere 6 ingressi per l’acquisizione e l’elaborazione di segnali analogici e 14 pin digitali che possono ricevere o trasmettere dati, possiede alcuni pin dedicati a funzioni specifiche:
- IOREF: restituisce in uscita il valore di tensione con il quale è alimentato il microcontrollore e serve per fare in modo che tutti i dispositivi connessi utilizzino la stessa tensione del microcontrollore;
- RESET: utilizzato per resettare il microcontrollore;
- 3V, 5V: erogano le rispettive tensioni;
- GND e Vin: sono i pin della tensione 0V (GND) e della tensione in ingresso (Vin);
- TX e RX: usati per la comunicazione USART;
- SS, MOSI, MISO, SCK: usati per la comunicazione SPI;
- ICSP: usati per programmare il microcontrollore via ICS.
Il core di Arduino Uno
Un microcontrollore è un dispositivo elettronico integrato su singolo chip che viene spesso impiegato in sistemi embedded (sistemi progettati unicamente per un determinato utilizzo) ed è in grado di interagire direttamente con il mondo esterno tramite un programma memorizzato al suo interno e una serie di pin fisici.
A differenza dei microprocessori, anche se hanno capacità di calcolo ridotte, i microcontrollori non hanno bisogno di componenti esterni per poter funzionare. Infatti, è tutto incluso all’interno del chip:
- la memoria per il programma;
- la memoria RAM;
- l’oscillatore di clock;
- il circuito di reset;
- le periferiche.
Un’altra sostanziale differenza tra un microprocessore installato su un classico personal computer e un microcontrollore è il tipo di architettura interna.
Mentre nel primo caso si parla di architettura di Von Neumann (la quale prevede che dati e istruzioni condividono la stessa memoria), nel caso dei microcontrollori si parla di architettura Harvard in cui dati e istruzioni risiedono in memorie separate, rispettivamente in una memoria SRAM e in una memoria Flash.
Architettura Harvard.Su Arduino Uno è installato il microcontrollore ATmega328 che fa parte della famiglia di microcontrollori RISC (Reduced Instruction Set Computer) e prodotto dall’azienda Atmel.
Il microcontrollore ATmega328 include tre tipi di memoria:
- Flash Program Memory: ha una capacità di 32KB ed è una memoria non volatile contenente il programma (sketch) che viene eseguito da Arduino. Può essere riprogrammabile fino a 10.000 volte;
- SRAM (Static Ram): ha una capacità di 2KB ed è utilizzata a runtime per memorizzare le variabili;
- EEPROM (Electrically Erasable Programmable ROM): ha una capacità ridotta di un 1KB in cui vengono salvati a lungo termine eventuali dati e parametri di configurazione. Può essere riscrivibile almeno 100.000 volte.
Protocolli di comunicazione
I bus paralleli offrono velocità di trasferimento molto elevate ma al tempo stesso sono difficili da realizzare fisicamente. Infatti, un bus di questo tipo è costituito da molti fili e fin quando il numero di periferiche da collegare al microcontrollore è basso non ci sono particolari problemi. Le complessità crescono all’aumentare delle periferiche.
Ad esempio, un bus ad otto linee per la comunicazione ha bisogno di almeno otto pin a disposizione sull’integrato, di conseguenza anche le dimensioni di quest’ultimo dipendono dal bus.
I protocolli seriali hanno l’obiettivo di risolvere tutti i problemi appena citati della comunicazione parallela.
I2C
Il protocollo I2C è uno standard seriale realizzato nel 1980 da Philips e sostanzialmente consente il collegamento di un numero elevato di periferiche sullo stesso bus, anche se la comunicazione è permessa tra due soli dispositivi per volta.
Ogni tipo di periferica collegata si distingue dalle altre attraverso un indirizzo univoco assegnatogli dalla casa produttrice e in parte dal progettista. Un limite derivato da tutto questo è che su un bus non è possibile collegare due periferiche dello stesso tipo.
Quest’idea però non è del tutto insensata in quanto, ad esempio, se si considera una periferica come un real time clock, è plausibile pensare che su un bus è sufficiente collegarne solo uno.
In ogni caso alcuni dispositivi come, ad esempio, la memoria 24LC256 della Microchip possiede tre pin in uscita A0, A1 e A2 tramite i quali è possibile modificare i 3 bit meno significativi dell’indirizzo totalizzando in tutto otto indirizzi a disposizione per lo stesso dispositivo.
Gli indirizzi possono essere di due tipi:
- Versione standard, l’indirizzo è costituito da 7 bit con la possibilità di indirizzare fino a 128 periferiche;
- Versione estesa, l’indirizzo è costituito da 10 bit con la possibilità di indirizzare fino a 1024 periferiche;
In realtà non tutti gli indirizzi sono disponibili in quanto alcuni sono destinati a funzioni speciali. Questo vale sia per indirizzi standard che per quelli estesi. Quindi il numero massimo di periferiche che è possibile connettere sul bus è imposto dalla versione dell’indirizzo.
Le periferiche che sfruttano di più il protocollo I2C sono memorie, display LCD e real time clock.
Nel corso degli anni il protocollo è stato aggiornato per andare in contro alle nuove esigenze dell’elettronica. Tuttavia, le modifiche non hanno introdotto problemi di compatibilità in quanto vengono sempre apportate dall’alto verso il basso e ciò permette una comunicazione efficace tra dispositivi di diverse generazioni.
Inizialmente la velocità di trasmissione prevista dal protocollo era di 100Kbit/s, mentre con il passare del tempo si è arrivati prima a 400Kbit/s nel 1992 e poi fino a 3.4Mbit/s nel 1998.
I principali vantaggi di I2C sono:
- la semplicità di utilizzo da parte del progettista dovuta al fatto che tutte le regole che bisogna rispettare come da protocollo vengono gestite a livello hardware;
- la scalabilità del sistema dovuta al fatto che è possibile aggiungere o togliere delle periferiche del bus senza intaccare le altre parti del circuito;
Il protocollo I2C sfrutta l’architettura Master/Slave, il cui funzionamento prevede un dispositivo detto master che prende il controllo del bus (avvia e termina l’interazione) e un dispositivo slave che risponde ai comandi del primo (riceve o trasmette informazioni).
Non tutti i dispositivi possono svolgere il ruolo di master, ad esempio può esserlo un microprocessore ma non una memoria per il mantenimento dei dati. Su uno stesso bus più dispositivi non possono essere master contemporaneamente, in tal caso lo è chi ha iniziato la comunicazione mentre l’altro viene considerato slave.
Un bus I2C è un sistema half-duplex formato da due linee nominate SDA e SCL. La linea SDA (Serial Data) è utilizzata per il trasferimento dei dati in formato ad 8 bit, questa linea assume un valore valido solo se la linea SCL è al livello basso. Invece, la linea SCL (Serial Clock) è utilizzata per sincronizzare la trasmissione. Il clock è controllato dal dispositivo master. Tramite questo tipo di comunicazione tutti i dispositivi possono sia trasmettere che ricevere.
La comunicazione I2C tra due dispositivi viene avviata dal master dopo aver verificato che sul bus non ci sono altre comunicazioni in corso (entrambe le linee sono al livello alto). A questo punto viene inviata la sequenza di start, ovvero il master porta la linea SDA al livello basso mentre il livello di SCL è alto.
Considerando il caso in cui gli indirizzi siano da 7 bit, dopo la sequenza di start il master invia sul bus l’indirizzo del dispositivo (dal bit più significato al meno significativo) con il quale vuole avviare la comunicazione seguito da un bit che indica il tipo di operazione richiesta, quindi il bit 0 corrisponde alla scrittura sulla periferica mentre il bit 1 indica che vuole leggere da quest’ultima.
Invece, nel caso in cui gli indirizzi siano in versione estesa e quindi da 10 bit, per l’identificazione della periferica il master dovrà inviare un secondo byte. Per evitare incomprensioni da parte dei dispositivi sull’identificazione dell’indirizzo, scambiandolo per uno da 7 bit, vengono utilizzati degli indirizzi speciali. Si tratta di indirizzi il cui primo byte è rappresentato dalle combinazioni 11110XYZ (X e Y sono i primi due bit dell’indirizzo e Z indica l’operazione scrittura/lettura), mentre gli altri 8 bit dell’indirizzo vengono inviati con il secondo byte.
Una volta inviato l’indirizzo, il master attende la risposta della periferica richiesta (la periferica in causa trasmette al master un bit di acknowledgment) e di seguito inizia la trasmissione di dati tra i due. Per chiudere la comunicazione e liberare il bus, il master invia la sequenza di stop, ovvero porta la linea SDA al livello alto quando il livello di SCL è alto.
UART
UART (Universal Asynchronous Receiver / Transmitter) è un protocollo che consente la trasmissione seriale di dati bidirezionale. La comunicazione non è sincronizzata da un segnale di clock, perciò si dice asincrona. Inoltre, il sistema è full-duplex, infatti i dispositivi possono trasmettere e ricevere dati contemporaneamente tramite la presenza di due linee:
- TX (linea per la trasmissione);
- RX (linea per la ricezione).
Protocollo SPI
Il protocollo SPI è di tipo sincrono e full-duplex. Anche questo caso si parla di comunicazione tra dispositivo master e dispositivi slave. Le linee condivise sono quattro e sono le seguenti:
- SCLK: serial clock gestito dal master;
- MISO: ingresso per il master e uscita per lo slave;
- MOSI: uscita per il master;
- CS: è la linea chip select usata dal master per scegliere il dispositivo con il quale comunicare.
Conclusioni
Per concludere, Arduino Uno è il modello entry level per iniziare a capire come funziona il mondo delle schede elettroniche con microcontrollore e come si programmano. Si tratta di un prodotto economico e altamente compatibile.
Si possono realizzare diversi progetti interessanti. Ovviamente, dovrai comprare tutti i componenti accessori di cui avrai bisogno (led, resistori, jumper, breadboard, sensori vari, ecc…) per il tuo progetto. Valuta anche l’acquisto di un kit già completo.