Ethernet Shield non comunica con router

Salve, mi sono appena iscritto e presentato. Ho un problema con la ethernet shield w5100. Appena acquistata, lo inserita sull'arduino UNO, ho caricato l'esempio ufficiale del webserver, ho configurato nello sketch, l'ip fisso compreso in quelli gestibili dal mio router, 192,168,1,107, ho configurato il mio router(Hamlet hrdsl512w), disattivando il dhcp, poi ho collegato la ethernet shield con un cavo rj45 dritto, ad una porta del mio router e ho provato a "pingare" quell'indirizzo dal mio pc, collegato in rete con Wifi. Non ho ottenuto nessuna risposta, quindi ho provato ad aggiungere nello sketch, il gateway e il subnet, ma ancora nulla, sucessivamente ho configurato il dhcp, sia sul router che sulla scheda ma non ne vuol sapere. Ho fatto poi un ultima prova, ossia ho collegato la ethernet shield, direttamente al pc con un cavo dritto, configurato gli indirizzi e in questo modo funziona tutto. Vi è mai capitata una cosa simile? Prima di farmi sostituire la scheda avrei bisogno di una conferma. Grazie a tutti.

Non ricordo mai quali sono i cavi dritti e gli "altri".
Però se colleghi 2 pc tra loro (in questo caso arduino con ethernet e pc) si usa un cavo, mentre tra un pc e il router un cavo normale.
Nella tua descrizione usi sempre dello stesso cavo. Secondo me non è possibile usare lo stesso. Secondo me hai un cavo ethernet per fare collegamenti solo tra 2 pc (non è mica quello che viene venduto assieme al router, di solito è quello per collegamenti diretti pc-pc)

Hai ragione comunque mi spiego meglio. Il cavo che si usa normalmente, tra pc e il mio router, può essere, da manuale, dritto o crossato, ed io ho fatto entrambe le prove, mentre quello che si usa tra pc e pc, dovrebbe essere un cavo crossato ed io ho fatto la prova con quello dritto. Quello che io non riesco a spiegarmi è il fatto che con il pc, la ethernet shield, comunica ed esegue lo skech come dovrebbe, invece con il router non ne vuole sapere.

Una cosa "strana" che a volte ho letto nei post che è capitata è che il router voglia sul dispositivo un MAC address "sensato". Di solito il MAC lo puoi dare a caso, ma x alcuni router no.
C'e' un thread in cui utente Guglielmo (gpb01) suggeriva di dare un MAC sensato. Prova a vedere se ritrovi nel forum quella discussione. Oppure prova a dare ad Arduino un MAC address di un pc che non è in rete.
Io di solito passo nel codice Arduinico anche il dns e metto 8.8.8.8 che quello di google.
Com'e' il lo sketch che stai provando ? Postalo.

Ho provato anche con il MAC di un altra scheda.
Quando collego il cavo di rete al modem router, il led corrispondente alla porta lan, non rimane acceso fisso come dovrebbe.

Lo skech che ho provato per primo è questo:

/*
Web Server

A simple web server that shows the value of the analog input pins.
using an Arduino Wiznet Ethernet shield.

Circuit:

  • Ethernet shield attached to pins 10, 11, 12, 13
  • Analog inputs attached to pins A0 through A5 (optional)

created 18 Dec 2009
by David A. Mellis
modified 9 Apr 2012
by Tom Igoe

*/

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

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,107);

// 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() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}

// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}

void loop() {
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
Serial.println(“new client”);
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
// if you’ve gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == ‘\n’ && currentLineIsBlank) {
// send a standard http response header
client.println(“HTTP/1.1 200 OK”);
client.println(“Content-Type: text/html”);
client.println(“Connection: close”); // the connection will be closed after completion of the response
client.println(“Refresh: 5”); // refresh the page automatically every 5 sec
client.println();
client.println("");
client.println("");
// output the value of each analog input pin
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
int sensorReading = analogRead(analogChannel);
client.print(“analog input “);
client.print(analogChannel);
client.print(” is “);
client.print(sensorReading);
client.println(”
“);
}
client.println(””);
break;
}
if (c == ‘\n’) {
// you’re starting a new line
currentLineIsBlank = true;
}
else if (c != ‘\r’) {
// you’ve gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
Serial.println(“client disconnected”);
}
}

Ho provato anche questo:

/*
Web Server

A simple web server that shows the value of the analog input pins.
using an Arduino Wiznet Ethernet shield.

Circuit:

  • Ethernet shield attached to pins 10, 11, 12, 13
  • Analog inputs attached to pins A0 through A5 (optional)

created 18 Dec 2009
by David A. Mellis
modified 9 Apr 2012
by Tom Igoe

*/

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

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
static byte mac={0x00,0x19,0xcb,0xf4,0x03,0x01};
static byte ip={192,168,1,107};
static byte gwip={192,168,1,254};
static byte netmask={255,255,255,0};

// 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() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}

// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}

void loop() {
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
Serial.println(“new client”);
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
// if you’ve gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == ‘\n’ && currentLineIsBlank) {
// send a standard http response header
client.println(“HTTP/1.1 200 OK”);
client.println(“Content-Type: text/html”);
client.println(“Connection: close”); // the connection will be closed after completion of the response
client.println(“Refresh: 5”); // refresh the page automatically every 5 sec
client.println();
client.println("");
client.println("");
// output the value of each analog input pin
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
int sensorReading = analogRead(analogChannel);
client.print(“analog input “);
client.print(analogChannel);
client.print(” is “);
client.print(sensorReading);
client.println(”
“);
}
client.println(””);
break;
}
if (c == ‘\n’) {
// you’re starting a new line
currentLineIsBlank = true;
}
else if (c != ‘\r’) {
// you’ve gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
Serial.println(“client disconnected”);
}
}

Primo: il codice devi racchiuderlo nei tag code (pulsante con <> su pergamena, vedi regolamento sezione 7 spiega bene come fare)

Secondo: scusa ma nel secondo sketch capisci che hai scritto 2 variabili gwip e nemask ma che poi nello sketch non usi ?
http://arduino.cc/en/Reference/ServerBegin
Devi scrivere:

Ethernet.begin(mac, ip, gateway, subnet);

Anzi, io preferisco dare tutti i parametri, compreso il DNS che metto a 8.8.8.8

Ethernet.begin(mac, ip, dns, gateway, subnet);

Terzo: hai una Leonardo ? Se no, togli quel while() nel setup, c’e’ pure scritto che serve solo se hai la Leonardo.http://arduino.cc/en/Reference/EthernetBegin

Sicuro che non stai usando un cavo di rete cross (incrociato)? Se il pc è vecchio, non è configurato, ha una scheda di rete aggiunta, potrebbe non avere Universal Cable Recognition e Auto Sensing.
Se sul pc ti risponde al ping direi che non è rotta.

Vi prego di perdonare i miei errori :disappointed_relieved: D'altronde sono qui per imparare qualcosa da voi. Comunque il mio è un netbook, con scheda di rete integrata, il cavo che utilizzo è dritto, me ne accorgo dai pin dei connettori. Lo skech, anche se per leonardo, nel pc funziona normalmente. Ho contattato il venditore, il quale mi ha fatto caricare dei semplici skech, per verificare la comunicazione con dhcp e senza. Per lui la scheda è difettosa, ma ho scritto nel forum per vedere se qualc' un altro aveva avuto lo stesso problema.

Ma come hai visto anche tu, mi pare strano una scheda difettosa che funziona se collegata direttamente al PC.
Poi, può capitare di tutto, però mi pare strano. :smiley:

Hai ragione, ma è chiaro che il fatto di non voler funzionare con le reti, gestite da router, può essere attribuito ad una anomalia.

Cambia la scheda, se poi il problema è lo stesso ritorna, così ti levi ogni dubbio tu e noi.

Ho provato un altra ethernet shield, il problema rimane. Quindi se escludiamo anche l'arduino, rimane solo il router. Ho testato il tutto anche in un altra rete, quella dell'azienda in cui lavoro, ma il problema era simile. Se fosse il mio modem router, non saprei proprio, quale configurazione provare a modificare, per far comunicare questa scheda. :astonished:

Credo di aver risolto il problema. A quanto pare la ethernet shield non comunica a 100M, quindi il modem router dovrebbe negoziare con l'apparato che viene collegato, per la comunicazione a 10M. Il mio modem router possiede la funzione di negoziazione, ma non capisco per quale motivo non sia attiva. Perciò, come ho letto in altre discussioni, su questo forum, ho collegato in cascata, uno switch, il quale abbassa la velocità a 10M. Ho rovato a fare un ping, con arduino configurato con ip statico e modem router con dhcp abilitato ed ha subito risposto come una scheggia. Ho caricato lo skech per il web server e quello per l'accensione del led da remoto, ed hanno funzionato alla grande. :grinning:

Anche io ho avuto lo stesso identico problema. Bartolo1973 mi ha messo sulla buona strada. Ho scoperto che la scheda ha problemi con il mio switch 10/100. Spostato il cavo dallo switch su una porta libera del router il problema e' sparito. Evidentemente la scheda non dialoga bene con tutti i dispositivi; non credo sia un problema di switch perche' gli ho collegato su di tutto e non ha mai avuto nessun problema neppure con metri e metri di cavo nel mezzo.

ik6gtf:
Anche io ho avuto lo stesso identico problema. Bartolo1973 mi ha messo sulla buona strada. Ho scoperto che la scheda ha problemi con il mio switch 10/100. Spostato il cavo dallo switch su una porta libera del router il problema e' sparito. Evidentemente la scheda non dialoga bene con tutti i dispositivi; non credo sia un problema di switch perche' gli ho collegato su di tutto e non ha mai avuto nessun problema neppure con metri e metri di cavo nel mezzo.

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:

Bartolo, potresti rieditare il post e includere il codice nei tag code? Pulsante </> dell’editor.