Ethernet shield Question

Salve a tutti e grazie innanzitutto per il Vostro intervento,

Per essere giustamente più preciso, posterò lo sketch che tra l'altro è quello preconfezionato nel software di arduino e io non ho fatto nient'altro che modificare i parametri di rete.

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

// network configuration. gateway and subnet are optional.

// the media access control (ethernet hardware) address for the shield:
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x6C, 0xE3 }; (MAC DELLA MIA SCHEDA)
//the IP address for the shield:
byte ip[] = { 192, 168, 0, 6 }; (IP LIBERO DELLA MIA RETE)
// the router's gateway address:
byte gateway[] = { 192, 168, 0, 1 }; (IP MODEM)
// the subnet:
byte subnet[] = { 255, 255, 255, 0 }; (CLASSICO PARAMETRO ORMAI UN DEFAULT PER MOLTE RETI)

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup()
{
// initialize the ethernet device
Ethernet.begin(mac, ip, gateway, subnet);

// start listening for clients
server.begin();
}

void loop()
{
// if an incoming client connects, there will be bytes available to read:
EthernetClient client = server.available();
if (client == true) {
// read bytes from the incoming client and write them back
// to any clients connected to the server:
server.write(client.read());
}
}

Per quanto riguarda l'hw, possiedo un Arduino UNO, con shield ethernet che trovate rappresentata in questa immagine: http://arduino.cc/en/Guide/ArduinoEthernetShield

Rammento che se collego arduino direttamente al pc, funziona tutto alla perfezione, visualizzando ad esempio, una pagina di prova nel browser.
Come ultima cosa, ho provato a collegare al mio modem, un piccolo convertitore USB/ETHERNET, attribuendogli un indirizzo ip, sia statico che dinamico e funziona sempre.
Altro test che ho eseguito è stato quello di disabilitare e abilitare il DHCP, ma il modem già a priori, non visualizza lo shield collegato, nella lista preposta...., mah che rabbia :0

lucadentella:
ciao

per capire meglio... se colleghi con un cavo l'ethernet shield alla presa di rete del PC riesci a pingare Arduino e a collegarti?
Se invece entrambi (PC e Arduino) sono connessi al router no?
Veramente strano, il router dovrebbe avere un semplice "switch" al suo interno...

prova così: carica uno sketch che risponda al ping, dal PC fai:

ping <indirizzo_ip_arduino>

e se non ti risponde dai

arp -a

vedi se almeno il PC riesce ad ottenere l'ARP che hai definito nel tuo sketch

Proverò anche (ARP-A) e vediamo se fa qualcosa.

Ciao

Aggiorno il mio post, perchè penso di essere prossimo alla soluzione; ho fatto un altro esperimento che consiste nell utilizzare un dispositivo, per inviare segnali ethernet, tramite onde convogliate, nella linea elettrica, in sostanza se interpongo questo dispositivo, il modulo lo vedo e funziona, in caso contrario, nulla da fare.

Riepilogando: nella porta del router, inserisco il dispositivo ad onde convogliate, che verrà collegato tramite presa elettrica.

Nella mia stanza, prelevo dal secondo dispositivo ad onde convogliate, il segnale ethernet che verrà collegato al modulo shield ethernet.
Magia! Funziona, a questo punto devo dare una spiegazione tecnica all'inghippo e l'unica cosa che mi viene in mente è: non che sta m....ia di shield, voglia un cavo incrociato???

Ciao a tutti :slight_smile:

Ciao

normalmente la configurazione è

  • dispositivo di rete -> altro dispositivo di rete (es. Arduino -> PC) = cavo incrociato
  • dispositivo di rete -> switch (o router) = cavo dritto

in realtà quasi tutti i dispositivi "moderni" hanno la funzionalità di Auto-MDIX ovvero "capiscono" che cavo stai usando e agiscono di conseguenza. Potrebbe essere però che tu stia usando un cavo cross, che quindi va bene per un collegamento diretto ma non verso il router se questo non fa auto-sensing...

lucadentella:
Ciao

normalmente la configurazione è

  • dispositivo di rete -> altro dispositivo di rete (es. Arduino -> PC) = cavo incrociato
  • dispositivo di rete -> switch (o router) = cavo dritto

in realtà quasi tutti i dispositivi "moderni" hanno la funzionalità di Auto-MDIX ovvero "capiscono" che cavo stai usando e agiscono di conseguenza. Potrebbe essere però che tu stia usando un cavo cross, che quindi va bene per un collegamento diretto ma non verso il router se questo non fa auto-sensing...

Salve Luca,

Si effettivamente hai ragione, purtroppo mi ero illuso che funzionasse, ma a questo punto, la causa potrebbe essere da imputare ad un probabile guasto dello shield, dal momento che ancora adesso non funziona :0; nel contempo ho potuto constatare, anche un altro problema ed in sostanza, lo shield non accetta gli indirizzi ip es: 192.168.0.4, con la conseguente mancata trasmissione dell' ip stesso anche collegandolo direttamente al pc, se però l'indirizzo lo modifico in: 192.168.1.4, ecco che riappare alla perfezione col ping e nel browser.

A questo punto ho reimpostato il modem, perchè accettasse ip, con numerazione x.x.1.0, anzichè x.x.0.1. ma anche in questo caso nessun risultato.

Ciao

Salve a tutti,

Problema definitivamente risolto!

Svelato l'arcano e colpevole di tutto il caos è il mio modem (tra l'altro da poco acquistato e pagato a peso d'oro ) che non accetta lo shield ethernet.
Per bypassare il problema, ho collegato in cascata, uno switch router che per fortuna avevo in casa, configurandolo come bridge 8)
Per farla breve, bisogna essere fortunati, di trovare un modem router "compatibile" con questo shield, altrimenti l' utilizzo di uno switch router in cascata è d'obbligo :P.

Adesso mi viene da sorridere, vedendo che uno shield piccolo, abbia bisogno, in certe situazioni, di parecchio hw intorno, un po' come avere un piccolo cellulare in tasca e due batterie tipo valigie, per alimentarlo eheh :roll_eyes:

Un saluto e buona domenica

ciao

sarebbe interessante capire cosa - dello stack ethernet - non piace al tuo modem visto che dovrebbe essere tutto standard...

ma scusami la stupida domanda ma la tua scheda di quale tipo e cioe che cip monta un enc28j60 oppure un winznet

Ha gia' risposto a questa domanda:

matrix77:
Per quanto riguarda l'hw, possiedo un Arduino UNO, con shield ethernet che trovate rappresentata in questa immagine: http://arduino.cc/en/Guide/ArduinoEthernetShield

questa e' la board ufficiale, quindi wiznet, non a caso dice di usare lo sketch incluso in Ide, nell'ide non c'e' supporto ufficiale per l'ENC

mi associo alla domanda di lucadentella, ed azzardo che potrebbe essere guasto il router, visto che e' nuovo fattelo sostituire, male non fa

a ok scusate non avevo notato , e con questo non dovresti avere troppe difficolta

.....che potrebbe essere per reagire così male ad un livello così basso?
MTU? (troppe ritrasmissioni o troppa frammentazione)
Porte hub non switching sul router e cavo dritto ?(nessuna autonegoziazione sull'uplink)
Porte antiche a 10mbit sul router con mancata/fallata autonegoziazione sulla velocità di comunicazione?.
sarei curioso di capire anch'io a che livello è l'inghippo...

Testato:
Ha gia' risposto a questa domanda:

matrix77:
Per quanto riguarda l'hw, possiedo un Arduino UNO, con shield ethernet che trovate rappresentata in questa immagine: http://arduino.cc/en/Guide/ArduinoEthernetShield

questa e' la board ufficiale, quindi wiznet, non a caso dice di usare lo sketch incluso in Ide, nell'ide non c'e' supporto ufficiale per l'ENC

mi associo alla domanda di lucadentella, ed azzardo che potrebbe essere guasto il router, visto che e' nuovo fattelo sostituire, male non fa

Ma dubito che possa trattarsi di un guasto, ho provato un convertitore USB/ETHERNET, è un piccolo dispositivo server video e tutto viene "visto" regolarmente; ci potrebbe essere qualche casistica di guasto in linea con questo tipo di problema?O forse un BUG nel firmware, visto che l'ho appena aggiornato?Non dimenticate che comunque lo switch router è collegato in cascata ad una di quelle porte maledette :0 e funziona senza problemi.La cosa che mi fa arrabbiare è che lo shield, dovrebbe funzionare in maniera fluida, proprio come una qualsiasi periferica acquistata, non ci dovrebbero essere problemi di questo tipo, visto che per ora, tutto quello che ho collegato al mio modem, funziona senza problemi, quindi per logica, ci deve essere una differenza, abbastanza pesante tra un dispositivo ethernet acquistato e lo shield stesso, una qualche remota incompatibilità che ogni tanto si fa sentire.Purtroppo dovrei approfondire di più l' argomento, per capire cosa non piace al mio modem di "sto" shield.

Ciao

...per curiosità, che modem router è? (marca / modello)

BrainBooster:
.....che potrebbe essere per reagire così male ad un livello così basso?
MTU? (troppe ritrasmissioni o troppa frammentazione)
Porte hub non switching sul router e cavo dritto ?(nessuna autonegoziazione sull'uplink)
Porte antiche a 10mbit sul router con mancata/fallata autonegoziazione sulla velocità di comunicazione?.
sarei curioso di capire anch'io a che livello è l'inghippo...

Salve a anche a te e grazie per il tuo intevento,

Ti posso solo dire che l'indirizzo "pingato" in realtà mi dava come risultato "indirizzo non raggiungibile", quando lo shield veniva collegato direttamente al modem, a differenza dalla classica situazione, dove non sia ha nessuna risposta, da un indirizzo "pingato" e non assolutamente trovato in rete.
Un ultima cosa che può forse interessare e che i moduli ad onde convogliate che ho provato, andavano spesso in crash, con lo shield collegato e dovevo spesso resettarli.

Ciao

BrainBooster:
...per curiosità, che modem router è? (marca / modello)

netgear n300

Ciao

ciao

ma quando colleghi i cavi si accende la luce verde? Io ho un netgear 800equalcosa e funziona tranquillamente...

scusate ma avete notato che nel firmware il gateway e 192.168.0.1 mentre lo standard dei modem italiani ha impostato il gw 192.168.1.1

lucadentella:
ciao

ma quando colleghi i cavi si accende la luce verde? Io ho un netgear 800equalcosa e funziona tranquillamente...

Ciao, si funziona e sembra comunicare, visto che anche i led di stato dello shield lampeggiano, simultaneamente con quelli del modem.

Ciao

relinquished:
scusate ma avete notato che nel firmware il gateway e 192.168.0.1 mentre lo standard dei modem italiani ha impostato il gw 192.168.1.1

Si giusta osservazione ed infatti, ho tolto il dhcp e ho impostato la nostra numerazione con x.x.1.0., ma con gli stessi problemi.

Ciao

relinquished:
scusate ma avete notato che nel firmware il gateway e 192.168.0.1 mentre lo standard dei modem italiani ha impostato il gw 192.168.1.1

giusto per una precisazione: non esiste uno "standard dei modem italiani" :wink:
gli indirizzi 192.168.x.x sono all'interno del range di IP riservati per le LAN (ovvero nessun dispositivo internet avrà mai tali indirizzi):

questo significa che puoi scegliere tranquillamente una qualsiasi sottorete all'interno di tale range per la tua rete domestica senza problemi... o addirittura un'altra rete riservata (10.0.0.0/8...)

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.

#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