Introduzione
Uno dei principi fondamentali dell’elettronica é la modularitá. Questo è da sempre uno dei suoi aspetti vincenti, dato che tutti i progetti possono essere suddivisi in moduli, che a loro volta sono suddivisi in ulteriori moduli e così via. Ciò ha reso tutti i progetti facilmente realizzabili e gestibili, dove ogni modulo puó essere considerato separatamente, migliorato e sostituito. Comunque tale efficienza ha reso indispensabile un altro aspetto: la comunicazione tra i diversi moduli. In questo articolo partiremo da una panoramica generale per poi approfondire ed analizzare in dettaglio la comunicazione seriale.
Comunicazione in parallelo o seriale
La comunicazione in parallelo si basa su interfacce che sono in grado di trasferire più bit nello stesso momento, utilizzando quello che viene chiamato un bus di dati. Questi bus di dati vengono generalmente trasferiti attraverso fasci di 8, 16, 32, … cavi su cui i segnali assumono solamente valori binari come 0 e 1. Si parla quindi di bus a 8, 16, 32 bit. Oltre a questi cavi ve ne é uno aggiuntivo chiamato CLK (clock) il cui scopo é quello di scandire il momento in cui i bit devono essere letti (byte).
La comunicazione in seriale invece si basa su un flusso di bit trasferito su di un unico cavo, in cui i bit sono trasferiti uno alla volta. Anche in questo caso esiste un secondo canale di comunicazione chiamato CLK (clock) che scandisce il tempo di lettura di ogni singolo bit. Quindi la comunicazione seriale si basa solo e sempre su 2 soli cavi.
La comunicazione in parallelo è quindi più efficiente: è più veloce, semplice e relativamente facile da realizzare. Ma comporta un particolare aspetto: richiede molte linee I/O. Questo in alcuni casi è veramente un problema dato che molti microprocessori non hanno molte porte I/O a disposizione e una comunicazione in parallelo ne occuperebbe molte, troppe. Quindi spesso si ricorre alla comunicazione seriale che anche se meno veloce, permette comunque di impegnare pochi canali.
Comunicazione Seriale Asincrona
Nel corso degli anni, moltissime tipologie di protocolli seriali si sono succeduti nel tempo per rispondere in gran parte alle esigenze del momento. Tra questi alcuni, come USB (Universal Serial Bus) ed Ethernet hanno riscosso moltissimo successo e sono note anche ai profani. Altri protocolli come SPI e I2C sono invece noti ed utilizzati dagli addetti all’elettronica. Ma esistono moltissimi altri protocolli, ognuno specializzato per un particolare scopo.
In generale tutti i protocolli seriali possono essere divisi in due gruppi: sincroni e asincroni.
Una comunicazione seriale sincrona viene sempre accoppiata con un segnale di CLOCK, in modo che tutti i dispositivi presenti sul serial bus condividano un clock comune. Questa particolare configurazione permette un trasferimento di dati più semplice e spesso più veloce, ma richiede anche un canale in più per effettuare la comunicazione. I2C e SPI sono appunti due protocolli di comunicazione seriale sincrona.
Una comunicazione seriale asincrona, d’altro canto non fa uso di un segnale di CLOCK esterno e richiede quindi meno canali I/O per la comunicazione. A spese di ciò, si deve perciò implementare un sistema affidabile per la trasmissione e la ricezione dei dati. I protocolli seriali più noti sono Bluetooth, Xbee, GPS module.
Le regole della comunicazione seriale asincrona
Il protocollo seriale asincrono si basa su un meccanismo intrinseco basato su alcune regole. Queste regole permetto di rendere il trasferimento dei dati più affidabile:
- bit di dati
- bit di sincronizzazione
- bit di parità
- baud rate
Quindi quando due dispositivi instaureranno una comunicazione seriale asincrona, sarà importante che essi siano configurati nella stessa maniera, seguendo le stesse regole.
Baud Rate
Il baud rate è una regola (o configurazione) che specifica quanto veloce i dati vengono inviati sulla linea seriale. Si esprime generalmente in bps (bit per secondo) ed il suo valore inverso indicherà quanto tempo occupa un singolo bit nella trasmissione dei dati. Questa regola permette così di evitare di utilizzare il CLOCK, dato che si conosce a priori la lunghezza e la velocità di ogni singolo bit di dati.
Il valore più comune di baud rate utilizzato è 9600 bps, ma sono presenti anche moltissimi altri valori standard (2400, 4800, 19200, 57600, ecc..). Come si può vedere i valori di baud rate possono anche crescere, ma allora perchè non usare valori sempre maggiori? Bene, in realtà questi valori sono ottimizzati a seconda delle prestazioni dei microcontrollori coinvolti nella comunicazione. Si scopre presto che valori sempre più elevati comporteranno errori di comunicazione via via più frequenti dovuti al limite di operabilità dei microcontrollori.
L’impacchettamento dei dati (framing)
Oltre alla regola dei baud rate, esistono anche altre regole che però lavorano sulla sequenza dei dati da trasmettere. E’ facile intuire che i dati dovranno rispettare una determinata sequenza e questa particolare attività si chiama framing. Infatti i dati (che non sono altro che pacchetti di bit) vengono suddivisi in parti più piccole chiamate blocchi (block o chunk). Ciascun blocco di dati per poter essere trasmesso su una comunicazione seriale asincrona deve essere inglobato in un frame di bit, che hanno una particolare struttura.
I bit di dati
I dati da trasmettere vengono quindi divisi in blocchi e inglobati in pacchetti seriali dove vengono aggiunti anche altre particolari sequenze di bit. La quantità di bit inserita in ogni singolo pacchetto può variare, generalmente tra i 5 ed i 9 bit, cioè la lunghezza di un byte. Quindi per prima cosa i due dispositivi in comunicazione dovranno essere configurati per accettare ed intepretare la stessa quantità di bit come chunck di dato. Ma questo non è sufficiente, dovranno corrispondere anche per la scelta del bit più significativo MSB (most significant bit). Cioè dovranno concordare se questo sarà il primo o l’ultimo dei bit trasmessi.
I bit di sincronizzatione
I bit di sincronizzazione sono 2-3 bit che vengono aggiunti e trasferiti a ciascun chunk di dati. Questi bit vengono suddivisi in start bit e stop bits. Questi bit sono molto importanti perchè definiscono l’inizio e la fine di ciascun pacchetto dati. Lo start bit viene sempre indicato quando la linea dati in idle passa dallo stato 1 allo stato 0, mentre i bit di stop ripristinano lo stato idle riportando la linea allo stato 1.
I bit di parità
La parità è un metodo molto semplice per controllare se si sono verificati degli errori durante la trasmissione. Ha solo due possibili stati: pari o dispari. Il bit di parità viene calcolato sommando tutti i bit del chunk dei dati, e se la somma è pari allora il bit è impostato su 1 (vero) altrimenti se è dispari su 0.
La regola dei bit di parità, nonostante la loro utilità, non sempre vengono utilizzate, dato che richiedono tempo per essere analizzate rallentando quindi la velocità di trasmissione.
Il Bus seriale
Un bus seriale (Serial Bus) consiste di due cavi che connettono due dispositivi tra di loro. Ogni dispositivo ha due porte una dedicata alla trasmissione dei dati (TX) una alla ricezione dei dati (RX). Ogni cavo dovrà essere connesso ad un estremo con una porta RX e all’altro TX. Quindi ogni cavo sarà dedicato alla trasmissione dei dati da un dispositivo all’altro, ma non viceversa. I dati, per ciascun cavo, andranno in una sola direzione.
Inoltre dovrà essere necessario avere per entrambi i dispositivi lo stesso livello di ground (GND) in modo che i dati trasmessi abbiano livelli di voltaggio coerenti tra i due sistemi. Nel grafico questo viene riportato come un ulteriore cavo che connette le due porte GND dei due dispositivi.
Una comunicazione seriale in cui entrambe i dispositivi possono inviare e ricevere dati simultaneamente viene chiamata full-duplex. Mentre si indica half-duplex, quando i dispositivi si inviano i dati alternativamente, cioè ogni dispositivo invierà i dati nel suo intervallo di comunicazione. Infine esistono comunicazioni seriali in cui esiste un solo cavo tra due dispositivi diversi, questo tipo di comunicazione viene chiamata simplex.
Realizzazione pratica: TTL e RS-232
Finora abbiamo visto la comunicazione seriale dal punto di vista concettuale. Ora vediamo come questa possa essere realizzata nella realtà. Esistono diversi protocolli seriali ed ognuno di essi viene realizzato in maniera diversa. In particolare analizzeremo due di essi tra i più comuni: TTL logic-level e RS-232.
I microcontroller e altri circuiti integrati normalmente comunicano tra di loro per via seriale e lo fanno utilizzando il sistema TTL (transistor-transistor logic). I voltaggi sul canale possono essere due: Vcc e GND. Vcc è generalmente di 3.3V o 5V a seconda del sistema dei circuiti utilizzati mentre il GND è di 0V. Quando il canale di comunicazione assumerà il valore Vcc allora questo potrà significare o che ci si trova in IDLE, o un bit di valore 1 o lo stop bit. Mentre se assumerà il valore GND allora potrà essere o un bit 0 o lo start bit.
Il sistema più noto a tutti è il sistema RS-232 che veniva utilizzato spesso sui nostri computer per comunicare con le diverse periferiche. Il concetto di base del suo funzionamento è molto simile a quello del TTL, solo che il range di voltaggi su cui opera è di -13/+13V (ma anche altri valori), ed inoltre i voltaggi dei bit sono capovolti. Infatti in questo caso quando la linea assumerà un low voltage (-13V) avremo o uno stato di IDLE del segnale, o uno stop bit o un bit di valore 1. Mentre quando assumerà un high voltage (+13V) allora avremo o uno start bit, o un bit di valore 0. Perfettamente in maniera opposta a come si comporta il TTL.
Gli UART
La parte finale di tutto questo è quella di trovare qualcosa che ci permetta di creare pacchetti seriali e di controllare le linee hardware fisiche: gli UART.
Uno UART (Universal Asynchronous Receiver/Transmitter) è la parte del circuito responsabile della comunicazione seriale. In particolare, uno UART agisce come interfaccia tra comunicazioni seriali e parallele. Infatti da un lato avremo un bus di 8 linee per la comunicazione in parallelo e dall’altro lato due uscite seriali RX e TX.
Gli UART esistono come circuiti integrati (IC) a se stanti, ma spesso si possono trovare già integrati all’interno dei microcontrollori (alcuni ne hanno anche diversi). Per esempio Arduino UNO ha 1 UART integrato, Arduino Mega ne ha 4.
Quindi gli UART svolgono alcune funzioni complesse. Per quanto riguarda la trasmissione, gli UART devono creare i pacchetti dati, aggiungerci i bit di parità e di sincronizzazione ed inviarli sulla linea TX. Per quanto riguarda la ricezione, gli UART devono campionare i bit in ricezione, in accordo alle regole di baud rate, e poi eliminare i bit di sincronizzazione e di parità estraendo il chunck di dati.
Conclusioni
In questo articolo abbiamo visto una rapida panoramica sulle comunicazioni elettroniche tra moduli, che si dividono in seriale ed in parallelo. In particolare, abbiamo visto i concetti e le regole che sono alla base di esse, e di come vengono realizzate nella realtà tramite i protocolli RS-232 e TTL. Questo è solo uno dei primi articoli che introducono al mondo dell’elettronica. Altri articoli futuri di carattere generale illustreranno altri concetti che sono alla base dell’elettronica.