arduino + ethernet schield accendere un led telnet

salve a tutti! ho di recente acquistato arduino + ethernet shield. tramite telnet voglio far accendere un led in remoto. il led l'ho posizionato sul pin 9 (funziona..) questo è il codice che ho trovato in giro x fare una prova:

#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);
 }
}

poi da terminale scrivo:

 telnet 192.168.1.15 77

sulla seriale stampa "accetto" ma quando da terminale premo il tasto 0 oppure 1 oppure B la ethernet schield si illumina ma non accende il led mi sapreste dire il motivo? grazie!

scusate forse sbaglio a mandare il messaggio da telnet? io scrivo..

send '1'

Ciao,
manda solo il carattere "1" o "0". (funziona comunque)

Come alimenti l'Ethernet Shield (se usi alimentazione altra da USB, hai bisogno di resettare lo shield prima che funzioni)?
Il led funziona?
Come lo hai collegato ad Arduino?

l'eternet schield l'alimento con la porta usb di arduino..il led con il metodo blink() si accende ma a me pare come se il metodo loop sia ignorato...forse un problema qui?

 Client client = server.available();

mister,
il codice è corretto (lo ho pure provato).

il led con il metodo blink() si accende

...intendi passando "B" via telnet?

scusa ma allora cosa puo essere? come ti colleghi con telnet?cosa scrivi?
comunque sono sicuro che qui...

 Client client=server.available();
 if (client) {
   char c = client.read();
   server.write(c);

oltre non vado..

Ciao,

come ti colleghi con telnet?

con telnet non penso ci siano molti modi per collegarsi :slight_smile:

$ telnet 10.0.10.1 77
Trying 10.0.10.1...
Connected to 10.0.10.1.
Escape character is '^]'.

(l'indirizzo assegnato da me è 10.0.10.1).
Una volta collegato, è sufficiente dare "1" per far accendere il led, "0" per spegnerlo e via dicendo (naturalmente seguiti dalla pressione del tasto INVIO).

All'interno dello switch case, io ho sostituito
Serial.println
con
server.write
in modo da avere feedback del comando lanciato, direttamente sulla console di telnet.

Led attaccato con gambetta più lunga (+) su pin 9, gambetta più corta (-) su pin GROUND (giusto per la cronaca).

e adesso cosa mi invento? stavo pensando..ho provato la prima volta a mettere il led sul pin 10 posso aver fatto danni?7
comunque ho provato a scrivere così:

 Client client=server.available();
 
 if (client=true) {
   //digitalWrite(ledPIN, HIGH);
   char c = client.read();
   //Serial.println(c);
   server.write(c);

così facendo ricevo su telnet una miriade di caratteri (illeggibbili..)

ciao,
innanzitutto il segno "=" ha valore di assegnamento, non di comparazione (che si fa con "==").

In secondo luogo, available() non torna true o false:

di conseguenza questa forzatura non serve.

Copia/incolla la console di telnet con la parte di connessione e con un paio di stringhe passate (giusto per capire realmente quel che fai)...

mi collego con telnet così:

[fabio@fabio-laptop ~]$ telnet 192.168.1.15 77
Trying 192.168.1.15...
Connected to 192.168.1.15.
Escape character is '^]'.
1
0
1

arduino è collegato alla mia rete locale a meno che il router impedisca connessioni telnet..ma a questo punto non si doveva neanche connettere giusto?

Apparte che, riguardando le dichiarazioni, vedo:

byte ip[] = { 192,168,1,15 };
byte gateway[] = {192,168,178,1};
byte subnet[] = {255,255,255,0};

il gateway non fa parte della classe di ip dello stesso shield.
Correggi e verifica il funzionamento (anche se non è questo il punto).

Subito dopo la riga:
Client client = server.available();
inserisci
server.write('ok');
(è una porcheria, ma almeno capiamo se di base funziona)

Ri-upload lo sketch e connettiti via telnet: dovrebbe riempirti la console di ok.
Se questo non funzia, mi sa che hai qualche problema all'eth shield.

Hai provato, cmq, a fare un reset dello shield?
Hai provato a connetterti direttamente con il tuo pc con un cavo di rete cross?
Lo shield è inserito bene nell'Arduino?
A parte il led, hai attaccato altro allo shield?

no il codice è questo...

#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,1,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();
 server.write('_ok_'); 
 // 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);
 }
}

da telnet mi escono una miriade di caratteri strani però qualche cosa esce..
il reset da acceso?
lo shield mi pare di si...
ho solo collegato un led..
devo provare con il cavo cross...
se devo fare una tesi così la vedo dura! :o

no il codice è questo...

#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,1,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();
 server.write('_ok_'); 
 // 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);
 }
}

da telnet mi escono una miriade di caratteri strani però qualche cosa esce..
il reset da acceso?
lo shield mi pare di si...
ho solo collegato un led..
devo provare con il cavo cross...
se devo fare una tesi così la vedo dura! :o

Ciao

se devo fare una tesi così la vedo dura!

;D
A dire il vero, mi sembra strano che non funzioni il tuo progettino.
(La variabile rcv è int, secondo me deve invece essere char).

In ogni caso, il codice funziona anche così com'è.
Il fatto che poi tu ti connetta via telnet, mi fa pensare che lo shield non abbia problemi.
Riesci a pingarlo tranquillamente (intendo, anche per qualche minuto)?

sia int che char è uguale...si riesco a pingarlo ma sincerammente non so più che pensare!ti colleghi tramite cavo cross con il tuo arduino?

ti colleghi tramite cavo cross con il tuo arduino

mi collego con cavo di rete, passando per uno switch.
Inutile dire che funziona.
Idem con cavo cross collegato direttamente la mio laptop.

sto cercando di collegarmi con il cavo cross ma il computer non pinga arduino... :cry: :cry:
RETTIFICO!
sono connesso con cavo cross ma la situazione non cambia! cosa mi consigli ora?

Altra porta USB?
Altro PC?
Stesso comportamento?

porta usb cambiata pc pure io non vorrei che l'arduino sia rotto...

mister,
Arduino non penso che sia rotto; lo sketch ti viene caricato, e viene eseguito. Se hai qualche dubbio, togli lo shield Ethernet e prova qualcuno degli sketch presenti nei tutorial.
Il problema potrebbe essere eventualmente l'Ethernet Shield, ma anche qui ho i miei dubbi, poichè la connessione telnet sembra avvenire senza problemi, come il ping.

Se ci dici di dove sei, potrebbe esserci qualcuno in zona che potrebbe aiutarti a fare un poco di debug sul tuo Arduino e Ethernet Shield.

Altro sinceramente per ora non mi viene in mente, passo la palla ai "colleghi" del forum con più competenza :-/