In questo articolo approfondiremo il discorso relativo alla software serial su Arduino, e vedremo quali differenze pone rispetto al sistema hardware.
Negli articoli passati abbiamo imparato a riconoscere ed utilizzare un collegamento seriale su Arduino attraverso UART, collegando i PIN 0 ed 1, RX e TX in modo incrociato tra due schede Arduino (o simili).In tal modo, e aggiungendo un terzo collegamento che ponesse in comune il riferimento di massa sulle due schede, è possibile consentire il trasfermimento delle informazioni attraverso la rispettiva connessione seriale. Il protocollo risulta abbastanza semplice ed intuitivo.
Ma come possiamo fare se, per una qualsiasi ragione, i pin 0 ed 1 risultassero già occupati da altri commegamenti?
La libreria SoftwareSerial
Come è evidente dall’immagine introduttiva, dal punto di vista del circuito è stato sufficiente spostare i collegamenti RX-TX dai pin 0-1 ai pin 10-11. Ma la modifica hardware non è sufficiente: è infatti necessario un driver software che reindirizzi le trasmissioni seriali sui nuovi pin. Fortunatamente, Arduino dispone di una libreria apposita, chiamata per l’appunto SoftwareSerial, che funziona proprio in questo modo. Vediamo il codice necessario per implementarla.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
/* * Codice basato sul testo Seriale & Arduino, di Paolo Di Leo * https://amzn.to/3B3ziOc * * Altra fonte: https://www.arduino.cc/en/Tutorial/BuiltInExamples/InputPullupSerial * * La pressione del tasto determina l'invio di un carattere via seriale. * La ricezione del carattere determina accensione e spegnimento del LED. * * Connessioni tra le schede Arduino: * GND -> GND * TX1 -> RX2 * RX1 -> TX2 * * Connessioni del tasto: * primo polo su GND * secondo polo su D1 della prima scheda * * Viene utilizzato LED 13 presente sulla scheda Arduino 2. * */ // Includiamo a libreria Software Serial #include <SoftwareSerial.h> // Definiamo i PIN per trasmissione e ricezione #define RXPIN 10 #define TXPIN 11 // Definiamo l'oggetto Software Serial, passandogli i parametri di configurazione SoftwareSerial softUART (RXPIN, TXPIN); byte dato; int P1; void setup() { // Inizializziamo il LED built-in pinMode(2, INPUT_PULLUP); pinMode(13, OUTPUT); //Serial.begin(9600); softUART.begin(9600); } void loop() { // Leggiamo lo stato della seriale // if (Serial.available() ) { // Se abbiamo un byte in arrivo sulla seriale... if (softUART.available() ) { dato = softUART.read(); if (dato == 'H') digitalWrite(13, HIGH); if (dato == 'L') digitalWrite(13, LOW); } P1 = digitalRead(2); if (!P1) { softUART.write('H'); } else { softUART.write('L'); } delay(100); } |
Il programma è una variazione di quello presentato la scorsa settimana, ed il suo funzionamento è identico, tranne che per l’uso di un oggetto softUART al posto della seriale hardware.
Quante seriali possiamo pilotare?
Il seguente programma riceve da due porte seriali software e reindirizza l’input verso la porta seriale hardware. Per mettersi in ascolto su una porta seriale software occorre chiamare il metodo port.listen(). Quando si utulizzano due porte seriali software, occorre passare dall’una all’altra ascoltando (listen()ing) a turno, e scegliere un momento particolare per passare ad una porta all’altra, tipicamente al termine di una trasmissione attesa, o quando il buffer è vuoto.
Nell’esempio, lo switch avviene quando su una porta non c’è nulla più da leggere.
Il circuito: due devices che comunicano atraverso la seriale. Nella prima serialeil TX è collegato al PIN digitale 10 (RX), RX al PIN 11(TX). Il secondo device seriale ha il TX collegato con il PIN digitale pin 8(RX), RX al PIN 9(TX).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
/* Software serial multple serial test created 18 Apr. 2011 modified 19 March 2016 by Tom Igoe based on Mikal Hart's twoPortRXExample This example code is in the public domain. */ #include <SoftwareSerial.h> // software serial #1: RX = digital pin 10, TX = digital pin 11 SoftwareSerial portOne(10, 11); // software serial #2: RX = digital pin 8, TX = digital pin 9 SoftwareSerial portTwo(8, 9); void setup() { // Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } // Start each software serial port portOne.begin(9600); portTwo.begin(9600); } void loop() { // By default, the last intialized port is listening. // when you want to listen on a port, explicitly select it: portOne.listen(); Serial.println("Data from port one:"); // while there is data coming in, read it // and send to the hardware serial port: while (portOne.available() > 0) { char inByte = portOne.read(); Serial.write(inByte); } // blank line to separate data from the two ports: Serial.println(); // Now listen on the second port portTwo.listen(); // while there is data coming in, read it // and send to the hardware serial port: Serial.println("Data from port two:"); while (portTwo.available() > 0) { char inByte = portTwo.read(); Serial.write(inByte); } // blank line to separate data from the two ports: Serial.println(); } |
Considerazioni finali
Abbiamo imparato come utilizzare la libreria SoftwareSerial, che ci consente di lavorare su PIN diversi dai classici 0 ed 1, e addirittura di gestire più connessioni seriali software. In questo modo Arduino diventa automaticamente un sistema di gestione e controllo di apparati di trasmissione basati su seriale, in grado di collegare più devices e monitorarne il corretto funzionamento.
Ma le connessioni PIN to PIN su Arduino sono estremamente delicate, soggette ad interferenza e a brevissimo raggio. Nel prossimo articolo vedremo come rinforzare il livello elettrico di comunicazione utilizzando uno schema più robusto o attraverso connessioni USB.
Appuntamento alla prossima settimana!
Le puntate precedenti:
- Comunicazione seriale tra due schede Arduino – #01
- Serial Arduino – Ricezione e trasmissione dati – #02
Join our groups on Telegram…