Utilizzare UDP per creare una semplice comunicazione via lan

Il protocollo UDP (User Datagram Protocol) è molto semplice da utilizzare e permette di instaurare una comunicazione via lan con l’Arduino. Quando ci troviamo a realizzare progetti dove l’Arduino è connesso in lan e vogliamo impiegare una comunicazione veloce, solo per scambiare brevi messaggi con la scheda, risulta utile conoscere come implementare questo protocollo.

Arduno cavo UDP

Per questo tutorial ho deciso di utilizzare la board Arduino Ethernet e l’ambiente di sviluppo Arduino IDE 1.0

Le librerie da inserire nello sketch sono le seguenti

#include<SPI.h>
#include<Ethernet.h>
#include<EthernetUdp.h>

 

Per utilizzare UDP  dobbiamo creare un oggetto derivato dalla classe EthernetUDP. Nel blocco setup() inizializziamo sia il modulo ethernet sia l’oggetto UDP.

//Indirizzo mac della board
byte mac[] = { 0xD5, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//indirizzo ip della board
IPAddress ip(10, 192, 1, 177);
//porta utilizzata per udp
unsigned int localPort = 7878;

//definisco un array di char per memorizzare i
//dati in ricezione
char DatiRX[20];

//Creo un oggetto
EthernetUDP Udp;

void setup()
{
  //Init modulo Ethernet
  Ethernet.begin(mac, ip);
  //Init oggetto EthernetUdp
  Udp.begin(localPort);
  //inizializzo la seriale per inviare
  //informazioni di debug al Serial Monitor
  Serial.begin(19200);
}

 

Il metodo begin() dell’oggetto Udp accetta come parametro il numero della porta dove saranno trasmessi e ricevuti i pacchetti dati.

Nel blocco loop() scriviamo il codice che ci permette di ricevere i pacchetti dati. Prima di avviare la lettura, dobbiamo assicurarci che questi dati siano disponibili, questo è possibile utilizzando il metodo parsePacket() che verifica se esistono pacchetti UDP in arrivo sulla porta stabilita e restituisce il numero di byte del pacchetto.

void loop()
{
  //Controlla se sono presenti dati da leggere
  int NumDataRx = Udp.parsePacket();

  if (NumDataRX > 0)
  {
    //leggi i dati
  }
}

 

All’interno del blocco if effettuiamo la lettura dei dati presenti nel buffer di ricezione con il metodo read()

void loop()
{
  //Controlla se sono presenti dati da leggere
  int NumDataRx = Udp.parsePacket();

  if (NumDataRX > 0)
  {
    //Invio al serial monitor il numero di byte presenti nel buffer
    Serial.print("Numero di byte da leggere: ");
    Serial.println(NumDataRx);

    //leggo i dati e li memorizzo in un array
    Udp.read(DatiRX, 20);

    for (int i = 0; i < numByteRX; i++)
      Serial.print(DatiRX[i], DEC);
  }
}

 

Al metodo read() dobbiamo passare un array di char dove verranno memorizzati i dati letti dal buffer di ricezione. Il ciclo for invia i singoli byte al serial monitor, utile per verificare il contenuto dei dati.

Per quanto riguarda l’invio di un pacchetto UDP vengono impiegate tre istruzioni, beginPacket(), che permette di specificare l’indirizzo ip e la porta a cui vogliamo spedire il pacchetto, write() che scrive i dati all’interno del pacchetto e endPacket() che chiude e spedisce il pacchetto dati UDP. Le istruzioni da utilizzare sono le seguenti

void loop()
{
  //Controlla se sono presenti dati da leggere
  int NumDataRx = Udp.parsePacket();

  if (NumDataRX > 0)
  {
    //Invio al serial monitor il numero di byte presenti nel buffer
    Serial.print("Numero di byte da leggere: ");
    Serial.println(NumDataRx);

    //leggo i dati e li memorizzo in un array
    Udp.read(DatiRX, 20);

    for (int i = 0; i < numByteRX; i++)
      Serial.print(DatiRX[i], DEC);

    //Una volta ricevuti i dati invio una stringa di
    //conferma all'indirizzo e alla porta che hanno
    //instaurato un collegamento con l'Arduino

    //preparo il pacchetto con l'indirizzo e la porta
    //che mi hanno inviato dati precedentemente
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    //scrivo nel pacchetto i dati da inviare
    Udp.write("RX_OK");
    //spedisco il pacchetto
    Udp.endPacket();

  }
}

 

Il metodo write() accetta sia una stringa di caratteri sia un array di char.

Personalmente impiego questo protocollo quando non mi interessa instaurare una connessione stabile con Arduino (come accade con TCP/IP) ma quando ho bisogno di un metodo semplice, basato su lan, per inviare dei semplici comandi alla board o avere dei dati di ritorno che mi permettono di conoscere lo stato della scheda piuttosto che lo stato di pin della scheda.

Come avete visto le istruzioni per impiegare UDP sono semplici come la programmazione della porta seriale, quindi nei vostri progetti dove Arduino è connesso alla lan potete provare con successo questo protocollo.