Arduino Ethernet Shield


En este último tutorial, conectaremos nuestro Arduino a una red Ethernet, usaremos un Arduino Ethernet Shield (escudo) práctico y fácil de usar. De esta sencilla forma, podremos acceder a contenidos web como cliente, usar Arduino como servidor web para mostrar datos de sensores e infinidad de cosas que se os puedan ocurrir.

Haremos un sencillo ejemplo para familiarizarnos con la shield Ethernet. El objetivo será crear un servidor web en nuestro Arduino para mostrar datos con los que trabaja Arduino, en este caso veremos el tiempo que a trascurrido desde que se puso en marcha el microcontrolador.

Un servidor web no es más que un dispositivo que atiende peticiones de otro dispositivo cliente a través de una dirección IP, es decir, si nosotros accedemos a la IP de Arduino (proporcionada por la Ethernet Shield) mediante un navegador, estaremos solicitando una información, Arduino como servidor, nos servirá la información solicitada.

ethernet arduino 5

Material necesario

Solo necesitaremos nuestro Arduino (nosotros usaremos Arduino Mega el cual puedes adquirir en comprar Arduino Mega), una tarjeta Ardunio Ethernet Shield (Comprar Ardunio Ethernet Shield), un cable Ethernet y el cable de porgamación USB.

arduino ethernet shield
Arduino Ethernet Shield.

ethernet arduino 7
Cable Ethernet.

ethernet arduino 8
Arduino Mega.

Código Arduino Ethernet Shield

#include <SPI.h> #include <Ethernet.h>   // Configuración de direccion MAC e IP. byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192,168,1,177);   // Inicia la libreria Ethernet server con el puerto 80 (por defecto el puerto HTTP). EthernetServer server(80);   void setup() { // Inicia el puerto serie. Serial.begin(9600);   // Inicia la conexión Ethernet y el servidor. Ethernet.begin(mac, ip); server.begin(); Serial.print("IP local del servidor "); Serial.println(Ethernet.localIP()); }   void loop() { EthernetClient client = server.available(); // Escucha a los clientes entrantes.     if (client) { // Si un cliente se conecta al servidor:     Serial.println("Nuevo cliente");     boolean currentLineIsBlank = true; // Marcador para enviar la respuesta desde el servidor.         while (client.connected()) { // Repite mientas existe clientes conectados:             if (client.available()) {             char c = client.read();             Serial.write(c); // Imprime por el puerto serie la petición del cliente (caracter a caracter)                 if (c == '\n' && currentLineIsBlank) { // Se envia la respuesta a una petición de un cliente cuando a finalizado la petición:                 // Respuesta:                 client.println("HTTP/1.1 200 OK"); // Enviar un encabezado de respuesta HTTP estándar                 client.println("Content-Type: text/html");                 client.println("Connection: close"); // Se cerrará la conexiós despues de enviar la respuesta.                 client.println("Refresh: 5"); // Refrescar automáticamente la página después de 5 segundos.                 client.println();                 client.println("<!DOCTYPE HTML>"); // Tipo de documento.                 client.println("<html>"); // Etiqueta html inicio del documento.                  client.print("Hola soy Arduino!! - ");                 client.print(millis()); // Tiempo de funcionamiento en ms.                 client.print("ms encendido. ");                 client.println("<br />"); // Etiqueta html salto de linea.                  client.println("</html>"); // Etiqueta html fin del documento.                 break;                 }                 if (c == '\n') { // Si el caracter es un salto de linea:                 currentLineIsBlank = true; // La petición a terminado, se respondera a dicha peticón en el sigueitne ciclo.                 }                  else if (c != '\r') { // Si el caracter no es un retorno de carro (la petición no a terminado).                 currentLineIsBlank = false; // Seguimos escuchando la petición.                 }            }        }     delay(1); // Espera para dar tiempo al navegador a recivir los datos.     client.stop(); // Cierra la conexión.     Serial.println("Cliente desconectado");     Serial.println();     } }

Aunque en el código existen comentarios de las partes más importantes, hay que tener en cuenta algunas cuestiones:

  • byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
    Es la configuración del identificador único MAC del adaptador de red (Arduino Ethernet Shield), este debe ser único en la red. Aseguraos de que no existe otro dispositivo con esta misma dirección.
  • IPAddress ip(192,168,1,177);
    Es la IP que Arduino tomará como servidor a la cual tendremos que acceder para ver los datos. Debe estar dentro del rango de red para poder ser visible. Intenta usar una IP lo más cercana posible a la IP del PC con el que trabajáis.
  • #include <Ethernet.h>
    Librería para usar la shield Ethernet (incluida en la IDE de Arduino).

Este código imprime información a través de dos medios. Una a través del puerto serie y otra como servidor a través del navegador. Por esto, cuando existe un cliente solicitando información, primero imprime (carácter a carácter) la información que el cliente solicita a través del puerto serie y luego atiende la petición imprimiendo los datos en el navegador.

ethernet arduino 9
Conectaremos la Shield sobre Arduino.

ethernet arduino 11
Y conectaremos el cable USB y Ethernet.

ethernet arduino 1
Una vez cargado el código en Arduino, si todo esta correcto, debe aparecer la IP del servidor en el monitor serie.

ethernet arduino 2
Accederemos mediante un navegador a la IP del ahora servidor web Arduino.

ethernet arduino 3
Si todo está correcto, aparecerá un mensaje como el de la foto, junto al tiempo trascurrido desde que se encendió Arduino en milisegundo. Esta información se refrescará cada 5 segundos.

ethernet arduino 4
En el puerto serie podremos ver las peticiones del cliente. El simple hecho de acceder a la dirección IP de Arduino ya es una petición.

sello garantizado


7 comentarios en «Arduino Ethernet Shield»

    • Para PC se debe realizar de la siguiente manera:
      En tu PC se debe configurar la IP manualmente, la cual debe pertenecer a la misma red de la dirección IP de arduino. En el ejemplo, la IP de arduino es 192.168.1.177, al no especificar mascara de red se asume 255.255.255.0 por lo tanto tu PC debiera tener un IP desde 192.168.1.1 hasta 192.168.1.254, exceptuando la dirección IP utilizada en el arduino y la mascara de red 255.255.255.0 la cual es asignada automáticamente por el PC.
      Yo acabo de realizar el ejemplo y no tuve ningún problema.
      Saludos

      Responder
      • Me falto decir que es importante el cable de red.
        Si conectas el arduino al pc directamente con el cable de red, debe ser con un cable de red cruzado. Si el pc va a un switch ( o router) y el arduino al switch (o router) se puede utilizar el cable de red normal.

        Responder
  1. Hola!
    Acabo de adquirir mi arduino uno con su ethernet shield hace cerca de una semana y pues estuve entendiendo uno por uno los programas de ejemplos (Los basicos y los de ethernet), y se me presento este problema cuando probe el ejemplo de servidor web en el cual no puedo acceder a la ip del server mediante el navegador (El programa corre perfectamente, verifique la ip del router que es 192.168.1.1 la mascara 255.255.255.0, no me detecta ping al server con el cual use 192.168.1.177)

    Responder
  2. Hola,
    un artículo interesante.

    Yo estoy en el caso contrario al que explicas, estoy usando arduino como «cliente» y una raspberry como «servidor».
    Tengo conectados varios sensores al arduino, uno de ellos recoge datos de temperatura y humedad.
    Me veo que si envío más de un dato por GET, el código no funciona bien.

    «client.print(«GET /testArduino2.php?tipo=»);»

    He probado con varios «client.print», añadiendo detrás de «tipo=» un & y las siguientes variables pero no me funciona bien.

    Podrías decirme cómo enviar más de una variable?

    Muchísimas Gracias.

    Responder

Deja un comentario