opinione progetto arduino + ethernet shield

salve a tutti! mi chiamo fabio e sono nuovo di questo forum! ho il bisogno di creare un software (sul pc)che tramite teltet invii dei comandi ad una scheda arduino + shield ethernet.e fattibile? la comunicazione deve avvenire anche al contrario. chiedo consigli e opinioni prima di acquistare tutto il necessario! grazie in anticipo a tutti!

nessuno che mi da un consiglio?

la cosa è fattibile. Però per prima cosa devi avere un arduino e un ethernet shield. dopo di che provi a vedere qui
Arduino Playground - InterfacingWithHardware e
Ethernet - Arduino Reference
dopo di che provi a vedere se riesci a creare un server molto semplice e infine passi al programma per la comunicazione

vorrei fare una cosa semplice ovvero quando il dispositivo è in loop aspetta una parola specifica che gli mando dal mio programma con telnet per poter accendere luci motori ecc...la cosa che mi è parsa strana è che non ho trovato un esempio che gli si avvicina...poi quale è la differenza tra un server e un client? non capisco bene..

poi quale è la differenza tra un server e un client? non capisco bene..

Direi che dovresti "studiare" un pochino prima di avventurarti in un qualcosa che forse potresti non capire...
Qui hai la spiegazione: Sistema client/server - Wikipedia

L'uso di una connessione che presuppone un indirizzo di rete (come l'IP del protocollo TCP/IP utilizzabile attraverso la ethernet shield che hai scelto di usare) si aspetta anche che sia implementato un sistema client/server... Per questo se non ne comprendi la funzione e le dinamiche non potrai mai sperare di capire il programma che vuoi creare.

no scusa non ci siamo capiti:
le librerie del client (leggendo l'esempio qui...)

ti obbligano a creare un client connesso a un server ..
Client client(server,80)
questa soluzione non può essere utilizzata per il mio problema ho bisogno di avere nodi sempre attivi in attesa di una possibile richiesta quindi devono essere tutti nodi server.
poi leggo questo metodo:
server.avariable() tramite questo metodo che mi restituisce tutti i client posso mandare messaggi. la mia domanda:
è possibile mandare un messaggio ad un indirizzo IP senza che ci sia un nodo client attivo?spero di essere stato piu charo...

Non farti confondere dai nomi delle classi.

Il protocollo TCP/IP richiede che ci sia una connessione aperta per poter scambiare dei dati.
Quando arriva una richiesta di connessione il server crea un oggetto client che ha tutti i metodi necessari a parlare con un altro computer.
In quel momento la comunicazione è simmetrica e tutti e due possono parlare / ascoltare. (percui se la classe si chiama client, server o pinocchio non cambia nulla)

Se vuoi risparmiare sulla creazione della connessione e vuoi un sistema più leggero usa il protocollo UDP, non è affidabile come il TCP (perche se mandi un pacchetto che si perde non se ne accorge nessuno, a meno che non implementi tu un meccanismo di ACK) ma è molto più semplice.

ti consiglio di guardare la libreria OSC di recotama (la trovi su google) ti permette di mandare messaggi ad un'arduino passando dei parametri. Il protocollo OSC (basato su UDP) è apertissimo e ci sono librerie per tutti i linguaggi.

m

quindi l'arduino si mette in ascolto della porta
all'arrivo di una richiesta di connessione (il pc che vuole mandare un messaggio)viene creato l'oggetto client giusto?
i metodi dell'oggetto client sono questi?
Client class

The client class creates clients that can connect to servers and send and receive data.

  • Client()
  • connected()
  • connect()
  • write()
  • print()
  • println()
  • available()
  • read()
  • flush()
  • stop()

poi riguardo le librerie che dici ho trovato un sito in cinese..o c'è altro?

http://recotana.com/recotanablog/?page_id=222
il sito è in giapponese ma il codice è leggibile

SimpleReceive.pde è un buon punto di partenza

m

per adesso lo tengo in conto ma il protocollo udp non lo vorrei utilizzare..invece riguardo all'oggetto client i metodi che ha sono quelli che ti ho postato sopra?

questa è la documentazione ufficiale con i metodi.

m

prova con degli sketch di esempio in file>example>ethernet> web client dovrebbe fare al caso tuo così capisci come comunicare tramite eternet

ok per adesso grazie il mio obiettivo era capire se quello che voglio fare è fattibile..sarà la mia tesi di laurea! :wink:

aggiungo anche che ho trovato un bell'esempio dell'utente Erthy Dyrssen!
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1256916783/15

quello l'ho usato anch'io per capire come usare la ethernet shield. Comunque ciò che vuoi realizzare te è fattibile

eccomi qua! dopo tanto ho acquistato il tutto! sto facendo un piccolo esperimento giusto per vedere se funziona tutto ecco il codice!

#include <Server.h>
#include <Client.h>

#include <Ethernet.h>

//Arduino uses digital pins 10, 11, 12, and 13 (SPI) to communicate with the W5100 on the ethernet shield
int ledPIN = 9;
byte mac[] = {
 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//byte ip[] = { 10, 0, 0, 4};
byte ip[] = { 192,168,1,15 };
byte gateway[] = {192,168,178,1};
byte subnet[] = {255,255,255,0};

Server server(77);

void setup()
{
 // setta come output
 pinMode(ledPIN, OUTPUT);
 // initialize the ethernet device
 Ethernet.begin(mac, ip, gateway, subnet);
 // start listening for clients
 server.begin();
 Serial.begin(9600);
 Serial.println("Accetto");
 blink (5);
}

void loop()
{
 Client client = server.available();
 // il client si collega con il comando:
 // telnet 192.168.1.15 77
 if (client) {
   int rcv = client.read();
   // echo vs il client:
   server.write(rcv);
   // Serial.print(rcv);
   
   // comandi accettati:
   // 1=acceso, 0=spento, B=blink
   switch (rcv) {
   case '1':
    digitalWrite(ledPIN, HIGH);
     Serial.println("CMD 1 received");
     break;
   case '0':
     digitalWrite(ledPIN, LOW);
     Serial.println("CMD 0 received");
     break;
   case 'B':
     blink(2);
     Serial.println("CMD B received");
     break;
   }
 }
}


void blink (int times)
{
 for (int cnt=times; cnt>0; cnt--)
 {
   digitalWrite(ledPIN, HIGH);   // set the LED on
   delay(200);                  
   digitalWrite(ledPIN, LOW);    // set the LED off
   delay(200);                  
 }
}

se mi connetto con telnet la connessione viene accettata e la seriale stampa accetto!
poi se do il carattere 0 oppure 1 il led non si accende perche? (il led funziona con metodo void blink (int times) il led si accende..)grazie dell'aiuto in anticipo!

forse è meglio se creo un nuovo topic?

sí, é il caso.