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.
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.
Supporta il mio sito
Compra italiano
Categorie
- CorsoArduino (3)
- Elettronica (11)
- Ghi-FEZ (5)
- MikroC (1)
- Notizie (38)
- OpenPicus (8)
- Programmazione (32)
- Tutorial Arduino (97)
- Tutorial Netduino (36)
- Tutorial Python (4)
- Tutorial Raspberry PI (13)
- Tutorial Zerynth (1)