Hola a todos de nuevo. La espera se ha hecho larga (¡¡¡ casi 7 meses !!!), pero es porque me enfrasqué en otros proyectos y he sacrificado el tiempo del blog para poder desarrollarlos, aunque siempre he estado pendiente de los comentarios. Uno de ellos (que no el único) ha sido el de crear Hora y Lugar: una web para crear recordatorios de citas y que ha quedado cuarta en el concurso de Google Maps España.
Como broche final a esta serie de artículos, expongo la interfaz por antonomasia que hace que la domótica cobre un nuevo sentido. Y esa es manejar el sistema mediante el móvil. Ya no se trata de estar en casa o de tener una conexión a internet, sino de prácticamente poder usar nuestros aparatos desde cualquier lugar (donde haya cobertura claro). En esta ocasión es a base de SMS, que todo el mundo sabe escribir y son relativamente baratos, aunque en un futuro añadiré la funcionalidad de centralita, donde una voz te pregunta e informa y tu envías comandos mendiante tonos DTMF (pulsando las teclas del teléfono) o bién mediante voz; todo ello usando TAPI.
Usando el móvil que ya todos conoceis desarrollé la interfaz para poder tratar los mensajes recibidos y traducirlos en comandos para el sistema. Para iniciarlo se carga el programa SMS indicandole en que puerto esta eschuchando el móvil y cual es la dirección del servidor.
Cuando queramos hacer algo, escribimos un mensaje sms con el formato usuariocontraseñacomando.
Cuando el móvil recibe el mensaje, el programa SMS que esta comprobando si ha recibido un mensaje cada cierto tiempo lo procesa, muestra el teléfono de origen, la fecha y la cadena enviada.
A continuación envía el comando al servidor y nos responde con otro mensaje sms indicando en que estado se encuentra el sistema después de haber procesado el comando.
De la aplicación se puede salir simplemente pulsando INTRO.
Aquí teneis un video donde podeis ver como funciona todo lo que he ido explicando en todos los artículos:
Y así acaba esta serie de artículos, esperando que os haya servido de utilidad y que os haya dado ideas de como implantarlo vosotros mismos (como ya muchos me habeis comentado). Mi idea es seguir desarrollandolo añadiendo nuevas funcionalidades como reconocimiento de voz, centralita (como ya he comentado más arriba) y más control en los aparatos (de ser un mero encender y apagar a poder manejar todas las funcionalidades).
Después de un largo periodo de descanso empiezo a escribir el siguiente artículo sobre domótica.
Ya hemos tratado varias formas de acceder remotamente o localmente al sistema de domótica a través de TCP/IP. La cuestión es que hasta ahora las interfaces que necesitábamos para poder interactuar con el sistema necesitaban de un ordenador que se conectara al sistema central (que podía ser el mismo que contiene el sistema) para enviarle ordenes y recibir el estado. En este artículo trataremos una forma más “casera” de interactuar con el sistema.
Todo el mundo tiene un mando a distancia en su casa y/o sabe como usarlo, asi que con esta sencilla interfaz podemos interactuar con todos los aparatos del sistema de domótica simplemente interpretando las pulsaciones que recibe del mando a distancia (en mi caso mediante un puerto serie) y convirtiendolo en comandos del protocolo del sistema de domótica. Para ello cargamos el programa Remoto, que es una aplicación de consola, pasándole como parámetros el puerto serie, el servidor, el usuario y la contraseña. Este lo que hará es acceder mediante TCP/IP al servidor Luces con el usuario y contraseña dados y a continuación abrirá el puerto serie para empezar a recibir las señales infrarojas.
Cuando se pulsa el botón 1, 2, 3 o 4 del mando a distancia cambia el estado del aparato a encendido o apagado si se encuentra apagado o encendido respectivamente. Por supuesto tiene que haber visión directa entre el mando a distancia y el receptor (que puede no estar en la misma habitación que el ordenador al que esta enchufado).
De la aplicación podemos salir pulsando intro. El mando a distancia que tengo y el cable receptor lo obtuve de una capturadora de televisión, sin embargo si no teneis uno similar podeis comprar ya uno hecho de cualquier capturadora MIRO o AVERMEDIA o haceros vosotros mismos uno: http://www.tldp.org/linuxfocus/Castellano/March2000/article137.html.
Continuando la serie de artículos sobre aparatos que tengo, introduzco el último y más importante del sistema casero de domótica que he creado.
El kit o módulo que aparece en la fotografía pertenece a la familia de módulos a relé de la empresa CEBEK, cuyo código es T-1. Es un módulo que puede manejar hasta 4 relés a través de unos bornes de entrada. Tiene muchas ventajas, como que aisla la señal de entrada del resto del circuito con optoacopladores o como que usa un puente rectificador para la alimentación del circuito. El módulo se alimenta con una tensión de 12 voltios e intensidad de 200 mA (muchos transformadores pequeños de móvil u otros aparatos los proporcionan de sobra).
La idea es que con este circuito se puedan manejar aparatos eléctricos (incluidos electrodomesticos) desde el ordenador. Para ello, por una parte se usan los relés a modo de interruptor de un cable normal (en mi caso uso alargadores para no tener que pelar los de los aparatos eléctricos), por lo que en el circuito que uso podría manejar hasta cuatro aparatos distintos; por otra parte los cuatro bornes de entrada van conectados a cuatro de los ocho cables de datos de un cable paralelo.
Aprovechando que es muy sencillo acceder al puerto paralelo del ordenador y que las señales son de 5 voltios (más que suficiente para activar los optoacopladores) es posible mandar un byte al puerto de datos del paralelo (0×378) para que llegue a los bornes del circuito y posteriormente active los relés. ¿Como funciona la lógica de encender y apagar relés? pues cuando se manda un byte a través del puerto paralelo, los bits que esten a 1 hacen que los correspondientes pines del puerto paralelo se activen a 5 voltios, lo que en el circuito provoca finalmente que se activen los relés asociados. Asi por ejemplo si enviamos un 3, en binario es 0011, activándose los dos primeros relés. Con este sistema se pueden encender lámparas, calefacciones, microondas, lavadoras, persianas eléctricas, sistemas de riego, etc.
En windows 95, 98 y Millenium se puede acceder directamente al puerto paralelo, sin embargo en windows nt, 2000 y xp se necesita crear un driver que se ejecute en el nivel (ring) privilegiado 0, porque en el nivel 3 no se permite hacer directamente. Como tampoco quise perder tiempo en crear mi propio driver, usé un programa que ya hace todo eso de una forma muy sencilla: Port Talk, el cual, una vez instalado, da permiso a una aplicación (proceso) para que acceda a un puerto determinado (o a todos) desde la linea de comandos. Finalmente solo basta usar el método _outp en C para enviar datos al puerto paralelo:
En el mercado de hoy en día se venden tarjetas sintonizadoras de televisión para el PC. Muchas de ellas tienen mando a distancia. Y en algunas de ellas el receptor de infrarojos que trae es para conectarlo a un puerto serie del PC.
Al ser el receptor de infrarojos un conector para el puerto serie, es muy sencillo comprobar que información le envía el mando a distancia y tomar esos datos para aprovecharlos en futuras aplicaciones, como por ejemplo:
-Apagar el equipo. -Cargar una aplicación -Simular pulsaciones del teclado predefinidas o mover el puntero ratón y simular pulsaciones de los botones. -Escuchar música y subir el volúmen de los altavoces …
La forma sencilla de saber que datos manda y en que formato sin tener que investigar mucho es usar un sniffer del puerto serie. En mi caso he usado el portmon, que es una excelente utilidad para rastrear la información que va y viene desde los puertos serie y paralelo.
Si os fijais en la imagen, se muestra como inicializa el puerto a 1200 baudios, 8 bits de datos, ninguna paridad y 1 bit de stop. A continuación vienen los datos propiamente dichos. Para la prueba he pulsado el botón 1 del mando a distancia y el resultado es FE 9F 31, si hubiese pulsado el 2 el resultado sería FE 3D 32. Si lo observamos veremos que el 1 y el 2 (y el resto de números) coinciden con su representación ASCII en hexadecimal (31 y 32). En otros casos como la pulsación de las teclas de subir (FE F1 3B) y bajar (FE 64 3D) volumen o subir (FE 17 3F)y bajar (FE C6 3E) de canal muestran otros caracteres. En el caso de que dejáramos una tecla pulsada los códigos varían ligeramente, como en la imágen, que aparece el triplete FE 77 71 cuando se deja pulsado el botón 1 del mando a distancia.
En definitiva, da igual que sea en linux o en windows, podemos capturar estos tripletes y actuar en consecuencia con cada pulsación recibida (si se pulsa el botón de off apagamos el equipo, si pulsamos los botones de subir y bajar el volumen y los canales podemos manejar el puntero del ratón, con el mute podemos apagar el altavoz del equipo, con el botón de play podemos enviar un tabulador, con los números podemos escribir letras estilo sms, etc). Por supuesto, que esa información venga así en mi receptor de infrarojos no significa que sea igual en otros, de ahi que haya que mirar como funciona con utilidades como el portmon.
En este proyecto mi intención no es otra que hacer un sistema de detección de movimiento (que no de reconocimiento de objetos).
Detectar movimiento no es una cosa sencilla como pueda parecer a priori, ya que la imágen que pueda dar una camara (en este caso un webcam) no es de una calidad suficiente como para que dos imágenes tomadas en distintos momentos puedan considerarse iguales. Esto es debido a que las cámaras suelen introducir ruido en las imágenes que captan, o dicho de otra forma, un pixel de una posición determinada de la imágen nº1 no suele coincidir casi nunca (por no decir nunca) con un pixel de la misma posición de la imágen nº2 (aún siendo estas tomadas con una diferencia de milisegundos). Es por ello que hay que pensar que nivel de tolerancia hay que permitir para que aunque las imágenes no sean iguales exactamente, la información que contienen si sea similar en gran medida; sin detrimentro por supuesto de que si hay algún movimiento de un objeto o de un ser vivo sea tomado como informaciones distintas y provoque un evento o acción.
Existen varias formas de trabajar con esta tolerancia: algoritmos de detección de bordes (gradientes, derivadas gausianas, transformada de Hough, etc), filtrados descriptores de Fourier, clasificador Bayesiano, etc), etc. Todos ellos sirven, pero no son iguales de rápidos. Es por ello que me decanté por el metodo estadístico de hacer medias de pixeles con los de su alrededor, un metodo sencillo para fijar una tolerancia en escaso tiempo (aunque quizá con un poco de penalización en cuanto a acierto en detección).
El método consiste en tomar cada pixel de la imágen nº1 y sumar su valor con los 8 pixeles que le rodean (una matriz de 3×3) y luego dividir el resultado por 9, por lo que nos da un valor medio. El mismo proceso lo hacemos con los mismo pixeles pero de la segunda imágen, y así obtenemos otro valor medio. Al compararlos podemos detectar cuanto % de diferencia hay entre uno y otro, momento por el cual, gracias a que hemos configurado que nivel de sensibilidad en la diferencia, o se admite como que no es un valor a tomar en cuenta, o sin embargo el valor es distinto y por lo tanto se toma en cuenta. Si se sobrepasa una cantidad determinada de pixeles que se toman en cuenta (sensibilidad por puntos), entónces es que las imágenes no son completamente iguales en cuanto a información y se supone que se ha producido un movimiento (cambio de posicion de entidades en la imágen o aparación de otras nuevas). La idea es que se tome una imágen de referencia (una del entorno estático), y se comparen las restantes con ella, para poder así saber con respecto al origen si ha habido algún cambio. Más tarde se toma otra imagen de referencia eliminando así los problemas que pudieran causar otros agentes (como un cambio atenuado de luz por el sol).
Siguiendo esta idea, he desarrollado una aplicación en visual c++ 6.0 llamada DETECTOR donde he aplicado los conceptos anteriormente citados. Podeis descargar el ejecutable y/o su código fuente en esta dirección (esta bajo licencia creative commons): http://www.sistemasorp.net/detemovi