Malfunzionamenti ethernet shield

Ragazzi,
stò avendo enormi problemi con l'ethernet shield. Volevo condividere con voi tutti le mie esperienze, nella speranza di trovare una soluzione.

Mi sono parecchio documentato e ho letto di diversi workaround per risolvere alcune problematiche, ma volevo avere esperienze dirette vostre per capire meglio, prima di mettermi ad implementare una soluzione che potrebbe rivelarsi insufficiente o non del tutto risolutiva.

Sorvolo sulla questione della necessità di un primo reset dopo aver dato alimentazione al sistema, perchè trovo il difetto di una gravità inaudita e mi sembra altrettanto assurdo pensare che io debba comprare 5 nuovi ethernet shield (tanti ne ho installati) a spese mie, quando il modulo è difettoso e dovrebbe essere, a mio avviso, sostituito in garanzia.

Ma i problemi sono ben altri...senza una logica ben definita, l'ethernet shield, di tanto in tanto, inizia a smettere di rispondere...lascia aperte le socket e, esauriti i 4 slot disponibili, smette di rispondere e và fuori rete in modo definitivo.

E' evidente che non è un problema di un "pezzo difettoso" in quanto ho lo stesso problema su tutti e 5 i nodi...e pensare di avere 5 shield difettosi mi sembra improbabile.

Faccio presente che l'arduino+ethshield è in ascolto su una porta. Un PC con WinXP + socket gestite tramite PHP (su Apache) manda dei comandi. Anche solo facendo questo si verifica il problema...vanno a buon fine per un tot di tempo...dopo un po' inizia a perdersi qualche comando e quindi si bloccano le socket...dopo 4 comandi persi il sistema è fermo. Faccio presente che il problema si è verificato anche usando un applicazione c# su .net per parlare sulle socket...

...poi se tento di fare una comunicazione bidirezionale la frequenza dei fail aumenta sproporzionalmente.

Non sò che pesci pigliare...aiutatemi ve prego!

Ah...nel fare i vari esperimenti...ho notato questo.

Più "raramente" viene chiamato ethernet.available() più aumenta il problema...più frequente è la chiamata a ethernet.available() meno si presenta...però si presenta comunque...

@astorz78,
non so se vuoi risolverlo o no, questo problema.
Io l'ho già affrontato, ne ho già parlato qui nel forum, anche nel thread domotica ti ho più volte accennato ad una soluzione, ma mi hai sempre snobbato ::slight_smile:

Ti posto innanzitutto un.. post che descrive le soluzioni possibili, e quella da me adottata:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1282231155/27#27

La soluzione più semplice è gestire il reset via software -piegando il piedino del reset dell'ethernet shield e dedicandogli un pin.
Nel setup fai il primo reset, e sei a posto con il primo problema.

Nel mio caso, ho poi impostato da parte del server una GET regolare sull'Arduino (nel mio caso ogni 30 sec).
Arduino, dal suo lato, ogni qualvolta riceve la GET in questione, resetta un timer adibito.

Nel caso il timer vada a 0 - il che significa che Arduino non ha ricevuto la GET di controllo negli ultimi tot secondi, viene effettuato un reset via software.

Il concetto è che è Arduino stessa a controllare la parte Ethernet..
Infatti, quando si freeza lo Shield Ethernet, Arduino continua a funzionare!

Tutto qui.
Nel post che ti ho linkato, c'è pure la parte di codice adibita al reset.

P.S: La discussione relativa alla problematica dell'Ethernet Shield, continuiamo a gestirla qui, lasciamo il thread della Domotica alla Domotica..

@pitusso:

sìsì quella soluzione l'ho vagliata, speravo in qualche altra soluzione! Ti spiego anche il perchè ed assolutamente non è perchè voglio snobbarti, anzi! La tua soluzione è assolutamente la più "efficiente" che mi si è posta davanti finora!

1° problema: come fai a sapere che il nodo è fuori rete per resettarlo? Devi avere un KO comunicando con un altro "oggetto" (che sia un altro arduino o un PC). Questo vuol dire che quel "nodo di riferimento" deve essere affidabile al 100%...xkè se crolla quello i nodi con questo sistema di watchdog si resetteranno in continuazione senza motivo

2° problema: devo "accroccare" l'hardware...piegare il pin...spendere un pin di arduino per il reset! Non solo per una questione di "formalizzarmi" sul non accroccare l'hardware, ma non mi piace questa soluzione per una questione "meccanica" che ora non sò come spiegarti in chat...sarebbe troppo lungo. E, cmq, in almeno un paio di nodi della mia domotica, non ho pin disponibili per la gestione del reset

Cercavo di capire se c'era qualche soluzione un po' + software...come dire...

ciao

come fai a sapere che il nodo è fuori rete per resettarlo? Devi avere un KO comunicando con un altro "oggetto"

forse non mi son spiegato.

Dal tuo server invia una GET ad Arduino con cadenza regolare.
Arduino ha una semplice procedura che verifica un timer (impostato con millis, o Metro), che altro non è che un conto alla rovescia..

Arduino quando riceve la GET, deduce che l'Ethernet Shield è attivo e sta funzionando. Resetta quindi il timer - ovvero lo riporta a valore iniziale.

Se il timer arriva a 0, significa che Arduino non ha visto la GET di controllo nell'arco di N secondi/minuti/ore (quel che hai impostato per il timer), ne conviene quindi che lo Shield si è freezato.
Quindi effettua il reset dello shield, e fa ripartire nuovamente il timer.

Molto semplice.
Non ci sono controllori esterni.
Arduino è in grado di gestire questa situazione in completa autonomia.

devo "accroccare" l'hardware...piegare il pin...spendere un pin di arduino per il reset! Non solo per una questione di "formalizzarmi" sul non accroccare l'hardware, ma non mi piace questa soluzione per una questione "meccanica"

neppure a me piace molto, ma è funzionale e non implica acquisto di hw nuovo o progettazione di ethernet shield DIY (con cui risolveresti tutti i tuoi problemi).
Un'alternativa è usare uno shield basato non su W5100, ma su ENC28J60, che, a quanto dicono, non è soggetto a questo tipo di problema.

E, cmq, in almeno un paio di nodi della mia domotica, non ho pin disponibili per la gestione del reset

..beh, ho visto che non hai problemi ad usare ShiftOut :smiley:

Giusto per motivarti: ho un'installazione di Arduino + Eth. Shield + scheda relais che funziona da 7 mesi, oramai.
Prima di tale modifica, ad ogni sbalzo di tensione, o per chissà quale motivo, lo shield si bloccava.

Cercavo di capire se c'era qualche soluzione un po' + software...come dire...

partendo dal presupposto che non vuoi sostituire gli shield che hai, non ci son molte alternative che ti garantiscano il corretto funzionamento continuativo delle stesse.

Eh...mi sà che pure io mi sono espresso male! :slight_smile:

Il serverino che manda il GET...insomma ci vogliono due oggetti perchè arduino capisca di non avere lo shield freezato...e se il 2° oggetto freeza e non manda più il GET non perchè Arduino è bloccato, ma xkè il server è "spento"? Arduino erroneamente penserebbe d'essere lui il problema e inizierebbe a resettarsi in continuazione...

Per il resto la tecnica l'ho capita benissimo...è la tecnica più classica di watchdog...quella del timer countdown resettato che se non viene resettato entro x tempo provoca il reset del componente bloccato!

L'arduino, come più o meno tutti i sistemi embedded , ha un timer che si chiama watchdog timer che serve per sbloccare il programma dovesse mai incastrarsi.

In pratica è un timer che viene caricato con un contatore e deve essere fatto ripartire prima che il contatore scada... Se il contatore arriva a zero il processore si resetta da solo.

un thread sul tema http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1229317367/9

Se il contatore arriva a zero il processore si resetta da solo.

Ok, qui le mie obiezioni al watchdog:

  • devi cmq gestire un evento schedulato e regolare che serva da controllo, e che faccia capire ad Arduino che lo shield Ethernet è incastrato (basterebbe che available() tornasse un booleano...) , quindi un sistema esterno per ora ci vuole..
    obietto alla mia obiezione: prevedendo qualche procedura ad hoc, potrebbe essere Arduino a verificare, tramite ping (per esempio al router, che sicuramente è sempre acceso), se è in rete...

  • nel caso di ethernet shield "vecchia" (e ce ne sono tante, in giro), il reset del processore comporta il problema del freeze dell'Ethernet Shield all'avvio :-?

  • ultima cosa, poco rilevante: se lo shield Ethernet è freezato, e va resettato, Arduino continua a funzionare. Con un reset del processore, si "perde" invece Arduino per qualche secondo.
    obietto alla mia obiezione: chiaro che se l'uso avviene solo da tcp/ip, poco cambia. Io personalmente ho in giro installazioni miste (pulsantiere fisiche + ethernet shield).

obiezioni di obiezioni a parte...

Trovo assurdo che lo shield per sapere che è freezato si debba appoggiare al fatto che non comunica più con un nodo di riferimento (router, server, pc, altro nodo). Dovrebbe assolutamente essere prevista una funzione che te lo fà capire...o come giustamente diceva pitusso un return ad esempio della funzione available.

Riguardo il watchdog, dando come premessa che conosco la logica di un watchdog, il problema è che resettando via watchdog l'arduino non si resetta l'ethernet shield...e quindi il problema non sarebbe risolto. L'arduino, infatti, quando lo shield è freezato non è assolutamente bloccato anzi, e dover resettare tutto significherebbe comunque far ripartire l'intero sistema. Calando la cosa nella realtà mia di domotica...se io resetto Arduino su cui sono accese 3 luci perchè si impalla lo shield ethernet, vuol dire che le 3 luci si spegnerebbero...non mi pare affatto una soluzione elegante.

Least but not last...un apparato hardware con il relativo driver non dovrebbe impallarsi e basta! Perchè altrimenti è difettoso e dovrebbe essere un problema risolto alla fonte. Ovviamente questa mia affermazione vale qualora il problema non è dato dal mio software, ma dall'hardware o dalla libreria di gestione. Se il problema è nel mio sketch chiedo venia e, come si dice a Roma, faccio pippa...ma ho rilevato problemi anche nell'uso degli sketch d'esempio (tipo web server).

E' estremamente grave e problematica sta cosa...

astroz78, vedo che siamo sulla stessa frequenza (quasi) su tutta la linea :slight_smile:

...un apparato hardware con il relativo driver non dovrebbe impallarsi e basta!

..son d'accordo, ma non dimentichiamoci cos'è Arduino:

Arduino is an open-source electronics prototyping platform based on flexible, easy-to-use hardware and software. It's intended for artists, designers, hobbyists, and anyone interested in creating interactive objects or environments.

Per me non è un problema trovare o applicare delle soluzioni ad hoc (fa parte del gioco :D), solo spero sempre siano patch, in attesa della soluzione definitiva.
Per esempio: riguardo all'ethernet shield, il problema relativo al freeze all'avvio è stato risolto in questa nuova versione hw.

Il problema relativo al freeze (non riconosciuto da tutti, comunque) presumo sia da attribuire proprio al W5100.

Ora, presumo che chi sta in alto stia prendendo in considerazione:

  • cambio chip WIZnet, a favore di una serie più recente;
  • cambio radicale del chip - quindi passaggio al fantomagico ENC28J60;
  • ulteriori modifiche alla libreria / shield per dare controllo sullo stato dello shield;

Tutte le alternative hanno pro e contro, e non sta a me (non ne ho i mezzi e le competenze) dire quale sia meglio dell'altra.

ma freez a parte i due shied (w5100 e ENC28J60) sono proprio uguali?

ma freez a parte i due shied (w5100 e ENC28J60) sono proprio uguali?

non capisco in che senso, ma cambia parecchio, sia lato sw che hw

mi riferivo più che altro alle funzionalità :slight_smile: sorry...

no problem :slight_smile:

Sostanzialmente questa è la differenza più grossa:

the ENC device only provides the MAC layer, leaving you with lots to implement in software. The Wiz device provides transport layer support.

Questo comporta che la libreria per l'ENC sia più "pesante" in termini di spazio (direi 3 volte tanto) rispetto a quella del W5100.

Riguardo alle funzionalità non mi sembra che lo shield basato su ENC28J60 abbia lacune, rispetto a quello basato su W5100, soprattutto negli usi più comuni che se ne possono fare.

Ma sinceramente non ne ho ancora acquistato (o fatto) uno... quindi riporto quel che ho capito dopo svariate letture.