El Shield Ethernet

Objetivos

<  

  • Montar el Shield Ethernet.
  • Conectarlo a nuestra LAN.
  • Configurar los valores por DHCP.
  • Configurar los valores manualmente[/three-fourth] [clear/]
  •  

    Material requerido.

     

    <

    Imagen de Arduino UNO  Arduino Uno o similar.
    Vista principal Shield Eternet
    Cables Dupont Macho-Hembra Cables Dupont Macho-Hembra
    Cables Dupont Macho-Hembra Cables Dupont Macho-Hembra
    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:

    ¡Accede al contenido!

    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.
  •  

    Deja una respuesta