[TUTORIAL] 3 – Arduino & Processing – Inviare messaggi da Processing a Arduino

Comunicazione seriale – Da Processing a Arduino

Vediamo ora come fare ad inviare un messaggio da Processing a Arduino.

Potrebbe essere molto utile, ad esempio, nel caso in cui vogliate inviare dei comandi da interfaccia grafica su PC ad Arduino.

In questo breve esempio vedremo come accendere e spegnere un led collegato ad Arduino, a seguito di un click del mouse in Processing.

Partiamo dal codice per Processing.

Iscriviti al nostro canale YouTube per saperne di più! 🙂

Prima di tutto dobbiamo importare la libreria per la gestione della seriale.

import processing.serial.*;

Quindi definiamo le variabili che useremo nel nostro codice.

Serial myPort; 
boolean isOn;

Abbiamo definito l’oggetto myPort della classe Serial, necessario per leggere e inviare dati sulla seriale. Inoltre abbiamo definito la variabile booleana isOn che ci servirà per stabilire se il click del mouse dovrà inviare un messaggio di “on” o di “off” del led: se il led è già “on” invieremo il messaggio di “off” e viceversa.

Nella funzione setup() impostiamo la dimensione della finestra, inizializziamo l’oggetto myPort e il flag isOn.

void setup() 
{
   size(400,400); 
   myPort = new Serial(this, Serial.list()[0], 115200);
   isOn = false;
}

Come già detto quando abbiamo parlato dell’invio di messaggi ad Arduino a Processing, il costruttore della classe Serial vuole in ingresso

  • this: identifica il parent dell’oggetto
  • Serial.list()[0]: la funzione list() della classe Serial restituisce la lista delle seriali attualmente disponibili sul vostro PC. Se avete, come in questo caso, solo Arduino connesso, o meglio solo una COM disponibile, allora la funzione restituirà un solo elemento a cui facciamo accesso con il [0].
  • 115200: è il baud rate della seriale. Deve essere uguale a quello scelto nel codice di Arduino

La funzione draw() sarà invece:

void draw() {
 
 if (mousePressed == true) 
 { 
   if(!isOn)
      myPort.write('1'); //send 1 (led ON)
   else
     myPort.write('0'); //send 0 (led OFF)
 
   isOn = !isOn;
   println("SEND COMMAND!");
   delay(500);
  }

}

In breve: quando il pulsante del mouse viene premuto nell’area occupata dalla finestra creata con Processing, si verifica il flag isOn. Se è false si invia il comando di “1” che abbiamo associato al comando “accendi il led”. Se isOn è true invece invieremo il comando “led OFF” ovvero in questo caso “0”. Dopo aver inviato il comando si assegna a isOn il valore opposto a quello precedente.

Anche in questo caso abbiamo inserito delay(500); per evitare di inviare più messaggi ad un singolo click del mouse. Se provate a commentare questo delay e ad eseguire il codice, vedrete che, premendo il pulsante del mouse,la scritta “SEND COMMAND!” verrà inviata più di una volta per un singolo clicca. Con il delay invece vedrete che la scritta apparirà una sola volta per un click.

Passiamo ora al codice per Arduino.

int led = 13;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(led, OUTPUT); 
}

In questo esempio abbiamo usato il led presente sulla scheda Arduino che è collegato al pin 13. Se volete comandare l’accensione di un altro led, collegato ad un altro pin, vi basterà modificare il valore della variabile int led = 13; inserendo il pin a cui avete connesso il led.

Nella funzione setup() si inizializza la seriale con lo stesso baud rate utilizzato per il codice in Processing e si imposta il digitale led come OUTPUT.

La funzione loop() invece sarà:

void loop() {
 char val;
 if (Serial.available()) 
    val = Serial.read();

 if (val == '1') 
 { 
    digitalWrite(led, HIGH); 
 } 
 else if (val == '0')
 {
    digitalWrite(led, LOW); 
 }
 delay(10); 
}

La variabile char val; assumerà il valore letto dalla seriale. La funzione available() della classe Serial restituisce un numero maggiore di 0 nel caso vi siano byte sulla seriale. Se sono presenti dei dati si vanno a leggere tramite la funzione read() della classe Serial e si assegna a val il carattere letto. In questo semplice esempio Arduino si aspetta di ricevere un singolo char, ovvero 1 o 0.

A questo punto si effettua un controllo sul valore letto: se è 1 il led viene accesso, se è 0 il led viene spento.

Quello qua proposto è un esempio molto semplice ma sufficiente per mostrare quali sono i passi necessari per poter inviare messaggi da Processing a Arduino. Potete, in modo analogo, inviare messaggi più complessi. Ad esempio un messaggi contenente più informazioni intervallate da un carattere separatore come abbiamo visto nel caso precedente di invio di messaggi da Arduino a Processing. La classe String di Arduino non prevede però la funzione che effettua lo “split” di stringhe in base ad un separatore. Potete creare voi la funzione che effettuare questa operazione seguendo le indicazioni riportate in questo articolo.

Lo step successivo è quello di implementare una comunicazione “bilaterale” fra i due. Vedremo quindi un esempio di due codici, uno per Arduino e uno in Processing, che prevedono la possibilità sia di inviare che di ricevere messaggi.