Microcontrollori
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 μC sono
Elettronica di consumo
• Cellulari e GPS
• Giochi elettronici
• Orologi digitali
• Impianti antifurto
• Condizionatori termici
• Domotica
• Foto e videocamere
• Lettori audio e video
Industria
• PLC
• controllo di processi
• Robotica
• Navigazione avionica
• Autronica
• Trasmissione dati
• Telefonia
• Pannelli luminosi
Strumentazione
• Apparecchi di misura
• Monitoraggio
• Analisi di laboratorio
• Autodiagnostica
• Strumenti elettromedicali
• Sistemi di sicurezza
• Sistemi di puntamento
Commercio
• Bancomat
• Terminali punti vendita
• Distributori di alimenti
• Fotocopiatrici Fax
• Editoria
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 del microcontrollore
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 etc.
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 cosidette 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 files 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 di 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() è la zona del programma dove inserire il
codice che deve essere eseguito una sola volta all'inizio del programma,
mentre loop() contiene il programma vero e proprio
che viene eseguito ripetutamente.
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 linguaggio usato per scrivere gli sketch può essere assimilato al C
o a Java; 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.