Come usare l'ethernet shield

Ciao a tutti!! Premetto che non ho mai utilizzato una scheda ethernet con arduino quindi mi scusa già in partenza per possibili figuracce :sweat_smile: Volevo chiedervi come si può capire se la mia scheda comunica con il pc. Ho provato a caricare un programma Client fornito come esempio da arduino ma non ne capisco il funzionamento. Grazie mille!

posta il codice, non abbiamo la sfera di cristallo :-)

cmunque in linea di massima per comunicare col PC vi aethernet bisogna che sia arduino che il pc abbiano i giusti programmi (ma sul pc puoi usare il comune browser o il meno comune ma onnipresente telnet)

… e non dimenticare di definire un indirizzo ip che rientri nella tua rete, nel tuo sketch!

il test piu banale che puoi fare è il ping all'indirizzo ip dell'host.

occhio che se attacchi l'arduino direttamente al pc molto probabilmente hai bisogno di un cavo di rete incrociato, se invece usi un hub/switch il classico cavo diritto è ok.

attento anche che i due host (pc e scheda) devono essere configurati per comunicare nella stessa rete. Ad esempio:

pc: ip 192.168.1.5 netmask 255.255.255.0 scheda: ip 192.168.1.6 netmask 255.255.255.0

Ti servono delle conoscenze di base sulle reti:
http://arduino.cc/playground/Italiano/Pobleminoti#Ethernet

Ho provato ad eseguire le operazioni con il ping e mi funziona! grazie mille!! :) Ho provato un exemple contenuto in arduino ma cè una parte di codice che non capisco: Client client = server.available(); if (client) { server.write(client.read()); }

Non capisco la condizione dell'if.

se client è falso allora vuol dire che c'è stato un'errore di connessione

lesto: se client è falso allora vuol dire che c'è stato un'errore di connessione

A meno che "Client" non sia un typedef di un puntatore quell'istanza sarà sempre vera nel controllo della condizione if.

update: vedendo che la riga successiva viene usato l'operatore . (punto) per accedere ad un metodo posso essere certo che Client non è un typedef a un puntatore e che quindi quell'if è inutile....

Hai dichiarato così ?

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Questo va lasciato invariato in quanto è un " Riconoscimento " byte ip[] = { Ip Locale Arduino }; byte gateway[] = { TuoGateway }; byte subnet[] = { 255,255,255,Numero };

E poi

void setup() { Serial.begin(9600); Wire.begin();

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

MementoMori:

lesto: se client è falso allora vuol dire che c'è stato un'errore di connessione

A meno che "Client" non sia un typedef di un puntatore quell'istanza sarà sempre vera nel controllo della condizione if.

update: vedendo che la riga successiva viene usato l'operatore . (punto) per accedere ad un metodo posso essere certo che Client non è un typedef a un puntatore e che quindi quell'if è inutile....

nono, non stiamo parlando di typedef ma di classi. Client è NULL se c'è stato qualche problema. probabilmente l'if riconosce il NULL come falso

lesto: Client è NULL se c'è stato qualche problema.

È vero: ho letto la documentazione ed effettivamente è cosi: http://arduino.cc/en/Reference/ServerAvailable

Returns a Client object; if no Client has data available for reading, this object will evaluate to false in an if-statement (see the example below)

Anche se a mio avviso l'API esposta dalla classe client non è delle più "standard" in quanto reimplementa in maniera "non classica" l'operatore bool:

Client::operator bool() {
  return _sock != MAX_SOCK_NUM;
}

lesto: probabilmente l'if riconosce il NULL come falso

Questo è esatto ma qualunque istanza di un qualunque oggetto non è mai NULL (mentre lo può essere un puntatore). Le mie affermazioni precedenti sono valide in generale ma non in questo caso a causa delle API non proprio ortodosse.

per chiarire meglio le idee:

class FOO {
  //classe che non reimplenta l'operatore bool() 
};

FOO f;
FOO *pf = &f;

if(f){} //errore di compilazione FOO non è bool
if(pf){} //questo è true perchè pf sta puntando a un'area di memoria diversa da 0

pf = NULL;
if(pf){} //questo è false perchè pf sta puntando a NULL

reimplementando l'operatore bool in una classe posso utilizzare le istanze degli oggetti in contesti dove è richiesta una espressione booleana.

riferimenti: http://www.artima.com/cppsource/safebool.html

Questo è esatto ma qualunque istanza di un qualunque oggetto non è mai NULL (mentre lo può essere un puntatore)

mea culpa, abituato al java :)