×

01-Microcontrollori

01-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 Industria
  • Cellulari e GPS
  • Giochi elettronici
  • Orologi digitali
  • Impianti antifurto
  • Condizionatori termici
  • Domotica
  • Foto e videocamere
  • Lettori audio e video
  • PLC
  • Controllo di processi
  • Robotica
  • Navigazione avionica
  • Autronica
  • Trasmissione dati
  • Telefonia
  • Pannelli luminosi

 

Strumentazione Commercio
  • Apparecchi di misura
  • Monitoraggio
  • Analisi di laboratorio
  • Autodiagnostica
  • Strumenti elettromedicali
  • Sistemidi sicurezza
  • Sistemi di puntamento
  • 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
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 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 (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.

I vantaggi di Arduino
Le caratteristiche principali di Arduino, che hanno contribuito alla sua diffusione a livello mondiale, sono le seguenti:

  • l’economicità dell’hardware (il prezzo è variabile in base al modello, ma è dell’ordine di qualche decina di euro) e la gratuità del software, scaricabile dal sito web di Arduino www.arduino.cc;
  • la scheda contiene già tutti i componenti necessari per la programmazione e un utilizzo di base;
  • la semplicità di collegamento della scheda, sia verso il computer (USB), sia verso gli altri circuiti elettronici (mediante pin messi a disposizione sulla scheda, senza necessità di saldature);
  • la relativa semplicità della programmazione in un linguaggio ad alto livello, derivato dal C/C++, che non richiede la conoscenza del linguaggio assembler del microcontrollore;
  • l’ampia disponibilità di librerie di funzioni che semplificano il pilotaggio didisplay LCD, motori, trasduttori, servomotori;
  • l’ampia disponibilità di schede aggiuntive (shield), realizzate da vari produttori, per interfacciare la scheda Arduino a motori, a carichi di potenza, a trasmettitori wireless, alla rete internet;
  • la filosofia open source dell’hardware e del software

L’HARDWARE: la scheda Arduino Uno
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.

Il software per la programmazione di Arduino
Il software Arduino (IDE, Integrated Development Environment o Ambiente di Sviluppo Integrato) rende semplice la scrittura (editing) del programma (sketch), la ricerca degli errori di programmazione (debugging) e il trasferimento del programma sulla scheda (loading).
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++. 

  1. Entrare nel sito internet https://www.arduino.cc e scaricare l’ultima versione del software Arduino (IDE), adatta al proprio sistema operativo.
  2. Installare il software sul computer.
  3. Collegare la scheda Arduino Uno a una presa USB del computer, per alimentarla e programmarla: si accende il LED verde ON sulla scheda. Una volta programmato, Arduino potrà funzionare scollegato dal computer (stand alone), fornendo alla scheda la tensione di alimentazione da 7 Va 12 V sull’apposito connettore, mediante un alimentatore esterno o una batteria da 9 V (il + è il contatto interno).
  4. Lanciare il software Arduino
  5. Tra i menù a tendina seguire il percorso: Strumenti ̵> Scheda e selezionare la scheda (board) Arduino Uno.
  6. Tra i menù a tendina seguire il percorso Strumenti ̵> Porta e selezionare la porta seriale a cui è collegato Arduino.

Per verificare la connessione Arduino-computer
Per verificare rapidamente che la comunicazione tra il computer e Arduino sia corretta, seguire i seguenti passi:

  1. Aprire, tra gli esempi, lo sketch Blink che fa lampeggiare il LED L sulla scheda: menù File (oppure pulsante +) ̵> Esempi ̵>01. Basics ̵> Blink; nella finestra di Editor appaiono le istruzioni che costituiscono lo sketch.
  2. Premere il pulsante per compilare e caricare (upload) su Arduino lo sketch Blink. Se la comunicazione è regolare, durante l’upload lampeggiano i LED RX e TX su Arduino.
  3. Una volta finito l’uploading, se il trasferimento dello sketch si è svolto senza problemi, in basso nella finestra appare il messaggio “Caricamento completato” e inizia automaticamente l’esecuzione dello sketch: il LED L, posto vicino al pin 13 e collegato a esso, lampeggia in modo regolare.

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.

La programmazione di uno sketch

Vediamo ora la struttura del codice di un programma per Arduino.
Lo sketch è sostanzialmente costituito da due sezioni:

  • La funzione setup() viene eseguita una sola volta, all’accensione o dopo il caricamento dello sketch, oppure dopo la pressione del pulsante Reset di Arduino; contiene tra le parentesi graffe le istruzioni pinMode() per impostare lo stato (input o output) dei pin, le inizializzazioni delle librerie utilizzate, l’apertura della porta seriale per il Serial Monitor, …
  • La funzione loop() contiene tra le parentesi graffe il corpo del programma che viene eseguito ciclicamente, specificando quali azioni deve compiere Arduino.

Prima della funzione setup si pongono:

  • le dichiarazioni delle variabili globali, cioè quelle variabili definite in tutto il programma e non solo all’interno di una funzione;
  • le direttive #include <nome-libreria>, per includere le librerie utilizzate nello sketch (le librerie sono gruppi di istruzioni che semplificano l’utilizzo di alcuni dispositivi, come servomotori, display LCD, ecc…).

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.

Commento all'articolo