El mundo de la electrónica y la programación de microcontroladores ha abierto puertas a proyectos cada vez más ambiciosos, y la capacidad de conectar nuestros dispositivos a internet es uno de los avances más significativos. En este contexto, el Arduino, una plataforma de desarrollo de hardware y software de código abierto, se ha convertido en una herramienta popular para entusiastas y profesionales por igual. Al combinar un Arduino con un Ethernet Shield W5100, es posible transformar un simple microcontrolador en un servidor web funcional, accesible tanto dentro de una red local como desde cualquier punto de internet. Este artículo explora en detalle cómo configurar y utilizar un Arduino como servidor web, aprovechando las capacidades del chip Wiznet W5100.
El Ethernet Shield W5100: La Puerta de Entrada a la Red
El Ethernet Shield W5100 es un módulo que se conecta a la placa Arduino, dotándola de la capacidad de conectarse a redes a través de un cable Ethernet estándar RJ45. Este shield está construido alrededor del chip Wiznet W5100, un componente clave que facilita la comunicación en red. El W5100 es compatible con los protocolos de transporte de datos TCP y UDP, y lo que es crucial para un servidor web, puede manejar hasta cuatro conexiones simultáneas de sockets. Esto significa que el Arduino puede, en teoría, atender a múltiples peticiones de clientes al mismo tiempo.

La instalación física del shield es sencilla: se coloca directamente sobre los conectores hembra del Arduino, permitiendo además apilar otros shields adicionales si fuera necesario para expandir la funcionalidad del sistema. Para interactuar con el Ethernet Shield desde el Arduino, se utiliza una librería específica, comúnmente incluida en el Entorno de Desarrollo Integrado (IDE) del fabricante.
Características Destacadas del Ethernet Shield
Además de su funcionalidad principal de conexión a red, el Ethernet Shield W5100 presenta otras características útiles:
- Conector Ethernet RJ45: Para la conexión física a un router o a una tarjeta de red de un PC.
- Slot para Tarjeta Micro SD: Permite almacenar datos de forma local, lo cual puede ser útil para registrar logs, configuraciones o incluso servir contenido web estático directamente desde la tarjeta.
- Indicadores LED: Varios LEDs en la placa proporcionan información visual sobre el estado de la alimentación (ON o PWR), la presencia de un enlace de red (LINK) y la actividad de transmisión/recepción de datos. Un LED adicional (100M) puede indicar la velocidad de conexión de 100 Mb/s.
Configuración de Red: Direcciones MAC e IP
Para que cualquier dispositivo pueda comunicarse dentro de una red, necesita identificadores únicos. En el caso del Ethernet Shield, estos son la dirección MAC y la dirección IP.
Dirección MAC: La Identidad Única del Dispositivo
La dirección MAC (Media Access Control), también conocida como dirección física, es un código de 6 bytes (48 bits) que se asigna de forma única a cada dispositivo de red en su fabricación. Es esencialmente la "huella digital" del hardware de red. Para el Ethernet Shield, es necesario asignar una dirección MAC única y global si se desea que sea accesible en la red. Si bien el shield viene con una dirección MAC por defecto incluida en el programa, es posible obtener direcciones MAC adicionales programáticamente o, en algunos casos, se recomienda obtener algunas de un PC con Windows.
Para obtener información de red de un PC con Windows, se puede acceder a la línea de comandos (cmd) y ejecutar ipconfig. Los datos resaltados en amarillo en la salida de este comando pueden ser útiles.
Dirección IP: La Ubicación del Dispositivo en la Red
La dirección IP (Internet Protocol) es un código numérico de 4 bytes (32 bits) que identifica a un dispositivo dentro de una red. A diferencia de la MAC, la dirección IP no es intrínsecamente única al dispositivo, sino que se asigna dentro del contexto de una red específica.
Asignación de Dirección IP: Estática vs. Dinámica
Existen dos métodos principales para asignar una dirección IP a un dispositivo:
- Dirección IP Estática: En este método, se configura manualmente la dirección IP, la máscara de subred y la puerta de enlace en el dispositivo. La ventaja principal es que el dispositivo siempre tendrá la misma dirección IP, lo que facilita su localización dentro de la red. Para este proyecto, se prefiere la asignación estática para asegurar que el servidor web Arduino sea predeciblemente accesible.
- Dirección IP Dinámica (DHCP): Un servidor DHCP (Dynamic Host Configuration Protocol), generalmente integrado en el router, se encarga de asignar automáticamente una dirección IP y otros parámetros de red a los dispositivos que se conectan. Si bien esto simplifica la configuración inicial, la dirección IP asignada puede cambiar cada vez que el dispositivo se reinicia o el router se actualiza, lo que puede ser un inconveniente para un servidor.
Configuración de la Dirección IP para el Arduino
Para el Arduino con Ethernet Shield, es necesario asignar una dirección IP que esté dentro del rango de la red local. Un formato común para redes domésticas es 192.168.x.x. La dirección IP asignada debe estar disponible en la red local, es decir, no debe estar siendo utilizada por otro dispositivo.
Para evitar conflictos con las direcciones asignadas por DHCP, es recomendable utilizar direcciones IP que se encuentren fuera del rango que el router asigna dinámicamente. Generalmente, los routers aplican DHCP a la mitad superior de las direcciones posibles de la red (por ejemplo, de 192.168.1.128 a 192.168.1.254). Por lo tanto, asignar una dirección IP a un Arduino con un número inferior a 128 (como 192.168.1.14) suele ser una práctica segura.

Para asegurarse al 100% de que la dirección IP no cambiará, se puede acceder a la configuración del router (escribiendo la dirección de la puerta de enlace, que suele ser la IP del router, en un navegador web). Dentro del menú del router, se debe buscar la configuración DHCP, identificar los rangos de direcciones que utiliza y, preferiblemente, vincular la dirección MAC del Ethernet Shield a una dirección IP específica. Esto garantiza que el router siempre asigne la misma IP al shield cada vez que se conecta.
La Puerta de Enlace
La puerta de enlace (gateway) es simplemente la dirección IP del router. Es el punto de salida de la red local hacia otras redes, incluida Internet.
El Modelo Cliente-Servidor en la Web
La comunicación en la World Wide Web se basa fundamentalmente en el modelo cliente-servidor. En este paradigma:
- El Servidor: Es un dispositivo o programa que está a la espera de peticiones de otros dispositivos. En el contexto de la web, un servidor web utiliza el protocolo HTTP para enviar páginas web y otros contenidos a los clientes que los solicitan.
- El Cliente: Es un dispositivo o programa que inicia la comunicación enviando una solicitud al servidor. En nuestro caso, el navegador web de un ordenador, tablet o smartphone actuará como cliente, mientras que el Arduino con el Ethernet Shield será el servidor.
Cuando escribes una dirección web en tu navegador, tu dispositivo actúa como cliente, enviando una solicitud HTTP al servidor web correspondiente. El servidor procesa esta solicitud y responde enviando los datos (como el código HTML de la página) de vuelta al cliente, que luego los muestra.
Modelo Cliente Servidor, Explicación Simple
Implementando el Servidor Web con Arduino y Ethernet Shield
El objetivo principal es configurar el Arduino para que actúe como un servidor web. Esto implica escribir un programa (sketch) que utilice las librerías adecuadas para gestionar la comunicación de red.
Librerías Esenciales: SPI y Ethernet
Para que el Arduino pueda comunicarse con el Ethernet Shield, se deben incluir dos librerías fundamentales en el sketch:
SPI.h: La comunicación entre el Arduino y el chip W5100 se realiza a través del bus SPI (Serial Peripheral Interface). Este bus utiliza pines digitales específicos: en un Arduino UNO, son los pines 11, 12 y 13; en un Arduino MEGA, son los pines 50, 51 y 52. El pin 53 en el MEGA se corresponde con la señal SS (Slave Select) del puerto SPI.Ethernet.h: Esta librería proporciona las funciones necesarias para inicializar y gestionar la conexión Ethernet, crear un servidor y manejar las solicitudes de los clientes.
Clases Clave de la Librería Ethernet
La librería Ethernet.h incluye varias clases importantes para la creación de servidores web:
Ethernet: Es una clase estática que se utiliza para inicializar la librería, configurar los parámetros de red (MAC e IP) y gestionar la conexión. Al ser estática, no se necesita crear una instancia u objeto de la clase; se llama directamente a sus funciones, comoEthernet.begin(mac, ip)oEthernet.init(pin). La funciónEthernet.init()permite configurar explícitamente el pin que se utilizará como chip select (CS) para el módulo Ethernet.EthernetServer: A diferencia deEthernet,EthernetServerno es una clase estática. Se utiliza para crear un objeto servidor que escuchará en un puerto específico (por defecto, el puerto 80 para HTTP) y aceptará conexiones de clientes. Una vez que un cliente se conecta, se pueden recibir datos (client.read()) y enviar respuestas (client.print(),client.println()) de manera similar a como se haría con la comunicación serial (Serial).
Estructura Básica del Sketch para un Servidor Web
Un sketch típico para un servidor web con Arduino y Ethernet Shield seguirá una estructura similar a esta:
- Inclusión de Librerías:
c++#include <SPI.h>#include <Ethernet.h> - Definición de Parámetros de Red:
- Asignar una dirección MAC única al array
mac[]. - Asignar una dirección IP estática al array
ip[].c++byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Ejemplo de dirección MACIPAddress ip(192, 168, 1, 178); // Ejemplo de dirección IP local
- Asignar una dirección MAC única al array
- Creación de la Instancia del Servidor:Se crea un objeto
EthernetServerque escucha en el puerto deseado (generalmente 80).c++EthernetServer server(80); // El servidor escuchará en el puerto 80 - Función
setup():- Inicializar la comunicación serial para depuración (
Serial.begin(9600)). - Inicializar el shield Ethernet con la MAC y la IP asignadas (
Ethernet.begin(mac, ip)). - Verificar que el hardware Ethernet está presente y que el cable de red está conectado.
- Iniciar el servidor web (
server.begin()). - Imprimir la dirección IP local asignada en el monitor serial para facilitar el acceso.
- Inicializar la comunicación serial para depuración (
- Función
loop():- Estar constantemente a la espera de clientes conectados (
EthernetClient client = server.available();). - Si un cliente se conecta (
if (client)):- Leer la solicitud HTTP del cliente. Una solicitud HTTP suele terminar con una línea en blanco (dos caracteres de fin de línea consecutivos
\n). - Una vez recibida la solicitud completa, enviar una respuesta HTTP al cliente. Esto incluye la cabecera HTTP (ej.
HTTP/1.1 200 OK,Content-Type: text/html) y el contenido de la página web (código HTML). - Es importante cerrar la conexión con el cliente una vez enviada la respuesta (
client.stop()).
- Leer la solicitud HTTP del cliente. Una solicitud HTTP suele terminar con una línea en blanco (dos caracteres de fin de línea consecutivos
- Estar constantemente a la espera de clientes conectados (
Ejemplo de Respuesta HTML Sencilla
La respuesta enviada al cliente puede ser código HTML. Por ejemplo, para mostrar los valores de los pines de entrada analógica:
client.println("HTTP/1.1 200 OK");client.println("Content-Type: text/html");client.println("Connection: close");client.println("Refresh: 5"); // Refresca la página cada 5 segundosclient.println();client.println("<!DOCTYPE HTML>");client.println("<html>");for (int analogChannel = 0; analogChannel < 6; analogChannel++) { int sensorReading = analogRead(analogChannel); client.print("I0."); client.print(analogChannel + 7); // Ajuste de índice si es necesario client.print(": "); client.print(sensorReading); client.println("<br />");}client.println("</html>");Este código lee los valores de los primeros 6 pines analógicos (A0-A5) y los muestra en una página web. La directiva Refresh: 5 hace que el navegador actualice la página automáticamente cada 5 segundos, permitiendo ver lecturas en tiempo real.
Acceso al Servidor Web
Acceso Local (LAN)
Para acceder al servidor web desde la misma red local (LAN) en la que está conectado el router, simplemente abre un navegador web en un ordenador, tablet o smartphone conectado a esa misma red. En la barra de direcciones, escribe la dirección IP estática que asignaste al Arduino (por ejemplo, 192.168.1.178). Deberías ver la página web generada por el sketch del Arduino.
Una red de área local (LAN) es una red de dispositivos que abarca un área reducida, como una casa o un edificio, típicamente integrada por dispositivos conectados por WiFi o Ethernet a un dispositivo central, usualmente un router. Todos los dispositivos en la LAN pueden interactuar entre sí sin necesidad de conexión a internet.
Acceso Global (Internet)
Para acceder al servidor web desde cualquier red externa (es decir, desde fuera de tu red local), se deben seguir pasos adicionales para exponer tu servidor local a Internet. Esto implica configurar el router para permitir el acceso externo.
Conocer la IP Pública: Primero, necesitas saber la dirección IP pública de tu router. Esta es la dirección IP que tu proveedor de servicios de Internet (ISP) te ha asignado y es la que te identifica en Internet. Puedes encontrarla buscando "cuál es mi IP" en Google desde un dispositivo conectado a tu red local, o a través de herramientas específicas.
Configurar el "Port Forwarding" (Reenvío de Puertos): Este es el paso crucial. Debes acceder a la configuración de tu router (usualmente escribiendo su dirección IP, la puerta de enlace, en el navegador) y buscar la opción de "Port Forwarding" o "Reenvío de Puertos". Aquí, debes configurar una regla para que el tráfico que llegue a un puerto específico de tu IP pública sea redirigido a la dirección IP local de tu Arduino y al puerto en el que está escuchando el servidor web (generalmente el puerto 80 para HTTP).
- Puerto de Origen: El puerto a través del cual se accederá desde Internet (generalmente el puerto 80).
- Protocolo: Selecciona TCP, ya que HTTP utiliza este protocolo. En algunos casos, se puede especificar TCP/UDP.
- IP de Destino: La dirección IP local de tu Arduino (ej.
192.168.1.178). - Puerto de Destino: El puerto en el que el servidor Arduino está escuchando (ej. 80).
Una vez configurado el reenvío de puertos, podrás acceder a tu servidor Arduino desde cualquier lugar escribiendo
http://TU_IP_PUBLICAen un navegador web.Es importante notar que algunos ISPs bloquean el tráfico entrante en el puerto 80, o las direcciones IP públicas pueden cambiar dinámicamente si no tienes una IP estática contratada. En estos casos, se pueden usar servicios de DNS dinámico (DDNS) o puertos alternativos para el acceso externo.
Consideraciones Adicionales y Proyectos Avanzados
Alimentación del Sistema
Una vez que el programa (sketch) ha sido cargado en el Arduino a través del cable USB, es recomendable desconectar el sistema del PC y alimentarlo con una fuente externa. Esto asegura que el Arduino y el Ethernet Shield funcionen de forma autónoma. Opciones comunes incluyen baterías (como una batería de Litio-ion de 12V/3000mAh) o adaptadores de corriente.
Es una buena práctica reiniciar tanto el Arduino como el Ethernet Shield (utilizando los botones de reset disponibles) una vez que todo esté conectado y alimentado.
Ampliando la Funcionalidad
El servidor web de Arduino no se limita a mostrar lecturas de sensores o controlar LEDs. Las posibilidades son casi infinitas:
- Domótica: Controlar luces, electrodomésticos, sistemas de riego, o monitorear la temperatura y humedad de una habitación.
- Sistemas de Monitoreo: Crear dashboards para visualizar datos de múltiples sensores en tiempo real.
- Interfaces Web Mejoradas: Para crear interfaces de usuario más atractivas y dinámicas, se pueden integrar tecnologías web modernas como JavaScript (incluyendo librerías como jQuery, que pueden ser enlazadas desde servidores CDN o incluso servidas desde la tarjeta SD del shield). Esto permite crear servidores web estéticamente agradables y funcionales que van más allá del HTML plano y el aspecto "Old School".
- Integración con Otros Dispositivos: Un Arduino con Ethernet Shield puede actuar como un nodo en una red de dispositivos IoT (Internet de las Cosas), comunicándose con otros microcontroladores, Raspberry Pi, o servicios en la nube.
Uso de Tarjeta SD
El slot para tarjeta micro SD en el Ethernet Shield abre la puerta a servir páginas web completas y archivos estáticos directamente desde el shield. Esto es particularmente útil si el sketch del Arduino se vuelve muy complejo o si se desea servir contenido multimedia. La librería SD.h del Arduino se utiliza para interactuar con la tarjeta SD.
Limitaciones de Memoria
Es importante recordar que los microcontroladores como el Arduino UNO tienen una memoria RAM y Flash limitada. Esto significa que los sketches deben ser optimizados y las páginas web servidas no deben ser excesivamente complejas si se espera un buen rendimiento. Para proyectos que requieren más recursos, se pueden considerar placas Arduino con más memoria (como el Arduino MEGA) o microcontroladores más potentes.
La implementación de un servidor web con Arduino y Ethernet Shield es un proyecto fascinante que combina hardware, redes y desarrollo web. Permite a los usuarios crear sistemas interactivos y controlables a distancia, abriendo un mundo de posibilidades para la automatización y la creación de proyectos personalizados.