bclose

El Shield Ethernet

Conectando Arduino a una red Ethernet

Objetivos

 

 

    • Montar el Shield Ethernet.
    • Conectarlo a nuestra LAN.
    • Configurar los valores por DHCP.
    • Configurar los valores manualmente
 

Material requerido.

Un cable Ethernet RJ45

Cable Ethernet estandard

 Acceso a la red local y al SwitchAcceso al router

Los Shield de Arduino

 

La ventaja de trabajar con un Arduino, es que la comunidad ha ido creando cantidad de electrónica lista para usarse, sin necesidad de protoboard. En muchos casos son placas que vienen diseñadas para encajar encima de los pines hembra de que dispone Arduino, añadiéndole funcionalidad.

A este tipo de placas prediseñadas para encajar en los pines de nuestros Duinos se les llama genéricamente Shields (Escudos), y en esta sesión vamos a utilizar un shield Ethernet que nos da acceso a la red local de que dispongamos, lo que nos abre unas posibilidades de lo más interesantes.

Shield Ethernet

Para ello lo primero es encajar el shield en nuestro Arduino:

 
  • Hacedlo con el Arduino apagado. Intentar colocar un Shield con Arduino bajo tensión es una ruleta rusa de consecuencias impredecibles.
  • Los pines tienen que encajar con suavidad primero, y después presionar cuidadosamente para se una a Arduino. No lo forcéis.
  • Si alguno de los pines no se alinea adecuadamente, podéis ayudarle, con cuidado pero no forcéis.
  • Aseguraros de todos y cada uno de los pines encaja en los conectores de abajo.
 

Una vez que haya encajado podéis alimentar el Arduino y luego conectar el cable de red, debería tener un aspecto similar a este, y veréis parpadear una serie de LEDs:

ArduinoWithEthernetShield

Por si no sabéis como conectar el Shield a la red Ethernet (Y todos hemos tenido una primera vez), la idea es que uséis un cable Ethernet con RJ45 en ambos extremos, uno de ellos va al Shield y el otro al Router o Swicth de que dispongas.

Cable Ethernet estandard
Acceso al router

Si te conectas con un ADSL, es probable que tengas instalado un Router Swicth cuya trasera se parezca a la imagen derecha. Suelen incluir 4 entradas RJ45 (Y una RJ11, la típica telefónica)

 
  • Tendrás alguna de las bocas en uso con tu PC o similar.
  • La WAN, es un RJ11, parecida pero un poco más estrecha, así que no te empeñes en forzarla  si ves que no va.
  • Normalmente cunado te instalan el Router, en la caja suele ir un cable Ethernet como el de la foto de la izquierda.
  • Si tu acceso es por modem cable, necesitaras acceder a un Swicth.
 

Conecta un extremo al Swicth, oirás un clic característico y el otro al Shield Ethernet y eso es todo, tu Arduino ya está conectado a la red local y probablemente a Internet.

 

Probando la conexión con DHCP

 

Tenemos que comprobar que la conexión es válida. No es posible conocer todos los modelos de Shields Ethernet, pero normalmente incluirán un LED bajo el conector que se encenderá con el cable conectado al Swicth, y se apagará si lo sueltas. (Y lo mismo ocurrirá en el Swicth, que encenderá un piloto en el frontal, cuando detecte la conexión Ethernet.

Vamos lo primero a buscar una dirección IP valida. Para ello y por simplificar vamos a comprobar si en vuestra red existe un servidor DHCP, que recordar servía para asignarnos una dirección IP al arrancar.

Vamos a probar con uno de los ejemplos que vienen con la librería Ethernet, que por cierto viene preinstalada en el IDE de Arduino.

Tenemos que importar en primer lugar un par de librerías, la SPI que ya conocemos y la Ethernet que es nueva. Podéis hacerlo directamente desde \\Pprograma\importarLibreria

#include <SPI.h>
#include <Ethernet.h

Ahora vamos a definir una dirección mac. Lo normal es que no os de problemas la habitual, pero si vais a usar más de un Shield, necesitareis cambiar al menos una. Recordad que tiene que ser diferentes para cada nodo.

byte mac[] = {  0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 } ;

Y ahora vamos a crear una instancia de cliente Ethernet:

EthernetClient client;

En el setup, inicializamos la puerta serie:

void setup()
   {
       Serial.begin(9600);
       while (!Serial)
          {     ; // Solo para el Leonardo  }
   }

En las versiones actuales de la librería Ethernet, si no suministramos una dirección IP propia (Luego veremos cómo), al inicializar la Ethernet, intentara conseguir una dirección mediante DHCP automáticamente, y devolverá 1 si lo consigue y 0 en caso contrario:

if (Ethernet.begin(mac) == 0)    //Si devuelve error
   {       
        Serial.println("No ha sido possible configurar la Ethernet por DHCP");
        while (true; )    ;            // No sigas, quédate aquí eternamente
   }

Si por el contrario devuelve un valor positivo, habrá rellenado un array Ethernet.localIP()[4],de 4 bites, con la dirección IP obtenida del DHCP

Serial.print("Mi direccion IP es: ");
for (byte B = 0; B < 4; B++)   
   {
       Serial.print(Ethernet.localIP()[B], DEC);
       Serial.print(".");
    }
 Serial.println();

El programa imprimirá, la dirección IP obtenida.

Antes de cerrar el tema el DHCP, aquí os dejo un programa que lo usa para conectar a la red e imprime los valores recibidos   Prog_61_1. La salida es esta:

ejemplo de DHCP

Si recurrís al DHCP, tenéis que ser conscientes de que tiene un coste en uso de memoria. Si queréis economizarla especificad solamente la IPAddress.ip y Arduino asignara por defecto al Gateway la dirección 1 dentro de la subred.

 

Que hacemos si no tenemos DHCP

 

Si en nuestra red no hay disponible un DHCP, o necesitamos la memoria que usa, aun no estamos perdidos. Tenemos que determinar nuestro rango de direcciones y asignarlas manualmente a nuestro Shield Ethernet.

En Windows tenemos que abrir la configuración de red. El procedimiento depende mucho de la versión, pero si podéis abrir la consola del sistema (SI, la terrible pantalla negra) acabaremos enseguida.

Normalmente, al pulsar el boto de inicio, abajo del todo hay una ventana en la que puedes escribir que pone “Buscar programas y archivos”, escribe CMD y pulsa intro. Te saldrá la temida consola en negro funesto. Escribe ipconfig  y pulsa intro.

Consola windows con IPconfig

Esos valores muestran los datos de tu conexión. Como mi dirección IP es la 192.168.1.50, lo lógico es probar una dirección del tipo 192.168.1.xx, donde xx es un valor entre 0 y 255, que no coincida con otra dirección de tu red.

Prueba con un valor tipo 237, por aquello de que es una dirección rara improbable en una red doméstica.

Para forzar a nuestro Shield a una dirección determinada, sin recurrir al DHCP, podéis hacerlo creando antes de llamar a Ethernet.begin (mac), uno o varios arrays de 4 bytes:

byte mac[] = {   0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1, 177);
IPAddress gateway(192,168,1, 1);
IPAddress subnet(255, 255, 0, 0);
 
  • Con definir la IPAddress.ip es suficiente. El resto de los valores se asignan por defecto.
  • Además si no vamos a salir a Internet, ni acceder a nuestro Arduino desde internet (Volveremos a hablar de esto), no será necesario definir la Gateway.
 

En Mac podemos ir a Preferencias del Sistema, Red y nos saldra la configuracion directamente:

Parametros TCPIP

Y después podemos ya probar una dirección tipo la que definíamos para Windows.

 

Accediendo a una página WEB desde Arduino

 

El IDE incluye un ejemplo muy interesante de acceso a Google desde la Ethernet y para hacerle una consulta. Vamos s cargarlo y comprobar que nuestra conexión y configuración funcionan correctamente.

Haremos una petición desde nuestro programa de búsqueda en Google y mostraremos el resultado en la pueta serie.

Es importante que tengáis en cuenta lo siguiente:

 
  • El volumen de información que genera el acceso a páginas Web es descomunal, aun en los casos más sencillos, porque hay mucha información de gestión que normalmente el usuario no ve y que ahora va a aparecer.
  • Os recomiendo que pongáis la velocidad de la puerta seria a 115.200 bps, porque si no, la consola va a tardar lo suyo.
  • Una vez que haya finalizado la recepción de texto HTML en la consola, podéis seleccionar y copiar el texto en un editor externo como el notepad, y guardarlo con la extensión HTML y no txt cuidado.
  • Haciendo doble click en el fichero así guardado os abrirá el navegador con la respuesta,

Si vas a buscar datos concretos en el texto recibido prepararos para hacer parsing (análisis) abundante y es fácil que un UNO se os quede corto de memoria.

 

Aquí teneis una copia del ejemplo Ethernet\WebClient

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//IPAddress server(74,125,232,128);  // numeric IP for Google (no DNS)
char server[] = "www.google.com";    // name address for Google (using DNS)
// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192, 168, 1, 177);
EthernetClient client ;

void setup()
   {     Serial.begin(115200);
         while (!Serial) ;   // Para Leonardo 
         
         if (Ethernet.begin(mac) == 0)
           { Serial.println("Failed to configure Ethernet using DHCP");
             Ethernet.begin(mac, ip);
           }
         delay(1000);      // Esperar a que Ethernet se inicie
         Serial.println("connecting...");
         if (client.connect(server, 80))
            { Serial.println("connected");
              // Make a HTTP request:
              client.println("GET /search?q=arduino HTTP/1.1");
              client.println("Host: www.google.com");
              client.println("Connection: close");
              client.println();
            }
         else
              Serial.println("connection failed");
   }
void loop()
   {    if (client.available())
           {   char c = client.read();
               Serial.print(c);
           }
        if (!client.connected())   // Si no hay conexion
          {  Serial.println();
             Serial.println("disconnecting.");
             client.stop();

             while (true) ;  // No hagas mas
          }
   }

Resumen de la sesión

.

 
    • Vimos como conectar el Shield Ethernet a nuestros Arduinos.
    • Mostramos algunas ideas para conectar el Shield a nuestro Swicth mediante un cable Ethernet RJ45.
    • En las versiones actuales de la librería Ethernet, están soportados tanto el DHCP con el DNS, lo que nos ahorra muchos dolores de cabeza.
    • Pero si por cualquier motivo, no podemos usarlos, y el uso de memoria es uno bueno, hemos visto también como configurar valores IP manualmente.
    • Vimos también un pequeño ejemplo de cliente Web.
 

 

 

 

 

(90) Comments

  • Hay algún puerto en el router quete devuelva la ip externa/publica??
    Sigo investigando, pero no lo logro encontrar. Gracias por las respuestas que me distéis anteriormente.

  • Quiero que arduino pregunte al router la ip externa/publica y la gurde en la SD. Y luego a través de twitter que me envíe la ip cada vez que cambie. Pero no sé que función es la que te devuelve esa dirección.

    • Hola Agustín, he estado buscando un poco y no encuentro ninguna función que pueda servirte. Seguiré intentándolo, pero a ver si mientras hay alguien que pueda ayudarnos. Un saludo.

      • Miguel

      Mas facil que preguntar la router es pregutnar a una web externa, por ejemplo https://www.cual-es-mi-ip.net/. y listo despues se parsea.
      en esta pagina esta en . buscas este texto y el string que le sigue es tu ip publica

      • Gracias por el aporte Miguel. Un saludo.

  • muchas gracias por l.a info super importante

    • Gracias a ti por el comentario. Un saludo.

  • Buenas noches.
    Mi nombre es Jorge Eliecer Benitez, estudiante de ingeniera.
    Actualmente estoy realizando un proyecto de adquisición y supervisión empleando la capa física Ethernet y protocolo Modbus TCP.
    El cliente se desarrolló en Visual Studio .NET y la conexión con el Arduino se realizó mediante el empleo de socket.
    Necesito expandir la comunicación a la red GSM, empleado el Shield GSM/GPRS para el cual me he guiado de sus tutoriales, pero se me ha presentado un problema, el cual intentare explicar.

    El Mega 2560 es el servidor Modbus.
    La aplicación en Visual Studio . Net es el cliente,
    Estoy intentado conectar los dos Shield “Ethernet y GSM” al Mega 2560.

    Al momento de que el cliente solicita el uso de la red GSM para enviar un SMS, se produce un error en la conexión mediante socket provocado desde el Mega; Siendo necesario reiniciar las placas, el error solo ocurre solamente al usar el servicio SMS y no antes.

    Entiendo que el Shield Ethernet emplea el bus SPI y el Shield GSM/GPRS comunicación Serial, y que los dos comparten un pin.

    Estoy empleando Software.Serial para cambiar los pines de comunicación con el Shield GSM/GPRS, pero aún se sigue presentando el problema.
    Estoy empleando la librería Simple Mudbus
    Quisiera saber si me puedes ayudar con este problema dándome ideas.

    Actualmente lo he solucionado empleando dos placas Arduino “Mega y UNO” que funciona de la siguiente manera, EL mega recibe la orden de Cliente y activa un pin Digital, leído por el Uno como orden para el uso de SMS, y utilizo flancos de subida para enviar solo 1 mensaje.

    y ya que estamos en esto, tengo pensado implementar una red RS 232 – RS 485 en el mismo MEGA 2560 para expandir a 32 puntos más,

      • Teso

      Hola Jorge, tuve un problema similar. En mi caso usaba un módulo SIM900 basándome en otros tutoriales de Prometec. Me sucedía exactamente lo mismo. Me di cuenta que el problema estaba en que cuando la librería Software Seríal empezaba a actuar…empezaba a caer la estabilidad. Era la que me provocaba esos bloqueos y decidí usar los puertos series del Mega a pelo. Es decir Serial1, Serial2 y Serial3 conectados a sus pines correspondientes. Total el software es prácticamente idéntico haciéndolo así. Ahora no tengo ningún tipo de ralentización o bloqueo como comentabas en tu caso. Es mas, uso un puerto para bluetooth, otro para el sim y otro para el reproductor de mp3 DFPlayer mini + el SHIELD Ethernet y como la seda al 90% de memoria de programa que no es poca (mucho css en el servidor también es verdad). Si te decides a desdoblar el rs232 al 485 estos puertos te pueden ayudar.

      • Muchas gracias por el aporte Teso. Un saludo.

  • Buenas tardes.

    A mí me ocurre lo mismo. tengo activado el DCHP y no funciona, heprobado a darle una IP fija y tampoco. He probado los ejemplos que trae Arduino y no funciona. El Shield solo enciende la luz roja.

    ¿es posible que sea porque mi Arduino no sea de Arduino.CC y sea de Arduino.ORG?

    gracias

    • Hola Adan, hay algunos módulos bluetooth que sirven para enviar audio, pero tienes que asegurarte que cumplen la norma A2DP. Nosotros no los hemos usado así que no podemos decirte mucho más. UN saludo.

    • Jorge Garcia

    Buenos días Admin,

    Muchas gracias por tu página y el esfuerzo que le dedicas, sirve de muchísima utilidad a gente como yo con interés en aprender sobre este mundo de Arduino.

    Te quería preguntar una duda, he probado a cargar el prog_61_1 que adjuntas en el tutorial y la verdad es que unicamente puedo leer la primera línea de escritura en el monitor serie (“Buscando DHCP…”). Después no aparece nada más.

    En mi caso estoy utilizando una placa Arduino UNO + arduino ethernet shield 2.

    ¿Sabes porqué puede estar pasando esto?

    Muchas gracias de nuevo

    • Hola Jorge, Seria conveniente estar seguro de que en tu red hay un sevidor de DCHP activo ¿Es asi?

Give a Reply

WordPress Anti-Spam by WP-SpamShield

¡Ofertón!

Robot Rover 4×4

Ahora por sólo

50€ + IVA

¡Lo quiero!