Comunicazione ethernet tra 2 o piú Arduino

Ciao a tutti,
sono alle prese con un problema apparentemente banale ma che per me non lo é.

Ho l'esigenza di inviare un byte, o una word o un bit status da un Arduino ad un altro e viceversa via ethernet shield ed a forza di guardare in giro su come fare mi sono perso; la stragrande maggiornaza delle applicazioni e/o librerie che ho trovato sono orientate verso l'interfacciamento Web che peró a me al momento non interessa.
I sistemi che ho visto (es. Souliss) sono troppo complicati per chi come me é un elettronico con un'infarinatura di informatica e dopo aver cercato per alcuni giorni sul forum, non ho trovato la risposta che cercavo.

La domanda é quindi la seguente: con quale libreria ed in che modo posso scambiare in modo semplice dei dati tra 2 Arduino in rete?

Sapete se esiste giá una disussione sull'argomento?

Grazie,

Bertu

Quale scheda, quella ufficiale che usa il WIZ5100 oppure quella con l'ENC28J60 ?

Preciso la configuarzione HW

Utilizzo 2 Arduino mega con Ethernet shield ENC28J60 entrambi connessi ad un router.

Il primo arduino legge una serie di sensori meteo i cui valori vorrei venissero inviati ad un secondo Arduino che li dovrebbe stampare su un display.

Hai proprio necessità che comunichino via Ethernet o va bene anche una seriale RS485?
In quel caso potresti usare la EasyTransfert --> GitHub - madsci1016/Arduino-EasyTransfer: An Easy way to Transfer data between Arduinos
Info su --> EasyTransfer Arduino Library « The Mind of Bill Porter

Per le ENC qui trovi una persona che ha fatto un bel pò di tutorial, prova a vedere se trovi qualcosa.
http://www.lucadentella.it/category/enc28j60-arduino/

Innanzi tutto grazie per le risposte.

Alla RS485 avevo pensato ma ritenevo piú semplice utilizzare un protocollo ben collaudato come il TCP/IP che é poi anche facilmente interfacciabile al web.
Riprenderó comunque in considerazione la RS485 anche se tempo fa provai la easytranfert ma ci furono problemi con le librerie.
Faró piú attenzione. :~

Per quanto riguarda il link a Lucadentella stasera gli do un'occhiata e vediamo se fa al caso mio.

Bertu

Anche la RS485 è collaudatissima. :wink:
Il problema col TCP, in particolare con l'ENC28J60 e che tutta la gestione è affidata al microcontrollore e alla sua minuscola memoria.
Inoltre devi risolvere i problemi di indirizzamento, se non è statico, devi individuare i due Arduino tramite protocolli aggiuntivi, infine aprire una canale TCP che userai quasi come una seriale ma con un buon mal di testa per le problematiche affrontate e la flash e le memoria al limite. Vedi ad esempio Nanode o Souliss.

La mia idea sul funzionamento del sistema via Ethernet é piuttosto semplice.

I 2 Arduino sono sulla rete domestica ed hanno un ip statico assegnato via sketch e quindi ben noto.

L'arduino 1 coi sensori, ad intervalli regolari ma non velocissimi ( 1 volta al minuto) invia (o risponde ad una richiesta di invio) i dati all'Arduino 2 che li stampa su display. Tutto li.

Una sorta di "client.print e client.get", nient'altro.
Quello che mi manca é la procedura corretta per fare questo trasferimento di dati via web in modo semplice perché se li devo inviare ad una pagina web, utilizzando alcuni esempi che ho trovato, ci sono riuscito senza problemi.

nid69ita:
Per le ENC qui trovi una persona che ha fatto un bel pò di tutorial, prova a vedere se trovi qualcosa.
enc28j60-Arduino – lucadentella.it

Ieri sera gli ho dato un'occhiata ma non c'é quello che cerco.

Il problema é sempre lo stesso; Arduino > Web e viceversa e mai Ardino <> Arduino

Non c'é nessuno che mi puó dare qualche semplice esempio di invio e ricezione tra 2 web clients, in modo analogo a come si fa con i modulini radio o con Xbee.

Grazie

P.S. lo so che queste domande sono banali e noiose ma vi ricordo che anche Einstein ha fatto la prima elementare :smiley:

Ciao,

se vuoi usare ethernet puoi decidere di usare o TCP oppure UDP. La differenza è che il primo protocollo è orientato alla connessione mentre il secondo no.

Per fare un esempio pratico il TCP è simile ad una telefonata: io ti chiamo, aspetto che rispondi e poi, in caso positivo (la connessione si è instaurata) cominciamo a parlare.

L'UDP è invece simile al classico messaggio nella bottiglia. Il mittente lo invia senza sapere se qualcuno lo riceverà. E' importante però dire che, a differenza della bottiglia, nel messaggio UDP possiamo specificare l'indirizzo IP del destinatario.

Nel tuo caso per usare TCP dovrai aprire un socket dal client verso il server. Il client potrebbe essere il sensore che apre una connessione verso l'altro Arduino che fa da server e visualizza i dati sul display. Devi tener presente che non sono possibili molte connessioni contemporanee (non ricordo il limite). Quindi se in futuro dovrai aggiungere dei sensori, dovrai modificare il software per fare in modo che ogni sensore apra la connessione, invii i dati e poi chiuda per fare posto agli altri.

Se invece decidi di usare UDP, ogni sensore può inviare un pacchetto sulla rete specificando l'IP dell'Arduino che visualizza come destinatario. Il formato del pacchetto lo decidi tu avendo cura di includere l'identificativo del mittente così che potrai visualizzare i dati di diversi sensori.

Come punto di partenza potresti leggere il reference sulla Ethernet: Ethernet - Arduino Reference anche se è fatto per la libreria ufficiale e dovrai poi adattarlo a quella dell'ENC28J60.

Ciao.
V.

A dire il vero userei la Ethernet Shield W5100 ma il discorso non cambia.

Adesso ho capito il concetto del TCP e credo che non ci siano problemi a gestirlo, basta che apro la comunicazione, mando quello che voglio e poi la chiudo e decido la logica di ascolto e comunicazione

Per quanto riguarda la procedura proveró a scopiazzare a destra e sinistra tra i progetti che usano questo protocollo.

Vedo che ci sei già arrivato.
Uno degli Arduino deve essere server e l'altro client. Il server aspetta che lo chiami il client. Una volta che la connessione è avvenuta è un po' come scrivere e leggere da una seriale.
Dovresti trovare degli esempi in cui l'Arduino fa da server e altri esempi in cui fa da client, ce ne sono molti anche se quelli per il Wiznet sono di più. Per quello che vuoi fare anche l'ENC dovrebbe andare bene.

Bertu65:
Ciao a tutti,
sono alle prese con un problema apparentemente banale ma che per me non lo é.

Ho l'esigenza di inviare un byte, o una word o un bit status da un Arduino ad un altro e viceversa via ethernet shield ed a forza di guardare in giro su come fare mi sono perso; la stragrande maggiornaza delle applicazioni e/o librerie che ho trovato sono orientate verso l'interfacciamento Web che peró a me al momento non interessa.
I sistemi che ho visto (es. Souliss) sono troppo complicati per chi come me é un elettronico con un'infarinatura di informatica e dopo aver cercato per alcuni giorni sul forum, non ho trovato la risposta che cercavo.

La domanda é quindi la seguente: con quale libreria ed in che modo posso scambiare in modo semplice dei dati tra 2 Arduino in rete?

Sapete se esiste giá una disussione sull'argomento?

Grazie,

Bertu

Ciao,

se da Souliss estrapoli solo vNet, il codice che ti server per inviare è

vNet_SendData(indirizzi, puntatore_messaggio, lunghezza, porta)

per ricevere

len = vNet_RetrieveData(buf);

All'interno di vNet ci sono degli esempi d'uso per trasferire un messaggio da un nodo ad un altro, tra i vari modi, funzionando su UDP con IP statici fissi oppure direttamente a livello MAC.

Saluti,
Dario.

Saluti,
Dario.

Grazie della risposta Veseo.

Purtroppo hai a che fare con una persona che ha difficoltá a capire quello che dici.
Quando mi ci avvicinai un paio di mesi fa, l'impatto che ebbi con Souliss fu un po' traumatico.......non ci capii molto.

Nello specifico, l'invio e la ricezione del dato via UDP mi é abbastanza chiaro ma quello dove trovai le difficoltá maggiori e non riusci a farlo funzionare, sono i settaggi necessari alla rete Souliss (settaggi da fare all'interno di alcuni files di configurazione)

Sai dove posso trovare una guida a prova di geometra (senza offesa per i geometra del forum) che spieghi passo passo in modo semplice come configurare il sistema e come usare il codice?

Per completezza di informazione, vorrei aggiungere che al momento sono riuscito a far comunicare 2 Arduino via TCP/IP dove il client manda al server un carattere via client.write e la cui interpretazione fa accendere o spegnere un led.
Sketch molto semplice ma che mi é servito per capire il principio di funzionamento della comunicazione tra client e server.
Avrei ancora molte domande da fare su come trasmettere dati complessi ma causa poco tempo, lo faró solo nei prossimi giorni.

Si, ma questa guida serve per impostare Souliss in blocco. A te serve estrarre la cartella vNet e seguire gli esempi dedicati a vNet.
http://code.google.com/p/souliss/wiki/YourFirstUpload

Spero possa esserti utile.

Saluti,
Dario.

Grazie Veseo, gli do un'occhiata e provo a vedere se riesco a tirarci fuori qualche cosa da solo.

Prova anche con questo
--> GitHub - codebndr/WebSerial: Arduino WebSerial Library
e questo
--> GitHub - codebndr/ArduinoWebsocketServer

Io non ho capito molto del funzionamento però. :sweat_smile: :~

@PaoloP: grazie dei link e soprattutto delle parole consolatrici :~

Causa limiti di tempo ed influenza in corso i progressi sono lenti ma ci sono.
Preferisco procedere passo-passo in modo da capire quello che faccio piuttosto che scopiazzare e basta,

Al momento sono riuscito a creare una connessione TCP/IP tra server e client e riesco a mandare dei caratteri o dei byte.
I dati sono correttamente ricevuti e riesco ad azionare il mio led remoto del Server gestito dallo stato di un ingresso dell'Arduino client.

Fino qui tutto bene.

Quello che non ho ancora capito é come mandare dati complessi tipo un float o un long e la loro interpretazione da parte del server o come inviare messaggi testuali e dati numerici insieme.

Per quanto riguarda gli altri suggerimenti (souliss etc etc) al momento li tengo in un cantuccio per evitare di mettere troppa carne al fuoco. Una volta definito il lavoro in TCP/IP passeró agli altri metodi, cosí da avere la possibilitá di confrontarne l'utilizzo.

Se hai già stabilito la comunicazione, per trasferire i dati guarda gli esempi della EasyTransfert.
Ti crei due strutture identiche ce contengono all'interno il pacchetto di dati da passare. Tramite il codice che dovrai riadattare al tuo caso, ma credo sia semplice, sposti l'intera struttura da un Arduino all'altro.
Occhio che quel codice utilizza in parte anche i puntatori (cosa nuova da studiare) :grin:

Si, la comunicazione é chiusa e quindi facilmente definibile.
Non voglio lasciare spazio ad interpretazioni e quindi ogni eventuale nodo dovrá solo fare quello che deve.

Per quanto riguarda gli esempi grazie, spero solo di riuscire a capirli :slight_smile:

Alla peggio torno