descargar 58.24 Kb.
|
![]() ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA IntelliRoom: Domótica Realizado por: Rafael Gómez García Para la obtención del título de INGENIERO TÉCNICO EN INFORMÁTICA DE GESTIÓN Dirigido por: Daniel Cagigas Muñiz Pablo Íñigo Blasco Realizado en el departamento de arquitectura y tecnología de computadores (ATC) Convocatoria de Junio, Curso 2010-2011 ContenidoEn relación a la asignatura: Proyecto fin de carrera 3 ¿Cómo surgió la idea? 3 ¿Qué se pretende con IntelliRoom? 3 Objetivos que pretendía con el proyecto 3 Habilidades o conocimientos adquiridos con el proyecto 3 Agradecimientos 5 Introducción a IntelliRoom 5 Requisitos de IntelliRoom 5 Requisitos Software 5 Requisitos Hardware 5 Objetivos del proyecto 6 Arquitectura Lógica Básica 6 Presentación 6 Lógica de negocio 7 Datos 7 Arquitectura Hardware 9 Hardware: control de luz y eléctrico 9 Planteamiento de hardware para circuitos de control de iluminación y eléctrico. 9 Elección del microcontrolador 10 Requisitos 10 PIC 16F1828 / 16D1824 11 Arduino 13 Programa para control de luz 14 Aislamiento de Arduino con LEDs 14 Esquemáticos 15 Protocolo de envío de mensajes: 16 Para concluir 17 Control de dispositivos electrónicos 17 Módulo Arduino 18 Objetivos 18 Casos de usos relevantes 18 Creación de conexión Serial 18 Procesamiento de un mensaje 18 Diagrama de diseño 19 Módulo Voice 19 Introducción 20 SAPI 20 Objetivos 20 Casos de uso relevantes 21 Sintetizar 21 Añadir gramática 21 Línea de proceso de Reconocimiento 21 Diagrama Diseño 21 Módulo Media 21 WMP SDK 21 Objetivos 21 Casos de usos relevantes 22 Cargar librería de música 22 Diagrama de diseño 22 Módulo Camera 22 OpenCV / EmguCV 22 Objetivos 22 Casos de usos relevantes 23 Diagrama de diseño 23 En relación a la asignatura: Proyecto fin de carrera[INTRODUCCION DEL APARTADO] ¿Cómo surgió la idea?¿Qué se pretende con IntelliRoom?Objetivos que pretendía con el proyecto
Habilidades o conocimientos adquiridos con el proyecto
AgradecimientosPor ultimo decir que mi labor no podría haber sido concluida sin la ayuda de Manuel Caballero, Pablo Íñigo Blasco, Victor…. y otros compañeros del club .NET Introducción a IntelliRoomIntelliRoom es un proyecto de fin de carrera realizado por Rafael Gómez estudiante de la escuela técnica superior de ingeniería informática (ETSII) en la universidad de Sevilla. IntelliRoom es un proyecto de domótica cuya idea principal es la de disponer de ciertas características que sean administradas por un ordenador principal (de uso general) que procese la información recibida por los sensores (micrófonos, cámaras…) y que la redistribuya a los periféricos (control de luz, altavoces…). Requisitos de IntelliRoomRequisitos SoftwarePara la ejecución de este proyecto se requiere tener instalado:
Para instalar el código en Arduino necesitaras compilar el código escrito en Processing/Wiring y traducirlo a uno entendible por ATMega328 y programarlo, esta tarea es muy sencilla si usamos el IDE de Arduino que podrá ser fácilmente descargarlo/instalado en la siguiente dirección: http://arduino.cc/en/ Requisitos HardwareOrdenador capaz de soportar Windows Vista Periféricos: (Hay que ser muy específico???????)
Componentes:
Objetivos del proyecto
Arquitectura Lógica BásicaHe dividido la arquitectura lógica en tres niveles básicos siguiendo la estructura básica de programación por capas, quedando así: capa de presentación, capa de lógica de negocio y capa de datos, vamos a hacer una breve descripción de los apartados del proyecto. PresentaciónEs el encargado de presentar el sistema al usuario por medio de la interfaz que ofrece la interfaz de la lógica de negocio. Tiene dos módulos: GUI y Console:
Lógica de negocioEs el punto central de la aplicación, que consta de dos grandes partes: nuestro motor de la aplicación (IntelliRoom) y módulos ampliables que incrementan la funcionalidad (Voice, Media, Camera…)
DatosLa tercera capa de la aplicación es la encargada de gestionar la información persistente (configuración y tratamiento de XML). ![]() Arquitectura Hardware[DIAGRAMAS DE DESPLIEGUE] [Porque esta decisión] Hardware: control de luz y eléctricoPlanteamiento de hardware para circuitos de control de iluminación y eléctrico.En primera instancia explicaremos el proceso que experimente hasta encontrar la solución al problema de ambientar una habitación con LEDs de colores. Buscando información sobre los LEDs, como funcionaban, de que tipo los había (tipo de luminancia, colores, potencia) y al poco concluí que necesitaba un LED RGB o 3 LEDs emparejados a 3 (que básicamente es de lo que está constituido un LED RGB), vi varios modelos y finalmente compré este modelo. ![]() ![]() La pregunta instantánea que surge es ¿Cómo consigo conectar un dispositivo que requiere una entrada analógica para la regulación del voltaje si lo que voy a tener es un circuito formado por un microcontrolador. La respuesta se llama PWM (Pulse-Width Modulation) o lo que es lo mismo “modulación por ancho de pulsos” Formalizando un poco el concepto el PWM o modulación por ancho de pulsos es una técnica en la que modificamos el ciclo de trabajo, o duty cycle, de una señal periódica para controlar la cantidad de energía que se envía a una carga. El ciclo de trabajo o duty cycle es la relación de tiempo que permanece la onda periódica (supongamos cuadrada) en valores positivos, veamos unos ejemplos de valores de ciclo de trabajo: ![]() De esta manera concluimos, muy intuitivamente, que el cálculo del duty cycle es: ![]() Las aplicaciones del PWM son variadas: comunicaciones, efectos de sonido, amplificación, regulación de voltaje… Nosotros lo usaremos como regulador de voltaje que le llega al LED. Con esto ya hemos conseguido la manera de regular la potencia con la que los diodos emitirán su luminosidad. [¿¿?¿?¿]. Elección del microcontroladorRequisitosAdemás, al ser RGB necesitare que el microcontrolador que seleccionemos para el proyecto tenga como mínimo 3 canales PWM para cada uno de los canales de colores. Después de tener más o menos claro lo que necesitábamos para la parte de electrónica, era el momento de decidirse por un microcontrolador del mercado. Para encontrarlo primero definí lo que quería para no partir de búsquedas muy complejas. Aquí dejo la lista de las características mínimas que buscaba:
PIC 16F1828 / 16D1824Después de una semanas de búsquedas y por recomendación de un compañero me decante por dos microcontroladores relativamente nuevos de la empresa Microchips, el PIC 16F1828 para el apartado de iluminación y el PIC 16F1824 para el apartado de control eléctrico. Ambos microcontroladores son iguales en características, solo se diferencia en el hecho de que el patillado de 16F1828 está menos multiplexado que el del 16F1824, como podemos ver en las figuras a continuación: ![]() ![]() Estos microcontroladores cumplían y superaban las características de la lista, tenían 4 + 2 timers para hacer PWM: 4 timers y 2 de ellos con salidas clonadas, 8 bits, salidas lógicas de sobra y un precio no superior a los 80 céntimos. Tan pronto como me decante por este modelo me puse a trabajar en la configuración del patillaje, llegando a la siguiente configuración: ![]()
Ahora solo nos quedaba entrar en la programación del microcontrolador, me instale el IDE de Microchip que ¡daba soporte parcial a los micros!, y ya empezaron los problemas. Nadie había creado un compilador en C para estos micros, puesto que eran bastante nuevos, y puesto que el IDE no daba casi soporte me vi en la necesidad de buscar alternativas, utilizamos durante un tiempo un simulador para PICs, y nos pusimos manos a la obra. Escribimos el código en ensamblador necesario para comunicarnos con el microcontrolador y en el momento de querer hacer pruebas llegamos a otro problema, ¿Cómo programamos el microcontrolador? Los programadores eran bastante caros para 2 o 3 usos que le íbamos a hacer y en los departamentos no había ninguno para productos de Microchips así que decidimos hacernos uno nuestro. Un compañero de la universidad me ayudo a buscar información y diseñó el posible programador, es más, la finalidad del trabajo era que fuera un programador universal, dejo el esquemático: ![]() Al final entre problemas decidí que era mucho más costoso utilizar un microcontrolador que requería de programadores que eran caros o difíciles de fabricar, además, mi formación en electrónica no era tan buena como para a día de hoy asegurar que este programador funcionaría, por lo que cambie la trayectoria del proyecto dirigiéndome a Ardunio. ArduinoArduino es una plataforma de hardware libre basada en una placa con un microcontrolador, en mi caso el ATMega328, y un entorno de desarrollo que implementa el lenguaje de programación Processing/Wiring (aunque es posible utilizar otros muchos lenguajes). Processing/Wiring tiene una sintaxis muy amena que permite, en pocas horas, desarrollar proyectos completos. Características de Arduino:
Después de lo antes comentado, aunque el precio de Arduino asciende a unos 25 euros, sale bastante rentable puesto que ya tenemos a nuestra disposición una placa con funcionalidad para que el microcontrolador pueda ser programado y un microcontrolador con un bootloader ya instalado y un sistema bastante completo en lo que a funcionalidad se respecta. Además sería posible en un futuro, adquirir otros ATMega328, programarlos en la placa para, posteriormente, ponerlo en otra placa diseñada por nosotros. En SparkFun se puede adquirir el ATMega328 con el bootloader por menos de 4 euros. Programa para control de luzCon Arduino en nuestras manos y el IDE instalado procedemos a ver el código del programa para el control de luz y la explicación del mismo. [PONER CODIGO Arduino v1] ¿¿?¿?PSEUDO CODIGO???¿¿?¿ El código es muy sencillo [EXPLICACION DEL CODIGO] Aislamiento de Arduino con LEDsYa tenemos en nuestro poder el código y un módulo programado en C# para enviar mensajes a Arduino, ya solo nos queda un detalle: La cinta de LED tiene 54 LEDs (18 por cada color) con el consumo siguiente: Componente R (Roja): 100 mA a 12 V Componente G (Verde): 87 mA a 12 V Componente B (Azul): 80 mA a 12 V Haciendo un total de 240 mA a 12 V Arduino ofrece 40 mA por PWM a 5 V, evidentemente no podemos conectarlo directamente:
Para solucionarlo seleccionamos una fuente alternativa al circuito que ofrecía 9 Voltios a 300 mA, 3 transistores NPN modelo 2n2222 para aislar el circuito y 3 resistencias de 1KΩ (posiblemente cambiadas en un futuro) [HABLAR SOBRE EL TRANSISTOR??] EsquemáticosQuedando el esquema en la placa de prototipo de la siguiente manera: ![]() Y el esquema electrónico de esta manera: ![]() Protocolo de envío de mensajes:Para el envío de información hemos usado algo cómodo pero en cierto modo ineficiente, le enviamos al Arduino por puerto serie una cadena de caracteres, por lo que por cada carácter le llega 8 bits, de momento vamos a trabajar con este protocolo. Formato generalLa conexión entre la aplicación general y Arduino se hace de la siguiente manera: Se hace el envío de una cadena que tiene la siguiente estructura: [FUNCION] [Arg1] [Arg2]… [Argn] Modo directoNombre función -> DIRECT R -> Valor color Rojo, en tamaño byte G-> Valor color Verde, en tamaño byte B-> Valor color Blue, en tamaño byte Comportamiento: Cambia de color directamente al color establecido por valores RGB Ejemplo: DIRECT 123 220 1 -> R=123, G=220, B=1 Modo degradadoNombre función -> DEGRADED R -> Valor color Rojo G-> Valor color Verde B-> Valor color Blue Time -> Número de milisegundos que estará degradando Comportamiento: Cambia de color gradualmente en un tiempo de [Time] milisegundos Ejemplo: DEGRADED 255 0 0 10000-> Tarda 10000 milisegundos (10 segundos) en cambiar a color rojo Modo aleatorioNombre función -> RANDOM RandomMode -> 0 = desactivar RandomMode 1 = activar RandomMode TimeRandom -> Tiempo, en milisegundos que hay entre el paso de un color a otro Comportamiento: Cambia de color gradual y aleatoriamente en un tiempo fijado de milisegundos Ejemplo: RANDOM 1 1000-> Activamos la función aleatoria para que cambie de color cada 1000 milisegundos. Para concluirCreador de la librería “Mesages” ayuda minolo?? esquemáticos realizados con Fritzing.?? Control de dispositivos electrónicosEl control de dispositivos eléctricos del hogar es otro de los apartados de IntelliRoom. En un comienzo íbamos a usar un PIC de Microchips para aislar el problema de iluminación y conexión de dispositivos, pero finalmente, al utilizar el ATMega328 tenemos muchos pines a nuestra disposición decidimos finalmente que fuera una placa Arduino la encargada de solucionar ambas necesidades. Para ello teníamos que hacer algunos cambios en el código, ya que anteriormente solo utilizábamos Arduino para una sola finalidad. En aspectos cuantitativos introducimos la nueva funcionalidad, el conectado y desconectado de dispositivos eléctricos. Pero en aspectos cualitativos teníamos que hacer un sistema que, en el caso de encontrarse haciendo un proceso de degradación (un proceso que ocupa la potencia de cálculo de Arduino) y en ese instante llegara una nueva orden del tipo “enciende el dispositivo 1” o “degrada a este otro color en t tiempo” fuera capaz de gestionarla. ¿Cómo hacemos esto? Muy sencillo generando una interrupción por cada mensaje que llegue por puerto serie. En ese instante Arduino trata el nuevo comando y posteriormente continuaría con el procesamiento de un posible degradado. PSEUDOCODIGO NUEVO ¿COMPONENTES? [Relés] ¿CIRCUITOS? Nuevos diagramas control dispositivo ¿ORDENES? Conjunto de nuevas ordenes Trabajo final de Arduino Código final Esquemático finales (XBee??, fuente….) Módulo ArduinoEl módulo Arduino es el encargado, como su nombre indica, de controlar todo lo referente a Arduino, en dos aspectos:
ObjetivosLos objetivos que cumple este módulo son:
Casos de usos relevantesCreación de conexión SerialMiramos los puertos COM disponibles Preguntamos cual es el nuestro Definimos velocidad a ¿¿?¿?¿ y salto de carro a ¿?¿? Procesamiento de un mensajeCreamos objeto Serial Enviamos un mensaje Llega a Arduino Arduino procesa el mensaje Diagrama de diseño![]() Módulo VoiceIntroducciónEl módulo Voice es el modulo encargado de satisfacer el objetivo de interfaz usuario-maquina por medio de la voz. Por un lado utilizaremos reconocimiento del habla para interpretar las funciones que el usuario le da al sistema y por otro, en caso de que sea necesario, un sintetizador para que el sistema informe al sistema. El módulo Voice además implementa un patrón fachada para facilitar futuros cambios en la librería, en la actualidad el sistema utiliza SAPI (Speech API) que funciona bastante bien para el reconocimiento, aunque de momento los paquetes gratuitos de Microsoft para el SDK no contemplan el Español como posible idioma para la sintetización. Como solución a este problema podríamos instalar Loquendo o bien en un futuro utilizar Google como sintetización, pudiendo crear un sistema bastante interesante con multitud de idiomas (aunque la pega seria que necesitaríamos siempre tener internet) SAPISAPI o Speech Application Programming Interface es una API para el desarrollo de técnicas de sintetización y reconocimiento de voz para aplicaciones desarrolladas en Windows. Históricamente podemos diferenciar etapas del producto, la que nosotros usaremos en el desarrollo es la 5.x que no permite ¿¿?¿retro compatibilidad?¿?¿? con las versiones de la 1 a la 4 pero una de sus novedades fue soporte para .NET desde el framework 3.0. SAPI se divide en 3 grandes partes Reconocimiento ObjetivosCrear un conjunto de clases que modele el reconocimiento y sintetización en el mismo momento. Que sea capaz de gestionar normas sintácticas y gramaticales así como la posibilidad de cambiar la sensibilidad con la que decide si una muestra escuchada pertenece a un patrón definido. Casos de uso relevantesSintetizarAñadir gramáticaLínea de proceso de ReconocimientoDiagrama Diseño[TODO!!] Módulo MediaEl módulo Media es el encargado de satisfacer todo el conjunto de problemas relacionados con reproducción de sonidos/música y control de los mismos, para ello utilizaremos el SKD de Windows Media Player, que se integra perfectamente con el mismo, dándonos por defecto funcionalidades tan interesantes como “reproducción de archivos en la nube”, “búsquedas por su biblioteca de medios”, “soporte para un montón de formatos de audio” WMP SDKWMP SDK o Windows Media Player Software Developer Kit Objetivos
Casos de usos relevantesCargar librería de músicaDiagrama de diseñoMódulo Camera[INTRODUCCION] OpenCV / EmguCVOpenCV o (Open Computer Vision) es una biblioteca libre de tratamiento de imagen, desarrollada originalmente por Intel en 1999. OpenCV es multiplataforma (Linux, Mac y Windows), muy eficiente (desarrollada en C y C++) y contiene más de 500 funciones de tratamiento de imagen. Por lo que OpenCV satisface todas nuestras posibles necesidades. Solo tenemos un problema, como hemos comentado OpenCV está desarrollado en C y C++ entonces... ¿Cómo podemos utilizar esta biblioteca en nuestro proyecto desarrollado en .NET? [HABLAR DE COMO ESTA HECHO .NET PARA EL INTERPRETADO DE CODIGO C y C++]. Por lo que concluimos que podemos ejecutar código C y C++ en la plataforma .NET gracias a sus funciones nativas. Y aquí es donde entra en juego EmguCV EmguCV es un wrapper para .NET de la librería OpenCV. Este wrapper es compatible con lenguajes como C#, VisualBasic, VisualC++, IronPython… incluso puede ser compilado en mono para ser ejecutado en entornos Linux o Mac OSX. EmguCV aun siendo un wrapper tiene a sus espaldas OpenCV que es una librería con una extensísima bibliografías. En mi caso, para conocer conceptos básicos, utilice las siguientes referencias: Para los conceptos básicos los apuntes de la asignatura procesamientos de imagen documental. Para la ampliación de conceptos utilice el libro: “Tratamiento digital de imágenes” escrito por Rafael C. González, editiorial “Addison-Wesley” Para el uso de la librería OpenCV el libro: “Learning OpenCV” de Gary Bradski y Adrian Kaehler, editorial “O’Reilly” Y por último los ejemplos que incluyen tras su instalación EmguCV y búsquedas en internet. ObjetivosLos objetivos de este módulo son:
Casos de usos relevantesDiagrama de diseñoANEXOS?? REFERENCIAS WIKIPEDIA??? BIBLIOGRAFIA UTILIZADA??? |