Far parlare tra di loro due Arduino collegati allo stesso PC: “battezzare” i dispositivi Arduino

In questo articolo si vuole mostrare il funzionamento di due Arduino collegati allo stesso PC (in questo caso un Raspberry PI) che comunicano in seriale con il computer e si possono scambiare messaggi tra di loro passando per lo stesso.

Questo video (https://youtu.be/dLaECXfDyBc) mostra quale potrebbe essere lo scenario di quanto visto a lezione del corso “SVILUPPARE PROTOTIPI HARDWARE E SOFTWARE PER INTERNET DELLE COSE” (https://www.sviluppareiot.it), edizione della mattina, per conto di abacons (http://www.abacons.com).

Chiamando ciascun dispositivo per nome (che deve essere univoco), è possibile indirizzare messaggi dall’uno all’altro, messaggi che possono contenere comandi.
Nel video si può vedere come premendo un pulsante collegato a un Arduino si riesce ad accendere un led collegato al secondo, premendo un pulsante sul secondo si riesce ad accendere un pulsante sul primo, nonostante tra i due con ci siano collegamenti elettrici diretti.

L’unica interconnessione avviene tramite cominicazione seriale.

Il Raspberry svolge il ruolo di gestore delle comuicazioni, ricevendo i messaggi (per esempio alla pressione dei pulsanti), elaborandoli e reindirizzandoli opportunamente.
Ciascun Arduino è stato “batezzato”, ovvero gli si è attribuito un nome univoco, che è stato associato alla porta di comunicazione seriale con la quale comuica col Raspberry da programma Java, mediante l’utilizzo di Mappe (LinkedHashMap, per la precisione).

Il nome viene impostato nello sketch in una variabile di tipo String, e nello stesso viene aggiunta una parte di codice che fa in modo che, quando da seriale il dispositivo riceve la stringa “get_device_name”, come risposta invia il contenuto della variabile contenente il nome.
Dal PC (Raspberry) il programma Java esegue una ricerca dei dispositivi collegati in seriale (USB in questo caso), apre una connessione verso ciascuno e invia il comando di richiesta del nome.

Se il dispositivo è in grado di rispondere al comando significa che si tratta di un Arduino opportunamente configurato, per cui viene salvata la risposta contenente il nome su una tabella di hash che fa corrisponedere il nome del dispositivo alla porta seriale alla quale è connesso.

Attribuendo un nome univoco a ciascun Arduino, da salvare sullo sketch (per esempio ARD01 e ARD02), sapendo che tale nome viene richiesto dall’applicativo Java al dispositivo al momento della connessione e salvato in opportune mappe o tabelle di hash di associazione nome_dispositivo – porta_seriale_di_connessione, è possibile eseguire un’astrazione rispetto alla porta seriale di connessione e rivolgersi ai dispositivi semplicemente “chiamandoli per nome”, così non ci si deve più preoccupare se il primo dispositivo è collegato per esempio alla porta COM1 o COM14 e se il secondo è connesso alla COM3 o COM5.

Questa astrazione permette, in parole povere, di fare un discorso del tipo: “se da ARD01 ricevo un messaggio seriale che indica che è stato premuto il primo pulsante, mando un mesasggio ad ARD02 per dirgli di accendere il LED collegato al pin 8”, oppure: “se da ARD02 ricevo un messaggio che indica che è stato premuto il secondo pulsante, invio un messaggio ad ARD01 per dirgli di spegnere il LED collegato al pin 8”.

A questo punto, è possibile gestire richieste e risposte in quanto si può stabilire da quale dispositivo provengono le richieste (per esempio si può capire su quale Arduino è stato premuto il primo pulsante) ed eventualmente eseguire azioni di risposta (per esempio, alla pressione del primo pulsante su un dispositivo deve essere acceso il primo led sul secondo, alla pressione del secondo pulsante il led deve essere spento, e questo deve funzionare in maniera incrociata tra i due Arduino).

Si noti che utilizzando una comunicazione seriale tra Arduino collegati sullo stesso Raspberry o PC non è necessario eseguire chiamate di rete per poter permettere l’interazione dei dispositivi, ma sono sufficienti scambi di messaggi in seriale.
Tuttavia è possibile, mediante la web application Java, poter gestire richieste http e trasmetterle a ciascun Arduino.

In pratica in questo scenario si può operare in due modalità, una completamente locale e offline e una che fa uso di chiamate http, eventualmente anche tramite browser, come mostra il vdeo.

Nell’ultima parte del video si vede come sia possibile trasemttere dei messaggi anche mediante il protocollo http per modificare i valori di intensità luminosa del secondo LED collegato a ciascun Arduino in modalità PWM.

Per poter inviare i comandi a un arduino si deve utilizzare la servlet DevicesServlet, alla quale va specificato il nome del dispositivo al quale si vuole inviare un messaggio e il messaggio stesso.

Per esempio, utilizzando:

http://indirizzo_ip_raspberry:8080/SerialeWeb/DevicesServlet?device=ARD01&message=8=1

stiamo dicendo che vogliamo accendere il led collegato al pin 8 dell’Arduino che ha nome “ARD01”, mentre utilizzando:

http://indirizzo_ip_raspberry:8080/SerialeWeb/DevicesServlet?device=ARD02&message=9=100

stiamo dicendo che vogliamo dare un valore PWM di 100 al pin 9 dell’arduino con nome “ARD02”, e quindi vogliamo modificare il valore di intensità luninosa del LED a esso collegato.

Qui di seguito si possono scaricare i codici di sketch e progetto NetBeans della web application Java: