lunedì 21 maggio 2012

UDP tra Arduino e PC

Questo test e' per verificare lo scambio dati tra Arduino Ethernet e PC mediante pacchetti UDP (Arduino invia e PC riceve)


Da notare che l'Arduino funziona bene anche con una normale pila a 9V ricaricabile ed un cavo cross


Il Pc e' impostato come 192.168.1.120 ed ascolta su porta 5005
L'Arduino e' impostata come 192.168.1.2

Script Python per ricevere i dati
--------------------------------------------------------------------
import socket
UDP_IP="192.168.1.120"
UDP_PORT=5005

sock = socket.socket( socket.AF_INET, # Internet
                      socket.SOCK_DGRAM ) # UDP
sock.bind( (UDP_IP,UDP_PORT) )

while True:
    data, addr = sock.recvfrom( 1024 ) # buffer size is 1024 bytes
    print "Ricevuto: ", data

--------------------------------------------------------------------

Sketch Arduino per inviare i dati
--------------------------------------------------------------------
#include <SPI.h>        
#include <Ethernet.h>
#include <Udp.h>        

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = {192,168,1,2};

byte remote_ip[] = {192,168,1,120};  
unsigned int remote_port = 5005;   

char sendBuffer [] = "Luca\0";
unsigned int sent=0;
int contatore = 0;

void setup() {
  Ethernet.begin(mac,ip);
  Udp.begin(8008);
}

void loop() {
  contatore = contatore + 1;
  dtostrf(contatore,4,0,sendBuffer);
  sent=Udp.sendPacket(sendBuffer, remote_ip, remote_port);
  delay(500);
}


--------------------------------------------------------------------
ATTENZIONE:
con le ultime due versioni del software Arduino (0.23 e 1.0) esiste un bug nella gestione di UDP che genera dei pacchetti pieni di spazzatura.
Per risolvere il problema si deve individuare il file w5100.h che si trova in /libraries/Ethernet/Utility e modificarlo secondo quanto riportato da questo post (vedi al termine del post)
Il problema dovrebbe risultare risolto nella versione 1.0.1 di prossima uscita