Utilizzare Software Serial Library per aggiungere una porta seriale
La comunicazione seriale RS232 è un modo semplice per permettere alla nostra board Arduino di comunicare con il computer piuttosto che con sensori o altri dispositivi.
Principalmente Arduino UNO possiede una sola porta seriale, implementata in hardware sul chip Atmega328, e disponibile sui pin0 (Rx) e pin1 (Tx) della scheda.
Sebbene, il più delle volte, una porta seriale sia sufficiente, può essere necessario instaurare un’ulteriore comunicazione seriale, ad esempio, per motivi di debugging o monitoring con un altro dispositivo o computer.
In questo caso ci viene in aiuto la libreria SoftwareSerial (Software Serial Library) che permette di impiegare ulteriori pin disponibili sulla scheda per definire una porta seriale aggiuntiva.
Per utilizzarla è fondamentale inserire nello sketch il riferimento alla libreria tramite la parola chiave #include:
#include <SoftwareSerial.h>
successivamente si definisce una variabile utilizzando il costruttore SoftwareSerial:
SoftwareSerial PortaSeriale = SoftwareSerial(pin_RX, pin_TX);
dove PortaSeriale è il nome dell’oggetto, pin_RX definisce il pin per ricevere i dati e pin_TX definisce il pin per la trasmissione dati.
Ora nella funzione Setup(), tramite pinMode, definiamo il pin previsto per la ricezione come input, e il pin previsto per la trasmissione come output. Specifichiamo inoltre la velocità di trasmissione a 9600bps.
void setup() { pinMode(pin_RX, INPUT); pinMode(pin_TX, OUTPUT); PortaSeriale.begin(9600); }
Per leggere e scrivere sulla seriale vengono utilizzati gli stessi metodi implementati per Serial().
Di seguito l’esempio completo che permette di testare questa funzionalità impiegando i pin7 per la ricezione ed il pin8 per la trasmissione
#include <SoftwareSerial.h> //creo una nuova porta seriale via software SoftwareSerial PortaSeriale = SoftwareSerial(7, 8); //variabile char EchoChar = 0; void setup() { //definisco il pin7(RX) come ingresso pinMode(7, INPUT); //definisco il pin8(TX) come uscita pinMode(8, OUTPUT); //setto la velocita della seriale software PortaSeriale.begin(9600); } void loop() { //leggo dalla seriale(pin7) EchoChar = PortaSeriale.read(); //invio il dato letto PortaSeriale.print(EchoChar); delay(10); }
il circuito di per il test è rappresentato nell’illustrazione seguente:
Avendo altri pin disponibili nulla ci vieta di definire un’ulteriore porta seriale o più.
Nonostante l’utilità di questa libreria, ci sono alcune limitazioni che bisogna conoscere, per evitare errori di programmazione e di progettazione:
- E’ possibile utilizzare per la porta solamente la velocità di 9600bps
- Non è possibile sapere se ci sono dati disponibili per la lettura come avviene per la funzione Serial.available()
- Il metodo read() è bloccante, quindi il codice si ferma fintanto che non arriva un byte da poter leggere
- Non essendo presente un buffer di ricezione il metodo read() deve essere richiamato velocemente per evitare la perdita di dati.
Queste limitazioni potrebbero far ripensare l’utilizzo della libreria, ma credo che sia comunque importante conoscerne il funzionamento per valutare, a seconda dei circuiti, se impiegarla o meno.
Personalmente l’ho trovata molto utile per inviare dati ad altri dispositivi come funzione di monitoring, difatti potete utilizzare solamente la funzione print e tralasciare la read().