Go Down

Topic: Ethernet shield Question (Read 4038 times) previous topic - next topic

lucadentella

Ciao

veramente strano... ma se colleghi qualcos'altro al router funziona? Che so due PC connessi in rete locale?
lucadentella.it

matrix77

#31
Feb 05, 2012, 10:24 pm Last Edit: Feb 05, 2012, 10:33 pm by matrix77 Reason: 1
Per adesso ho provato con dispositivi tipo convertitore USB/ETHERNET, oppure con un server video, sempre moduli configurabili, con indirizzi ip statici e vengono visti senza problemi; mi sono collegato anche con il portatile e anche in quel caso nessun problema.

Adesso ho riprovato con "arp -a" e funziona solo con switch collegato in cascata, visualizzandomi il mac della scheda, se poi collego lo shield al modem, l'arp è impossibile da trovare e la risposta del ping è "host non raggiungibile".

Se stacco lo switch, in cascata dopo che quest'ultimo è stato mappato dal modem e inserisco al suo posto lo shield, mi viene visto, ma  non devo spegnere niente, altrimenti è come se si smemorizzasse qualcosa nel modem e a quel punto dovrei "fregarlo", reinserendo lo switch, per poi toglierlo a "caldo" e così via...... da non credere eheh :smiley-roll:

Ciao

lucadentella

sembra che per qualche motivo lo stack Ethernet non piaccia al tuo router... prova a cambiare il mac address che hai assegnato ad Arduino e vediamo...
Se metti una arp statica su PC digitando

arp -s <mac-address-arduino> <ip-arduino>

funziona?
lucadentella.it

BrainBooster

Ma dai log del router non vedi nulla di strano?

matrix77

#34
Feb 06, 2012, 07:35 pm Last Edit: Feb 06, 2012, 07:39 pm by matrix77 Reason: 1

sembra che per qualche motivo lo stack Ethernet non piaccia al tuo router... prova a cambiare il mac address che hai assegnato ad Arduino e vediamo...
Se metti una arp statica su PC digitando

arp -s <mac-address-arduino> <ip-arduino>

funziona?
Ciao Luca, niente da fare:  "aggiunta alla voce arp non riuscita"

Questa cosa è un po' irritante, perchè significa che il chip d'interfacciamento ethernet dello shield, non garantisce il 100% di compatibilità coi

modem router, dal momento che svariati dispositivi connessi al mio modem, hanno funzionato, senza nessun problema.

Mi piacerebbe sapere a questo punto, quale alternativa si potrebbe scegliere, per avere un interfacciamento sicuro, allo stesso livello dei

prodotti venduti  "home consumer".


Ma dai log del router non vedi nulla di strano?
Salve Brain,

no, purtroppo è come se non esistesse lo shield collegato, ma ribadisco che la spia della LAN è accesa e lampeggia in concomitanza dello

shield stesso.

La cosa che non mi riesco a spiegare è del perchè, se inserisco in cascata lo switch, il mio modem lo "mappa", stacco lo

switch, collego lo shield al suo posto e da questo momento in poi, l'ip, risulta raggiungibile, salvo reset, di Arduino, o spegnimenti e

riaccensioni del modem, altrimenti si "smemorizza"questa ipotetica "mappatura" e addio indirizzo.... :0

Ciao

matrix77

#35
Feb 06, 2012, 09:52 pm Last Edit: Feb 06, 2012, 09:58 pm by matrix77 Reason: 1

Ciao,
potresti fare questa prova?

Dovresti riabilitare il DHCP del router, compilare lo sketch qui sotto con l'IDE 1.0. Lanciandolo con l'Arduino collegato direttamente al router e aprendo il serial monitor dovresti vedere una serie di dati tra cui l'indirizzo ip, il gateway. (nella versione 1.0 dell'IDE è stato implementato il supporto del DHCP)
Lo sketch è quello riguardante il server NTP da me modificato per inviare altri dati sulla seriale. Una specie di piccolo debug.
Code: [Select]
#include <SPI.h>        
#include <Ethernet.h>
#include <EthernetUdp.h>

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = {  
 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA };

unsigned int localPort = 8888;      // local port to listen for UDP packets

IPAddress timeServer(192, 43, 244, 18); // time.nist.gov NTP server

const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message

byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets

// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

void setup()
{
 Serial.begin(9600);
 Serial.println("Arduino start!");
 // start Ethernet
 if (Ethernet.begin(mac) == 0) {
   Serial.println("Failed to configure Ethernet using DHCP");
   // no point in carrying on, so do nothing forevermore:
   for(;;)
     ;
 }
 else
 {
   Serial.println("Ethernet configured using DHCP");
   Serial.print("Local IP: ");
   Serial.println(Ethernet.localIP());
   Serial.print("SubnetMask: ");
   Serial.println(Ethernet.subnetMask());
   Serial.print("Gateway: ");
   Serial.println(Ethernet.gatewayIP());
   Serial.print("DNS Server: ");
   Serial.println(Ethernet.dnsServerIP());
 }
 if (Udp.begin(localPort) == 0) {
   Serial.println("No UDP sockets available");
   // no point in carrying on, so do nothing forevermore:
   for(;;)
     ;
 }  
 else
 {
   Serial.println("UDP sockets ON");
 }
}

void loop()
{
 Serial.println("Send Packet");      
 sendNTPpacket(timeServer); // send an NTP packet to a time server

   // wait to see if a reply is available
 delay(1000);  
 if ( Udp.parsePacket() ) {  
   // We've received a packet, read the data from it
   Udp.read(packetBuffer,NTP_PACKET_SIZE);  // read the packet into the buffer

   //the timestamp starts at byte 40 of the received packet and is four bytes,
   // or two words, long. First, esxtract the two words:

   unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
   unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);  
   // combine the four bytes (two words) into a long integer
   // this is NTP time (seconds since Jan 1 1900):
   unsigned long secsSince1900 = highWord << 16 | lowWord;  
   Serial.print("Seconds since Jan 1 1900 = " );
   Serial.println(secsSince1900);              

   // now convert NTP time into everyday time:
   Serial.print("Unix time = ");
   // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
   const unsigned long seventyYears = 2208988800UL;    
   // subtract seventy years:
   unsigned long epoch = secsSince1900 - seventyYears;  
   // print Unix time:
   Serial.println(epoch);                              


   // print the hour, minute and second:
   Serial.print("The UTC time is ");       // UTC is the time at Greenwich Meridian (GMT)
   Serial.print((epoch  % 86400L) / 3600); // print the hour (86400 equals secs per day)
   Serial.print(':');  
   if ( ((epoch % 3600) / 60) < 10 ) {
     // In the first 10 minutes of each hour, we'll want a leading '0'
     Serial.print('0');
   }
   Serial.print((epoch  % 3600) / 60); // print the minute (3600 equals secs per minute)
   Serial.print(':');
   if ( (epoch % 60) < 10 ) {
     // In the first 10 seconds of each minute, we'll want a leading '0'
     Serial.print('0');
   }
   Serial.println(epoch %60); // print the second
 }
 // wait ten seconds before asking for the time again
 delay(10000);
}

// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(IPAddress& address)
{
 // set all bytes in the buffer to 0
 memset(packetBuffer, 0, NTP_PACKET_SIZE);
 // Initialize values needed to form NTP request
 // (see URL above for details on the packets)
 packetBuffer[0] = 0b11100011;   // LI, Version, Mode
 packetBuffer[1] = 0;     // Stratum, or type of clock
 packetBuffer[2] = 6;     // Polling Interval
 packetBuffer[3] = 0xEC;  // Peer Clock Precision
 // 8 bytes of zero for Root Delay & Root Dispersion
 packetBuffer[12]  = 49;
 packetBuffer[13]  = 0x4E;
 packetBuffer[14]  = 49;
 packetBuffer[15]  = 52;

 // all NTP fields have been given values, now
 // you can send a packet requesting a timestamp:  
 Udp.beginPacket(address, 123); //NTP requests are to port 123
 Udp.write(packetBuffer,NTP_PACKET_SIZE);
 Udp.endPacket();
}


Se funziona, prova poi a scollegare Arduino, ad inserire l'altro switch in cascata e riprovare... e poi anche con i PowerLan.
Ho anche io una Ethernet Shield e ogni tanto fa i capricci.

Paolo.
p.s. ho la UNO R3 e la Ethernet Shield R3 uso l'IDE 1.0
Salve Paolo e grazie per il tuo intervento...

Ho collegato direttamente lo shield al modem router e una volta caricato il tuo sketch in Arduino, ho potuto constatare che tramite serial monitor, si visualizza l'ip assegnato e una serie di send a ciclo infinito; ogni pacchetto trasmesso, viene evidenziato dal lampeggio dello shield e dalle spie di stato LAN del modem.Poi ho anche riprovato con lo switch in cascata collegandoci lo shield, ma sembra non funzionare.
A questo punto, il cerchio si stringe un po', o almeno credo, ma non riesco personalmente, a circoscrivere il problema.

Ciao e grazie ancora

PaoloP


Ho collegato direttamente lo shield al modem router e una volta caricato il tuo sketch in Arduino, ho potuto constatare che tramite serial monitor, si visualizza l'ip assegnato e una serie di send a ciclo infinito; ogni pacchetto trasmesso, viene evidenziato dal lampeggio dello shield e dalle spie di stato LAN del modem.Poi ho anche riprovato con lo switch in cascata collegandoci lo shield, ma sembra non funzionare.
A questo punto, il cerchio si stringe un po', o almeno credo, ma non riesco personalmente, a circoscrivere il problema.

Ciao e grazie ancora

Lo sketch permette ad Arduino di richiedere al router un indirizzo IP tramite DHCP. Se lo hai ottenuto allora il router ha reagito ad una richiesta della scheda assegnando al'indirizzo MAC il primo indirizzo IP disponibile. Inoltre gli passa anche altri parametri come il gateway predefinito, in questo caso lo stesso indirizzo del router e la maschera di sottorete.
Inoltre se hai potuto visualizzare il tempo ricevuto del server NTP funziona anche il routing dei pacchetti trasmessi e ricevuti. Quindi il tuo router fa il router.
Collegando direttamente l'Arduino al router, nelle pagine web interne del router dovresti vedere elencato il MAC e l'IP dato all'Arduino.
Hai provato a richiamare le pagine del router dopo aver lanciato lo sketch?

matrix77

#37
Feb 08, 2012, 08:07 pm Last Edit: Feb 08, 2012, 08:08 pm by matrix77 Reason: 1


Ho collegato direttamente lo shield al modem router e una volta caricato il tuo sketch in Arduino, ho potuto constatare che tramite serial monitor, si visualizza l'ip assegnato e una serie di send a ciclo infinito; ogni pacchetto trasmesso, viene evidenziato dal lampeggio dello shield e dalle spie di stato LAN del modem.Poi ho anche riprovato con lo switch in cascata collegandoci lo shield, ma sembra non funzionare.
A questo punto, il cerchio si stringe un po', o almeno credo, ma non riesco personalmente, a circoscrivere il problema.

Ciao e grazie ancora

Lo sketch permette ad Arduino di richiedere al router un indirizzo IP tramite DHCP. Se lo hai ottenuto allora il router ha reagito ad una richiesta della scheda assegnando al'indirizzo MAC il primo indirizzo IP disponibile. Inoltre gli passa anche altri parametri come il gateway predefinito, in questo caso lo stesso indirizzo del router e la maschera di sottorete.
Inoltre se hai potuto visualizzare il tempo ricevuto del server NTP funziona anche il routing dei pacchetti trasmessi e ricevuti. Quindi il tuo router fa il router.
Collegando direttamente l'Arduino al router, nelle pagine web interne del router dovresti vedere elencato il MAC e l'IP dato all'Arduino.
Hai provato a richiamare le pagine del router dopo aver lanciato lo sketch?

Salve Paolo,


Per adesso ti posso solo dire che ho visto l'assegnazione dell'indirizzo ip, con i dati relativi al gateway e all 'indirizzo ip del modem, per il resto, solo una serie infinita di trasmissioni (send packet) e basta.

Ciao

PaoloP

Strano, dopo gli indirizzi dovresti vedere la stampa dell'orario prelevato dal server NTP.

matrix77

#39
Feb 08, 2012, 08:17 pm Last Edit: Feb 08, 2012, 08:20 pm by matrix77 Reason: 1

Strano, dopo gli indirizzi dovresti vedere la stampa dell'orario prelevato dal server NTP.
No purtroppo, magari riproverò, per avere una riconferma e posso fare anche uno screenshot, della videata.
Io ricordo solo il riepilogo dei dati relativi al modem e una serie di trasmissioni, senza nessun altro valore.


tonywhite

#40
Mar 30, 2012, 01:22 pm Last Edit: Mar 30, 2012, 01:28 pm by tonywhite Reason: 1
Salve a tutti.
Ho letto tutto il thread e non sono ancora riuscito a far dialogare in UDP lo shield collegandolo direttamente al PC con un cavo incrociato.

Cosa ho e come deve funzionare:
1) Arduino+Shield Ethernet (ufficiale) invia in UDP al mio PC sulla porta 4445 il pacchetto NTP
2) Sul PC ho creato un'applicazione con protocollo UDP in ascolto sulla porta 4445 che visualizza il pacchetto ricevuto.
3) Per testarne l'effettivo funzionamento ho creato un'altra piccola applicazione che invia in UDP da un PC ad un altro.

Le applicazioni UDP funzionano correttamente.


Lo sketch è UdpNtpClient modificato
Code: [Select]
#include <SPI.h>        
#include <Ethernet.h>
#include <EthernetUdp.h>

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = {0x90, 0xA2, 0xDA, 0x00, 0x58, 0x0B};
byte ip[] = { 192, 168, 0, 5 };
byte gateway[] = { 192, 168, 0, 1 };
byte subnet[] = { 255, 255, 255, 0 };

unsigned int localPort = 8888;      // local port to listen for UDP packets

IPAddress timeServer(192, 168, 0, 9); // destinatario: il mio PC

const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message

byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets

// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

void setup()
{
 Serial.begin(9600);
 Serial.println("Inizializzo il protocollo seriale...OK.");
 // start Ethernet and UDP
 Serial.print("Inizializzo l'ethernet...");
 Ethernet.begin(mac, ip, gateway, subnet);
 Serial.println("OK.");
 Serial.print("Inizializzo il protocollo UDP...");
 Udp.begin(localPort);
 Serial.println("OK.");
 Serial.println("Tutti i protocolli di comunicazione sono pronti.");
}

void loop()
{
 Serial.print(millis());
 Serial.print(": send UDP packet to ");
 Serial.print(timeServer);
 sendNTPpacket(timeServer); // invia un pacchetto NTP
 // Aspetta 1 secondo prima di inviare un nuovo pacchetto
 delay(1000);
}

// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(IPAddress& address)
{
 // set all bytes in the buffer to 0
 memset(packetBuffer, 0, NTP_PACKET_SIZE);
 // Initialize values needed to form NTP request
 // (see URL above for details on the packets)
 packetBuffer[0] = 0b11100011;   // LI, Version, Mode
 packetBuffer[1] = 0;     // Stratum, or type of clock
 packetBuffer[2] = 6;     // Polling Interval
 packetBuffer[3] = 0xEC;  // Peer Clock Precision
 // 8 bytes of zero for Root Delay & Root Dispersion
 packetBuffer[12]  = 49;
 packetBuffer[13]  = 0x4E;
 packetBuffer[14]  = 49;
 packetBuffer[15]  = 52;

 // all NTP fields have been given values, now
 // you can send a packet requesting a timestamp:  
 unsigned int porta = 4445; // porta del ricevente
 Serial.print(":");
 Serial.print(porta);
 Serial.println(".");
 Serial.print("Beginning packet...");
 Udp.beginPacket(address, porta); //NTP requests are to port 4445
 Serial.println("OK");
 Serial.print("Write packet to destination host...");
 Udp.write(packetBuffer,NTP_PACKET_SIZE);
 Serial.println("OK");
 Serial.print("Ending packet...");
 Udp.endPacket();
 Serial.println("OK");
}


Avvio l'applicazione sul PC per mettermi in ascolto ed avvio lo sketch Arduino.
L'output dello sketch è questo
Code: [Select]
Inizializzo il protocollo seriale...OK.
Inizializzo l'ethernet...OK.
Inizializzo il protocollo UDP...OK.
Tutti i protocolli di comunicazione sono pronti.
329: send UDP packet to 192.168.0.9:4445.
Beginning packet...OK
Write packet to destination host...OK
Ending packet...


In teoria dovrei inviare un pacchetto al secondo e riceverne altrettanti dal PC.
Sul PC non ricevo niente
e da Arduino non va più avanti del primo ciclo.
Si ferma al comando Udp.endPacket(); e devo riavviare lo sketch. Ma ho sempre lo stesso risultato.
Non riesco nemmeno a pingare.
P.S.
Il cavo funziona e i led sulla shield lampeggiano.

PaoloP

Devi controllare cosa c'è dentro la funzione Udp.endPacket();.

tonywhite

Devo entrare nei sorgente della libreria Ethernet?

Code: (arduino-1.0/libraries/Ethernet/EthernetUdp.cpp) [Select]
[...]
int EthernetUDP::endPacket()
{
  return sendUDP(_sock);
}
[...]

Testato

non centra nulla ma ti puo' far comodo in futuro, non servono piu' i cavi cross, tutte le schede di rete integrate nei pc, ormai da anni, sono autocross
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

tonywhite

Ah, perfetto... mi hai già evitato un bel po' di rogne! :D

Go Up