Negli ultimi articoli abbiamo approfondito l’uso delle strutture di controllo e di iterazione. In quest’episodio invece introdurremo un nuovo e fondamentale capitolo della programmazione con Arduino: la comunicazione seriale.

<<La trasmissione seriale è una modalità di comunicazione tra dispositivi digitali nella quale i bit vengono trasferiti lungo un canale di comunicazione uno di seguito all’altro e giungono sequenzialmente al ricevente nello stesso ordine in cui li ha trasmessi il mittente>>. (Wikipedia)

Cerchiamo di chiarire la definizione per capire in che modo questo nuovo strumento può tornarci utile. Innanzitutto, nel nostro caso, la comunicazione seriale avviene tra Arduino e il computer mediante il cavo USB, che quindi funge contemporaneamente da cavo di alimentazione e canale di comunicazione; ma quali informazioni passano in questo canale?

La comunicazione seriale è di tipo digitale, quindi, come suggerisce la definizione, riesce a trasmettere solo sequenze di bit, cioè tanti 0 e 1 quanti ne vengono inviati dal mittente, e nello stesso ordine. Tale forma di comunicazione, inoltre, si definisce seriale in quanto i bit vengono trasmessi sequenzialmente, cioè uno alla volta, dal dispositivo mittente al dispositivo destinatario.

Vediamo come utilizzare la comunicazione seriale.
Per comunicare ad Arduino che si vuole avviare una trasmissione di tipo seriale, bisogna inizializzarla nel setup con la seguente istruzione:
Serial.begin(9600);

che significa: “Avvia una comunicazione seriale ad una velocità di 9600 baud”.
Il baud è l’unità di misura che indica quanti caratteri vengono trasferiti ogni secondo dal dispositivo in questione, quindi, in questo caso Arduino sarà in grado di inviare al nostro un computer un massimo di 9600 caratteri al secondo. Per quanto possa sembrare una velocità elevata, in realtà è già stata superata da diversi anni e da diversi dispositivi elettronici, ma non c’è da preoccuparsi, poiché per i nostri progetti di prototipazione sarà più che sufficiente.
Cerchiamo di mettere in pratica le informazioni che abbiamo appena appreso scrivendo un programma che stampi una parola a video (“overVolt” ovviamente, che cosa altrimenti?) ripetutamente e ad intervalli di un secondo.

Il codice è il seguente:

L’istruzione Serial.print( ) consente di stampare sullo schermo l’argomento contenuto tra parentesi, che può essere una variabile o una stringa (in tal caso ricordate di usare le virgolette!).

Osservazione || Per andare a capo ci sono due possibilità:

  • Utilizzare il carattere di escape ‘\n’ che sta per “new line”.
  • Utilizzare l’istruzione Serial.println( ) che prima stampa l’argomento (stringa o variabile) e poi va a capo.

 

Il Monitor Seriale

Per visualizzare l’output della trasmissione seriale bisogna aprire il “Monitor Seriale”:

""""

Attenzione!
Ogni volta che si apre il Monitor Seriale, Arduino farà ripartire il codice dalla prima riga.

Un altro esempio.

Consideriamo, per completezza, anche il caso in cui si voglia stampare una variabile. Scriviamo quindi un programma che, data una variabile “a” di tipo int inizializzata a 0, ogni secondo stampi la variabile stessa incrementata di 1. Ecco il codice:

Otterrete un output di questo tipo:

""""

 

Hardware e Comunicazione Seriale

A questo punto manca solo un esempio che dimostri come l’hardware possa interfacciarsi con la comunicazione seriale. Scriviamo un programma che mediante un led e un pulsante misuri i nostri tempi di reazione:

  • Il led fungerà da segnale di inizio.
  • Il pulsante sarà lo strumento di misura vero e proprio.

Quando il led si accenderà, noi dovremo premere il pulsante il più velocemente possibile e sul monitor seriale comparirà il tempo (in millisecondi) che avremo impiegato nel farlo, cioè la nostra velocità di reazione.
 

HARDWARE 

Per quanto riguarda l’hardware, faremo uso esattamente degli stessi componenti degli ultimi due episodi della serie:

  • 6 jumper
  • 1 LED
  • 1 resistore da 220 Ω (per il led)
  • 1 pulsante
  • 1 resistore da 1 KΩ (per il pulsante)

 A seguito è riportato il circuito:

""""

 

SOFTWARE

Ecco il codice:

Analisi passo-passo del loop():

  • delay(random(5000,10000));  ---> La funzione random(minimo,massimo) restituisce come output un numero intero casuale compreso tra la soglia minima e massima, che vanno indicate tra parentesi tonde e separate da virgola. In questo caso la funzione restituisce un numero compreso tra 5000 e 10000, che sarà il ritardo (in millisecondi) della funzione delay( ).
  • digitalWrite(pinLed, HIGH);  ---> Accende il led collegato al pin 8.
  • while(digitalRead(buttonPin)==LOW) { ….. } ---> Il ciclo indica che, finchè il pulsante non sarà premuto, la variabile “a” dovrà aumentare di 1 ad intervalli di 1 millisecondo: in questo modo se la variabile aumenta di 1 ad ogni millisecondo, allora, quando il pulsante sarà premuto, essa conterrà il numero di millisecondi trascorsi dall’accensione del led.
  • Serial.println(a);  ---> Prima stampa la variabile “a” e poi va a capo.
  • digitalWrite(pinLed, LOW);  ---> Spegne il led che è collegato al pin 8.

 
A questo punto possiamo anche divertirci a formattare l’output in maniera più curata, modificando i Serial.print( ). Un suggerimento potrebbe essere:

Serial.print(“Hai aspettato “);
Serial.print(a);
Serial.println(“ millisecondi”);

Così siamo giunti alla conclusione anche di questo episodio...

Fino ad ora abbiamo approfondito la comunicazione seriale tra Arduino ed un computer: più avanti vedremo anche come mettere in comunicazione più schede Arduino, operazione che sicuramente sarà più allettante per chi ha intenzione di affacciarsi al mondo della robotica. Non perdetevi i prossimi episodi!