viernes, 5 de junio de 2015

Controla tu casa por internet con arduino.

http://www.educachip.com/arduino-ethernet-shield/

Arduino Ethernet Shield – Controla Tu Casa Por Internet

… ¿Y si te dijera que con Arduino Ethernet Shield puedes crearte tu propio web server y utilizarlo para domotizar tu casa? Ya sea para controlar tu vivienda o cualquier otro elemento a través de Internet, este shield de Arduino es una gran elección.
En este post te voy a enseñar todos los pasos que debes seguir para configurar tu Arduino Ethernet Shield y crear tu propia página web con la que podrás controlar tu casa desde cualquier parte del mundo. Además incluiré un código pensado para que puedas pegarlo fácilmente a tu sketch de Arduino y adaptarlo a tu proyecto con unos pocos cambios.Arduino-Ethernet-Shield

Tutorial Arduino Ethernet



Como te puedes imaginar, para este proyecto van a ser necesarios algunos conocimientos de HTML y configuración de redes, así como la librería Ethernet de Arduino. No te preocupes por eso porque te lo voy a explicar todo paso a paso para que te resulte lo más simple posible.

El Problema de las IP



Cuando conectas tu Arduino Ethernet Shield con tu Router, éste le asigna una dirección IP, es decir, una identificación que le permite diferenciar a tu Arduino del resto de ordenadores y demás elementos que tengas conectados a la red local de tu casa, así que esa dirección que va a utilizar tu Arduino tienes que introducirla en tu sketch. El problema es que esa IP es cambiante y cada vez que su valor cambie, tu sistema dejará de funcionar.
Del mismo modo, la dirección de tu Router cambia salvo que tengas contratado un sistema con IP estática. Esto no es lo más habitual ya que estos sistemas son más caros y a la compañía que “te proporciona el Internet” le interesa que tú tengas una IP dinámica.
Como lo que tú quieres es implementar tu sistema sobre tu Arduino Ethernet Shield, poder controlarlo desde cualquier parte del mundo (y no solo desde tu red de área local) y que este siga funcionando sin tener que modificar tu código (sketch) con independencia de lo que pase en tu red. Tienes que amenazar de muerte a tu proveedor de Internet solucionar varios problemas:
  1. Conseguir que conexión IP entre tu Arduino Ethernet Shield y tu Router (área local) no cambie.
  2. Abrir los puertos de tu Router para permitir que entre y salga información.
  3. Conseguir que la conexión entre tu Router e Internet no cambie (para que puedas acceder siempre desde la misma dirección).
Si te ha entrado el miedo en el cuerpo por aquello de “romper Internet”, tranquilo. Lo primero que debes saber es que desde la era de Internet todos los que somos un poco curiosos y hemos encontrado algo en Google que hemos intentado probar, hemos causado (ya sea por desconocimiento o intención) tantos problemas que ya todos los sistemas están hechos “anti-cafres”. Lo segundo es que, como siempre te digo, Arduino está pensado para ser fácil (y esto no iba a ser menos). Y lo tercero es que desde EducaChip estamos para ayudarte. Vamos a ello.

Conexión Arduino Ethernet Shield – Router



Te voy a decir algo que no te va a gustar: Cada Router se configura de una manera distinta. Como supongo te estarás imaginando, eso quiere decir que en este apartado no puedo ayudarte mucho. No desesperes, aunque todos son distintos, todos son similares y con un poco de paciencia no te costará realizar este paso.

Acceder a tu Router


Lo primero que debes hacer es acceder a tu Router desde tu navegador favorito. Para ello necesitas saber cuál es su puerta de enlace (o gateway en inglés). Te voy a poner cómo se haría desde Windows. Si estás utilizando un sistema operativo diferente, el funcionamiento es similar. En caso de que tengas dudas puedes dejar un comentario al final de este post o buscarlo en Google (no te costará encontrarlo).Puerta-de-Enlace-Arduino-Ethernet
  1. Pulsa el botón de inicio.
  2. En la barra de búsquedas, escribe ejecutar y pulsa la tecla intro.
  3. En la ventana que te acaba de aparecer escribe “cmd” y vuelve a pulsar intro.
  4. Te habrá salido otra ventana de fondo negro. Escribe en ella “ipconfig”.
  5. Dentro del texto que se acaba de escribir en la ventana hay una sección llamada Adaptador de Ethernet (o similar). Busca en ella la “puerta de enlace predeterminada” o “gateway” y apunta la dirección asociada (suele ser algo del tipo 192.168.1.1).
Ahora que ya tienes la dirección con la que acceder a tu Router, basta con que la escribas en tu navegador (en la zona donde normalmente escribes las URL). Seguramente te pedirá una contraseña. Si es la primera vez que accedes a tu Router será la contraseña por defecto. Suele ser algo tipo:
  • usuario: admin
  • contraseña: 1234
Si tienes no eres capaz de encontrar tu contraseña, aquí te dejo un enlace con contraseñas por defecto de Routers.

Configurar Área Local


Ahora que estás dentro de tu Router, debes decirle que siempre le de la misma IP a tu Arduino Ethernet Shield.
Por defecto, la mayor parte de los Routers utilizan un sistema denominado DHCP según el cuál van asignando IP locales a todos los elementos que se conectan a la red. Cada cierto tiempo esas IP cambian (también pueden cambiar si conectas y desconectas algún elemento) por lo que si inicias el programa Arduino Ethernet Shield sin modificar esto, funcionará al principio, pero cuando esa dirección cambie se perderá la comunicación y tendrás que modificar tu sketch. Para que esto no suceda tienes que decirle al protocolo DHCP que te parece fantástico que juguetee con las IP pero que no toque la de tu Arduino.
Todas las máquinas que conectas a tu red tienen un número identificativo denominado MAC que, de cara a la red, es como un DNI o pasaporte. El MAC de tu Arduino puedes fijarlo tú (basta con que no haya varias máquinas con el mismo MAC) y por defecto es:
Salvo que tengas especial interés por utilizar un MAC concreto puedes utilizar este.
Una vez tienes tu MAC, debes decirle a tu Router que a ese MAC le de siempre la misma IP. Los pasos son los siguientes:DHCP-Arduino-Ethernet
  1. Accede a las propiedades de tu DHCP a través de los menús de tu Router, es decir, busca por los menús la palabra DHCP o DHCP Settings (suele estar en: Configuración >> LAN >> DHCP).MAC-IP-Arduino-Ethernet
  2. En este menú podrás ver cosas interesantes como el rango de IP que asigna tu DHCP (puede que te venga como “IP Pool Range” o como direcciones IP inicial y final). Lo que debes buscar es algo tipo “Reserva de direcciones IP” o “MAC-Base Assignment” que es donde vas a enlazar la MAC de tu Arduino Ethernet Shield con una IP concreta.
  3. Abre el menú de para asignar la IP. Seguramente te aparecerá un recuadro para enlazar un MAC a una IP. Rellena los datos utilizando el MAC de tu Arduino Ethernet Shield y la IP que desees (por ejemplo 192.168.1.177) y asegúrate de guardar los cambios.
Si has conseguido llegar a este punto, mi más sincera enhorabuena. Entiendo que todos estos datos son realmente abstractos y puede resultar complicado para alguien sin experiencia. En caso de que estés teniendo algún tipo de problema, aquí estamos para ayudarte, así que relájate, toma aire y deja tu comentario. Intentaremos ayudarte.

Puertos del Router



Si has completado los pasos anteriores no deberías tener ningún problema en crear tu propia red de área local, es decir, si el proyecto que vas a implementar con tu Arduino Ethernet Shield únicamente necesita conexión entre los elementos de tu casa (del Router hacia dentro) no necesitas tocar nada más. Ahora bien, si tu idea es utilizar tu sistema desde cualquier parte del mundo debes permitir el acceso a tu sistema.
Gracias a que en el paso anterior conseguiste darle una IP fija a tu Arduino Ethernet Shield, ahora será muy fácil abrir únicamente el puerto que va a utilizar tu shield de Arduino.
De nuevo todo esto lo tienes que hacer desde tu Router. Los pasos a seguir son los siguientes (todo esto te sonará si, en su día, ya abriste los puertos del eMule):Abrir-Puertos-Arduino-Ethernet
  1. Debes buscar en los menús de tu Router algo tipo NAT, Virtual Servers o Port Forwarding. El nombre varía en función del Router pero vas buscando modificar los puertos así que puedes guiarte por la palabra “Port”. Si no terminas de encontrar la manera de llegar a ese menú, no te costará mucho dar con él con una rápida búsqueda en Google (poniendo el modelo de tu Router).
  2. Una vez estés en menú de puertos de tu Router, activa la opción de Port Forwarding y, para la IP local que le diste a tu Arduino Ethernet Shield, abre un puerto (típicamente el puerto 80 aunque puedes abrir otros como el puerto 5400). De nuevo no te olvides de guardar los cambios.

Conexión Router – Internet



Hasta ahora has conseguido que tu Router siempre le de la misma IP a tu Arduino Ethernet Shield y que este tenga acceso a Internet. En realidad ya está todo hecho. El único problema es que a la hora de acceder desde fuera de tu red local a tu shield de Arduino desconoces qué dirección tiene, es decir, no sabes qué IP tiene tu Router. Para solucionar este problema tienes varias opciones:

Contratar Una IP Estática


Como ya te he dicho antes, si contratas una IP estática no tendrías que preocuparte por saber en cada momento cuál es la dirección de tu Arduino Ethernet Shield. Puedes hablar con tu proveedor de Internet y, por un poco más de dinero al mes (depende del proveedor pero no suele ser excesivamente caro, entorno a 1€), bastaría con que recordases esa dirección para acceder en cualquier momento y desde cualquier sitio a tu sistema domótico.

Dejar Tu IP Dinámica


Si acostumbras a mantener tu Router siempre encendido debes saber que tu IP no cambia cada cinco minutos. De nuevo, depende del proveedor. Normalmente cambiará una vez por semana por lo que si estás frecuentemente en casa y consultas tu IP con regularidad (puedes ver cuál es tu IP pública en este link), puedes ahorrarte dinero y esfuerzo y utilizar este método. Ten en cuenta, eso sí, que si tu IP cambia y no estás en casa para consultarla, no podrás acceder al sistema.

Utilizar Un Servicio de DDNS


DDNS-Arduino-Ethernet-ShieldEste es mi método favorito. El sistema de las DDNS consiste básicamente en un dominio (como lo es en esta página www.educachip.com) que está asociado en cada momento a tu IP actual, es decir, un nombre fijo elegido por ti (y por lo tanto más fácil de recordar que una dirección IP) que esté siempre actualizado y dirija la conexión hacia tu Arduino Ethernet Shield.
El problema de este método es que depende de tu Router. Existen muchos servicios tanto de pago como gratuitos de DDNS y cada Router soporta unos u otros. Que tu Router no soporte uno en concreto no implica que no puedas utilizarlo pero deberás descargarte la aplicación correspondiente de ese servicio DDNS y actualizar la IP desde el ordenador, es decir, tendrás que tener un ordenador siempre encendido, por lo que lo mejor es que utilices uno de los que tu Router soporta para que la actualización de la IP se haga desde el Router, sin necesidad de aplicaciones.
Los servicios de DDNS de pago rondan los 20€ (25$) al año. No es muy caro (cuesta más o menos lo que tener una IP estática) pero en mi opinión es mejor que realices un único pago y te compres un buen Router que soporte DDNS gratuitas (lo que además, dependiendo del Router que tengas ahora, puede incluso mejorar la velocidad de tu red). Sea cual sea tu elección aquí te dejo unos cuantos servicios de DDNS para que elijas el que más te convenga:
  • DynDNS: Servicio de pago (desde hace poco tiempo) pero líder en el sector y uno de los más soportados por los Routers.
  • Donweb: Gratuito y en Español pero relativamente nuevo y poco habitual en los Routers. Es el que yo utilizo y actualmente estoy intentando conseguir que funcione desde un Router que no soporte este sistema (ya te iré contando mis avances).
  • No-IP: La alternativa típica a DynDNS. Es gratuito pero requiere que reactives la cuenta una vez al mes y lo utilices desde un PC.
  • Namecheap: A parte de dominios a muy buen precio, esta web ofrece servicio de DNS dinámico gratuito.
  • TZO: Pertenece a la misma empresa que DynDNS y, como te puedes imaginar, tanto su precio como su disponibilidad en Routers es similar.
Como a pesar de que cada página tiene sus peculiaridades todas funcionan de forma similar, no voy a entrar a explicarte como conseguir tu servicio de DDNS. Basta con que entres en la página que prefieras (lo ideal es que sea una soportada por tu Router), te hagas una cuenta como harías en cualquier otra web y accedas a la sección de DDNS. Si tienes algún problema realizando este proceso puedes dejar tu comentario al final del post.
Una vez tengas tu DDNS entra de nuevo en la configuración de tu Router (aprendiste cómo hacerlo al principio de este artículo), accede a la sección de DNS dinámicas y escribe en las zonas correspondientes tanto el nombre de dominio como tus datos de usuario.

Actualizar DDNS Con Arduino



En el paso anterior te dije que si tu Router no soporta un determinado sistema de DDNS, tienes que descargarte una aplicación y tener tu PC encendido siempre. Esto no es del todo así ya que puedes implementar un código que haga que tu Arduino Ethernet Shield actualice automáticamente la IP.
No es el tema de este post así que dejaré la explicación en profundidad de este método para otra ocasión. Aun así, está bien que sepas que se puede hacer (por si quieres investigarlo). Ten en cuenta que este método te aporta versatilidad (porque no dependes del Router y puedes implementar el sistema en distintos sitios sin necesidad de realizar tantos cambios) pero añade carga de trabajo y espacio al microcontrolador cuando puedes dejar que eso lo haga el Router.

Código



Ahora que ya eres un experto en redes, programar tu Arduino Ethernet Shield debería ser pan comido. Aun así te voy a dejar dos códigos para tu Arduino:
  • El primer código es el proporcionado por el propio equipo de Arduino, al que le he modificado los comentarios para que te resulte más fácil entenderlo, modificarlo y lo adaptes a tu propio proyecto sin problemas.


  • Este segundo código te va a encantar. Es una muestra de que la pequeña capacidad de un Arduino no está reñida con la calidad y se puede crear una web funcional y a la vez estética. No es creación mía. El código HTML lo ha realizado un webmaster y diseñador web de categoría. Calidad, eficacia, eficiencia y estilo son su seña de identidad. Si este tema te interesa, te recomiendo que le eches un vistazo a sus perfiles en las redes sociales. Actualmente está empezando un nuevo proyecto, un startup que sin duda nos dejará boquiabiertos. Los comienzos nunca son fáciles pero él lleva la clave del éxito en el ADN.


Aquí te dejo una muestra de cómo luce el resultado.
Arduino-Ethernet-Shield-EducaChip

Material Necesario



Para construir tu sistema domótico necesitas una Placa Arduino y un Shield de Ethernet. Puedes hacerte con ellos a muy buen precio aquí:

Información Adicional



Ya dispones de todos los conocimientos necesarios para crear tu propio sistema domótico (o cualquier otra aplicación similar) con Arduino Ethernet Shield. Sin embargo, este tipo de proyecto suele dar bastantes problemas (conexión de redes, problemas de firewall, etc.). Aquí te muestro una lista con conceptos que te serán útiles:Placa-Arduino-Ethernet
  • Recuerda que para acceder a tu sistema tienes que escribir en el navegador (en la zona donde habitualmente escribes las URLs) tanto la IP (pública si estás fuera de tu red de área local y la asignada a tu Arduino si estás dentro) como el puerto. Debería quedar algo tipo: 12.34.567.890:80 donde los :80 son el puerto que le has asignado a tu Arduino Ethernet Shield. En caso de que utilizases DDNS tendrás que poner el nombre de tu sistema DDNS (el mismo que añadiste al Router) seguido de :80 (o el puerto que hayas utilizado).
  • A parte de con el Arduino Ethernet Shield y tu placa de Arduino habitual, puedes implementar este sistema en unArduino Ethernet, una placa que ya incorpora los elementos necesarios para la conexión a la red.
  • Muchos de los proyectos con conexión a Internet ocupan más kb de los que puede proporcionarte una placa de Arduino UNO, así que si quieres hacer algún sistema relativamente te recomiendo que utilices una placa Mega.
  • A la hora de configurar el MAC de tu Arduino y asignarle una IP puedes probar a cambiar el rango de direcciones IP que asigna tu protocolo DHCP. Asignándole a tu Arduino Ethernet Shield una IP fuera de ese rango, ésta no debería cambiar.
  • Cuando has implementado el código de tu conexión Ethernet has iniciado el sistema con:

    Puedes iniciar la conexión simplemente con:

    El propio Arduino se adaptará al protocolo DHCP y buscará su IP. Debes tener en cuenta que dicha IP puede cambiar (si no seguiste los pasos correspondientes de configuración del Router) y tendrías que reiniciar tu sistema para que la IP de tu Arduino Ethernet Shield se volviese a actualizar. Además el tamaño de tu sketch incrementará considerablemente.
  • Aunque hayas abierto los puertos e insertado todos los datos correctamente, es posible que tanto el Firewall de tu ordenador como el de tu Router bloqueen la señal. Comprueba que tu firewall esté funcionando de acuerdo a lo que quieres.
  • Si a pesar de todos tus intentos el Firewall sigue dándote problemas, puedes acceder a la configuración de tu Router y buscar el término DMZ. Insertando la IP de tu Arduino Ethernet Shield en la sección DMZ consigues que a esa IP no le afecten los cortafuegos.
  • Si utilizas un Proxy, asegúrate de configurarlo (de la misma forma que hiciste con tu Firewall).
  • Es posible que por un puerto concreto en tu conexión (por ejemplo el puerto 80) haya más de un sistema en tu red de área local enviando y recibiendo información. Si esto ocurre la conexión no se realizará correctamente y tu sistema fallará. En ese caso puedes probar con otros puertos como: 5400, 5500, 5600, 5700, 5800 u 8080.
  • Algunos cables de Ethernet tienen los pines permutados. Para que lo entiendas es como si el pin 2 en un extremo fuese el receptor y en el otro el transmisor. Esto no sucede con todos los cables y en general no suele ser un problema con los ordenadores actuales (que están preparados para realizar la permutación internamente si es necesario) pero sí a la hora de conectar tu Arduino Ethernet Shield. Si has seguido bien todos los pasos y ves que no funciona, puede ser simplemente porque el cable no sea el adecuado.
  • Cuando creas una página web como la que has visto antes, necesitas utilizar hojas de estilo (CSS). CSS añade muchas líneas de código a tu sistema (y en mi experiencia da bastantes problemas). Puedes optar por una solución alternativa como la que se ha seguido en este post, donde las hojas de estilo están alojadas en Tumblr.



Una vez más esto ha sido todo. Como ves, no hay excusa para que te pongas manos a la obra y controles tu casa desde Internet. Puede que no sea el proyecto más simple pero con un poco de paciencia te harás con él enseguida, estoy seguro.
Mucho ánimo y acuérdate de compartir este post en tus redes sociales favoritas. Además, puedes suscribirte al blogpara no perderte ninguna entrada.

No hay comentarios:

Publicar un comentario