El Ethernet Shield W5100 es un dispositivo que nos permite conectar nuestro Arduino a internet. Esto se logra a través de un puerto Ethernet de un router WiFi. Con este dispositivo, nuestro Arduino puede funcionar como un servidor web.
El servidor web puede ser accesible solamente desde la red WiFi en la que está conectado el router (llamado servidor web local) o puede ser accesible desde cualquier red externa (llamado servidor web global). De esta manera, podemos interactuar con él, tanto enviando como recibiendo datos.
El Ethernet Shield W5100 está basado en el chip Ethernet Wiznet W5100, que es el que permite esta conexión a internet. Este chip soporta los protocolos de transporte de datos TCP y UDP, y permite hasta cuatro conexiones simultáneas de sockets. Esto hace que el Ethernet Shield W5100 sea muy versátil como servidor web.
Para poder utilizar el Ethernet Shield junto con nuestro Arduino, es necesario trabajar con la librería que viene incluida por defecto en cualquiera de los IDE existentes en la página web del fabricante. De esta manera, podemos controlar el Ethernet Shield y utilizarlo para conectar nuestro Arduino a internet.
El Ethernet Shield es un dispositivo que se conecta a nuestro Arduino para permitirle acceder a internet. Este shield cuenta con conectores hembra que permiten conectar otros shields apilados sobre nuestro Arduino. Sin embargo, es importante tener en cuenta que los pines digitales 10, 11, 12, y 13 no pueden ser utilizados como entradas/salidas genéricas, ya que son utilizados por la comunicación SPI entre el Arduino y el Ethernet Shield W5100.
El Ethernet Shield también cuenta con un conector Ethernet estándar RJ45 para conectarse a un puerto Ethernet de un router o a una tarjeta Ethernet de un PC. Además, incluye un jumper soldado marcado como «INT» que puede ser conectado para permitir a nuestro Arduino recibir notificaciones de eventos por interrupción desde el W5100.
Otra característica del Ethernet Shield es su slot SD, que permite guardar información en una tarjeta micro SD. Por último, también tiene un botón de reset que es capaz de reiniciar todo el conjunto, incluido nuestro Arduino.
El Ethernet Shield cuenta con una serie de LEDS que informan al usuario sobre el estado y funcionamiento del sistema. Estos LEDS incluyen:
-
- PWR: que indica que el Arduino y el Ethernet Shield están recibiendo energía
- LINK: que indica la presencia de una conexión de red y parpadea cuando el Ethernet Shield envía o recibe datos
- 100M: que indica la presencia de una conexión de red de 100 Mb/s
- FULLD: que indica que la conexión de red es full dúplex
- COLL: que parpadea cuando se detectan colisiones en la red
- RX: que parpadea cuando el Ethernet Shield recibe datos
- TX: que parpadea cuando el Ethernet Shield envía datos
Para configurar el servidor web de manera correcta, es necesario asignar una dirección MAC única e global a cada dispositivo conectado a la red local. Esta dirección MAC puede ser obtenida de manera programática, y no es necesario modificar la dirección MAC incluida por defecto en el programa.Además, para asignar una dirección MAC al Ethernet Shield, es necesario obtener unas cuantas direcciones más desde un PC con Windows. Esto se puede hacer accediendo a Inicio -> Ejecutar -> cmd -> ipconfig.
Al hacer esto, se obtendrá un resultado en pantalla.
De los datos obtenidos a través de Inicio -> Ejecutar -> cmd -> ipconfig, nos interesan los datos resaltados en amarillo. Para configurar el Ethernet Shield, es necesario abrir el programa y modificar las siguientes líneas de código:
- IPAddress ip (192,168,1,14): Es necesario asignar una dirección IP al Ethernet Shield para que sea reconocido dentro de la red local. Esta dirección IP debe ser del estilo 192.168.XX, donde XX es un número comprendido entre 1 y 254. La dirección IP asignada al Ethernet Shield debe estar disponible en la red local. En este ejemplo, se ha utilizado la dirección IP 14.
- IPAddress gateway (192, 168, 1, 1): Debe coincidir exactamente con la dirección de la puerta de enlace predeterminada de la LAN inalámbrica.
- IPAddress subnet (255, 255, 255, 0): Debe coincidir exactamente con la dirección de la máscara de subred de la LAN inalámbrica.
Estas modificaciones permiten configurar correctamente el Ethernet Shield y asegurar que sea reconocido en la red local.
Para comprobar si la dirección IP que le asignamos al Ethernet Shield está libre, tenemos que hacer un ping desde el “cmd” de Windows a esa dirección, en mi caso a la dirección 192.168.1.14, y si nos devuelve “Host de destino inaccesible” significa que podemos utilizar esa dirección para la IP del Ethernet Shield puesto que está libre.
Para asegurarse de que la dirección IP asignada al Ethernet Shield no sea ocupada por otro dispositivo en el futuro, es necesario cerciorarse de que la dirección IP no pertenece a las direcciones que tienen DHCP (un protocolo de red que permite a los clientes de una red IP obtener sus parámetros de configuración automáticamente). Por norma general, el DHCP se aplica a la mitad de las direcciones posibles de la red, es decir, de la dirección 192.168.1.128 a la 192.168.1.254. Por lo tanto, si se utilizan direcciones IP inferiores a 128, no debería haber problemas. Sin embargo, es recomendable utilizar direcciones IP cercanas a la dirección de la puerta de enlace predeterminada para evitar problemas.
Para asegurarse al 100% de que la dirección IP no cambiará, es posible acceder al router escribiendo en el navegador la dirección de la puerta de enlace predeterminada. Por ejemplo, en este caso es http://192.168.1.1. Sin embargo, se solicitará un usuario y una contraseña para acceder al router, que deberían haber sido proporcionados por el proveedor de internet (ISP) durante la instalación.
Una vez dentro del menú del router, es necesario buscar la configuración DHCP, comprobar los rangos de direcciones a los que afecta el DHCP y vincular las direcciones MAC e IP del Ethernet Shield, para que siempre que se conecte al router, se le asigne la misma dirección IP. Cada router es diferente, por lo que si no se encuentra la opción, se recomienda buscar información sobre el modelo de router en línea.
Para acceder al servidor web desde una red externa, es necesario conocer la IP pública del router. La forma de acceder a ella es a través de un puerto abierto previamente para la comunicación HTTP. En este caso, el puerto 80 es el utilizado por defecto.
Para abrir el puerto 80, es necesario acceder al router y buscar la opción «Port Forwarding». Aquí, se debe enlazar el puerto (con protocolos TCP y UDP) a la dirección IP del Ethernet Shield. En este ejemplo, la dirección IP es 192.168.1.14. Cada router es diferente, por lo que es importante investigar cómo abrir los puertos en el modelo específico.
Para utilizar el Ethernet Shield, primero se debe colocar sobre la placa Arduino y cargar el programa (sketch) a través del cable USB desde el PC. Luego, se debe desconectar el sistema del PC y alimentarlo con una fuente externa, como una batería de Litio-ion de 12V/3000mAh. Además, se debe conectar el Ethernet Shield a un router WIFI mediante un cable Ethernet estándar (CAT5 o CAT6 con conectores RJ45).
Es recomendable reiniciar tanto el Arduino como el Ethernet Shield mediante el botón de reset una vez que todo esté instalado. Para conocer la IP pública y verificar si el puerto 80 (HTTP) está abierto, se puede seguir un enlace específico. Sin embargo, es importante tener en cuenta que, a menos que se tenga una IP fija, la IP pública puede cambiar cada vez que se reinicia el router o incluso en algunos casos, la compañía la cambia periódicamente (IP dinámica).
El Ethernet Shield nos permite conectar nuestro Arduino a Internet y controlar un LED o cualquier otro elemento electrónico desde cualquier lugar, ya sea desde una red local o externa. Para hacer esto, creamos un servidor web en el Ethernet Shield, que proporcionará el código HTML para ser visualizado en un navegador y permitirnos interactuar con él. Es necesario tener conocimientos básicos de HTML para personalizar la página web.
Un servidor es un dispositivo remoto que provee información a los dispositivos que se conecten a él. En la web, un servidor es un dispositivo que usa el protocolo HTTP para enviar páginas web al dispositivo de un usuario cuando éste las solicita. Con el Ethernet Shield, creamos un servidor web que puede ser accedido desde cualquier dispositivo conectado a Internet.
Para acceder al “Servidor WEB” desde la red local (red WIFI donde tenemos conectamos el Ethernet Shield), tenemos que acceder a la siguiente dirección WEB desde el navegador del PC por ejemplo, que coincide con la dirección IP que hemos asignado en un principio al Ethernet Shield.
Para acceder al “Servidor WEB” desde una red externa (red 4G de un Smartphone u otra red WIFI diferente por ejemplo) tenemos que acceder a la siguiente dirección WEB desde el navegador del Smartphone (ojo siempre que estemos conectados a la red 4G y no a la WIFI), que coincide con la dirección IP pública que tiene asignada nuestro router, seguida del puerto HTTP (80), separados por dos puntos.
http://mi_IP_pública:80
Lista de Materiales
-
- Arduino UNO Rev.3
- Cable USB tipo A-B
- Ethernet Shield W5100
- Cable Ethernet standard (CAT5 o CAT6 con conectores RJ45)
- LED 5mm (de cualquier color)
- Resistencia de 220Ω
- Batería de Litio-ion de 12V/3000mAh (DC 12300)
- Protoboard
- Cables de conexión
Código del programa
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
/* TITULO: Control de un LED desde un servidor WEB con el Ethernet Shield W5100. AUTOR: MARIANO DEL CAMPO GARCÍA (@2016) --> INGENIERO TÉCNICO INDUSTRIAL ESPECIALIDAD ELECTRÓNICA - FACEBOOK: https://www.facebook.com/mariano.delcampogarcia - TWITTER: https://twitter.com/MarianoCampoGa - CORREO: [email protected] DESCRIPCIÓN DEL PROGRAMA Con este programa vamos a controlar el encendido y apagado de un LED a través de internet, mediante el Servidor WEB creado con el Ethernet Shield que conectamos a Arduino, que tenemos comunicado con nuestro router WIFI. ESQUEMA DE CONEXION +-----+ +----[PWR]-------------------| USB |--+ | +-----+ | | GND/RST2 [ ][ ] | | MOSI2/SCK2 [ ][ ] A5/SCL[ ] | | 5V/MISO2 [ ][ ] A4/SDA[ ] | | AREF[ ] | | GND[ ] | | [ ]N/C SCK/13[ ] | | [ ]IOREF MISO/12[ ] | | [ ]RST MOSI/11[ ]~| | [ ]3V3 +---+ 10[ ]~| | [ ]5v -| A |- 9[ ]~| | [ ]GND -| R |- 8[ ] | LED(+) | [ ]GND -| D |- | | [ ]Vin -| U |- 7[ ] | | -| I |- 6[ ]~| | [ ]A0 -| N |- 5[ ]~| | [ ]A1 -| O |- 4[ ] | | [ ]A2 +---+ INT1/3[ ]~| | [ ]A3 INT0/2[ ] | | [ ]A4/SDA RST SCK MISO TX>1[ ] | | [ ]A5/SCL [ ] [ ] [ ] RX<0[ ] | | [ ] [ ] [ ] | | UNO_R3 GND MOSI 5V ____________/ \_______________________/ NOTAS: - Cátodo(-) del LED (pata más corta) a GND a través de una R=220 omhs. - Ethernet Shield colocada sobre Arduino UNO (Los pines coinciden al 100%). - Ethernet Shield conectada al router WIFI mediante cable Ethernet standard (conector RJ45) - Arduino UNO alimentado a través de una batería externa de Litio-ion de 12V/3000mAh (DC 12300) */ // Librerías #include <SPI.h> #include <Ethernet.h> // Declaración de la direcciones MAC,IP,GATEWAY y SUBNET. byte mac[]={0xDE,0xAD,0xBE,0xEF,0xFE,0xED}; // Dentro del cdm de Windows ponemos ipconfig y buscamos en adaptador de LAN inalámbrica IPAddress ip(192,168,1,14); // 192.168.1.XX donde XX es una dirección que no esté utilizada IPAddress gateway(192, 168, 1, 1); IPAddress subnet(255, 255, 255, 0); // Creamos un servidor Web con el puerto 80 que es el puerto HTTP por defecto EthernetServer server(80); int LED = 8; // Pin digital para el LED String estado = "OFF"; // Estado del LED inicialmente "OFF" void setup() { Serial.begin(9600); // Comienzo de la comunicación serie // Inicializamos la comunicación Ethernet y el servidor Ethernet.begin(mac, ip, gateway, subnet); server.begin(); Serial.print("La IP del servidor local es: "); Serial.println(Ethernet.localIP()); // Nos devuelve la IP del Ethernet Shield pinMode(LED,OUTPUT); // Pin digital 8 como salida } void loop() { EthernetClient client = server.available(); // Creamos un cliente Web // Cuando detecte un cliente a través de una petición HTTP if (client) { Serial.println(); // Salto de línea Serial.println("Nuevo cliente"); Serial.println(); boolean currentLineIsBlank = true; // Una petición HTTP acaba con una línea en blanco String cadena=""; // Creamos una cadena de caracteres vacía while (client.connected()) { if (client.available()) { char c = client.read();// Leemos la petición HTTP carácter por carácter Serial.write(c);// Visualizamos la petición HTTP por el Monitor Serial cadena.concat(c);// Unimos el String 'cadena' con la petición HTTP (c). // De esta manera convertimos la petición HTTP a un String // Ya que hemos convertido la petición HTTP a una cadena de caracteres, ahora podremos buscar partes del texto. int posicion=cadena.indexOf("LED="); // Guardamos la posición de la instancia "LED=" a la variable 'posicion' if(cadena.substring(posicion)=="LED=ON") // Si en la posición 'posicion' hay "LED=ON" { digitalWrite(LED,HIGH); estado="ON"; } if(cadena.substring(posicion)=="LED=OFF") // Si en la posición 'posicion' hay "LED=OFF" { digitalWrite(LED,LOW); estado="OFF"; } // Cuando reciba una línea en blanco, quiere decir que la petición HTTP ha acabado y el servidor Web está listo // para enviar una respuesta if (c == '\n' && currentLineIsBlank) { // Enviamos al cliente una respuesta HTTP client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); // Página web en formato HTML client.println("<html>"); client.println("<head>"); client.println("</head>"); client.println("<body style='background-color: #40E0D0;'>"); client.println("<br/><br/>"); client.println("<h1 align='center'>LED controlado por Servidor Web con Arduino</h1>"); // Creamos los botones. // Para enviar parámetros a través de HTML se utiliza el método URL encode. // Los parámetros se envían a través del símbolo '?' client.println("<div style='text-align:center;'>"); client.println("<button onClick=location.href='./?LED=ON\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:85px;'>"); client.println("ON"); client.println("</button>"); client.println("<button onClick=location.href='./?LED=OFF\' style='margin:auto;background-color: #84B1FF;color: snow;padding: 10px;border: 1px solid #3F7CFF;width:85px;'>"); client.println("OFF"); client.println("</button>"); client.println("<br/><br/>"); client.println("<b>ESTADO DEL LED = "); client.print(estado); client.println("</b><br/>"); client.println("</b></body>"); client.println("</html>"); break; } if (c == '\n') { currentLineIsBlank = true; } else if (c != '\r') { currentLineIsBlank = false; } } } // Dar tiempo al navegador para recibir los datos delay(1); client.stop();// Cierra la conexión } } |
Video
Conclusiones
En resumen, este post describe cómo controlar un LED a través de Internet utilizando un Ethernet Shield y una placa Arduino. Se explica cómo adaptar el Ethernet Shield a la placa Arduino y cargar el programa necesario. También se describen los pasos necesarios para acceder al servidor WEB desde una red local o externa, como la asignación de una dirección IP y la apertura de puertos. En general, se trata de una guía completa para crear un servidor WEB y controlar un dispositivo electrónico a través de Internet.
Gracias por leer este post. Esperamos que haya sido de ayuda para entender cómo controlar un LED a través de internet mediante un servidor web y el Ethernet Shield. Si tienes alguna duda o comentario, por favor compártelo con nosotros. Estaremos encantados de ayudarte y escuchar tus opiniones.