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.

Imagen de Arduino UNO

  Arduino UNO o equivalente.

Shield Ethernet

Un Shield Ethernet.

Cable Ethernet estandard

 Un cable Ethernet RJ45

Acceso al router

Acceso a la red local y al Switch.

 

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.
 

 

 

 

 

(69) Comments

    • JC

    Muchíiiiisimas gracias por toda la información, ejemplos, librerias, ….. un trabajo excepcional!!!!
    Quería hacer una consulta, que imagino que alguien (o muchos) la habrán hecho, pero no consigo saber la respuesta “completa”.
    Quiero hacer una especie de domótica en mi casa, y quiero poner una pantalla táctil de unas 5 o 7 pulgadas (que todavía estoy buscando) y un Ethernet Shield. Y la duda que tengo es….. “SPI”. Si la placa Ethernet esta usando el SPI, como hago funcionar el TFT, que también usa ese puerto (lo quiero usar con el táctil y la SD del TFT, todo en una Arduino Due).
    Muchas gracias!

    • Hola JC, el SPI es un bus diseñado y pensado para poder usar varios componentes en el mismo y controlar quien habla y cuando, asi como indicar a que direccion se envian los mensajes. no tenemos de momento ningun tuto al respecto pero tendremos que hacer uno.

      Como regla general, en el SPI de cada nodo hay un pin llamado CS o Select que cuando se activa levante este nodo. Todos los demas tienen que tener su selec o CS desactivado con lo que solo uno recibe el mensaje. El problema viene cuando los dos equipos usan el mismo pin de activacion

      https://www.circuitsathome.com/mcu/running-multiple-slave-devices-on-arduino-spi-bus/

        • JC

        Muchas gracias “admin” por la información y el link.
        Buscando tipos de TFT, he encontrado uno “Nextion” que usa puerto TTL (Tx, Rx) para la comunicación, y se programan mediante su software. Voy a probar una (así no tengo problemas con el Ethernet Shield).

  • Hola, he hecho todo como dice el tutorial, pero cuando le mando subir a la placa me tira este error, estoy trabajando con IOs.

    avrdude: ser_open(): can’t open device “/dev/cu.usbmodemFA141”: No such file or directory
    Problema subiendo a la placa. Visita http://www.arduino.cc/en/Guide/Troubleshooting#upload para sugerencias
    muchas gracias

    • Hola Pablo, lo que te dice es que no encuentra tu arduino si no me equivoco. Parece como que no te levanta la puerta USB

  • Hola de nuevo. Investigando un poco he dado con la solución de Arduino DUE + Thernet Shield II.
    Instalando el IDE 1.7.4 funciona aparentemente bien. Os dejo el hilo de la fuente.
    Un saludo
    https://forum.arduino.cc/index.php?topic=329990.0

    • Esquerda21

    Buenas noches. Comentar si podrías darme una solución a lo siguiente. Los reyes me han traído una DUE y una Etehernet Shield2 y después de intentar compilar ejemplos tuyos y no funcionar, he averiguado incompatibilidad de alimentación.
    Sabiendo esto, ¿que SHield sencilla, que funcione con Due, puedo usar? ¿Hay algún apaño para usar esta con Due?
    Gracias

    • Hola, he leido que con el DUE solo es compatible la Rev 3.0 del Ethernet shield. Un saludo.

  • Admin, como estas, me he conectado al servidor que quiero vía Ip asignada por DHCP y no tiene ningún problema, pero cuando lo trato de hacerlo por una Ip fija el servidor no me contesta a pesar de usar una dirección dentro del rango e incluso aveces usar la misma que me asigna por DHCP. Igual repito el ejercicio con el ejemplo de google que presentas. pero tampoco responde con una Ip fija. Si le doy ping si responde el shield pero no se conecta al server. tienes alguna idea.

    • Hola Edwin,

      Si te aseguras de asiganr una IP fija a tu shield no deberia asignarsela el DHCP y si lo hace es muestra de algun error basico

      Una vez que estes seguro de la IP statica que le has asignado, basta con que te conectes a esa direccion con ese puerto y si antes podias acceder al web server tambiend eberias hacerlo ahora

      Ya me diras

  • Admin, tienes algún ejemplo donde se lea un archivo tipo HTML cuyo servidor inicia por http://xxx.xxx.com/xx y no tiene www como el ejemplo de Victor Hugo (enero 8 de 2016). o por ejemplo que pueda leer la pagina https://aprendiendoarduino.wordpress.com/2016/07/05/arduino-web-client/

    He usado el ejemplo de Victor Hugo que ya mencione en el cual incorpora la expresion GET así:
    client.println(“GET http://proyectoresidencia.comxa.com/data/alarma2.php?para=mic etc, pero no me ha funcionado. Solo aparece connectimng… connected disconnecting. Que puedo estar haciendo mal pues en el navegador si me da la respuesta que espero.
    Igualmente he realizado los ejemplos que relacionas como el de google y me funcionan perfectamente.

  • Gracias por tu respuestas aun que tengo mas inquietudes, He visto en la web que en algunos casos para conectar el shield ethernet a un arduino mega usan unos puentes a los pines 50 a 53 y entras ocasiones no los veo. Me puedes aclarar por favor si puedo usar los pines 10 11, 12 y 13 con un arduino mega o es obligatorio usar otros?

    • Hola Edwin, el Mega y el UNO comparten pines en las mismas posicione sy por eso el Mega deberia usar los mismos que el uno. No s epara que pueden servir esos pines 50-53 con el ethernet

  • Hola,

    Podrías comentarme que puertos usa el shield ethernet del arduino mega, no lo puedo evidenciar leyendo el código de ejemplo.

    • Hola Edwin,

      EL ethernet shield usa los pines 10,11,12, y 13 y ademas el bus SPI

    • Cesar

    Hola Admin, consulta, voy a suponer que mi dirección publica es 200.200.200.200, y la dirección interna es 192.168.1.xxx, con mascara 255.255.255.0, con puerta de enlace 192.168.1.1, como configuro esto en mi arduino ethernet?, comprendiendo que estoy liberando el puerto en el router, ahi mi otra pregunta, cual podría ser el puerto para abrir, el 80, 8080 u otro. Lo que busco es poder controlar desde mi iPhone en la oficina mi casa.

    gracias por la respuesta.

    • Hola Cesar, La configuracion que pides no afecta a tu ARduino sino a tu router y para ello debes programarle un port forwarding. EL tema es demasiado amplio para entrar aqui en detalles pero la idea basica es decirle a tu router que cuando alguien llegue desde le exterior a tu direccion publica buscando el puerto 80, debes redirigirlo a la IP interna 192.168.1.xx de tu arduino.
      El router hara el forwarding de forma transparente para tu arduino y alguno permiten ademas cambiar el puerto de destino, es decir que lo que entra por el puerto 4215 por decir algo haga el forwarding a la direccion interna deseada y el puerto interno que te convenga que es donde has definido el servidor web en arduino

    • JUAN SANCHEZ CARRION

    Hola Admin y a todos los que andais por aquí, llevo poco tiempo en este mundo de arduino pero a trancas y barrancas he conseguido manejar a nivel local 8 relés con el arduino uno y la tarjeta ethernet pudiendolos activar y desactivar a través del teléfono.
    El problema surge cuando quiero usar DNS del tipo xxxxxx.dyndns.org:3450, DNS definida en el router y puerto 3450 abierto también.
    Les agradecería donde puedo estudiar las instrucciones que debo agregar en el codigo.
    Saludos

    • Hola Juan

      No estoy muy seguro de entender tu pregunta

    • Andres Donoso

    Me sumo a los agradecimientos por el tutorial, estoy decidido a entrar en el mundo arduimo, me recomendaron que por simpleza comience con el arduino Leonardo, dos preguntas:
    me recomiendas comenzar con el arduino leonardo?
    en el tutorial utilizas el arduino uno, puedo reemplazarlo por el leonardo? tiene alguna diferencia el tutorial?

    gracias.

    • Hola Andrés, si no has usado nunca Arduino yo te recomiendo usar el Uno. aunque es más potente que el Uno, el leonardo tiene algunas particularidades.

      Podrías hacer el tutorial con el Leonardo, pero en algunas sesiones, como las respectivas al I2C, tendrías que cambiar un poco el montaje.

      Un saludo.

  • en primer lugar t doy las gracias por estos tutoriales q estan haciendo q m vuelva el interes por la programacion y la electronica, tengo un problema con mi shield de ethernet, no m hace nada si lo conecto al ruter, despues d mucho trastear m di cuenta q si conecto el shiel directamente desde el cable del modem m funciona, hay alguna forma de configurar el ruter para q lo reconozca?, ya q asi no puedo ver si los programas q usan la red local m van y he intentado los de internet pero m quedan muy muy grandes

    • Hola Antonio,

      Yo conecto mi ethernet sheld directamente al router y toda va genial. Si tienes un cable modem deberia ser igual que conectes tu ethernet al cable modem o al router y si no es asi hay algo raro

    • Pablo

    Hola,

    Antes de nada agradecerte estos post tan bien explicativos que tienes el gusto de compartir con todos.

    Me gustaría saber si hay alguna forma de saber si la tarjeta ethernet funciona correctamente. Te cuento, he probado a instalar el ejemplo de la biblioteca WebServer y al abrir el puerto serial me indica lo siguiente:

    Server is at 0.0.0.0

    Tras esto me aparecen varios mensajes uno tras otro que ponen:

    new client
    client dissconect
    new client
    client dissconect
    ….

    He probado tanto con un arduino UNO como con un arduino MEGA y en dos redes diferentes. Siempre pone lo mismo.

    ¿Sabes a que puede ser debido?

    P.D.: Lo curiosos es que si realizo un ping a la dirección que pongo en el programa (en mi caso 192.168.1.30) si me da respuesta cuando lo conecto y no da respuesta cuando lo desconecto.

    Muchas gracias!

    • Hola Pablo, si el ping te responde es que la comunicacion es buena. Prueba ahora el servidor web en esa direccion y me cuentas que pasa ¿Vale?

      No se el mensaje que te saca a que se debe pero aparenteme paraece mas algun error a la hora de solicitar la direccion interna o imprimirla

  • Buenas,
    Lo primero agradecer esta genial pagina con la que estoy aprendiendo un monton.
    El problema que tengo es que pincho el shield al arduino, lo conecto y le meto el cable de red, pero en el shield el unico led que se enciende es uno rojo que pone “pwr”. Intento cargarle el programa y me da error, pruebo a quitar la shield y el programa se carga correctamente por lo que entiendo que el arduino está bien. ¿Estoy haciendo algo mal, o mi shield está dañada?

    Muchas gracias

    • Hola Unai, el shield no debería impedirte cargar programas, y si lo hace es mala señal

  • Hola , es posible que la tarjeta sólo use la ip que yo le asigno, sin necesidad de buscar por dhcp? Pienso que para ello tendría que quitar la línea donde dice Ethernet.begin(ma )==0 y solo dejarle donde dice ethernet.begin(mac,ip) creó yo que con eso ya no buscaría por dhcp.

  • si esque, el lugar donde estoy realizando el proyecto tiene su red por proxy y pues hoy en la mañana pude tener conexion a mi servidor local con la tarjeta y poder enviar email, sin embargo en menos de una hora me aparecio el mensaje de que la direccion ip estaba bloqueada por un cierto tiempo, ese menaje aparece en mi lap cuando no ingreso en la configuracion del proxy la ip a la cual me quiero conectar, porque aunque esas ip’s estan dentro del rango de la red y del proxy aparecen bloqueadas y se deben de agregar en la configuracion del proxy en los navegadores, y eso mismo debo hacer pero en el codigo de arduino. gracias por tu respuesta

    • Hola Victor, en una ojeada rapida por inernet no he visto nada que resuelva la conexion a traves de un proxy con Arduino, por lo que lo unico que se me ocurre es que hables con los administradores de la red para que te hagan una excepcion directa a traves de los firewalls, aunque ya comprendo que esto es como pedir al papa que te conceda una bula

Give a Reply

WordPress Anti-Spam by WP-SpamShield