Вы находитесь на странице: 1из 9

17/5/2016 ControlandounLEDporEthernet|TutorialesArduino

CONTROLANDO UN LED POR ETHERNET


Control de pines digitales desde Internet

Home Controlando Un LED Por Ethernet

OBJETIVOS

Montar un circuito con un LED y un Shield Ethernet.

Crear un servidor Web.

Mostrar un cdigo bsico HTML para activar odesactivar el LED, que nos sirva como armazn para nuestros
proyectos.

Presentar el Port Forwarding y su razn de ser, cuando queremos acceder desde internet al servidor de
nuestro Arduino.

MATERIAL REQUERIDO.

Arduino UNO o equivalente.

Una Protoboard ms cables.

Una resistencia de 330.

Un LED

http://www.prometec.net/ethernetled/ 1/18
17/5/2016 ControlandounLEDporEthernet|TutorialesArduino

UnShield Ethernet

A VUELTAS CON EL HTML

El HTML es un lenguaje de descripcin de pginas que ha evolucionado en sus ltimas versiones, (HTML5, a la hora de escribir esto) en algo muy
sosticado que sin llegar a ser un lenguaje de programacin, es capaz de ofrecer una potenciaespectacular.

Un curso medianamente organizado de HTML escapa con mucho la capacidad y el objetivo de estas humildes sesiones, pero para continuar
presentando como hacer ciertas cosas con Arduino y la conexin a Ethernet, necesitamos presentar algunas ideas al respecto, porque sin ellas
cualquier intento de avanzar seria vano.

Por ejemplo, es muy til disponer de un programa tipo, que nos permita manipular un LED conectado a nuestro Arduino mediante una pgina Web, y
este es el objetivo de la sesin actual.

Para ello, vamos a presentar pequeos snippets (fragmentos) de HTML que nos permitan hacerlo, sin entrar en grandes detalles del lenguaje, pero
que vamos a emplear en nuestros programas.

EL primero, es un snippet que nos permite mostrar un checkbox en nuestra pgina y reconocer si se ha pinchado o no:

<!DOCTYPEhtml>
<html>
<head>
<title>ControldeLEDsenArduino</title>
</head>
<body>
<h1>LEDremoto</h1>
<p>HazclickparaconmutarelLED.</p>
<formmethod="get">
<inputtype="checkbox"name="LED2"value="2"onclick="submit();">LED2
</form>
</body>
</html>


Como norma general, lo que se presenta entre < > se llaman tags y describen algo en concreto, ttulos,
cabeceras, negritas.

Por ejemplo para expresar que es cdigo HTML, debemos empezar con <html> y nalizar con </html>, lo
mismo ocurre con los dems tags, como < head> cabecera, <body> cuerpo, o <p> prrafo, que cuando
nalizan incorporan un tag con el smbolo / para indicar el n del tag.


En el snippet de arriba, hemos usado un mtodo HTML para mostrar un checkbox y enviar un texto cuando se pulse.

Si copiis ese cdigo con un editor de textos y lo guardis con extensin htm, cuando lo abras con el navegador veras:

Fijate en la imagen de la derecha, que cuando pulsemos el checkbox, el navegador aadir al nal de la direccin IP, el texto ?LED2. Utilizaremos
este texto de respuesta para decidir si encendemos o apagamos el LED. Para ello usaremos la funcin indexOf() que nos devuelve si un string est

http://www.prometec.net/ethernetled/ 2/18
17/5/2016 ControlandounLEDporEthernet|TutorialesArduino

incluido o no en otro.

DIAGRAMA DEL CIRCUITO

Vamos a usar un circuito con Arduino y un LED conectado alD2 con sus resistencia, en conjuncin con la pgina web que hemos descrito en el
apartado anterior. En funcin del status del checkbox encenderemos o apagaremos los LED.

EL PROGRAMA DE CONTROL

La mayor parte del programa va a ser similar al programa de la sesin anterior, con algunas modicaciones (Pocas). Principalmente, sern crear un
variable para almacenar el status del LED, y un String para registrar la peticin que nos hace el cliente Web:

StringHTTP_req;//storestheHTTPrequest
booleanLED_status=0;//stateofLED,offbydefault

El resto es casi igual, excepto porque cambiamos el cdigo HTML que enviamos en la respuesta, para presentar el snippet del que hablamos ms
arriba, y porque hemos aadido una funcin ProcessCheckbox() que har el procesamiento del click (incluyendo enviar el HTML correspondiente a
pulsado o no).

http://www.prometec.net/ethernetled/ 3/18
17/5/2016 ControlandounLEDporEthernet|TutorialesArduino

Fijaros que enviamos los comandos HTML, mediante client.print() a quien le pasamos los strings limitados
por comillas. Pero como los comandos HTML tambin incluyen comillas, si los copiamos por las buenas
tendramos un lio servido.

La solucin de C++ para esto es preceder el carcter a imprimir por un carcter de escape para que el
compilador sepa que no es el n del string, si no parte de el.

Por eso, si queremos mandar <form method=get> lo que tenemos que enviar con print es <form
method=\get\>.

Aqu tenis el programa PROG_63_1

#include<SPI.h>
#include<Ethernet.h>

bytemac[]={0xDE,0xAD,0xBE,0xEF,0xFE,0xED};
IPAddressip(192,168,1,177);
EthernetServerserver(80);

StringHTTP_req;//Paraguardarlapeticiondelcliente
booleanLED2_status=0;

voidsetup()
{Ethernet.begin(mac,ip);
server.begin();
Serial.begin(9600);
pinMode(2,OUTPUT);
}
voidloop()
{EthernetClientclient=server.available();//Comprobamossihaypeticiones
if(client)//Encasoafirmativo
{booleancurrentLineIsBlank=true;
while(client.connected())
{if(client.available())//Hayalgopendientedeleer
{charc=client.read();//Leemosloscaracteresdeunoenuno
HTTP_req+=c;//LosaadimosalString
if(c=='\n'&&currentLineIsBlank)
{client.println("HTTP/1.1200OK");
client.println("ContentType:text/html");
client.println("Connection:close");
client.println();
client.println("<!DOCTYPEhtml>");//EnvialapaginaWeb
client.println("<html>");
client.println("<head>");
client.println("<title>ControldeLEDsenArduino</title>");
client.println("</head>");
client.println("<body>");
client.println("<h1>LED</h1>");
client.println("<p>HazclickparaconmutarelLED.</p>");
client.println("<formmethod=\"get\">");
ProcessCheckbox(client);
client.println("</form>");
client.println("</body>");
client.println("</html>");
Serial.print(HTTP_req);
HTTP_req="";//Unavezprocesador,limpiarelstring
break;
}
if(c=='\n')
currentLineIsBlank=true;
elseif(c!='\r')
currentLineIsBlank=false;
}//if(client.available
}//WHile
delay(10);//dartiempo
client.stop();//Cerraconexion
}//Ifclient

http://www.prometec.net/ethernetled/ 4/18
17/5/2016 ControlandounLEDporEthernet|TutorialesArduino
}

voidProcessCheckbox(EthernetClientcl)
{if(HTTP_req.indexOf("LED2=2")>1)//LED2pinchado?
LED2_status=!LED2_status;//Sipichadoinvertimoselvalor

digitalWrite(2,LED2_status);
if(LED2_status)
cl.println("<inputtype=\"checkbox\"name=\"LED2\"value=\"2\"\\onclick=\"submit();\"checked>LED2");
else
cl.println("<inputtype=\"checkbox\"name=\"LED2\"value=\"2\"\\onclick=\"submit();\">LED2");
}

Aqu os dejo un minivideo con el resultado

Control de LED mediante Arduino y ethernet

ACCEDIENDO DESDE INTERNET A NUESTRO ARDUINO

Hasta ahora, hemos accedido a nuestro servidor Arduino, desde la red interna, a travs de un cable Ethernet. No es distinto acceder desde el
exterior de la red local, pero para hablar de ello necesitamos presentar algunas ideas adicionales, as que poneros cmodos.

El esquema de una red local LAN, puede ser ms o menos este:

Cada una de los equipos internos dispone de una direccin IP nica, vlida para la red interna. Normalmente son IPs en uno de dos rangos:

192.168.xx.xx
172.26.xx.xx

http://www.prometec.net/ethernetled/ 5/18
17/5/2016 ControlandounLEDporEthernet|TutorialesArduino

Esta dos rangos estn reservadas a direcciones internas y no son enrutables, es decir el Router rechazar sacarlas a internet. A este tipo de
direcciones que usamos internas se les llama direcciones IP privadas, porque en principio no se puede acceder desde internet a ellas.

Por el contrario, las direcciones a las que accedemos desde Internet, las llamamos direcciones pblicas y no pueden coincidir con otra IP pblica
bajo ninguna circunstancia.

Cuando desde dentro de la LAN, queremos acceder a una direccin pblica, el Router utiliza el NAT (Que vimos en la sesin anterior), para
enmascarar mi direccin interna privada y utiliza su propia direccin pblica para hacer la peticin. Cuando recibe la respuesta, nos la reenva como
si no hubiera pasado nada.

Pero es importante entender aqu que:


Siempre que tu Router se enciende, recibe una direccin pblica que le asigna tu operadora telefnica, y
que es la que usar para acceder a internet. Necesita ser una direccin pblica para poder navegar en el
exterior.

Si quieres saber con qu IP publica estas navegando (Acurdate del NAT, quien navega es el Router con su
IP, no t) usa cualquiera de los servicio para ello, por ejemplo http://cual-es-mi-ip-publica.com/, y veras que
tu IP privada es distinta de la que te dice esta pgina, pero es correcto.


Algunas veces me preguntan que tienen que hacer para conseguir una direccin IP pblica para un servidor domstico. Yo siempre respondo que
direccin pblica, ya tienen, la que habis visto antes. Lo que no tienen es una direccin IP ja o esttica, porque esta cambia cada vez que apagas
y enciendes el Router, pero es una IP publica de pleno derecho.

Si necesitas acceder a tu Arduino desde fuera puedes utilizar esa IP, por lo menos hasta que reinicies el Router (Y es algo que hacemos
habitualmente con los servidores domsticos).

Cuando contratas a tu proveedor una IP ja, lo que haces es pagar por una que no cambie cuando reinicias y por regla general tambin te permite
registrar en sus DNS pblicos un nombre que apunte a la IP que compras.


Si queris hacer pruebas a coste mnimo, podis usar alguna pgina como noip, que te ofrecen soluciones
gratuitas para encontrar tu direccin pblica incluso cuando apagues tu Router. No es una solucin
denitiva, pero tiene la virtud de tener un precio imbatible: 0.


Supongamos ahora que ya sabemos que IP pblica nos corresponde. Lo siguiente es acceder desde internet, pero surge un nuevo problema (Como
no).

Cuando salimos a travs del Router este sabe nuestra direccin interna (Va en los paquetes TCPIP) y cuando recibe la respuesta, no tiene problema
en saber a quin corresponde. Pero cuando alguien del exterior trata de entrar en nuestra red sin una peticin registrada por nuestra parte, tiene dos
problemas:


Permitimos por seguridad que se entre desde el exterior a nuestra red interna? Normalmente hay que
revisar la poltica de seguridad del Router para garantizar que se pueda.

Cmo sabe el Router a que direccin interna va la peticin? Dentro de la red interna hay muchos puestos.
A cul de ellos debe enviar la peticin?


No existe manera de dirigir correctamente estas peticiones de fuera, sin informar previamente al Router de algn criterio para que tome una
decisin. Para esto se invent el Port Forwarding o redireccin de puertos IP.

Cmo diferenciamos una peticin del exterior hacia el interior?

Tenemos la clave en que cada peticin IP lleva anexo un puerto. O lo que es lo mismo, todas las peticiones que vengan por el puerto 80 podremos
asumir, razonablemente, que son para el servidor Web interno.

As, si vienen por el puerto 21, es razonable envirselo a un servidor de FTP y si viene por el 25 lo lgico es que sea un tema de SMTP y se lo enve
al servidor interno de correo.


Adems, siempre que en una red con administrador profesional se permite la entrada del exterior (O zona
desmilitarizada, en la jerga) al interior de la red local, se suele instalar un FireWall que controla, limita e

http://www.prometec.net/ethernetled/ 6/18
17/5/2016 ControlandounLEDporEthernet|TutorialesArduino
inspecciona y eventualmente bloquea, todas las transacciones, para evitar problemas de seguridad.


As pues, bastara con informar al Router, mediante una tabla de redireccin de puertos, de que cualquier intento de llegar al interior de la red local
por el puerto 80, HTTP, se desven, hacia la direccin interna del servidor Web. Y lo mismo con el FTP y SMTP a su propia IP privada.

As con una nica IP publica, podemos recibir y servir peticiones, de mltiples servidores internos, sin ms condicin de que se pueda discriminar
entre ellos por el puerto caracterstico (Lo habitual).


No est de ms destacar, que este sistema implica, necesariamente, programar las reglas de port
forwarding en el Router. No funcionar en absoluto si se obvia este paso.

La limitacin de este sistema es, que podemos poner tantos servidores como queramos detrs del Router o
rewall, a condicin de que solo haya uno de cada. No podemos poner dos servidores web en el puerto 80,
porque todo lo que venga por el puerto 80, el Router har un port forwarding a una nica direccin.

Si hemos puesto un servidor estndar en un puerto inusual, o si hemos montado un servicio propio en un
puerto dado, la direccin completa con puerto se puede especicar como por ejemplo en 192.168.1.175: 4217


Por ultimo para programar el port forwandig en tu Router, debes entrar en l. Actualmente todos los routers domsticos pueden administrarse desde
una pgina web que sirve el propio Router en su direccin IP.

Si por ejemplo tu Router tiene la direccin 192.168.1.1, puedes ir a esa direccin con tu navegador. Te pedir un nombre de usuario y clave de acceso
para validar tu autorizacin.

Es imposible describir la conguracin de los routers en detalle porque hay cientos de modelos, pero en todos ellos hay que buscar la denicin de
port forwandig.

Voy a incluir capturas de mi Router, por si hay suerte y coincide con el vuestro. Si no goglead el tema con el modelo especico de vuestro Router.

En mi caso concreto, os anexo un pantallazo de mis opciones, donde veis en la columna de la izquierda, el men del Router con la seleccin de Port
Forwarding, y a la derecha la tabla de redirecciones de mi Router, donde redirecciono varios puertos hacia dos IPs internas diferentes

http://www.prometec.net/ethernetled/ 7/18
17/5/2016 ControlandounLEDporEthernet|TutorialesArduino

TIENDA SCRATCH ARDUINO FORO PROYECTOS CONTACTO


Aunque hasta ahora hemos hablado exclusivamente como si el Transporte fuera siempre TCP, lo cierto es
que hay otro protocolo que se utiliza habitualmente, que es el UDP.

No he querido complicar innecesariamente las explicaciones hablando de l, pero hay que tenerlo en
cuenta. Algunos servicios usan UDP y no TCP y cuando hacemos port Forwarding, se debe especicar
(Aunque casi todos los routers modernos aceptan especicar ambos como arriba).


Un ltimo comentario, Cuando accedes desde el exterior a tu servidor Arduino, vas a usar en tu navegador, la direccin pblica de tu Router. Pero si
intentas usar esa direccin pblica exterior para entrar desde el interior de tu red local (por ejemplo cuando usas tu telfono WIFI) te llevaras un
chasco.

Algunos routers lo detectan como un intento de violar la seguridad y te bloquearan sin contemplaciones (A esto se le llama Spoong en la jerga y
suele suponer malas intenciones de todas, todas menos en el caso del que hablamos).

Y otros te pedirn una clave para pasar, que ser la del Router, en cuyo caso te pondr con la pgina Web de administracin y no con el servidor
interno en Arduino.

Cuando ests conectado por Ethernet o WIFI, tienes que utilizar la IP privada interna. Cuando ests fuera de tu LAN, utilizars la direccin pblica, y
si, esto te va a dar guerra para hacer pruebas.

http://www.prometec.net/ethernetled/ 8/18
17/5/2016 ControlandounLEDporEthernet|TutorialesArduino

RESUMEN DE LA SESIN

Hemos visto cmo usar el servidor web de Arduino con un cdigo HTML especial, para controlar el status
de un LED conectado a un pin digital.

Veris que es muy sencillo a partir del programa que ya vimos en la sesin anterior, y debera ser fcil
ampliar el programa a mltiples LEDs.

Hemos presentado el Port Fowarding y porque es necesario, para acceder desde el exterior.

Hemos apuntado a como congurar la tabla de redireccin de tu Router.


ANTERIOR SIGUIENTE

(50) COMMENTS

Fabian 12 Jul 2015


Hola
Me ayudo mucho tu trabajo.
Reply Gracias

Jaume 10 Ago 2015


Buenos das, estoy siguiendo paso a paso el tutorial pero tengo problemas nada ms empezar. vaya por delante que ya tengo una IP
esttica y puedo comunicarme con el router desde internet, de manera que puedo encender y apagar leds a travs de la red. Me ha
Reply gustado esta pgina, por que navega por los primeros pasos para congurar una pgina HTML para gestionar aparatos a distancia y me
interesa cmo hacerlo. Vereis, el problema con que me encuentro es que al confeccionar la pgina web de el principio, desde la cual se
apaga y enciende un led, consigo que aparezca en internet, pero al clicar en el checkbox, no mantiene este cuadradito con la tilde
conforme est activado. Por contra, en la barra de direcciones s que aparece escrito LED2=2, lo que indica que est activado. El caso
es que no puedo seguir adelante, pus no consigo que en el sketch encienda el led (la direccin que sale en el navegador s:
le:///C:/Users/Jaume/Desktop/Codi%201.htm?LED2=2, y tengo el archivo HTM en el escritorio.

Podeis darme una idea de lo que pasa?

admin 10 Ago 2015


Hola Jaume,
No es facil decirte mucho solo con esas pistas, pero tiene toda la pinta de algo descolocado.
Reply Algo asi como una coma o un parentesis. Prueba a copiar y pegar el programa de la pagina y me dices

gerardo 17 Ago 2015


Hola.. Una pregunta en que parte del skech se ubica: void ProcessCheckbox(EthernetClient cl)
Desde ya muchas gracias..Sdos
Reply

dbagur 29 Ago 2015


Buenas, antes de nada felicidades por tus tutoriales llevo varios meses con ellos. Te queeria preguntar si es posible meter una
contrasea al programa me explico, he abierto el puerto 80 de mi (dragino + arduino uno > arduino yun) y lo puedo controlar desde
Reply cualquier parte si hay red internet, el caso es que cualquiera que sepa mi ippublica del ruter puede entar en el web server (o bridge en
arduino yun) y controlar lo que hay (un led, la tele por la web)

http://www.prometec.net/ethernetled/ 9/18

Вам также может понравиться