domingo, 26 de mayo de 2013

Servidor web con arduino.

Dicen que para poder vencer a tu enemigo, lo mejor es conocerlo a fondo. No quiero decir con esto que la plataforma Arduino sea un enemigo, pero como ya sabéis los que me conocéis, o los que habéis leído alguna entrada mía sobre la que hablaba de la plataforma, no es un producto que me entusiasme demasiado. No voy a entrar en las razones, ya que me harían falta 3 o 4 entradas, y no lo veo necesario. Todo esto no quiere decir que no sea una plataforma muy utilizada por aficionados a la electrónica, por tanto, tiene cabida en este blog, y mas aún cuando existe una forma muy sencilla de hacer un servidor web, reducido, en esta plataforma con solo un archivo de código y de forma muy rápida, además de barata. Hace tiempo que las placas arduino están cada vez más baratas, por lo que por unos 12 o 13 euros podemos hacernos con una placa Arduino UNO, con lo que ya tendriamos nuestra placa con el procesador, pero además nos hará falta la shield para conectarnos a internet, y para esto existen 2 principalmente. Una placa que monta un controlador W5100, el cual se maneja con 4 pines SPI, o existe otra que utiliza un ENC28J60. El precio de ambas es diferente, la primera la podemos encontrar por 6 o 7 euros, mientras que la segunda la encontramos por 15 o 16 euros. Como el código de ejemplo que nos proporciona la comunidad arduino está hecho para la primera, es esta la que he comprado, por lo que 12 euros de la placa, y 6 euros de la Ethernet Shield, con 18 euros podemos montar un servidor sencillito, que para muchisimas cosas nos puede servir perfectamente.


Como he dicho, para hacer mi servidor, he utilizado el ejemplo que encontramos en el mismo IDE de Arduino, que es realmente básico, ya que solo muestra texto con los valores de los canales analógicos, que en mi opinión es muy pobre, ya que apenas ocupa la mitad de la memoria de AVR, pero bueno, para mejorarlo estamos los ingenieros de verdad. A diferencia de si utilizamos un microcontrolador de microchip con el Stack, para arduino no he encontrado ningún programa que pase una página hecha en html a un codigo compilable en C, no digo que lo no haya, pero no lo he encontrado, por lo que la página debemos meterla por código en el microcontrolador, con lo que escribir una página se hace bastante tedioso. En mi caso he diseñado una página muy sencilla desde la cual monitorizamos la temperatura de la habitación y podemos encender o apagar un ventilador. El código de la página que se debe introducir en el microcontrolador es el siguiente,
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");  // the connection will be closed after completion of the response
client.println("Refresh: 5");  // refresh the page automatically every 5 sec
client.println("");
client.println("");
client.println("");
client.println("index.htm");
client.println("");
client.println("SERVIDOR WEB ARDUINO UNO");
client.println("================================");
client.println("Autor:   P.Trujillo");
client.println("mipsandchips.blogspot.com.es");
client.println("Fecha:   05/2013");
client.println("================================");
client.println("CONTROL DE TEMPERATURA DE UNA HABITACION");
client.println("La temperatura de la habitacion es ");
client.println(temp);
client.println(""); 
client.println("El ventilador esta ");
if(estado_vent)
       client.println("ENCENDIDO");
else
       client.println("APAGADO");
client.println(""); 
client.println("Forzar el ventilador a un estado");
client.println("
"); client.println(""); client.println("
"); client.println("");
A continuación os pongo un vídeo del funcionamiento del sistema:

Como veis es muy sencillo implementar un pequeño servidor web en una placa Arduino UNO, aunque se hace muy pesado introducir páginas relativamente complejas en el. Existe una opción para meter la página en una tarjeta SD, pero si lo comparamos con el servidor web que estoy haciendo con PIC, en el que no utilizo sistema de almacenamiento externo, creo que este ultimo gana por goleada, en primer lugar por facilidad de introducir la página web, en segundo lugar por orden en la programación, cada cosa tiene su archivo diferente, uno para los callbacks y las variables dinámicas de la página web, otro archivo para el código principal, podemos elegir para cada aplicación un procesador adecuado... En cuanto a facilidad de programación, está claro que gana Arduino, aunque si el servidor web de Microchip solo funcionara en un micro, y todos lo hicieran igual, quizás sería más sencillo, en definitiva, ha sido una buena experiencia, y muy válida para realizar algo sencillo y muy rápidamente, en apenas 1 hora tenia funcionando el sistema, mientras que la primera vez que me puse con la pila TCPIP necesité una semana, a ratos, para hacerlo funcionar.

24 comentarios:

  1. ¿Y esa diferencia de precios entre placas a que se debe? ¿simplemente por el chip que gasta? Me gustaría probar alguna, pero también me gustaría saber si llevan PoE y/o wake-on-LAN, puede ser muy útil para redes de sensores.
    Ojo que la Ethernet de Arduino no funciona sólo para Arduino hay cientos de placas "Arduino compatible" que pueden ser tanto compatibles pin a pin, como compatibles en programación usando las mismas librerías, por ejemplo la última que me encontré llevaba un Atmel con radiofrecuencia y la anterior tenía un Atmel y un ARM conectados pero para los fans de Microchip también tenéis la Pingüino.

    ResponderEliminar
    Respuestas
    1. prefiero poner como ejemplo de las de microchip las chipkit. respecto a la diferencia de precios, no lo se, pero es mucho más fácil encontrar una con el W5100 que con el enc28j60. Esta placa no lleva PoE, respecto al WOL no es necesario, ya que el consumo de los micros es bastante pequeño comparado con el consumo de los periféricos, así que podrias hacerlo por soft.
      Ya se que funciona con todas las equivalentes arduino, he visto videos incluso funcionando en las chipkit, pero si por ejemlo se te queda corta la arduino UNO mientras estás en un proyecto, no vale con cambiar el micro y ya, sino que has de comprar otra placa, mientras que si tu utilizas, por ejemplo, un pic24 de 28 pines y 64k de flash, y se te queda corta, tan solo has de cambiar el micro por uno de 128k y solucionado. Si quieres una ethernet shield en ebay las tienes baratas, la compras, esperas un mes o menos, y ya tienes tu servidor web :)

      Eliminar
  2. Muy buenas.
    Me gustaria presentarte este proyecto, permite la conexión remota a un servidor web arduino sin que tengamos ip estatica.

    Solo hay que añadir unas cuantas lineas de codigo al programa arduino y utilizar la aplicacion android para recuperar la ip publica que tiene nuestro router.
    Mas info en este enlace
    http://excontrol.es/Domotica-Arduino/Arduino-WebServer/Default.aspx

    Espero que te guste, un saludo

    ResponderEliminar
    Respuestas
    1. Hola Roberto! la finalidad del proyecto que expones se puede conseguir también redirigiendo nuestra IP mediante un servidor DNS. Actualmente existen servidores DNS gratuitos, por ejemplo http://www.noip.com/. La ventaja de utilizar un servidor de estos frente a lo que expones son a primera vista 2, la primera es que no añadimos código al arduino, cosa que es de agradecer ya que las placas arduino no se caracterizan por tener una gran cantidad de memoria, y la segunda es que no necesitamos aplicaciones externas. De todas formas gracias por compartirlo!
      Un saludo.

      Eliminar
    2. Muy buenas otra vez.

      No se si todos los servidores dns gratuitos funcionan del mismo modo, yo probe el noip.com pero claro tenia que tener un ordenador encendido todo el dia para que refrescara la ip en sus servidores, con todo el gaste electrico extra y tal.

      En cuanto a la memoria del programa para arduino solo comentarte que apenas utiliza un puñado de lineas de codigo con lo que el gasto de memoria es practicamente despreciable <1%.

      Un saludo

      Eliminar
    3. Hola! la verdad es que no sabia como funcionaban esos servicios. De ese modo lo que propones está muy bien, solo tengo una duda. El móvil con android entiendo que debe estar en la misma red que el servidor no? o puede estar en otro lugar?

      Eliminar
    4. No no , se trata precisamente de eso, poder conectarte con la red 3g de tu movil al servidor web que tengas en tu casa sin conocer la ip que este presenta, vamos una conexión remota....

      No obstante la ip de tu servidor si que debe ser conocida dentro de tu red local, ya que tienes que abrir el puerto 80 del router hacia esa ip para permitir conexiones externas.

      Un saludo, por cierto me encanta tu blog y que sepas que te tomo ""prestadas"" muchas ideas... espero poder devolverte alguna...

      Eliminar
    5. Me alegra que te guste el blog, se hace lo que se puede!! se trata de que podáis coger "prestadas" todas las ideas que se exponen para mejorarlas.
      En cuanto al proyecto, me gustaría probarlo, pero, aunque parezca mentira, no tengo ningún móvil con android en casa... además que con mi router, no se porqué nunca me deja acceder desde fuera a un servidor, ya lo probé conociendo mi ip... de todas formas en cuanto publique todas las entradas de los ARM retomaré un poco el servidor web, ya sea con arduino o con PIC.
      Un saludo!! Gracias por pasarte!

      Eliminar
    6. Buenas:

      PAra no tener encendido el PC todo el día y gastando mucha luz, mejor usa el DynDNS, hay router que incluyen l afacilidad de configuración y no necesita tener el PC encendido, solo el router que consume mucho menos.

      http://www.adslayuda.com/smc7804-configuracion_dyndns.html

      Un saludo.

      Eliminar
    7. Muchas gracias por la información Meta. Lo he comprobado en mi router y no he visto nada, de todas formas lo seguiré intentando. También es verdad que mi router es uno muy básico, nada que ver con un linksys. Muchas gracias por pasarte!

      Eliminar
  3. Hola que tal amigo, antes que nada felicitaciones por tu blog la verdad muy interesante.

    Te comento que me estoy iniciando con la electrónica y se me hizo muy buena opción Utilizar Arduino para llevar acabo un proyecto. El cual contempla lo que tu publicaste, por ello te pido si esta dentro de tus posibilidades, darme mas información. necesito apagar un aparato de forma remota y también medir la temperatura de una habitación, estuve leyendo que hay un sensor de temperatura para arduino el DHT22/AM2302.

    Que material necesito ? y cual seria la conexión ? tomando en cuenta que ya tengo el Ethernet Shield W5100 y Atmega328.

    Espero tu respuesta. Gracias!!

    ResponderEliminar
    Respuestas
    1. Hola! lo primero sería saber si lo quieres hacer sobre una página web, o si lo quieres hacer sobre un programa hecho, por ejemplo, en visual basic. En cuanto a los componentes van a depender del tipo de aparato al que te refieras. Podrias hacerlo con un transistor y un relé, y el sensor de temperatura directamente al arduino. la conexión del relé sería así http://farm4.static.flickr.com/3247/2482023238_957c4c3be3_o.jpg.
      El transistor puede ser un 2n3904, y el relé pues uno de 5 voltios, así lo puede alimentar desde el mismo conector USB, o si tienes opción de utilizar una fuente de 12 voltios,pues coges uno de 12 voltios, ya que así reducirás la corriente que necesita.
      Un saludo.

      Eliminar
  4. Hola buenas, me a gustado mucho tu proyecto y es justo lo que llevo tiempo buscando, mi idea es crearme un termostato accesible por internet desde web (estaria bien desde iphone y android, pero eso ya me supera y no pienso pagar por la developer de apple).

    En principio quiero empezar con tomar la temperatura de la habitacion y encender y apagar la caldera desde los cables del termostato de la misma (creo que van a 24v y solo habria que poner un rele para cerrar y abrir el circuito).
    El segundo paso seria fijar desde web una temperatura con un rango de +-0.5grados y que el solo encienda y apague la caldera cuando tu desde web le des a on.
    Y ya por ultimo ponerle un reloj y fijar una hora de encendido y apagado.
    Es mi primer proyecto con arduino, asi que me vendria muy bien saber que sensor has cogido para medir la temperatura, y el codigo que has utilizado para realizar este proyecto.
    Muchas gracias de antemano

    ResponderEliminar
    Respuestas
    1. Para tu proyecto bastaria con un sensor de temperatura integrado, por ejemplo un LM35, o equivalente. Para un proyecto como el que tu quieres deberías proteger con contraseña la página web, eso no lo he hecho nunca, pero bueno, para las primeras pruebas podrias hacerlo como el mio, pero para el proyecto final deberías hacer lo de la autentificación. Respecto al código, he cogido el que hay de ejemplo de arduino, cambiando la página web. Gracias por pasarte si tienes más dudas dímelo y te ayudare en lo que pueda.

      Un saludo!!

      Eliminar
    2. Muchas gracias por tu respuesta tan rapida, al final me e decidido por la xboard relay (lleva chip mega e integrada la ethernet y dos reles), y de sensor el dht11. A trastear un poco cuando llegue. Me podrias pasar el enlace del ejemplo que dices? es que no lo encuentro

      Eliminar
    3. Hola! pues el código lo puedes encontrar tambien en la página de arduino. http://arduino.cc/en/Reference/Ethernet ahi tienes todos los codigos compatibles con la comunicación ethernet. no se si valdrán tambien para esa placa, la verdad es que no la conocía... Un saludo!!

      Eliminar
  5. Hola:

    Muy bueno el servidor Web. Ya que cuesta hacer hasta enlaces de un html a códigos desde Arduino, el "Servidor Web", he pensado aunque no lo he probado aún usar un editor de html, como el DreamWeaver CS6, también hay gratuitos y sencillos. Puedes poner lo botones que quieras, hacer el diseño que quieras que no ocupe mucha memoria, solo lo justo, miras el código fuente línea por línea y lo introduces en el microcontrolador. Si tienes la posibilidad de hacerlo, es un buen intento. Gracias a tus vídeos tutoriales me has animado conseguir dicha placa, antes, debo observarla mejor hasta que punto es de potente este Servidor Web, me refiero sus posibilidades y lentitud.

    Esa placa parece que tiene memoria SD para incorporar, lo que no se hasta cuanto gigas cabe. ¿16 GB? Bromas a parte, tampoco necesitamos tanta. Hay que saber si es posible introducir una Web dentro de la SD, con algunas imágenes incluídas. Las imágenes pueden ser un pequeño logo (no es necesario) o otras imágenes hasta un Led apagado y otro encendido, si es posible, imagenes gif para ahorrar memoria. Los routers tienen una Web dentro y muchos de ellos funciona bajo AVR de Atmel.

    En cuanto a hacer en la Web principal index.html un Login y Password, lo he hecho y no es tan complicado, más bien te vuelves loco organizarte como diseñar una base de datos si es en un PC. En el Web Server no tengo idea porque no creo que use bases de datos como MySQL para guardar nombre y contraseña de cada usuario que entre. Se que el RaspBerry Pi es capaz de hacerlo porque usa Linux y Python. Puede que haya otros métodos, guardar esos datos en el propio microcontrolador, hasta los estados de los Led.

    Muy buen artículo. Ojalá sigas haciendo experimentos con el Web Server, bien haciendo una Web com te indiqué arriba para probar, y meterla en una memoria SD a ver que tal.

    Tienes la última palabra, ya que esto requiere tiempo y ganas de motivación.

    ResponderEliminar
    Respuestas
    1. Hola! Gracias de nuevo! la verdad es que no soy muy aficionado a Arduino, pero no deja de ser una plataforma muy muy utilizada. De hecho como verás por el blog he montado servidores en PIC18, y PIC24 también, y en cuanto a capacidades creo que están muy por encima de este. Tambien es verdad que yo aquí he utilizado un Arduino UNO, la capacidad aumentaria muchisimo utilizando un Chipkit UNO o incluso un Arduino DUE. Miraré lo de la SD aunque seguro que no es complicado. La mayor pega que tiene este codigo es que la página web se introduce mediante codigo, lo cual si queremos meter una página un poco elaborada no es tarea corta ni sencilla. En cuanto a las imágenes, seria posible alojarlas en otro servidor web, y que nuestro pequeño Arduino las cargue cada vez, aunque en este caso estamos a merced de nuestra conexión a internet. Volveré a retomar este tema a ver si puedo habilitar la tarjeta sd.
      Un saludo.

      Eliminar
  6. Buenas:

    Tampoco soy muy de Arduino, llevo esta semana informándome sobre él, para probar algo nuevo no está mal, también le hecharé un ojo a Raspberry Pi, cuando saquen otra versión nueva en el 2014, ejejejjeje.

    He visto que hiciste algo con los PIC, por lo que veo, parece complicado el tema del USB. Aún mi base principal son los PIC de toda la vida. Sería bueno que tenga apoyo tipo Arduino para los nuevos.

    Un Web Server cuando lo iba a comprar costaba más de 240 € en el 2008 el barato, ejjejeje. Para que no sea lento, se recomienda un PIC32 de los nuevo s a 200 MHz.

    http://electronica-pic.blogspot.com.es/2013/11/nueva-gama-pic32mz-de-32-bits-de.html

    Aún así, con Arduino para empezar el tema de los Web Server no está mal. Un router tiene un un AVR que hace de Web Server, configurar datos. LinkSys es muy buena marca para hacer muchas cosas, no la que te da telefónica cada vez más básico. LinkSys cuesta muy caro porque tiene muchas funciones de todo tipo. Si las usa, vale la pena. Es para hacerte una idea. Algunos router puedes conectarlo bajo Telnet de Windows o el SSH de Linux, es una ventaja que un PIC puede controlar.

    Puedes comentar más a fondo para sacarle ideas sobre tu impresión sobre ella.

    El tema de la SD para guarfar imágenes y páginas html puro me da la impresión que si se puede hacer. ¿Entonces, para qué está la SD? No creo que esté de adorno. No niego que también sirva para hacer un dataloger, ejejjejej.

    En cuanto al Web Server, muchos ánimos. Lo estaré siguiendo y aportando ideas.

    ResponderEliminar
  7. Hola:

    Sobre la placa que usas para servidor Web, me imagino que está solo el IPv4.

    ¿Funciona también para la IPv6?

    Si no es así, no te extrañe que vengan el nuevo compatible con el IPv6. En Raspberry funciona de maravilla con las dos porque tiene Linux directamente.

    Sigue con los experimentos de los microcontroladores.

    Buen trabajo.

    ResponderEliminar
    Respuestas
    1. Hola Meta. El stack de microchip que yo utilizo no tiene la posibilidad de utilizar IPv6. No se si ya hay algún stack que lo pueda implementar. En el caso de que lo haya supongo que estará para PIC32.
      Un saludo!

      Eliminar
  8. buen proyecto, fecilidades sabes, como puede encender y apagar un led, apartir de una web alojada en la memoria de la ranura de la ethernet shield
    espero me puedas ayudar. saludos.

    ResponderEliminar
    Respuestas
    1. Hola! pues para hacer eso debes crear una página web en AJAX. Te pongo un enlace a un tutorial muy bueno.
      http://startingelectronics.com/tutorials/arduino/ethernet-shield-web-server-tutorial/SD-card-web-server/
      Un saludo!

      Eliminar
  9. Felicidades Pablo por todos tus conocimientos, yo estoy tratando mi segudo aire en esto encontrando que Arduino es lo mas comercial y aquí me encuentro tratando de tener una casa domotica mi problema es poder tener un Proxy de prueba para después poder continuar haciendo algunas pruebas. Saludos

    ResponderEliminar