Go Down

Topic: comunicacion entre dos shield ethernet w5100 (Read 126 times) previous topic - next topic

juan-jose-06

Hola. Necesito comunicar dos arduinos por medio de ethernet de tal forma que al momento de que yo envié un pulso en uno de los arduinos el otro al recibirlo active un led por un tiempo definido. La idea es que se conecten directamente es decir del puerto RJ45 de uno directamente al Rj45 del otro, no me ha funcionado, utilice un switch para interconectar los dos arduinos y tampoco me comunica, les dejo el código que utilice para esto, tanto el cliente como el servidor.
cliente
Code: [Select]
#include <Ethernet.h>
#include <SPI.h>

/*CONFIGURACION DE LOS PARAMETROS ETHERNET CLIENTE*/

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x2F, 0xE4 };
                                                     // byte ip[] = { 192, 168, 1, 178 };  OTRA FORMA DE COLOCAR LA DIRECCION IP 
IPAddress ip(192, 168, 1, 178);
byte server[] = { 192, 168, 1, 125 };                 // IP DEL ARDUINO SERVIDOR
int SW;                                               // CREA LA VARIABLE DE TIPO ENTERO "SW"

EthernetClient client;                                // CREA UN CLIENTE, QUE EN ESTE CASO SE LLAMA "client"

void setup()
{
 Ethernet.begin(mac, ip, server);                    // INICIA LA LIBRERÍA ETHERNET Y LA CONFIGURACIÓN DE LA RED
 pinMode(3, INPUT);                                  // CONFIGURA EL PIN 3 DE ARDUINO COMO UNA ENTRADA DIGITAL
 pinMode(4,OUTPUT);                                  // CONFIGURA EL PIN 4 COMO SALIDA DIGITAL (sd)
 digitalWrite(4,HIGH);                               // COLOCA EL PIN 4 DE LA ARDUINO EN UN NIVEL LÓGICO ALTO
 delay(1000);
 Serial.begin(9600);                                 // COMIANZA LA COMUNICACIÓN SERIAL A 9600 BAUDIOS DE VELOCIDAD
 client.flush();                                     // DESCARTA TODOS LOS DATOS ALMACENADOS EN EL BUFFER
 delay(500);
}

void loop()
{
 if(digitalRead(3)== LOW)                            // SI EL PIN DIGITAL 3 ESTA EN BAJO....... ENTONCES.....
 {
 Serial.flush();                                     // LIMPIA EL BUFFER DEL MONITOR SERIAL
 Serial.println("Esperando el boton");                 // IMPRIME EN EL MONITOR SERIAL
 }
   else                                              // CASO CONTRARIO A LA CONDICIÓN INICIAL
   {
   Serial.println("Entrada 3 en alto");              // IMPRIME EN EL MONITOR SERIAL
   client.flush();                                   // NUEVAMENTE LIMPIA LOS DATOS DEL BUFFER DE DATOS DE LA CONEXIÓN ETHERNET
   client.connect(server, 12535);                    // CONECTA EL CLIENTE AL SERVIDOR POR SU IP Y POR EL PUERTO ESPECIFICADO
   Serial.println("connected");                      // IMPRIME EN MONITO SERIAL
   delay(1000);               
   SW =  client.write('P');                          // LE ASIGNA LA VARIABLE "SW" EL VALOR QUE SE ESCRIBIRÁ EN EL SERVIDOR
   Serial.println(SW);                               // IMPRIME EL VALOR DE RETORNO DE LA FUNCIÓN WRITE() QUE ES EN BYTES
   delay(1000);
   }
 }


servidor
Code: [Select]
#include <SPI.h>
#include <Ethernet.h>

/*CONFIGURACION DE LOS PARAMETROS ETHERNET SERVIDOR*/

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 
                                                    // byte ip[] = { 192, 168, 1, 123 }; OTRA FORMA DE ESCRIBIR LA DIRECCIÓN IP 
IPAddress ip(192, 168, 1, 125);                      // DIRECCIÓN IP ASIGNADA AL SERVIDOR
byte gateway[] = { 192, 168, 1, 1 };                 // LA DIRECCIÓN DE PUERTA DE ENLACE AL ROUTER                                                     
byte subnet[] = { 255, 255, 255, 0 };                // LA MÁSCARA SUBNET DEL ROUTER

EthernetServer server = EthernetServer(12535);       // CREA UN SERVIDOR QUE ESTA ATENTO A CONEXIONES ENTRANTES POR UN PUERTO DADO

void setup()
{
 Ethernet.begin(mac, ip, gateway, subnet);          // INICIA LA LIBRERÍA ETHERNET Y LA CONFIGURACIÓN DE LA RED
 server.begin();                                    // INDICA AL SERVIDOR QUE COMIENCE A RECIBIR CONEXIONES ENTRANTES
 
 pinMode(4,OUTPUT);                                 // CONFIGURA EL PIN 4 DE ARDUINO COMO SALIDA
 pinMode(3,OUTPUT);                                 // CONFIGURA EL PIN 3 DE ARDUINO COMO SALIDA
 digitalWrite(4,HIGH);                              // DESHABILITA LA MEMORIA SD 
 Serial.begin(9600);                                // COMIENZA LA COMUNICACIÓN SERIAL A 9600 BAUDIOS
 Serial.print("server is at ");                     // IMPRIME EN EL MONITOR SERIAL
 Serial.println(Ethernet.localIP());                // IMPRIME LA IP LOCAL EN EL MONITOR SERIAL
}

void loop()

 EthernetClient client = server.available(); // COMIENZA A LEER LO QUE ESTA ENTRANDO EN EL BUFFER DEL SERVIDOR
 if (client)
 {                                                  // SI EL CLIENTE ESTA CONECTADO.... ENTONCES.....
   Serial.println("client connected");              // IMPRIME EN EL PUERTO SERIAL
   while (client.connected())                       // MIENTRAS EL CLIENTE ESTÉ CONECTADO..... HACE.....
     {
       int c = client.read();                       // CREA LA VARIALBE DE TIPO ENTERO "C" EN DONDE SE ALMACENA LO LEIDO EN EL BUFFER
       if (c == 'P')                                // SI EL ENTERO "C" ES IGUAL AL VALOR ASCII 80 QUE EQUIVALE AL VALOR 'P'
       {
       Serial.println(c);                           // IMPRIME EN EL MONITOR SERIAL EL VALOR DE LA VARIABLE "C"
       digitalWrite(3,HIGH);                        // ENTONCES ASIGNA EL VALOR "HIGH" O 5 VOLTS AL PIN 3 DE ARDUINO
       delay(2000);                                 // DEMORA 2 SEGUNDOS
       digitalWrite(3,LOW);                         // ASIGNA EL VALOR "LOW" O 0 VOTLS AL PIN 3 DE ARDUINO (ENCIENDE Y APAGA EL LED)
       server.write(client.read());
       }
     }
 delay(500); 
 }
}





gfia

Disculpa que te pregunte desde mi ignorancia, si quisieras hacer esta comunicación el RJ45 no debería estar conectado de forma cruzada? Gracias!

surbyte

Dijo estar usando un switch de modo que no hace falta. Si lo conectas uno contra otro si.

De los códigos lo primero que me hace ruido es el uso del puerto 12535 que no lo haces en el cliente.
Prueba para comenzar el puerto 80 asi no tienes nada que asignar en el cliente.

gfia

Dijo estar usando un switch de modo que no hace falta. Si lo conectas uno contra otro si.

De los códigos lo primero que me hace ruido es el uso del puerto 12535 que no lo haces en el cliente.
Prueba para comenzar el puerto 80 asi no tienes nada que asignar en el cliente.

Gracias!! No había dado atención al detalle donde nombra haber intentado con un switch

juan-jose-06

 Hola, con respecto a los puertos si ya use un cable cruzado para tratar de interconectar directamente los dos
shield pero no tiene reacción, con el switch ya utilice los dos tipos y aun así no tengo comunicación.

 Con respecto a los puertos utilize primero ese para generar un puerto de solo lectura y pues no funciono, tambien utilice el puerto 23 que es el telnet que se el que se utiliza para la comunicacion cliente servidor y tampoco paso nada y ya utilice por ultimo el puerto 80 y tampoco.

 Con el switch hay momento donde se genera un comunicacion, pero solo hablo de los indicadores, ya que en el monitor serial del cliente nunca conecta aparece desconexion y en el servidor solo muestra su direccion local ip cuando en el caso del servidor deberia de entragar un mensaje de conectado y empezar a hacer que el led prenda y apague, seguire intentando si tienen alguna idea espero sus comentarios.

 Tengo una duda con este shield si es posible hacer lo que estoy intentanto por que todo lo que veo en internet en ejemplos son como servidor web e interconectado a una red nunca solos o directamente.


Go Up