Arduino dispone di diverse modalità di comunicazione attraverso la porta seriale. Iniziamo a vedere i concetti alla base di tale meccanismo.
Iniziamo con questo articolo una serie di brevi tutorial sull’uso del protocollo di comunicazione seriale di Arduino. Vedremo la comunicazione a due fili, l’utilizzo del protocollo RS232, la connessione con boost ed infine presenteremo cenni esplicativi della comunicazione attraverso BlueTooth.
Gli articoli saranno progressivi, usciranno il venerdì e conterranno informazioni e schemi per costruire i propri progetti, ma soprattutto, nello spirito di Moreware, per cercare di comprendere i meccanismi di funzionamento degli elementi presentati.
Comunicazione seriale e parallela
In elettronica possiamo trasmettere le nostre informazioni fondamentalmente in due modi: a gruppi di bit o inviarli uno alla volta a parità di clock della CPU. Va da sé che la trasmissione di dati in parallelo appaia più efficiente, dal momento che per ciascun ciclo di clock cengono trasmesse più informazioni. Tuttavia la trasmissione seriale è decisamente più semplice da implementare, meno suscettibile al rumore elettrico, e tutto sommato non richiede particolari caratteristiche di controllo.
Segnali dati e gestione di una porta seriale sono controllati dall’UART (Universal Asynchronous Receiver Transmitter), un chip presente sul nostro Arduino.
Contrariamente a quanto si crede, l’UART può essere impiegato anche senza la porta seriale RS232, come vedremo nel prossimo esempio.
Comunicazione attraverso pilotaggio UART
Come dice il nome, un UART rappresenta un sistema di ricetrasmissione che consente di inviare dati da una scheda all’altra. L’unico accorgimento è quello di porre entrambe le schede su una massa comune, in modo che i segnali HIGH e LOW siano coerenti tra loro.
Nei nostri esempi l’UART utilizzerà il cosice ASCII per trasmettere le informazioni: esso trasformerà i codici inviati serializzandoli in sequenze di bit. Vediamo un esempio.
Dobbiamo trasmettere la lettera ‘A’: come sappiamo, il codice ASCII di A è 65, ed il suo valore binario corrisponde a 01000001. Il codice ASCII prevede come codifica 7 bit, quindi (per non perdere precisione) dovremo trasmettere ‘1000001’. Il numero sarà poi inserito all’interno di un inviluppo che prevede un bi di start, un eventuale bit di parità, uno o due bit di stop. Vediamo come funziona.
Il protocollo di comunicazione
Il livello logico del segnale è HIGH, a livello logico 1, e verrà posto a LOW (livello logico 0) dal bit di START. a questo punto verranno trasmessi i bit del nostro carattre ‘A’, dal bit meno significativo (LSB) al bit più significativo (MSB). Al termine della trasmissione potrà essere aggiunto un bit cosiddetto di parità, per garantire una minima sicurezza nella precisione dei dati trasmessi. Infine, per dichiarare che i bit da trasmettere sono terminati, viene inviato uno (o due) bit di stop.
Se la spiegazione vi ha confuso le idee, non preoccupatevi: Arduino dispone di un’ottima libreria per la gesione delle comunicazioni seriali in modo trasparente per l’utente finale.
Arduino: collegamenti seriali
Prima di mettere mano al codice, tuttavia, occorre ancora definire un paio di informazioni necessarie. Abbiamo visto nell’illustrazione di apertura che occorre collegare tra loro i pin GND delle due schede da collegare, quindi collegare il pin di trasmissione (TX) dell’uno al pin di ricezione (RX) dell’altro. La configurazione dei “treni di bit” consentirà una comunicazione bidirezionale, o full-duplex, tra sorgente e destinatario, grazie alle caratteristiche interne dell’UART. Ma quali sono i “livelli di tensione” supportati da Arduino? In altri termini, come potremo distinguere un segnale MARK da un segnale SPACE, un livello HIGH da un livello LOW?
Come sappiamo, la logica digitale di Arduino UNO prevede una comunicazione TTL con livelli di tensione compresi tra 0 e + 5V. Purtroppo questo non è sempre vero per le altre schede, che potrebbero lavorare ad esempio tra 0V e +3.3V. Arduino potrà ricevere tranquillamente un trno d impulsi da un sistema che lavori a 3.3V (superiore ai 2V minimi necessari per essere riconosciuti come HIGH da Arduino), ma occorrerà prestare la massima attenzione quando trasmetteremo i dati verso un ricevente che lavori a +3.3V. Per evitare che tale sistema venga irreparabilmente danneggato da una tensione eccessiva, occorrerà predisporre un partitore di tensione (ne abbiamo parlato diffusamente in questo articolo).
Ed ora un po’ di software
Per questo primo esempio creeremo un framework utile a descrivere il nostro sistema di ricezione: colleghiamo i pin come nella figura di apertura (e riportato nel commento iniziale del sorgente). Definiamo il formato del dato da trasmettere (byte), quindi inizializziamo la seriale e leggiamo il dato se è stato trasmesso.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
/* * Seriale e Arduino #01 - Template trasmissione * * PIN0 (TX) su PIN1 (RX) * PIN1 (RX) su PIN0 (TX) * PIN GND su PIN GND */ byte dato; void setup() { Serial.begin(9600); } void loop() { if (Serial.available()) { // lettura dati dalla seriale dato = Serial.read(); // Elabora dato } // altri task } |
Nel prossimo articolo del venerdì analizzeremo un sistema completo, hardware e software, per trasmissione e ricezione di dati attraverso collegamento seriale. Arrivederci tra sette giorni!
Join our groups on Telegram…