Icono del sitio Home Assistant Fácil

Ethernet Shield Arduino tutorial paso a paso parte 2

Aquí puedes acceder a la primera parte de Ethernet Shield con Arduino.

En el artículo de hoy veras otra aplicación de la tarjeta de expansión ethernet para Arduino o también conocida como Ethernet Shield.

Recuerda que estas placas son un aditivo para nuestro microcontrolador. Tiene una similitud a las mejoras o complementos para una computadora de escritorio.

Precisamente este artículo trata sobre el control de varios LEDs mediante un servidor web basado en Arduino utilizando el Ethernet Shield.

Te aseguro que al terminar estas líneas, tendrás nociones sobre:

Si quieres partir de la base con un ejemplo mas sencillo, te comento que tienes el artículo anterior donde puedes montar un servidor web en Arduino con Ethernet Shield.

Allí se muestra como implementar un monitor de temperatura y humedad. Utiliza el navegador del móvil o del ordenador y permite conocer parámetros útiles de forma simple y rápida. 

También se muestran las bases para el control del Ethernet Shield y el uso de la librería Ethernet que serán útiles a la hora de equipar servidores en Arduino. 

Si no tienes conocimientos sobre HTML puedes revisar el artículo de introducción a HTML5 donde se muestran los principios fundamentales de este lenguaje.

Bueno, sin más vacilación, se levanta el telón :)

¿Qué es HTTP?

El Protocolo de transferencia de hipertexto (en inglés, Hypertext Transfer Protocol o HTTP) es el protocolo de comunicación que permite las transferencias de información en la World Wide Web.

Cuidado, no confundir HTTP y HTML.

HTML se trata del lenguaje con el que se define el contenido de las páginas web, mientras que HTTP es el que hace posible la comunicación entre navegadores y servidores.

En realidad, la mayoría de los servidores utilizan HTTPS, que es la versión segura de HTTP. La principal diferencia entre estos radica en que en HTTPS los datos se envían encriptados.

HTTP es un protocolo orientado a transacciones y sigue el esquema petición-respuesta entre un cliente y un servidor.

Por ejemplo:

Supón que necesitas información sobre Arduino UNO y decides revisar en internet. De seguro abres tu navegador, te diriges al buscador de Google, escribes algo como “programar Arduino UNO” y presionas la tecla ENTER.

En ese momento tu navegador realiza una petición enviando un mensaje al servidor de Google. Ese mensaje lleva las palabras claves que escribiste en el buscador.

El servidor, por su parte, toma el mensaje recibido y envía una respuesta con los datos solicitados. En este caso serían los resultados de la búsqueda realizada.

Todo este proceso de comunicación se realiza utilizando el protocolo HTTP.

El navegador por su parte recibe el mensaje y te muestra la información solicitada de forma visual.

Mensajes HTTP

Como comente anteriormente, HTTP se basa en el envío de mensajes. Esos mensajes son en texto plano, eso significa que son fáciles de leer e interpretar. Un mensaje HTTP está compuesto por varias líneas, como si fuera un archivo de texto. 

Existen dos tipos de mensajes HTTP: 

En la siguiente imagen se muestra la estructura de ambos tipos de mensajes, donde cada fila representa una línea de texto plano.

Petición HTTP

En la primera línea de un mensaje de petición se encuentran los campos para:

Existen una serie de métodos de petición que pueden utilizarse. Cada uno de ellos indica la acción a realizar sobre el recurso indicado. Los métodos más conocidos son GET y POST.

El método GET permite solicitar un recurso. Por ejemplo, cuando ingresas a una página web o intentas abrir una imagen de un sitio el navegador realiza peticiones GET.

El método POST permite enviar datos para que sean procesados por el servidor. Por ejemplo, cuando rellenas un formulario en un sitio web y presionas en el botón “enviar” el navegador realiza una petición POST para enviar tus datos.

Respuesta HTTP

En caso de ser un mensaje de respuesta la primera línea cuenta con:

A partir de la segunda línea ambos tipos de mensajes tienen la misma estructura.

Cabeceras HTTP o head HTTP

En la segunda línea comienzan las cabeceras, una por cada línea. Cada una se compone por un nombre de cabecera seguido de dos puntos (:), un espacio en blanco y el valor. Una línea en blanco es utilizada para indicar el final de las cabeceras.

Las cabeceras más comunes son:

Por último está el cuerpo del mensaje. Este campo es opcional y típicamente contiene los datos que se intercambian entre el cliente y el servidor. Puede ser un archivo de texto, una página web, una imagen u otro tipo de recurso.

Ejemplo de comunicación HTTP

Para comprender como ocurre el intercambio de información entre cliente y servidor utilizando el protocolo HTTP veras algunos ejemplos. 

Primer ejemplo de petición HTTP

El cliente inicia la comunicación con una petición HTTP tipo GET.

Simplemente observando el mensaje podemos obtener la siguiente información:

Todo esto nos indica que la petición fue realizada escribiendo “www.algunsitioweb.com/index.html” en la barra de direcciones del navegador.

Puedes obtener mucha más información analizando todas las cabeceras, aquí solo he destacado algunas. 

Primer ejemplo respuesta HTTP

Una posible respuesta del servidor a esa petición sería:

Segundo ejemplo «petición HTTP tipo POST«

Es responsabilidad del servidor interpretar el mensaje enviado por el cliente, es decir, el servidor es quien decide la acción a realizar. Por ejemplo, en este caso podría ser un mensaje indicando apagar un motor de DC.

Segundo ejemplo respuesta HTTP

La respuesta del servidor dependerá de la interpretación realizada.  

En este caso la respuesta es similar al ejemplo anterior, solo que más simple.

Diferencias entre GET y POST

La principal diferencia entre las peticiones de tipo GET y POST es que cuando realizas una petición GET la información viaja en la URL. Es decir, que el recurso solicitado se especifica en la barra de direcciones.

Por otra parte, cuando se realizan peticiones POST la información viaja en el cuerpo del mensaje. En otras palabras, no se muestran los datos enviados en la barra de direcciones del navegador. Esta diferencia es la que implica el hecho de que GET se utilice para acceder a los recursos y POST para modificarlos.

Veamos ahora como utilizar lo aprendido en un ejemplo práctico.

Control de LEDs con servidor web en Arduino y Ethernet Shield

En este ejemplo veras cómo implementar un servidor web en Arduino que permita controlar un grupo de LEDs

Puedes reemplazar los LEDs con relés y controlar las luces del portal o el sistema de riego del jardín.

Para este proyecto necesitarás:

* Puede ser cualquier router, aunque si es uno con Wifi integrada mucho mejor.

** Si no dispones de un Arduino MEGA puedes utilizar un Arduino UNO sin problemas

Circuito eléctrico con Arduino y Ethernet Shield

Lo primero que debes hacer es conectar el Ethernet shield y Arduino. Al tratarse de un módulo tipo shield esta tarea se simplifica enormemente, ya que solo es necesario hacer coincidir los pines del Arduino con los del módulo.

Te recuerdo que hay una primera parte sobre teoría y ejemplos básicos para el Ethernet shield con Arduino.

Después se conectan los LEDs y se utiliza en cada caso una resistencia de 1 kΩ para limitar la corriente.

En la siguiente imagen representa la conexión completa.

Como puedes ver, he utilizado los pines digitales 2, 3, 5, 6 y 7 para conectar los LEDs. Tú puedes utilizar otros si lo prefieres, pero ten presente que tanto el bus SPI como el pin 10 son utilizados en la comunicación con el Shield Ethernet.

En la figura siguiente se aprecia el montaje.

Utiliza tres LEDs azules y dos rojos.

Ethernet Shield y su Arquitectura de red

Para este proyecto tendrás que montar  una red similar a la que se muestra en la imagen.

Es decir, que tienes que conectar tanto el ordenador como el Arduino con el Shield Ethernet al router. En ambos casos debes utilizar cables de red ethernet.

En la siguiente imagen puedes ver el montaje realizado. En este caso he empleado un router TP-Link, el mismo que utilizo para conectarme a internet.

Si tu router admite conexiones Wifi entonces también podrás acceder al servidor y controlar los LEDs desde tu móvil.

Programar el servidor web en Arduino con Ethernet Shield

Con todo el sistema montado. Ahora solo queda darle vida programando la placa Arduino y el modulo Ethernet Shield.

De modo general en el Arduino se implementa un servidor web que solo admite dos tipos de peticiones: GET y POST.

Ante una petición GET el servidor responderá con una página web donde se muestra el estado actual de los LEDS y un grupo de botones para modificar el estado de estos.

Si se presiona uno de los botones de la página el navegador enviará una petición POST al servidor para cambiar el estado del LED correspondiente.

A continuación, por simplicidad, se analiza el código en partes.

Librerías, constantes y variables globales

Se empieza como de costumbre, incluyendo las librerías necesarias. En este caso solo es necesaria la librería Ethernet para el control del módulo de red. 

Se declaran cinco constantes para definir los pines digitales a utilizar para controlar los LEDs. Una sexta constante indica la cantidad de LEDs que se utilizan.

Los pines digitales son almacenados en un arreglo para facilitar su manejo.

Se declaran las constantes ip y mac con las direcciones IP y MAC del Arduino, respectivamente.

Si no tienes claro qué dirección IP o MAC asignarle a tu Arduino puedes revisar el artículo anterior sobre Ethernet Shield donde se muestra ese proceso paso a paso.

Se define un objeto EthernetServer para la implementación del servidor web. Se utiliza el puerto 80 porque este es el predefinido para HTTP.

Función setup()

En la función setup() se inicializan todos los componentes necesarios. Se comienza configurando los pines de los LEDs como salida y en estado bajo (LOW).

Luego se inicializa el puerto serie y el Ethernet Shield.

Por último, se comprueba el estado del Ethernet Shield. Si este no presenta ningún problema se inicializa el servidor.

Función loop()

En la función loop() simplemente se ejecuta la función checkForClients(). Es la encargada de atender las peticiones de los clientes.

Función checkForClients()

La función comienza declarando una variable tipo String donde se almacenará el mensaje enviado por el cliente. También se crea un objeto EthernetClient utilizando la instrucción webServer.available()

Utilizando una instrucción if se comprueba la existencia de peticiones por parte de algún cliente. En caso de que se detecte alguna petición se indica mediante el monitor serie y se almacena el mensaje HTTP en la variable sms_client.

Para obtener el mensaje se van leyendo los caracteres enviados por el cliente hasta que se llegue a la línea en blanco que separa las cabeceras del cuerpo del mensaje. Para indicar que se ha encontrado el final de las cabeceras se asigna true a la variable ok.

Luego de haber leído los caracteres se verifica el valor de la variable ok. Si es false no se procesa la petición, ya que se considera un mensaje incompleto.

Si el mensaje es válido se comprueba el tipo de petición. En este caso solo se procesan dos tipos: GET y POST.

Para identificar el tipo de petición se implementó la función checkRequest(). Esta retorna false cuando el mensaje corresponde a GET y true para POST.

Si la petición es de tipo GET se invoca a la función responseToClient(), la cual envía un mensaje de respuesta al cliente a partir del estado de los LEDs.

En caso de ser una petición POST se lee el cuerpo del mensaje y se almacena en la variable payload. Luego se ejecuta la función makePOST() que interpreta el mensaje y actúa en consecuencia. También se ejecuta responseToClient() para que los cambios ocurridos sean actualizados en el navegador.

Una vez se ha enviado la respuesta al cliente se realiza un pequeño retardo para que el navegador reciba los datos y por último se cierra la conexión con el cliente.

Función checkRequest()

La función checkRequest() recibe como parámetro un String con un mensaje HTTP y determina el método de petición. Para esto simplemente se comprueba si la palabra “GET” o “POST” se encuentra al principio del mensaje.

Función responseToClient()

Esta función que recibe como parámetro un objeto EthernetClient y él envía una página web en formato HTML utilizando el protocolo HTTP con el estado de los LEDs y botones que permitan controlarlos.

Comienza enviando la versión HTTP y el resultado de su solicitud.

Luego se envían las cabeceras indicando que es un mensaje HTML (Content-Type),  que la conexión se cerrará después de ese mensaje (Connection) y que el navegador se debe refrescar cada 5 segundos (Refresh). Se termina la sección de cabeceras con una línea en blanco, tal y como se vio anteriormente.

Por último, envía la página web en formato HTML. Esta cuenta con cinco botones que muestran el estado actual de cada LED. Además, haciendo clic sobre un botón se puede cambiar el estado del LED.

Más adelante se utiliza un navegador web para interactuar con la página y ver el código HTML generado.

Función makePOST()

La función makePOST() recibe el cuerpo de un mensaje de tipo POST y lo interpreta para identificar sobre qué LED tiene que actuar y qué operación realizar.

Bueno, aquí tienes el código completo para que lo cargues a tu Arduino.

Funcionamiento del servidor web con Arduino y Ethernet Shield

Si ya tienes tu placa Arduino programada, el Ethernet shield, y el resto de componentes conectados es hora de comprobar que el sistema funciona correctamente.

Lo primero es energizar todo el sistema. Asegúrate de encender el router y alimentar el Arduino correctamente.

Ahora abre un navegador web en tu ordenador. Da lo mismo el que sea, aunque te recomiendo utilizar Mozilla Firefox o Chrome.

Una vez tengas el navegador abierto ve a la barra de direcciones y escribe la dirección IP que le asignaste al Arduino en el código. En mi caso sería 192.168.1.125.

Cuando la tecla ENTER sea presionada el navegador enviará una petición GET al servidor implementado en el Arduino

En la siguiente figura se puede observar la salida del monitor serie donde se muestra la petición enviada por el navegador.

Para poder ver las peticiones enviadas al Arduino es necesario alimentarlo desde un puerto USB del ordenador y abrir el monitor serie.

Ten en cuenta que no es necesario alimentar el Arduino desde el ordenador para que el sistema funcione.

Al recibir la petición el Arduino evalúa el estado de los LEDs y envía una respuesta al navegador. En este último se debería cargar una página similar a la que se muestra en la siguiente figura.

Como puedes ver, la página cuenta con 5 botones, uno para cada LED. El texto de cada botón indica el estado actual de los LEDs. Presionando el botón se cambia el estado del LED correspondiente.

En la siguiente imagen se muestra el resultado obtenido después de presionar los botones correspondientes a los LEDs 1 y 4.

Si quieres ver el código fuente HTML de la página puedes hacer clic derecho y seleccionar la opción Ver código fuente de la página.

Esto abre una nueva pestaña donde se muestra el código HTML. Este código es el generado por el Arduino utilizando la función responseToClient().

Si no tienes experiencia en HTML será difícil entender por completo el código de la página web, sin embargo, puede ser interesante saber que cuentas con esta herramienta.

Como puedes ver cada botón pertenece a un formulario HTML (form), es por eso que al presionar uno de ellos el navegador envía una petición de tipo POST al Arduino. Por ejemplo, al presionar el botón correspondiente al LED 1 se envía la siguiente petición.

En el cuerpo de la petición se indica el estado actual del LED a modificar, es decir, que la instrucción LED1=OFF indica que el LED1 está actualmente apagado y debe encenderse. 

Conclusión proyecto Ethernet Shield y Arduino

En este artículo se comenta cómo funciona el protocolo HTTP.

Luego, cómo utilizar HTTP con una placa Arduino y Ethernet Shield para implementar un servidor web que permita encender y apagar otros dispositivos.

Recuerda que aunque en el ejemplo se emplean LEDs, pueden ser intercambiados por relés.

Sin duda, serán viejos ayudantes electrónicos con mucho más potencial. Si te embarcas en esa travesía te recomiendo el artículo sobre control de relés con Arduino.

Pero entonces, el servidor web con Arduino y Ethernet shield ¿No es suficiente?

Pues, ningún problema.

Combina la interacción de LEDs con un monitor de temperatura y humedad puesto en marcha en la primera parte de este artículo.

Por ultimo, espero que este pequeño prototipo te halla abierto el apetito Maker.

Ya sabes, cualquier duda o sugerencia será bien recibida en la caja de comentarios.

Gracias a Shutterstock por ceder los derechos de las imágenes.

Salir de la versión móvil