Ethernet shield, mancato assegnamento IP

Salve a tutti, premetto che questa è la prima volta che scrivo sul forum e che sono entrato da poco nel mondo Arduino, quindi chiedo scusa per il mio linguaggio poco "tecnico".
Arriviamo subito al dunque: ho acquistato una Ethernet shield per il mio Arduino Uno ma non sono stato in grado di farla funzionare in alcun modo.
Ho provato a caricare diversi sketch (sia con assegnazione automatica dell'ip, che con assegnazione di un ip statico) ma tutti davano lo stesso risultato: connessione fallita.
Cercando un po' su internet ho trovato discussioni che trattavano l'argomento ma non mi sono state di grande aiuto.
A titolo informatico vi dico che sto usando un vecchio router TP-LINK TD-W8901G, dotato di 4 uscite Ethernet posteriori (il router segnala il dispositivo sull'uscita accendendo il led corrispondente).

Grazie mille in anticipo! :slight_smile:

Ecco il codice:

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

byte mac[] = { 0xDE, 0xAD, 0xBD, 0xEF, 0xFE, 0xED };
char server[] = "www.google.com";
byte ip[] = {192, 168, 1, 109};

EthernetClient client;

void setup()
{
Serial.begin(9600);
Ethernet.begin(mac, ip);
delay(1000);
Serial.println("connecting...");
if (client.connect(server, 80)) {
Serial.println("connected");
client.println("GET /search?q=arduino HTTP/1.1");
client.println("Host: www.google.com");
client.println("Connection: close");
client.println();
}
else {
Serial.println("connection failed");
}
}
void loop()
{
if (client.available()) {
char c = client.read();
Serial.print(c);
}
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
while(true);
}
}

Ciao,
essendo il tuo primo post, ti chiederei cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Specifica quale shield Ethernet hai acquistato e metti un link al prodotto :wink:

Hai verificato che il MAC sia unico nella tua rete? Stesso discorso per l'IP. Sei sicuro che quell'IP sia disponibile(Il tuo router ti concede quell'IP?), Hai provato ad sostituire all'url di google il suo IP?(Potrebbe essere un problema di DNS)

Rispondo al sig. Guglielmo aggiungendo il link del prodotto: Prodotto non trovato!.

In risposta a Roberto invece aggiungo che il MAC è unico e che l'IP è disponibile (o almeno così credo, visto che ho controllato sul pannello dell impostazioni del mio router). Posso provare a sostituire nel codice l'url di google con il suo ip, ma non penso che il problema riguardi quella parte dello sketch.

Non è che lo scketch sia molto grande. Il tuo router può rifiutarsi di concedere quel IP (se è riservato per esempio), il metodo migliore è sempre lasciare al router la gestione degli IP.

France271:
Rispondo al sig. Guglielmo aggiungendo il link del prodotto: Prodotto non trovato!

Lascia stare il Sig. e dammi del tu ... :smiley: :smiley: :smiley:

Ok, quella è una scheda che dovrebbe essere compatibile con quella standard di Arduino ....
... ha provato i vari esempi che sono nel IDE ? Non ne funziona proprio nessuno ?

Guglielmo

Guglielmo ho appena provato lo sketch WebClient che si trova sotto la voce esempi --> Ethernet (che poi è simile a quello che ho inserito precedentemente). Ho apportato alcune modifiche al codice come ad esempio la rimozione del ciclo while necessario solo nel caso in cui si usi Leonardo, ho modificato il valore dell'ip con quello proprio della mia rete domestica (192.168.1.1) ma non funziona ancora. Non so se può essere utile ma non viene eseguita nemmeno l'operazione: "Serial.println("Failed to configure Ethernet using DHCP");" ed è come se l'esecuzione si bloccasse nell'if.

A questo punto non mi resta che pensare che il problema sia nel router, forse a causa di alcune impostazioni che in qualche modo non mi permettono di collegarmi attraverso le prese Ethernet.

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
//IPAddress server(74,125,232,128);  // numeric IP for Google (no DNS)
char server[] = "www.google.com";    // name address for Google (using DNS)

// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192, 168, 0, 177);

// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 80 is default for HTTP):
EthernetClient client;

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:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    // try to congifure using IP address instead of DHCP:
    Ethernet.begin(mac, ip);
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");

  // if you get a connection, report back via serial:
  if (client.connect(server, 80)) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET /search?q=arduino HTTP/1.1");
    client.println("Host: www.google.com");
    client.println("Connection: close");
    client.println();
  }
  else {
    // kf you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

void loop()
{
  // if there are incoming bytes available
  // from the server, read them and print them:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    // do nothing forevermore:
    while (true);
  }
}

Senti, tanto è veloce, fai una prova per sicurezza e metti questo MAC address : 90-A2-DA-0D-3F-5C ...
... riprova e fammi sapere come va ... :roll_eyes:

Guglielmo

Scusate per il ritardo ma non ho potuto provare ieri sera. Il risultato è sempre lo stesso: non funziona :frowning:
A mio parere è come se non riuscisse a completare l'operazione Ethernet.begin(mac) bloccando l'esecuzione dell'intero programma. Questo sarebbe in accordo con il fatto che il monitor seriale non restituisce nessun risultato e rimane bianco.

Mi correggo, dopo un tempo biblico è apparso questo messaggio sul monitor seriale. Comunque sempre un risultato negativo...

Failed to configure Ethernet using DHCP
connecting...
connection failed

disconnecting.

ciao, io sto utilizzando una scheda ethernet con W5500 ma non sono un esperto, ho avuto questo risultato, con il tuo sketch:

connecting...
connected
HTTP/1.1 302 Found
Location: arduino - Google Search
Cache-Control: private
Content-Type: text/html; charset=UTF-8
P3P: CP="This is not a P3P policy! See P3P and Google's cookies - Google Account Help for more info."
Date: Sat, 23 Jan 2016 12:25:19 GMT
Server: gws
Content-Length: 278
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Set-Cookie: NID=75=VZblWbZ90yMSvXosd9T8rj8WxVVonp5HxELa3UK5hUU5-kKbvVagmaK2De-n9Vm9FuJELC7z6o6VVrwejLRpmub4Fsxw46UaUodzeTUjBgLe2yjxhe1wRa_T-gakpMRWo74ELMXkAg; expires=Sun, 24-Jul-2016 12:25:19 GMT; path=/; domain=.google.com; HttpOnly
Connection: close

302 Moved

302 Moved

The document has moved here.

disconnecting.

usando questa libreria, ma penso si tratti solo di fortuna

Ethernet.zip (72.8 KB)

No, non funziona in alcun modo. Come ultimo tentativo proverò a cambiare router magari andando a casa di un amico. Vi terrò informati :smiley:

Nello sketch postato metti come IP 192.168.0.107 e poi dici che il tuo tplink ha come indirizzo 192.168.1.1 :o
I primi 3 numeri devono essere uguali. Quando usi il DHCP verifica che il servizio sia attivo.. Per default i tplink mettono a disposizione sul DHCP 100 IP dal x. x. x. 100 al x. x. x. 200

Ps. Non è escluso un difetto sulla scheda un cavo di rete non idoneo

Inoltre quando ci sono problemi, sempre meglio dare TUTTI i parametri alla begin, compreso maschera e dns

Quindi:
Ethernet.begin(mac, ip, dns, gateway, subnet);
di solito subnet 255.255.255.0
gateway IP del router, di solito 192.168.1.1 oppure 192.168.0.1
dns va bene quello di google, 8.8.8.8

Ancora.. Ma no!! Nid no no e no continui a scriverlo da anni no no e ri-no

Pablos l'"errore" riguardante l'IP è solo nello sketch che ho postato, infatti è solo un copia e incolla dagli esempi sulla classe Ethernet. Nello sketch che ho caricato ho sostituito nell'IP lo 0 con un 1 e confermo che il servizio DHCP del router è attivo.
Appena posso provo a sostituire il valore finale con uno superiore a 200 sperando che effettivamente i valori inferiori siano riservati al DHCP e che in questo modo ce la faccia a connettermi almeno con un'IP statico.

AGGIORNAMENTO: Non funziona neanche con il nuovo IP

pablos:
Ancora.. Ma no!! Nid no no e no continui a scriverlo da anni no no e ri-no

Why ? Cosa mi sono perso ? :confused:

nid torno a ripetere che l'IP l'ho messo giusto! So che nello sketch è 192.168.0.xxx ma l'ho modificato con 192.168.1.xxx.

Alla fine dei giochi vi comunico che il problema sta nel router. Ho appena provato gli sketch che avevo trovato collegandomi al router di casa della mia ragazza e FUNZIONA!!! Con il suo (sempre un TP-Link ma più recente) funziona sia l'assegnazione automatica dell'IP, sia la scelta dell'IP statico.
Adesso non mi resta che smanettare un po' sulle impostazioni del mio router oppure chiedere a qualche amico se mi ci da un'occhiata e trova l'inghippo.

Ringrazio tutti e penso che il caso possa definirsi risolto!

nid69ita:
Why ? Cosa mi sono perso ? :confused:

Pablos sostiene (giustamente) che se il postino deve portarti una lettera è giusto che tu dia tutte le referenze per trovarti, ma se sei tu che devi consegnare la lettera ha poco senso urlare al mondo il proprio indirizzo di casa.
Se l'analogia non è chiara un client non ha necessità di specificare una subnetmask visto che è il router che la deve gestire. Credo di averla messa giu in maniera semplice.

Ma io ho scritto "quando ci sono problemi..." quindi non intendo dire che bisogna sempre passare tutti i parametri, ma quando ci sono problemi tra scheda e router (visto che di modelli ce ne sono enne-mila) meglio provare a darli tutti, bypassando quei dati che potrebbe darti il router stesso, ma che in caso di difficoltà sembra non riuscire a darti. :slight_smile: