Ingeniería Civil Telemática Domotipi Servicio de domótica Víctor Collio Luis Castro Alfonso Contreras Luis Gálvez Rodrigo Araya 01/09/2013 201330031-6 201330027-8 201330014-6 201330047-2 201330044-8 Índice. Introducción……………………………......…………………………………..……..………..…………2 Procedimiento………………..…………………………………………………………….………………3 Programas………..………..……………………………………………………………………..……….…6 Electrónica…………………………………………………………….……………………………………..8 Conclusión………………………………………………………………………………………………….10 Referencias………………………………………………………………………………………….…..…10 Introducción Sabemos que como vivimos hoy en día, en un siglo marcado por el avance tecnológico que parece crecer de manera exponencial y cada vez más cercano a la mayoría de las personas alrededor de todo el mundo, muchas ideas que hace tan sólo unas décadas parecían sueños utópicos hoy se han hecho realidad y se han incorporado a la cultura y la sociedad de manera casi inherente, como es el ejemplo de la telefonía móvil o el mismo acceso a internet, más aún ahora con dispositivos que incorporan ambas cosas de manera simultánea y sin grandes limitaciones ya que existen equipos al alcance del cualquier bolsillo, hasta dispositivos que son un verdadero lujo. Es por esto que pensamos que para desarrollar ideas innovadoras debemos ser cada vez más ambiciosos, en el sentido de proponer ideas que parezcan utópicas y proponernos desafíos cada vez más interesantes, porque probablemente en el transcurso de llevar todo a cabo, ya se habrán dispuesto herramientas para mejorar la idea aún más. Y es por esta razón que como grupo decidimos proponer un proyecto enfocado a la domótica que nos permita seguir incluyendo ideas a largo plazo, seguir desafiándonos a conseguir un producto - o bien, un servicio - cada vez más completo y que pueda prestar más comodidad. Sin mucho más que decir, describiremos a grandes rasgos nuestro proyecto, al cual hemos llamado Domotipi, y procederemos a describir los pasos que seguimos para llevar a cabo el proyecto. El proyecto consiste básicamente en poder tener control de las luces de una casa - o en su defecto otro tipo de recinto - a larga distancia de manera cómoda, rápida y simple de usar, por medio de un mini computador de bajo costo, llamado Raspberry Pi. Esto lo hicimos a través de una interfaz web la cual se comunica con los archivos alojados dentro de la Raspberry Pi, los cuales controlan un puerto físico llamado puerto GPIO (General Purpose Input/Output) que se encuentra en uno de los extremos de la Raspberry Pi, estos transmiten impulsos eléctricos que podemos utilizar para un sinfín de cosas, muy interesantes dependiendo de la idea y la utilidad que se le den. Dichos impulsos eléctricos son los que nos permitirán encender las luces de a través de un circuito que considere los voltajes y la intensidad necesarios para una red doméstica, sin causar ningún peligro de dañar la Raspberry Pi, dando como resultado el control y la automatización del encendido de luces de manera remota. Las metas que nos propusimos fueron varias, ya que la domótica es un campo muy versátil. Entre los objetivos cumplidos, se encuentran encender luces desde una página web creada por nosotros, mecanismos de encendido por sensores de luminosidad, un pequeño sistema de seguridad que utiliza luz infrarroja y encendido de luces mediante un aplauso. Cabe decir que queremos seguir avanzando con este proyecto e incorporar comandos de voz para encender las luces, una base de datos que registre todos los cambios efectuados, enviar un mail de alerta cuando se active el sensor de movimiento entre otras cosas. Procedimiento Creemos que la manera más sencilla de explicar el procedimiento es partiendo desde lo que tenemos a simple vista, es decir la página web, hasta el encendido de la luz. Cabe destacar que nosotros utilizamos una maqueta con leds, dadas las limitaciones de tiempo y recursos; sin embargo el proyecto es totalmente aplicable a una red doméstica tomando todas las precauciones de cambio de voltaje e intensidad de la electricidad al momento de hacer la instalación, más adelante describiremos con más detalle cómo logramos encender una ampolleta conectada al circuito principal para demostrar lo que acabamos de decir. Página Web La página web está escrita en html básicamente, a pesar de que en su mayoría los elementos visuales son javascript dado que utilizamos un framework para Jquery llamado Kickstart(1), Jquery es una de las librerías más utilizadas para javascript por su sencillez, y dado que Kickstart es un framework que utiliza Jquery, nos facilitó mucho más el trabajo ya que el uso de este framework es tan intuitivo que hasta personas que no tengan muchos conocimientos de desarrollo web podrían utilizarlo, de hecho nos consideramos dentro de este grupo, y como ustedes verán en las fotos el resultado final es más que satisfactorio. Eso es en cuanto a lo visual, sin embargo lo más importante dentro de la página es el método por el cuál se envían los datos a la Raspberry; esto lo hacemos mediante AJAX(2), una forma de enviar datos al servidor sin necesidad de recargar la página, esto resulta bastante eficiente cuando tenemos una interfaz que interactúa de manera constante y dinámica con el cliente. Como dijimos anteriormente utilizaremos la librería Jquery para hacer más sencilla la labor, para esto debemos incluir en el archivo html la siguiente línea dentro del encabezado (<head>): <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> Hecho esto, podemos utilizar la librería Jquery, ahora agregamos un script con una función javascript que capture las variables desde el html y las guarde en “parametros” y luego las envía mediante Ajax al servidor, el cuál tiene un archivo “rptest.php” que recibe las variables mediante el método POST: <script> function enviar(programa, variable){ var parametros = { "programa" : programa, "variable" : variable, }; $.ajax({ data: parametros, url: 'rptest.php', type: 'post', beforeSend: function () { $("#resultado").html("Procesando, espere por favor..."); }, success: function (response) { $("#resultado").html(response); } }); } </script> En beforeSend, escribimos lo que queramos que se vea mientras se están enviando los datos, y en success escribimos la respuesta que dará el archivo php. Notar que #resultado hace referencia al elemento con un id=”resultado”, donde se visualizará el mensaje escrito en beforeSend y en success, el cual podemos incorporar en cualquier parte dentro del cuerpo del html (<body>) de la siguiente forma: <span id="resultado"></span> Ahora, la parte dinámica dependerá de los elementos que agregemos en el cuerpo del html, esto pueden ser botones o cuadros de texto: <button onclick="enviar('encender', 'd1');></button> <input id='mail' type="text" placeholder="[email protected]"/> <button onclick="enviar('mail', $('#mail').val());"></button> Debemos notar que lo que se enviará como “programa” y “variable”, en el primer caso serán los string “encender” y “d1” ; en el segundo caso serán “mail” y el valor del elemento con el id=“mail” el cual corresponde a un cuadro de texto, así que lo enviado como “variable” dependerá de lo que el usuario escriba en dicho cuadro de texto. Ya hemos pasado la parte más difícil, para terminar la explicación del funcionamiento de la página web sólo nos queda describir el archivo “rptest.php”. Para hacerlo sencillo diremos que el archivo recibe los valores de ‘programa’ y ‘variable’ enviadas desde html, y guarda sus valores en una $variable, mediante el método $_POST así: <?php $programa = $_POST['programa']; $variable = $_POST['variable']; … Luego ejecutaremos el programa y le damos como parámetro la variable, mediante el comando system(); de la siguiente forma: … system("/home/usuario/carpeta_programas/{$programa} {$variable}"); ?> Remplazando la ruta si es necesario por la carpeta donde se alojarán los programas. Eso es a grandes rasgos, por ejemplo si el valor de $programa fuera “encender” y el valor de $variable fuera “d1”, se ejecutará el programa llamado encender con el parámetro d1; así mismo si sus valores fueran “mail” y “[email protected]”, se ejecutará el programa llamado mail con el mail ingresado por el usuario como parámetro ([email protected]). Debemos destacar que hay que configurar los programas para que reciban un parámetro y trabajen en base a ese parámetro de antemano y que el comando system() de php devolverá como salida lo que retorne el programa alojado en la Raspberry. Programas La parte de los programas es la más importante, ya que esta es la que controla los impulsos eléctricos que finalmente nos permitirán encender los leds. Para controlar el puerto GPIO utilizamos una librería para C llamada wiringPi(3), es bastante utilizada y la página oficial provee una muy buena documentación (en inglés solamente), para instalarla en nuestra Raspberry debemos ejecutar los siguientes comandos en la terminal: ~$ sudo apt-get install git-core ~$ sudo apt-get update ~$ git clone git://git.drogon.net/wiringPi ~$ cd wiringPi ~$ git pull origin ~$ cd wiringPi ~$ ./build Y para incluirla en nuestros archivos.c debemos escribir al principio: #include <wiringPi.h> Junto con las demás librería de C más usadas, y que por cierto, utilizaremos también nosotros <stdio.h> y <string.h>. Es importante advertir que para compilar con esta librería debemos hacerlo escribiendo –lwiringPi al final de la línea, por ejemplo: ~$ gcc archivo.c –o archivoEjecutable –lwiringPi Ahora debemos tener en cuenta que para inicializar el sistema wiringPi, podemos escribir las siguientes funciones dentro del archivo.c, que son equivalentes entre sí con algunas diferencias que mencionaremos a continuación: wiringPiSetup(); // Numeración de pines propia de wiringPi wiringPiSetupGpio(); // Numeración de pines Broadcom GPIO (ver página oficial) wiringPiSetupSys(); // Numeración de pines Broadcom GPIO La diferencia radica en que con las primeras dos necesitaremos permisos de superusuario para ejecutar los programas, mientras que con la tercera no será necesario; sin embargo sólo en la tercera debemos haber exportado los pines que utilizaremos como salida o como entrada con anterioridad, esto lo hacemos de la siguiente forma: #include <stdio.h> #include <string.h> #include <wiringPi.h> main(){ char comando[50]; strcpy(comando, "gpio export 9 in"); system(comando); … Aquí ocupamos la función strcpy() para copiar el string “gpio export 9 in” y guardarlo en la variable comando de tipo char, luego ejecutamos la función system() que es equivalente a escribir en la terminal lo que esté guardado en la varible comando; por lo tanto podríamos escribir la siguiente línea de comandos en la terminal y tendríamos el mismo resultado: ~$ gpio export 9 in El resultado es el pin 9 (numeración Broadcom) exportado como entrada, análogamente podemos escribir out en lugar de in y obtendremos el pin como salida. Dicho esto, podemos comenzar con la parte electrónica. En la parte electrónica tenemos las 8 luces controladas a través de la GPIO en modo OUTPUT main(){ char comando[50]; strcpy(comando, "gpio system(comando); strcpy(comando, "gpio system(comando); strcpy(comando, "gpio system(comando); strcpy(comando, "gpio system(comando); strcpy(comando, "gpio system(comando); strcpy(comando, "gpio system(comando); strcpy(comando, "gpio system(comando); export 17 out"); //Luz Dormitorio 1 export 18 out"); //Luz Dormitorio 2 export 27 out"); //Luz Dormitorio 3 export 22 out"); //Luz Baño export 23 out"); //Luz Cocina export 24 out"); //Luz Living export 25 out"); //Luz Pasillo strcpy(comando, "gpio export 4 out"); //EMISOR de luz para seguridad en ventana; system(comando); … Los primeros siete pines los exportamos en los programas correspondientes encender.c, apagar.c y estado.c; el último lo exportaremos sólo en el programa mail.c; que será el encargado de ennviar un mail al momento que sea interrumpida la luz. También tenemos 3 sensores conectados al GPIO en modo INPUT: strcpy(comando, "gpio export 10 in"); //Sonido (micrófono) system(comando); strcpy(comando, "gpio export 9 in"); //Fotodiodo receptor de luminosidad system(comando); strcpy(comando, "gpio export 11 in"); //Fotodiodo receptor de luz en ventana system(comando); El primero lo podemos exportar en un archivo llamada aplauso.c; el segundo en autoluces.c y el tercero en el anterior mencionado mail.c. Ahora para encender cada luz será cosa de algoritmos simples, con unos cuántos if, else if, etc. Dependiendo del string ingresado como parámetro junto con el programa; recordar que para capturar estos parámetros podemos utilizar argv y argc; y para comparar string usamos la función strncmp(). Electrónica En cuanto a la parte electrónica procederemos a describir los componentes del circuito para cada pin utilizado, exceptuando a los pines que salían hasta el led, ya que ellos no tienen mucha elaboración más que conectarlos al pin correspondiente: 1) Sensor de luminosidad Componentes: -TR1=Transistor pn2222 -LDR -VR1=Potenciómetro o Resistencia de 10k El sensor de luminosidad funciona principalmente gracias a un LDR (light-dependent resistor) o fotorresistencia, la cual disminuye la resistencia con el aumento de la luminosidad. Link http://www.youtube.com/watch?v=WPXhlvpZVj4 2) Sensor emisor y receptor en ventana Componentes: -Fotodido (receptor) -Led emisor -R6= Resistencia de 50k - R2=resistencia de 220 EL sensor funciona gracias al fotodiodo el cual recibe la luz del led emisor y este detecta la interrupción de la luz. 3) Sensor de sonido Componentes: -Micrófono -Transistor pn2222 -R3=Resistencia de 1k -R2=Resistencia de 100k -R4=Resistencia o potenciómetro de 50k El sensor de sonido funciona principalmente gracias a un micrófono en el cual esta conectado al circuito, lo que hace el micrófono es convertir ondas sonoras en energía eléctrica haciendo que envie un pulso a al GPIO de la raspberry. Link http://www.youtube.com/watch?v=u4lDJBxWSAc Además le instalamos un circuito de potencia, en la cual en vez de hacer funcionar un motor (como se muestra en el video), instalamos una ampolleta la que prende gracias al Relé, y el circuito de control lo conectamos al pin 26 y a negativo de la GPIO de la Raspberry Pi, de esta manera podemos ver que es posible implementarlo a la red doméstica. Componentes: -Relé 5vcc /250vac -Ampolleta Todos los diagramas los modificamos de acuerdo a lo que necesitábamos, en este caso pulsos 1 y 0 (1=3,3volts y 0=0volts), y así poder comunicar el sensor con los programas en C, ya que investigamos y sabemos que la Raspberry no recibe señales análogas, sino sólo señales digitales (1 y 0). Conclusión Las instalaciones a escala real, son posible de ser realizadas pero desde nuestro prototipo a hacerlo real hay un largo trayecto, puesto que se deben identificar muchas partes del proyecto, su instalación con 220v su acertada función sin errores críticos, la seguridad de los circuitos de bajo consumo y además la instalación local de la casa, la idea es seguir informándose y viendo todos los posibles problemas que se pueden acumular al realizar una instalación en casa. Referencias (1) Kickstar: http://www.99lime.com/elements/ (Página Oficial) (2) AJAX: http://www.imaginanet.com/blog/usando-ajax-un-simple-ejemplo-con-php-y-jquery.html (3) WiringPi: https://projects.drogon.net/raspberry-pi/wiringpi/ (Página Oficial)