Nei due episodi a seguire tratteremo la comunicazione diretta tra Arduini, essenziale per trasmettere dati e creare strutture complesse:
immaginate ad esempio un robot in cui un Arduino legge tutti i sensori e trasmette l'essenziale a un secondo Arduino che invece si occupa solo di controllare i motori!

I protocolli standard per questo tipo di trasmissione dei dati sono due:

  • La comunicazione seriale
  • La comunicazione I²C bus

""""

La comunicazione seriale

Come abbiamo specificato nell’articolo #8, la comunicazione seriale deve avvenire attraverso un canale di trasmissione: in questo caso non sarà il cavo USB, come accade tra Arduino e il computer, ma due semplicissimi jumper.

In generale tutte le schede Arduino (compreso Arduino Nano, che è il più piccolo) sono dotate di almeno due pin dedicati alla seriale: 

  • Il pin RX per la ricezione
  • Il pin TX per la trasmissione

Supponiamo di avere, come in figura, due Arduini UNO, che chiamiamo “a” e “b”.

""""

  • Il pin TX (trasmettitore) dell’Arduino “a” va collegato al pin RX ricevitore dell’Arduino “b”
  • Il pin TX (trasmettitore) dell’Arduino “b” va collegato al pin RX ricevitore dell’Arduino “a”

In questo modo ciascun Arduino potrà inviare e ricevere informazioni all’altro e dall’altro.

Nello specifico, Arduino UNO possiede solo una coppia di pin dedicati alla seriale e questa potrebbe essere una forte limitazione dal momento che questo protocollo, al contrario dell’I²C, è monodirezionale; ciò significa che non c’è un unico cavo su cui comunicano vari dispositivi, ma ogni coppia di cavi è riservata ad una coppia di dispositivi collegati1. Ebbene, su Arduino UNO i pin TX-RX sono esattamente gli stessi della porta USB2, perciò non potete collegarlo ad un altro Arduino e contemporaneamente anche al computer!

1In realtà esistono delle librerie che consentono di sfruttare anche i pin digital PWM, ma non sono native dell’IDE Arduino.

2Ricordate che anche il cavo USB (2.0) lavora su un protocollo di tipo seriale, ma implementa due pin aggiuntivi: uno per l’alimentazione (5V) e uno per la messa a terra (GND).

 

Per queste ragioni, d’ora in poi utilizzeremo un Arduino MEGA, che, come potete vedere dall’immagine, possiede ben 4 coppie di pin RX-TX e infatti potrà avviare contemporaneamente 4 comunicazioni seriali numerate da 0 a 3. Nel nostro caso utilizzeremo la seriale 0 per la comunicazione con il pc e la seriale 1 per la comunicazione con l’altro Arduino.

""""

Per spiegare come funziona la comunicazione seriale tra Arduino MEGA e Arduino UNO chiameremo il primo A e il secondo B (quanta fantasia!).
Programmiamo le due schede in modo che facciano le seguenti operazioni:

  • A riceve in input un carattere dal computer e lo manda a B
  • B legge il carattere e lo rimanda ad A
  • A stampa a video il carattere

Solitamente spieghiamo prima i collegamenti e poi passiamo al codice, ma adesso non possiamo farlo. Per far funzionare il nostro Arduino UNO infatti abbiamo bisogno di caricargli il codice mediante il cavo USB, e questa operazione tiene impegnata la comunicazione seriale: dopo aver caricato le istruzioni, il cavo servirà solo per l’alimentazione, mentre la comunicazione avverrà sui jumper collegati all’altro dispositivo.
Sarà Arduino MEGA a comunicare contemporaneamente con il pc (per ricevere il carattere) e con Arduino UNO (per inviarglielo e poi riceverlo nuovamente).

 

SOFTWARE

Per questo progetto bisogna aprire due sketch, uno per programmare Arduino MEGA (a sinistra, nell’immagine) e l’altro per Arduino UNO (a destra).

Nel primo sketch bisogna inizializzare due seriali:

  • Serial.begin(115200) per la comunicazione con il computer.
  • Serial.begin1(115200) per la comunicazione con Arduino UNO.

Nel secondo sketch invece avremo una sola seriale (l’unica disponibile) Serial.begin(115200) impegnata con Arduino MEGA.

Vi starete chiedendo come fare ad inviare un dato (nel nostro caso un carattere) da un Arduino all’altro: bene, se per la comunicazione con il pc utilizziamo l’istruzione Serial.print(), nel caso di più Arduini utilizziamo l’istruzione Serial.write()

Il codice in sè è davvero molto semplice, dal momento che le operazioni eseguite da ciascun dispositivo sono davvero elementari ed in sostanza riprendono ciò che abbiamo spiegato nell’episodio #8.

""""


Per Arduino MEGA il codice è il seguente:

Il ragionamento è questo: 

if(Serial.available()) ⇒             Se c’è qualcosa da leggere
char a = Serial.read() ⇒          Leggi in input il carattere (dal computer) e memorizzalo nella variabile “a”                          
Serial1.write(a) ⇒                    Invia il carattere sulla seriale 1
while(!Serial.available()) ⇒    Finché non c’è una nuova richiesta di comunicazione non fare assolutamente nulla.
{ }                                              Il ciclo while termina quando Arduino UNO manderà indietro il carattere.
char b = Serial1.read()  ⇒      Memorizza il carattere letto dalla seriale 1 nella variabile “b”.
Serial.println(b)        ⇒           Stampa a video “b” e vai a capo.

 


Per Arduino UNO il codice è il seguente:

Il ragionamento è questo:

if(Serial.available())  ⇒       Se c’è qualcosa da leggere
char a = Serial.read() ⇒     Leggi in input il carattere (dal computer) e memorizzalo nella variabile “a”.
Serial.write(a) ⇒                 Invia il carattere sull’unica seriale disponibile.


HARDWARE

Se avete compreso bene le basi ed il funzionamento del protocollo seriale, sarete sicuramente in grado di realizzare da soli il circuito.
Basta collegare:

  • Il TX dell’Arduino MEGA all’RX dell’Arduino UNO.

  • Il TX dell’Arduino UNO all’RX dell’Arduino MEGA.

""""

ATTENZIONE!!!
In questo caso non serve nient’altro poichè i due Arduini sono alimentati dallo stesso computer, quindi il ground comune è rappresentato dal cavo USB che, come già detto, oltre ai pin RX e TX possiede anche i 5V per l’alimentazione e il GND.

""""

Se ad esempio aveste due Arduini alimentati da due batterie, allora dovreste tirare un filo da ground a ground…

""""

La situazione finale sarà questa:

""""

 

Nel prossimo episodio tratteremo il protocollo I²C bus, che è sicuramente più veloce ed efficiente di quello seriale. Tenetevi pronti!