lunes, 29 de junio de 2015

Arduino , Ethernet Shield y algo de HTML

Repasando la entrada anterior, me gustaría comentar algunos puntos que no se tocaron y que pueden resultar de interés.
El primero tiene que ver con el hardware del ejemplo. Hay mucha variedad de Ethernet Shields en el mercado. Os recomendé un par que son compatibles con el Arduino, hay muchas más, pero debéis fijaros que el CHIP que use sea el W5100 Ethernet controller IC , para evitar problemas de compatibilidad.

 El siguiente punto, también de hardware tiene que ver con el consumo de ese chip. Puede llegar a ser muy alto, y además de calentarse, y de qué manera, es necesario alimentar el ejemplo con una fuente de alimentación externa, pues vuestra conexión USB no dispone de la potencia necesaria. Si aún no lo habíais hecho, es un buen momento para hacerse con una fuente externa de 9 V para alimentar vuestro Arduino.
El último punto relacionado con el hardware,  tiene que ver con los pins 10,11,12 y 13 del Arduino. Estos pins se usan para la comunicación con la Ethenet shield, por lo que no podrán ser usados para otro fin cuando se use con esta ampliación.
El resto de puntos que me gustaría tratar, están relacionados con el código del sketch de ejemplo. Al final lo que conseguimos es convertir nuestro Arduino en un servidor web.  La página mostrada es de una sencillez máxima,(es un ejemplo “demo”)  y tampoco veréis grandes florituras en los ejemplos míos  que vendrán, pues mis conocimientos de HTML son básicos.
Pero me gustaría desarrollar un poco las líneas más básicas de código HTML para mostrar la información de una manera mínimamente inteligible.
Hasta ahora, en algún ejemplo como este, habíamos usado la instrucción serial.print(); para mostrar la información que queríamos en el Monitor Serial.
Sin embargo en este ejemplo usamos la instrucción :

client.println();

Entre los parantésis podemos escribir desde un texto entre comillas:

            client.print("analog input ");


O el valor de una variable cualquiera:

            client.print(sensorReading);


Salto de línea, mostrará el siguiente valor o texto en otra línea:

            client.println("<br />");      


Y dos líneas imprescindibles que marcan el inicio y el final de un código en HTML:

            client.println("<html>");


Y
          client.println("</html>");


Otra instrucción también interesante, es la que controla el tiempo de refresco de la página. En el ejemplo del día anterior era cada 5 segundos:

client.println("Refresh: 5"); // refresh the page automatically every 5 sec

Eso es todo de momento. Espero hayáis podido configurar vuestra Ethernet Shield y el router sin problemas, pues seguiremos avanzando en las próximas entradas en estos temas.

viernes, 12 de junio de 2015

Conectando nuestro Arduino a Internet

Es momento de abrir al mundo nuestro Arduino. Vamos a configurar todo lo necesario para conectar a internet nuestro Arduino através de una shield Ethernet.

Este post veremos cómo configurar nuestro entorno de trabajo para poder sacar partido de esta shield, que creo que es de las más productivas que podemos encontrar. Veremos cómo configurar el router, como parametrizar la shield Ethernet y un sencillo ejemplo que puede servir de base para desarrollar otros proyectos.

Los requisitos necesarios para poder sacar partido de este ejemplo son:

-       - Placa Arduino UNO, o compatible, por poco más de 6€
-       - Placa shield Ethernet  compatible, un coste similar de unos 6 €
-       - La librería Ethernet, http://arduino.cc/en/Reference/Ethernet
-       - Sería recomendable, tener nociones de HTML,
-       - Un router conectado a internet, y sus instrucciones si es posible
-       - Cable RJ-45
-       - Paciencia y algo para hidratarnos que ya empieza a hacer demasiada calor
-       - Opcionalmente, ya  lo explicaremos, un IP fija o servicio DDNS equivalente

Vamos a ello,

El router


Antes de seguir, debo advertir que este ejemplo está realizado con mi router. Se trata del que facilita  mi proveedor de internet (no lo nombraré hasta que no me paguen por ello ),  y hay que advertir que cada modelo gestiona las opciones de configuración de manera distinta. La parte positiva, es que de todas maneras las opciones suelen ser bastante similares y no difieren mucho de un modelo a otro.
En cualquier caso, podéis localizar mucha información sobre configuración de routers en páginas como esta www.adslayuda.com

¿Preparados? Bien, pues lo primero es conocer en que dirección IP podemos configurar nuestro router. Podemos mirar si físicamente tiene alguna pegatina, (versión cutre pero efectiva), o lanzar unos comandos desde nuestro ordenador.

Si utilizas Windows, los pasos son estos:
 -  Botón de inicio y busca ejecutar
-      -  Teclea en la pantalla cmd y enter ( Estos dos pasos son equivalentes a pulsar Tecla windows + R)
-      -  Tendrás ahora una ventana con fondo negro del tipo MS-DOS, teclea ipconfig y enter

-        En la pantalla que te habrá salido, busca la línea Puerta de enlace predeterminada, esa es tu dirección IP.




 Ahora con tu dirección IP, abre una pestaña de tu navegador favorito y pega el número tal cual en la barra de direcciones. 

Según el ejemplo : http://192.168.1.1

Te saldrá la pantalla de bienvenida de tu router, y los más probable, dos espacios solicitando usuario y contraseña.



Si no los sabes, puedes buscar con google, por tu modelo y/o operador de internet. Este sitio te puede servir de referencia. Los más habituales:

-        Usario:  admin, user,(en blanco)
-        Contraseña: admin, user, 1234,(en blanco)

Llegados a este punto, deberíamos haber sido capaces de acceder al entorno de configuración del router.  El siguiente paso es :

Asignar una IP al Arduino


Ahora, necesitamos que cada vez que nuestro Arduino se conecte a nuestra red local, lo haga siempre a la misma dirección. Si no lo configuramos, el router va gestionando las direcciónes IP de manera automática y toalmente aleatoria, y nosotros necesitamos que sea siempre la misma.

¿Cómo? Primero asignaremos a nuestra shield un identificador único. Esto lo hacemos desde el void setup, configurando el MAC de la placa. Podéis profundizar más sobre el tema aquí, pero básicamente se trata de un identificador con la dirección física del dispositivo, lo tiene cualquier aparato que se conecte a la red, y la única premisa que debe cumplir es que no sea igual al de alguno de los dispositivos conectado en nuestra red. Por defecto, puedes usar :

0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED

Y la instrucción completa:

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

Si nuestro proyecto tuviese dos shields Ethernet este número debería ser diferente para cada una de ellas.

Podéis comprobar las direcciones MAC de los equipo conectados buscando entre las opciones del router algo del tipo Device Info - > DCHP, donde os saldrá una tabla con las direcciones MAC de los dispositivos conectados la última semana.

Ahora es momento de localizar en el menú del router dentro de las opciones de DCHP, algo  parecido a DCHP estáticas, o asignaciones de MAC . Es el punto donde debemos escoger la dirección IP que asignaremos al Arduino y decirle al router la MAC que corresponde al Arduino. Una imagen de como queda en mi router.



Accediendo desde el “exterior”



Una vez completados los pasos anteriores ya puedes acceder vía IP desde tu red local al Arduino, y probar el ejemplo que hay más adelante. Tan solo tendrías que teclear la dirección IP que le hemos asignado dentro de la barra del navegador. Algo como esto http://192.168.1.177

Para poder acceder desde fuera de la red local, tenemos que decirle al router que permita las conexiones entrantes. Para ello habilitaremos un puerto, el nº 80 por ejemplo para permitirlo. A muchos les sonará esto del emule... para los que no deberemos buscar en el router un menú relacionado con puertos, NAT, virtual servers o similar. En caso contrario, una búsqueda en google con el nombre de vuestro equipo del estilo : abrir puertos router XXXXX, os solventará el problema.
 Recordad , puerto 80, y la IP que le hemos asignado al Arduino la 192.168.1.177 .






¿Esto es todo? No, I'm sorry. Falta saber la dirección IP que el proveedor nos asigna a nuestra conexión. Para eso teclear en vuestro navegador:

www.cualesmiip.com  o  www.sabermiip.es


Anotad la dirección que os aparece, cerrad el navegador y reiniciar el router. Ahora volved a teclearlo y comprobad si los números son iguales. No coincide ¿verdad? , es normal que no coincidan, eso significa que tu IP es dinámica, como la del 99% de los usuarios.
¿Que implica que tu IP sea dinámica? El número que te ha mostrado es tu dirección IP, tecleando desde cualquier parte del mundo accederías a tu red, o al menos al puerto 80 ( es el que hemos abierto).  Si es dinámica, cambiará ante cualquier incidencia ( corte de tensión o reasignación por parte del proveedor), y te impedirá acceder a tu sistema.

Tranquilo, esto tiene solución, no hemos llegado hasta aquí para abandonar ahora. Tienes al menos dos maneras para resolverlo:

1 .- Contratar con tu suministrador un servicio de IP estática o fija. El coste ronda los 30€ anuales. El inconveniente, al margen del precio, es que una dirección tan solo numérica es difícil de recordar.

2.- Contratar un servicio de DDNS. Los hay de pago o gratuitos, y lo que hacen es seguir tu IP dinámica y asignarla a un nombre de servidor ( de tu elección) que lo hace más fácil de recordar. El inconveniente es que tu router debe soportar este servicio. Algunos ejemplos de proveedores de este servicio pueden ser, DynDNS, TZO, NoIP (gratuito con reactivación mensual), DNSdynamic (gratuito). Configurarlo en tu router será tan sencillo como buscar la opción e introducir el usuario y contraseña asignados. Recuerda que el registro previo se ha decir vía web.



Recuerda que no es necesario, ni abrir puertos, ni configurar el DDNS para poder realizar el ejercicio propuesto. Esto sólo será necesario en caso de querer hacerlo funcionar desde fuera de nuestra red local.

Una forma rápida de comprobar si todo gira, uno de los ejemplos de los que vienen por defecto en el IDE de Arduino. Os recomiendo:

Archivo -> Ejemplos -> Ethernet -> WebClient

Abrir el navegador y poner la dirección 192.168.1.177 si estás conectado en tu red local (lo recomiendo para empezar), o tu dirección IP. Obtendrás una pantalla con 6 lecturas analógicas totalmente arbitrarias, pues no hay nada conectado.



Hay trabajo para rato con lo aquí propuesto para configurar vuestra red local, así que os dejo en este punto. El montaje consistiría únicamente en montar la shield encima del Arduino, alimentar el conjunto y conectar a la red local mediante un cable RJ-45. Poned los valores propuestos, pues son los que usa el ejemplo del IDE.

En la siguiente entrada habilitaremos el código para leer un TMP-36 y hacer una lectura real de temperatura. Nos vemos!