jueves, 17 de marzo de 2016

Control de un LED desde un servidor WEB con el Ethernet Shield W5100


El Ethernet Shield W5100 nos sirve para conectar nuestro Arduino a internet a través del puerto Ethernet de un router WIFI, pudiendo trabajar como un servidor WEB local (accesible solamente desde la red WIFI donde está conectado el router) o global (accesible desde cualquier red externa) con el que se puede interactuar, ya sea recibiendo o enviando datos a través de él. Como su propio nombre indica, el Ethernet Shield W5100 está basado en el chip Ethernet Wiznet W5100, el cual soporta los conocidos protocolos de transporte de datos TCP y UDP, además de soportar hasta cuatro conexiones de sockets simultáneas, lo que le hace muy versátil como servidor WEB. Para controlar el Ethernet Shield junto con 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.

Ethernet Shield W5100

El Ethernet Shield dispone de unos conectores hembra que permiten conectar a su vez otras shields apiladas sobre nuestro Arduino, por lo que es importante conocer que los pines digitales 10, 11, 12, y 13 no pueden ser utilizados como E/S genéricas, puesto que son utilizados por la comunicación SPI entre el Arduino y el Ethernet Shield W5100. Este Shield también está dotado de un conector Ethernet estándar RJ45 para poder conectarlo tanto al puerto Ethernet de un router como a la tarjeta Ethernet de un PC. También tiene un jumper soldado marcado como “INT” puede ser conectado para permitir a nuestro Arduino recibir notificaciones de eventos por interrupción desde el W5100. Además incluye un slot SD para guardar información en una tarjeta micro SD y por último tiene un botón de reset capaz de reiniciar todo el conjunto, incluido nuestro Arduino.
Para mayor comodidad del usuario, este Shield contiene una serie de LEDS que nos informan sobre el estado y funcionamiento del sistema como se muestra a continuación:
                    PWR: Indica que el Arduino y el Ethernet Shield están alimentados.
                    LINK: Indica la presencia de un enlace de red y parpadea cuando el Ethernet Shield envía o recibe datos.
                    100M: Indica la presencia de una conexión de red de 100 Mb/s (de forma opuesta a una de 10Mb/s).
                    FULLD: Indica que la conexión de red es full dúplex.
                    COLL: Parpadea cuando se detectan colisiones en la red.
                    RX: Parpadea cuando el Ethernet Shield recibe datos.
                    TX: Parpadea cuando el Ethernet Shield envía datos.
Para configurar de manera correcta el Servidor WEB, al Ethernet Shield se le debe asignar una dirección MAC, que nos es más ni menos que un identificador global único y diferente para cada dispositivo conectado a la red local. No es necesario modificar la dirección MAC que trae ya el programa por defecto, puesto que con esa MAC el Servidor WEB va a funcionar correctamente. También debemos de asignar al Ethernet Shield mediante programación, unas cuantas direcciones más que obtendremos desde nuestro PC con Windows, si nos vamos a inicio à ejecutar à cmd à ipconfig, obteniendo el siguiente resultado por pantalla:

Configuración de la direcciones del adaptador de LAN inalámbrico

De los datos obtenidos, nos interesan los que están redondeados en amarillo. Lo primero que tenemos que hacer es abrir el programa y modificar las siguientes líneas del código:

                 IPAddress ip(192,168,1,14): Teniendo en cuenta la dirección de la puerta de enlace predeterminada de nuestra LAN inalámbrica, que en mi caso es 192.168.1.1, tenemos que asignar una dirección IP al Ethernet Shield para que sea reconocido dentro de nuestra red local, del estilo a la dirección IP 192.168.XX, donde XX puede ser un número comprendido entre 1 y 254. Aunque como veremos más adelante es muy importante que la dirección IP que le asignemos al Ethernet Shield esté libre, en mi caso he utilizado la 14
                 IPAddress gateway(192, 168, 1, 1):  Tiene que coincidir exactamente con la dirección de la puerta de enlace predeterminada de nuestra LAN inalámbrica.
                 IPAddress subnet(255, 255, 255, 0): Tiene que coincidir exactamente con la dirección de la máscara de subred de nuestra LAN inalámbrica. 

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.

Ping a la dirección IP 192.168.1.14 desde el “cmd” de Windows

Para que la dirección IP que le asignemos al Ethernet Shield no sea ocupada por otro dispositivo cuando tengamos desconectado el sistema nos tenemos que cerciorar que la dirección que le hemos asignado 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 defecto, es decir, direcciones que nuestro router va asignar de manera automática a los elementos que conectemos a nuestra red, por el mero hecho de que se encuentren vacías en ese mismo momento. Por norma general el DHCP se aplica en la mitad de los posibles nodos de la red, es decir de la dirección 192.168.1.128 a la 192.168.1.254 por lo que si utilizamos direcciones inferiores a la 128 no deberíamos de tener problema, aunque es recomendable utilizar direcciones IP cercanas a la dirección de la puerta de enlace predeterminada para evitar este tipo de problemas. Para asegurarnos al 100% de que nuestra dirección IP no va a cambiar, podemos acceder al nuestro router escribiendo en el navegador la dirección de la puerta de enlace predeterminada, que en mi caso es http://192.168.1.1, aunque siempre nos pedirá un usuario y una contraseña para poder acceder al router, que nuestro proveedor de internet (ISP) nos debe de haber suministrado cuando realizó la instalación. Una vez dentro del menú de nuestro router debemos de buscar la configuración DHCP, comprobar los rangos de direcciones a los que va a afectar el DCHP y enlazar las direcciones MAC e IP de nuestro Ethernet Shield, para que siempre que le conectemos al router, este le asigne la misma dirección IP. Como cada router es totalmente diferente, si no encontráis la opción os recomiendo buscar información de vuestro modelo de router a través de la WEB.

Enlace de las direcciones MAC e IP del Ethernet Shield

Por último, cuando queremos acceder al Servidor WEB desde una red externa a la que está conectado el Ethernet Shield, es decir, por ejemplo desde la conexión 4G de nuestro Smartphone o desde una red WIFI diferente, tenemos que conocer la IP Pública que tiene nuestro router para poder acceder a él, y que este nos lleve a la dirección IP del Ethernet Shield a través de un puerto, el 80 por defecto, que previamente tenemos que haber abierto para la comunicación HTTP en nuestro router. Para abrir el puerto 80, tenemos que acceder nuevamente al router y buscar la opción “Port Forwarding” para enlazar el puerto, con protocolos TCP y UDP, a la IP del Ethernet Shield, que en mi caso es la 192.168.1.14. Ahora volvemos a tener el problema de que todos los routers son diferentes, por lo que tendremos que investigar cómo se pueden abrir los puertos en nuestro modelo en concreto.

Puerto 80 (HTTP) abierto y enlazado a la IP 192.168.1.14 en router modelo ZXHN H218N

Ahora solamente tenemos que adaptar el Ethernet Shield sobre la placa Arduino y cargar el programa (sketch) desde el PC mediante el cable USB como se hace normalmente, para posteriormente desconectarlo del PC  y alimentarle desde una fuente externa, que en nuestro caso es una batería de Litio-ion de 12V/3000mAh (DC 12300) para un uso prolongado. También debemos de recordar conectar el Ethernet Shield a nuestro router WIFI utilizando un cable Ethernet standard (CAT5 o CAT6 con conectores RJ45). Una vez instalado todo yo recomiendo realizar un reinicio del Arduino y la Shield Ethernet mediante el botón de reset. Para conocer nuestra IP Pública y ver si tenemos el puerto 80 (HTTP) abierto, podemos seguir este enlace una vez que tengamos el sistema funcionando, teniendo en cuenta que a no ser que tengamos asignada una IP fija, la IP pública cambiará cada vez que reiniciemos el Router o en algunos casos la misma compañía la cambia cada cierto tiempo (IP dinámica).

En este POST en concreto vamos a controlar un LED, aunque se pueden controlar todo tipo de elementos electrónicos, a través de Internet ya sea desde la red local (WIFI) o externa (4G del Smartphone u otra RED a la que no esté conectado el Ethernet Shield), mediante un PC, Tablet o Smartphone. Serán necesarios unos conocimientos básicos de HTML, simplemente para poder hacer la página WEB a nuestro gusto, a través de la cual podamos encender y apagar un LED cuando queramos. Lo que vamos a crear con el Ethernet Shield, es un servidor WEB, el cual nos proporcionará el código HTML para poder verlo en nuestro navegador y poder, así, interactuar con él. En Internet, un servidor es un dispositivo remoto que provee los datos solicitados por parte de los navegadores de otros dispositivos, es decir, sirve información a los dispositivos que se conecten a él. Cuando los usuarios se conectan a un servidor, pueden acceder a programas, archivos y otra información del servidor. 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.
 
Página WEB vista en el navegador del PC
 
                 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:



Video:


17 comentarios:

  1. Hola, muy buena explicación! Muy interesante y con la posibilidad de hacer muchos proyectos de acceso y control remoto vía web

    ResponderEliminar
  2. hola!!! excelente aporte, una duda, sabes como podria conectarme desde otro modem ? es decir estar fuera de mi hogar y activar o desactivar algo a distancia desde otra red, espero que me puedas ayudar.

    ResponderEliminar
  3. de hecho lo que quiero hacer es una comunicación entre dos Arduinos, espero me puedas ayudar.

    ResponderEliminar
  4. en el caso de una red externa la ip pública es la misma que la IP que hemos asignado en un principio ?

    ResponderEliminar
  5. Buenos días, siguiendo las indicaciones de lo que hay que hacer en el router, al tratar de acceder desde una red externa mediante la IP Pública, lo que sale es la petición de usuario y contraseña del router, no el servidor web con 192.168.1.14.
    No hay que hacer algo mas?
    Tengo el router ZXHN H218N

    ResponderEliminar
    Respuestas
    1. Eso te pasa porque no has abierto el puerto de comunicación HTTP (el puerto 80) de tu ROUTER como se describe en este POST. Busca la manera de hacerlo para tu ROUTER en la WEB. De todas las maneras te recomiendo que revises el POST desde el principio no se te haya quedado algún detalle más en el tintero.

      Eliminar
  6. alguien tiene un codigo con de en realidad el arduino se conecte a un servidor web como cliente hasta el momento solo he visto que se conectan a una red local

    ResponderEliminar
    Respuestas
    1. Si lo que quieres es controlarlo desde el internet fuera de la lan o wlan, necesitas una IP publica que tu proveedor de servicios te la puede dar a cambiar de una renta mensual o gratis depende de cada proveedor

      Eliminar
  7. Hola, buen post, gracias por compartir. Podes explicar como debemos conectar las placas para que queden como servidor permanente sin tener que encender la notebook. Desde ya muchas gracias....

    ResponderEliminar
  8. Conecta el cable Ethernet de la shield directamente a uno de los puertos Ethernet de salida de tu Router

    ResponderEliminar
    Respuestas
    1. ok, lo voy a probar, gracias despues te cuento.

      Eliminar
    2. Barbaro, anduvo. Ahora otra consulta, como puedo ampliar el alcance de mi router ???, Como siempre gracias.

      Eliminar
  9. Hola amigo quisiera que me ayuden tengo una shield clon ethernet el problema que tengo ya configure la ip de mi router ya la cambie en el scketch a lo que le doy el Ping en el cmd los leas d TX y RX se enciende pero al poner la ip en la url para acceder a los botones para prender el led no entra ayúdenme por fa gracias

    ResponderEliminar
    Respuestas
    1. Revisa de nuevo el POST que estás haciendo algo mal o se te está pasando por alto algo

      Eliminar
  10. ya lo tengo trabajando. si pudieras ayudarme con programa para controlar lamparas con barios relax gracias

    ResponderEliminar
  11. Hola buenas existe algun codigo de encender automaticamente el led sin apretar un boton por ethernet, ya que estoy programando un sensor de distancia por ethernet pero a cierta distancia necesito que se encienda un led

    ResponderEliminar