Il microcontrollore è il dispositivo digitale che ha maggiormente caratterizzato lo sviluppo dell'elettronica a partire dalla seconda metà degli anni '90; esso è caratterizzato da una elevata versatilità, unita ad una potente capacità di elaborazione e da una estesa capacità di immagazzinamento della memoria.
Lo sviluppo del microcontrollore (µC) ha permesso all'elettronica di espandersi capillarmente in tutti i settori tecnologici.
Alcune aree di applicazione del microcontrollore sono:

Elettronica di consumo Industria
Cellulari e GPS PLC
Giochi elettronici controllo di processi
Orologi digitali Robotica
Impianti antifurto Navigazione avionica
Condizionatori termici Autronica
Domotica Trasmissione dati
Foto e videocamere Telefonia
Lettori audio e video Pannelli luminosi

 

Strumentazione Commercio
Apparecchi di misura Bancomat
Monitoraggio Terminali punti vendita
Analisi di laboratorio Distributore di alimenti
Autodiagnostica Fotocopiatrici Fax
Strumenti elettromedicali Editoria
Sistemi di sicurezza  
Sistemi di puntamento  

 

La centralità di questo componente nella moderna progettazione, rende obbligatoria, da parte di ogni tecnico elettronico, la conoscenza non solo della sua struttura hardware ma anche del suo linguaggio di programmazione. La distinzione tra abilità hardware ed abilità software, che fino ai tempi recenti distingueva i progettisti, è diventata con il microcontrollore è stata superata.
In generale, i microcontrollori vengono usati in applicazioni che richiedono un livello di complessità minore rispetto a quelle che coinvolgono l'uso dei microprocessori; il loro impiego è orientato alla gestione di apparati relativamente semplici che hanno un livello di complessità medio-basso come lavatrici, forni, apparecchi per la distribuzione di alimenti etc..

STRUTTURA
I microcontrollori (µC) sono circuiti integrati digitali che nella forma più ridotta, contengono in un unico chip un microprocessore (µP o CPU) una memoria di programma di tipo non volatile (ROM), una memoria dati volatile (RAM) un'unità di ingresso-uscita (I/O) ed almeno un timer.

La memoria di programma può essere di tipo PROM in tal caso il µC può essere programmato solo per una volta oppure di tipo EPROM o E2PROM nel qual caso può essere riscritta più volte.
I µC più complessi sono dotati al loro interno di svariate periferiche come comparatori, convertitori analogico-digitali, generatori di segnali PWM (Pulse Widht Modulation) porte di comunicazione seriale, sistemi di comunicazioni ad onde, e così via.
La maggioranza presenta un parallelismo a 8bit ma ormai sono frequenti anche dispositivi a 16 o 32bit.
La potenza di elaborazione, l'elevato numero di linee di I/O, la disponibilità di periferiche di tutti i tipi, le ridotte dimensioni, la comodità dell'ambiente di sviluppo , la ripetibilità illimitata della programmazione rendono il microcontrollore ideale per le cosiddette applicazioni embedded nelle quali il dispositivo è incorporato nell'apparecchiatura o nella macchina da controllare.
Grazie a questa innovativa filosofia di progettazione non c'è ormai più un'apparecchiatura anche di dimensioni ridotte che non abbia il suo µC incorporato. Si parla infatti dei µC come di un dispositivo embedded cioè incorporato in un apparato più grande in grado di facilitare le funzioni di quest'ultimo. Infatti, non bisogna solo pensare ad oggetti sofisticati come telefoni cellulari, lettori MP3 o DVD , i moduli di localizzazione GPS, i ricevitori TV ma anche ai più famigliari elettrodomestici (domotica).
Si potrebbe continuare parlando delle applicazioni nell'industria degli autoveicoli, terreno preferito per le applicazioni embedded (autronica) e di quelle macchine intelligenti che erogano denaro (bancomat) controllano il pagamento con carta di credito, distribuiscono bibite e alimenti.
Nelle apparecchiature elettromedicali i controlli embedded sono la norma come nel settore aereo e satellitare (avionica).
L'importanza di questo innovativo componente elettronico, ha messo in competizione le più grandi multinazionali del settore elettronico con il risultato di avere sul mercato famiglie di microcontrollori per
tutte le esigenze.
Alcune case come Zilog propongono µC derivati dallo Z80, altre presentano famiglie di microcontrollori originali come NEC, Intel, Toshiba Philips Semiconductor, Texas Istruments, ST Microelectronics fino alla Microchip Technology diventata famosa per la produzione dei popolarissimi PIC. Motivo della grande diffusione di questi µC oltre alle indubbie qualità è stata la vasta campagna pubblicitaria della Microchip, che ha messo a disposizione una ricca documentazione di progetti e programmi sorgente di tutti i tipi scaricabili da Internet.

AMBIENTE DI SVILUPPO
Per rendere operativo un µC bisogna prima di tutto programmarlo, cioè bisogna scrivere un algoritmo (una sequenza di istruzioni) che descriva tutte le azioni che il dispositivo deve eseguire. Il programma viene normalmente sviluppato a bordo di un normale computer, attraverso l'utilizzo di un IDE(Integrated Development Environment) cioè un software che costituisce un opportuno ambiente di sviluppo normalmente fornito dal produttore del µC.
La maggior parte dei dispositivi richiedono una programmazione in linguaggio Assembly, ma negli ultimi anni molti dispositivi consentono anche la scrittura del codice in linguaggi di medio livello come il C. L'IDE è un software costituito generalmente da un editor di testo e da un debugger cioè un correttore che permette di individuare eventuali errori di sintassi presenti nel codice scritto.

  • scrittura del programma in codice sorgente sorgente (C/ASM) attraverso un editor di testo;
  • debug: correzione del programma da eventuali errori di sintassi;
  • compilazione, cioè creazione del programma eseguibile in codice macchina;
  • caricamento (upload) del programma eseguibile a bordo della scheda µC.

Praticamente i passaggi sono gli stessi che si hanno per la realizzazione di un normale programma per computer, solo che in questo caso ad essere programmato è un dispositivo elettronico.
Questo nuovo tipo di approccio alla progettazione elettronica e all'automazione ha portato a coniare nella letteratura del settore il termine "physical computing".
Il physical computing utilizza l'elettronica per progettare oggetti interattivi che possano comunicare con gli esseri umani utilizzando sensori ed attuatori controllati da un comportamento che viene implementato sotto forma di software eseguito all'interno di un microcontrollore .
Si potrebbe obiettare che la stessa programmazione di un computer (PC) sia assimilabile al concetto di physical computing, perché si accettano segnali fisici da tastiere e mouse (periferiche di input) e si producono segnali si video e stampanti (periferiche di output) ma sarebbe difficile impiegare un PC convenzionale per controllare direttamente il funzionamento di sensori ed attuatori.

ARDUINO
Attualmente possiamo considerare il progetto Arduino come la piattaforma open source di physical computing più diffusa e popolare.
Arduino è composto da due parti: la scheda (hardware) e l' IDE (software) che deve essere scaricato ed eseguito sul PC.
L'IDE, come si è accennato, serve per creare piccoli sketch (programmi) salvati come file con estensione  .ino (dalle ultime tre lettere della parola Arduino) che poi devono essere caricati sulla scheda. Lo sketch istruisce la scheda.
Non molto tempo fa, lavorare con l'hardware significava costruire circuiti da zero utilizzando centinaia di componenti diversi, resistenze, condensatori, transistor etc.. Ogni circuito era cablato per eseguire una applicazione specifica e apportare delle modifiche significava tagliare cavi e saldare collegamenti.
Con l'avvento delle tecnologie digitali e dei microprocessori, queste funzioni, una volta realizzate coi cavi, sono state sostituite da programmi software. Il software è più facile da modificare dell'hardware .
La scheda Arduino è una piccola scheda microcontrollore, cioè un circuito (la scheda) che contiene un chip (il microcontrollore) ; il risultato è un piccolo computer almeno 1000 volte meno potente di qualsiasi PC, ma molto più economico ed in grado di costruire dispositivi interessanti. Sulla scheda è infatti riconoscibile un rettangolo nero in plastica dotato di 28 piedini (quadrato se si dispone della versione SDM) ; si tratta del  µC AT-mega328 della Microchip: il cuore della scheda.
Bisogna specificare che ci sono diversi tipi di scheda Arduino, ma la più comune è la scheda Arduino Uno descritta di seguito.
Sulla scheda sono posizionati tutti i componenti necessari affinché il µC funzioni correttamente e che possa comunicare con un computer.

In alto ed in basso si notano i connettori per i collegamenti ai sensori e agli attuatori; ricordiamo che i sensori percepiscono qualche tipo di grandezza fisica e la traducono in un segnale elettrico interpretabile da un computer, mentre un attuatore è l'opposto di un sensore, converte un segnale elettrico proveniente da un computer e lo traduce in una azione fisica. Quando non altrimenti specificato, noi faremo sempre riferimento alla scheda base, quella denominata Arduino Uno; a bordo di questa scheda si riconoscono:

14 pin I/O digitali (pin 0-13)
Questi possono essere usati per eseguire operazioni di input ed output. Come connettori di input sono usati per leggere le informazioni provenienti dai sensori mentre come output sono usati per il controllo degli attuatori. Gli input digitali possono solo leggere uno dei due valori HIGH/LOW, gli output digitali possono solo inviare uno dei due valori HIGH/LOW.

6 pin di ingresso analogico (pin 0-5)
I pin di ingresso analogico sono usati per leggere misure di tensione dai sensori analogici.
A differenza dei pin digitali, che possono distinguere solo tra due livelli differenti (HIGH e LOW) i pin di ingresso analogico possono misurare 1024 livelli differenti di voltaggio.

6 pin di uscita analogica (pin 3, 5, 6, 9 10 e 11)
Questi sono in pratica sei pin digitali che possono eseguire una terza funzione: fornire un' uscita analogica.
Come per i pin I/O digitali, si deve sempre specificare il loro compito nel codice sorgente del programma dell'applicazione che si intende eseguire.

La scheda può essere alimentata attraverso la porta USB del computer, attraverso la maggior parte dei caricatori USB oppure tramite un alimentatore esterno, possibilmente da 9V con spinotto cilindrico da 2,1 mm (con positivo centrale). Se nella presa non è collegato alcun alimentatore, la scheda si alimenta via USB, ma, non appena si collega un alimentatore di corrente, la scheda lo utilizza automaticamente. Come al solito è più sicuro disporre dell'alimentazione sulla presa rispetto all'alimentazione USB.

PROGRAMMAZIONE ARDUINO
Una volta aperto l'IDE di Arduino ci si accorge che la struttura del codice è suddivisa in due parti fondamentali: la funzione setup() e la funzione loop().
setup() viene eseguita una sola volta e  serve per inizializzare variabili, per impostare lo stato dei pin, per far partire le librerie da usare e per l'impostazione delle comunicazioni seriali; essa è sempre la prima a essere eseguita dopo ogni accensione o reset della scheda.
loop() esegue ciclicamente il codice scritto al suo interno, permette quindi l'esecuzione del programma, interagendo con la scheda Arduino. Questa impostazione è data dal fatto che il dispositivo non è in grado di eseguire diversi programmi contemporaneamente (multitask) come un normale computer e dal programma principale non si può uscire. Quando si accende la scheda, il codice viene eseguito, per fermare il codice basta spegnere la scheda.

Nella parte superiore dell'editor si trovano alcuni pulsanti molto utili:

 

Pulsante di Verifica, la sua funzione è di controllare se si sono commessi degli errori.

 

Pulsante di Caricamento (upload) che compila il codice scritto e lo carica sulla scheda configurata.

 

Pulsante Nuovo. Crea un nuovo sketch ogni volta che si vuole.

 

Pulsante Apri. Fa apparire un menu con tutti gli sketch già realizzati.

 

Pulsante Salva. Salva il codice appena scritto.

 

Apre il Serial Monitor che permette di controllare i dati scambiati col computer e controllare cosa avviene nel codice eseguito da Arduino.

 

Il software è scritto in Java e basato su Processing e altri software open source; esso può essere utilizzato con qualsiasi scheda Arduino e funziona su Windows, Mac OS X e Linux.
Il linguaggio di programmazione è il Wiring, derivato dal C/C++; cioè uno standard dove il punto e virgola è usato come terminatore di una istruzione.
Le strutture di controllo: 

if
if-else
for
switch
while
do-while
break
continue
return
goto
(quest'ultima, ovviamente deprecata)

rimangono invariate. Un primo esempio di sketch è il seguente:

void setup(){
pinMode(13, OUTPUT);
}
void loop(){
    digitalWrite(13, HIGH);
    delay(1000);
    digitalWrite(13, LOW);
    delay(1000);
}

Viene fissato il pin 13 come uscite del collegamento al LED nella funzione setup()

La funzione loop() contiene la logica principale del programma, e viene usata per creare un ciclo infinito.
La logica di questa funzione, deve prima di tutto accendere il led collegato al pin 13.
Per effettuare questa operazione si utilizza il metodo digitalWrite() passando come parametri il numero di pin e la costante HIGH. In questo modo il pin fornisce in uscita 5V fino alla modifica successiva ed il led collegato al pin si accende. A questo punto il programma chiama il metodo delay() e attende 1000 millisecondi (1 secondo) senza eseguire alcuna operazione.
Durante questo intervallo di tempo il pin 13 rimane nello stato HIGH ed il led è sempre acceso.
Il led viene spento con l'istruzione digitalWrite(13, LOW); poi il programma attende altri 1000 ms prima di concludere la funzione loop().
Poi, il programma, viene avviato di nuovo ed il led torna ad accendersi.
Oltre le periferiche di uscita come il LED ci sono le periferiche di ingresso come il pulsante.
Nel seguente sketch il pulsante viene usato come interruttore per accendere e spegnere il LED stesso. 

const int Switch = 2, LED = 13;
int state = 0, LEDstate=0;
void setup() {
    pinMode(Switch, INPUT);
    pinMode(LED, OUTPUT);
}
void loop() {
    if (state == 0 && digitalRead(Switch) == HIGH) {
        state = 1;
        LEDstate=!LEDstate;
    }
    if (state == 1 && digitalRead(Switch) == LOW) {
        state = 0;
    }
digitalWrite(LED, LEDstate);
}

 

Si vede che come in altri linguaggi di programmazione la parte della dichiarazione delle variabili e delle costanti viene scritta per prima.
Viene usata la variabile state in concomitanza con il metodo digitalRead(Switch);per far commutare il led da acceso a spento (e viceversa) attraverso la variabile LEDstate che agisce sul led di uscita attraverso l'istruzione digitalWrite(LED, LEDstate);
La possibilità di scrivere il codice usando un linguaggio di medio livello come il C è molto vantaggiosa se si considera che i primi PIC potevano essere programmati solo attraverso il linguaggio assembly che spesso differiva da dispositivo a dispositivo.