Índice de documentos DOCUMENTO I. MEMORIA Parte I. Memoria Parte II. Estudio económico Parte III. Código Fuente Parte III. Datasheets pág. 11 a 87 pág. 89 a 90 pág. 91 a 100 pág. 101 a 107 77 páginas 2 páginas 10 páginas 7 páginas DOCUMENTO II. PLIEGO DE CONDICIONES 1. Generales y económicas 2. Técnicas y particulares pág. 3 a 8 pág. 11 a 15 6 páginas 5 páginas pág. 5 a 9 pág. 11 a 13 5 páginas 3 páginas DOCUMENTO III. PRESUPUESTO 1. Presupuestos parciales 2. Presupuesto general Documento I Memoria DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN II DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN III ÍNDICE Parte I Capítulo 1 1 Memoria ........................................................................................... 11 Introducción................................................................................. 13 Estudio de los trabajos existentes / tecnologías existentes ....................... 14 1.1 ZigBee ............................................................................................................................ 14 1.2 KNX ................................................................................................................................ 16 1.3 Z-wave ........................................................................................................................... 18 1.4 Contiki............................................................................................................................ 18 2 Motivación del proyecto ................................................................................. 19 3 Objetivos y aplicaciones ................................................................................. 21 4 Metodología ...................................................................................................... 21 5 Recursos / herramientas empleadas.............................................................. 22 Capítulo 2 1 Principios Teóricos ..................................................................... 25 6LoWPAN .......................................................................................................... 25 1.1 La arquitectura de 6LoWPAN .................................................................................... 25 1.2 Introducción a 6LoWPAN ........................................................................................... 27 2 Contiki................................................................................................................ 31 2.1 Resumen del sistema .................................................................................................... 31 2.2 La arquitectura del Kernel ........................................................................................... 32 2.3 Servicios (services) en Contiki .................................................................................... 33 2.4 Librerias ......................................................................................................................... 34 Capítulo 3 El procesador MC13226V ........................................................... 35 1 Borrado de la memoria FLASH ..................................................................... 35 2 Carga de programas en MC13226V ............................................................... 37 2.1 Instalación de la librería libmc1322x .......................................................................... 37 2.2 Cargar imágenes en la RAM con mc1322x-load.pl .................................................. 37 3 Entradas/salidas en MC13226V ..................................................................... 38 3.1 Salidas en MC13226V ................................................................................................... 38 DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN IV 3.2 Registros GPIO ............................................................................................................. 40 3.3 Entradas en MC13226V ............................................................................................... 44 4 Primeras comunicaciones entre dos tarjetas ............................................... 46 4.1 Inicialización del módulo de comunicación ............................................................. 46 4.2 Programa emisor .......................................................................................................... 47 4.3 Programa receptor ........................................................................................................ 49 4.4 Fallo en la inicialización del módulo de comunicación. ......................................... 50 Capítulo 4 El procesador MC13224V ........................................................... 55 1 Adecuación previa de la tarjeta ..................................................................... 55 2 Diseño e implantación de un circuito sencillo (LED+Pulsador) ............. 58 3 Entradas/Salidas en MC13224V ..................................................................... 59 3.1 Cambio en los pines y bits del registro GPIO ........................................................... 59 3.2 Modificación del archivo Makefile............................................................................. 60 4 Primeras comunicaciones entre dos tarjetas. .............................................. 61 4.1 Fallo en la inicialización. ............................................................................................. 62 4.2 Impresión de paquetes. ................................................................................................ 64 Capítulo 5 Programación de una red con Contiki y 6LoWPAN ............. 67 1 Compilar programas con Contiki.................................................................. 67 2 Esquema básico de una programa en Contiki ............................................ 68 3 Programación de una red sencilla border router-cliente udp .................. 69 3.1 Esquema de la red ........................................................................................................ 69 3.2 Ejecución de la red........................................................................................................ 69 4 Entradas/salidas en Contiki ........................................................................... 73 4.1 Salidas ............................................................................................................................ 73 4.2 Entradas ......................................................................................................................... 76 4.3 Ejemplo Entradas/Salidas ........................................................................................... 76 5 Ejecución de una pequeña red domótica ..................................................... 78 5.1 Funciones necesarias .................................................................................................... 78 5.2 Desarrollo del programa ............................................................................................. 80 5.3 Salida del programa en cada tarjeta ........................................................................... 82 Capítulo 6 Conclusiones ................................................................................ 85 Capítulo 7 Futuros Desarrollos .................................................................... 87 DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN V 1 Conexión de la red 6LoWPAN a Internet. ................................................... 87 2 Smart cities ........................................................................................................ 88 Bibliografía .......................................................................................................... 91 Parte II Capítulo 1 1 Estudio económico ...................................................................... 95 Viabilidad del proyecto. ................................................................................. 95 Parte III Capítulo 1 1 Estudio económico .......................................................................... 93 Código Fuente .................................................................................. 97 Código Fuente .............................................................................. 99 Entradas/salidas en MC13226V ..................................................................... 99 1.1 gpio.c .............................................................................................................................. 99 1.2 conpulsadores.c .......................................................................................................... 100 2 Comunicación básica en MC13226V........................................................... 101 2.1 enviapaquetes.c........................................................................................................... 101 2.2 recibepaquetes.c .......................................................................................................... 103 3 Entradas/Salidas con Contiki y MC13224V............................................... 104 3.1 entradasalida1.c .......................................................................................................... 104 4 Red domótica .................................................................................................. 105 4.1 redom.c ........................................................................................................................ 105 Parte IV Datasheets ..................................................................................... 109 Capítulo 1 Esquemas de Freescale Sensor Reference Board ................... 111 Capítulo 2 Esquemas de Redbee Econotag ............................................... 113 DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN VI DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN VII ÍNDICE DE FIGURAS Parte I Memoria ........................................................................................... 11 Figura 1.2. Logotipos de las distintas partes del Proyecto OSIRIS ................. 16 Figura 1.3. Modos de configuración KNX. ........................................................... 17 Figura 1.4. KNX Flat Panel PC ................................................................................ 17 Figura 1.5. Termostato para radiadores Danfoss ................................................. 18 Figura 1.6.Monitorización del agua a distancia ................................................... 19 Figura 1.7.Freescale Sensor Reference Board....................................................... 22 Figura 1.8. Redwire Econotag (Top) ...................................................................... 23 Figura 1.9. Redwire Econotag(Bottom) ................................................................. 23 Figura 1.10. Placa protoboard.................................................................................. 24 Figura 2.1. La arquitectura de 6LoWPAN ............................................................. 26 Figura 2.2. Pilas de los protocolos IP y 6LoWPAN ............................................. 27 Figura 2.3. IPv6 edge router con soporte para 6LoWPAN ................................. 28 Figura 2.4. Ejemplo de compresión en 6LoWPAN .............................................. 30 Figura 2.5.Partición entre el nucleo y los programas cargados......................... 32 Figura 3.1. Jumpers J19 y J20 ................................................................................... 36 Figura 3.2. Situación de J19 y J20 en la tarjeta. .................................................... 36 Figura 3.3.Circuito de recuperación ....................................................................... 37 Figura 3.4. Conexión de los Leds/pulsadores....................................................... 40 Figura 3.5. Esquema comunicación entre dos tarjetas. ....................................... 46 Figura 3.6. Pantallazo del Terminal con ROM desensamblada. ...................... 53 Figura 4.1.Zoom de la tarjeta Redwire Econotag................................................. 56 Figura 4.2. Parte del esquema de Redwire Econotag. ......................................... 56 DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN VIII Figura 4.3. Zoom del esquema 2 de Redwire Econotag. .................................... 57 Figura 4.4. Zoom 2 de la tarjeta Redwire Econotag............................................. 57 Figura 4.5. Soldadura de las hembras en los pines. ............................................ 57 Figura 4.7. Circuito LED + Pulsador ...................................................................... 58 Figura 4.8. Implantación y conexión del circuito a la tarjeta. ........................... 59 Figura 4.9. Esquema primera comunicación entre dos tarjetas. ....................... 61 Figura 4.10. Vista Terminal con dispositivos conectados. ................................. 62 Figura 4.11. Vista Terminal corriendo enviapaquetes.c..................................... 63 Figura 4.12. Funcionamiento de enviapaquetes.c ............................................... 65 Figura 4.13. Funcionamiento de recibepaquetes.c .............................................. 65 Figura 5.1. Esquema de la red. ................................................................................ 69 Figura 5.2. Primeras líneas de ejecución border-router.c .................................. 70 Figura 5.3. Primeras líneas de ejecución udp-client.c ........................................ 72 Figura 5.4. Página web generada por border-router.c ........................................ 73 Figura 5.5. Zoom del esquema 1 de Redwire Econotag. .................................... 75 Figura 5.6. Salida del programa entradasalida1.c ............................................... 77 Figura 5.7. Salida del programa redom.c en la tarjeta 1 ..................................... 83 Figura 7.1. Ejemplo de control via iPhone............................................................ 88 Parte II Estudio económico .......................................................................... 93 Parte III Código Fuente .................................................................................. 97 Parte IV Datasheets ..................................................................................... 109 Figura 1.1. Componentes del PCB (vista superior) ........................................... 111 Figura 1.2. Esquema de Freescale Sensor Reference Board ............................ 112 Figura 2.1. Esquema 1 Redwire Econotag ........................................................... 114 Figura 2.2.Esquema 2 Redwire Econotag. ........................................................... 115 DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN IX ÍNDICE DE TABLAS Parte I Memoria ........................................................................................... 11 Tabla 3.1. Correspondencia Pin-Registro GPIO ................................................. 40 Tabla 3.2. Selección de Funciones en GPIO......................................................... 43 Tabla 4.1. Correspondencia pin-bit ....................................................................... 64 Parte II Estudio económico .......................................................................... 93 Parte III Código Fuente .................................................................................. 97 Parte IV Datasheets ..................................................................................... 109 DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Parte I MEMORIA DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Introducción. 13 Capítulo 1 INTRODUCCIÓN A lo largo de la historia el hombre ha ido utilizando su inteligencia para evolucionar y hacerse a sí mismo la vida más cómoda y a la vez utilizar los recursos que la Tierra le proporciona de forma más eficiente. La evolución marca el ritmo de la vida y las casas tampoco pueden escapar de ella. Por ello se ha ido evolucionando desde la cueva con fuego para calentar e iluminar a las antorchas, las velas, el candil y por último la electricidad. Esta ha dado paso en la casa a los electrodomésticos que necesitan de la electrónica para regular sus procesos. Por último, se presenta en esta evolución la domótica que se encarga de que la casa sea capaz de “sentir” y reaccionar por sí sola e interactuar con nosotros. La domótica hace referencia al conjunto de sistemas capaces de automatizar una vivienda, aportando servicios de gestión energética, seguridad, bienestar y comunicación, y que pueden estar integrados por medio de redes interiores y exteriores de comunicación, cableadas o inalámbricas, y cuyo control goza de cierta ubicuidad, desde dentro y fuera del hogar[1]. Este proyecto se desarrollará en el campo anteriormente mencionado de la domótica. Se diseñará un sistema de control tanto de iluminación como de electrodomésticos usando comunicaciones inalámbricas basadas en 6LowPan. Para ello el software se implantará bajo el sistema operativo Contiki. A lo largo de las diferentes secciones se irá analizando cómo se ha ido desarrollando el trabajo y que resultados se han ido obteniendo. En la presente sección se hará una pequeña introducción al entorno en el que se mueve el proyecto y los sistemas que en él se han desarrollado ya, al igual que se explicará cual será la metodología a seguir para lograr llevar a cabo el fin que se propone. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 14 Memoria 1 Estudio de los trabajos existentes / tecnologías existentes Los últimos avances en el campo de la domótica se refieren básicamente a cuatro campos: 1) Ahorro energético, mediante el control del consumo. Como ejemplo tenemos el encendido y apagado automático de la iluminación de una casa. 2) Confort, mediante la regulación de los sistemas de climatización e iluminación y también a la hora de generar controles inalámbricos de los dispositivos de una casa de forma que el sujeto no tenga que moverse. 3) Seguridad, mediante el control con sensores, cámara, etc. 4) Comunicaciones, con el avance de las tecnologías de comunicación ya sea con cable o sin él. Es interesante hacer un pequeño resumen de lo que se hace hasta el momento relacionado con este proyecto. Veremos los sistemas alternativos que existen a 6LowPan y sus usos dentro del campo de la domótica, así como el uso que se ha hecho hasta la fecha del sistema operativo Contiki. 1.1 ZigBee Es el nombre de la especificación de un conjunto de protocolos de alto nivel de comunicación inalámbrica para su utilización con radiodifusión digital de bajo consumo, basada en el estándar IEEE 802.15.4 de redes inalámbricas de área personal (Wireless Personal Area Network, WPAN). Su objetivo son las aplicaciones que requieren comunicaciones seguras con baja tasa de envío de datos y maximización de la vida útil de sus baterías [2]. Tiene unas velocidades comprendidas entre los 20 kB/s y 250 kB/s y rangos de 10 a 75 m de alcance. Puede usar las bandas libres ISM de 2.4GHz, 868MHz para Europa y 915 para EEUU. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Introducción. 1.1.1 Arquitectura Zigbee es una pila de protocolos constituido por diferentes capas, las cuales son independientes una de la otra. En la Figura 1.1 se muestran las diferentes capas que componen la pila. Figura 1.1.Diferentes capas que conforman la pila de protocolos para Zigbee. 1.1.2 Empaquetamiento El empaquetamiento se realiza en cuatro tipos diferentes de paquetes básicos, que son: - Datos: con un tamaño de hasta 104 bytes. - Paquete ACK: es donde se realiza una realimentación desde el receptor al emisor para confirmar que el paquete se ha recibido sin errores. - Paquete MAC:se utiliza para el control remoto y la configuración de dispositivos. - Paquete baliza: se encarga de “despertar” los dispositivos que “escuchan” y luego vuelven a “dormirse” si no reciben nada más. 1.1.3 Ejemplo de aplicación Como uso de ejemplo de ZigBee, la empresa Domodesk ha desarrollado una solución domótica completa para el hogar que ha nombrado como Proyecto OSIRIS. Ésta cuenta con múltiples funciones que van desde el control del agua y del gas hasta la seguridad de la casa e incluso el control de un sistema de home cinema (Figura 1.2). El producto se ofrece como una solución óptima para instalar sistemas domóticos sin DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 15 16 Memoria necesidad de realizar obras en la vivienda. El kit ofrece un conjunto de sensores y actuadores con los cuales se puede controlar la vivienda de forma automática. Figura 1.2. Logotipos de las distintas partes del Proyecto OSIRIS 1.2 KNX Desarrollado por la asociación de un conjunto de empresas (KONNEX) con el objetivo de conseguir un sistema de control de la instalación eléctrica en viviendas y edificios. Este sistema pretende ser el “único estándar abierto para todas las aplicaciones de control de la vivienda” [4] para todos los miembros que formen parte de la asociación anteriormente citada. Una característica que lo hace interesante es la posibilidad de configurarlo conforme a dos modos de funcionamiento según el segmento de mercado al que se desee orientar. En la Figura 1.3 se pueden ver estos dos modos de funcionamiento. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Introducción. 17 Figura 1.3. Modos de configuración KNX. Un primer modo, Easy Mode, está dirigido a instaladores con conocimientos básicos sobre KNX. Ofrece limitadas funciones con respecto al otro sistema, System Mode, dirigido a instaladores KNX formado que llevan a cabo funciones de control sofisticadas. Un ejemplo que podemos nombrar de este sistema puede ser el KNX Flat Panel PC (Figura 1.4). Sistema diseñado para el control de la casa que ofrece la empresa JUNG (una de las componentes de KONNEX). Se trata de un panel táctil con el que se controlan las distintas variables de la casa y con el que se manda las órdenes oportunas. Figura 1.4. KNX Flat Panel PC DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 18 Memoria 1.3 Z-wave Z-wave es un tipo de tecnología inalámbrica diseñada para la automatización del hogar. Es un estándar que permite a todos los dispositivos fabricados bajo el mismo comunicarse perfectamente entre ellos, formando una red doméstica. Usa la frecuencia de 868.42MHz. Actualmente existen 160 fabricantes que utilizan este tipo de tecnología para sus productos. Un ejemplo de fabricantes que utilizan esta tecnología puede ser la compañía Danfoss, que ofrece una automatización inalámbrica completa de todas las variables de una casa por medio de esta tecnología. Un ejemplo puede ser el termostato inalámbricamente controlado para radiadores (Figura 1.5). Figura 1.5. Termostato para radiadores Danfoss 1.4 Contiki No son muchos los usos comerciales que se han dado hasta el momento a Contiki, pero sin duda el más importante de ellos puede ser la Monitorización del Agua a distancia (Figura 1.6), desarrollado por el SICS en el Mar Báltico. Se trata de un conjunto de sensores anclados a diferentes profundidades que recogen información y son capaces de transmitirla de forma inalámbrica. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Introducción. 19 Figura 1.6.Monitorización del agua a distancia 2 Motivación del proyecto Este proyecto surge de ese afán de comodidad y de eficiencia que se ha comentado antes. En primer lugar comodidad evidente a la hora de facilitar el control de una casa desde cualquier lugar. En segundo lugar la eficiencia a la hora de poder usar esta tecnología para reducir el consumo de electricidad de una casa común. Se busca que el sujeto sea capaz de controlar todo lo relativo a su casa de forma cómoda y sencilla. A la vista de los trabajos ya realizados en este campo y las investigaciones que se han llevado a cabo en el mismo, encontramos la motivación de este proyecto. Es clara la necesidad de un sistema domótico dentro de la vivienda donde los protocolos y software sean gratuitos, con lo que eso supone en la reducción del coste de los dispositivos. El uso de otros protocolos de comunicación, como es el caso de ZigBee, supone un importe extra a la hora de implantar las redes que puede ser fácilmente obviado con el uso de protocolos Open Source1. La propuesta del uso de Contiki y de 6LoWPAN es una alternativa muy atractiva para solucionar lo que ya se ha nombrado antes. Ambos software cumplen a la perfección con la premisa de gratuidad y fácil acceso a los mismos. 1 Llamamos así al conjunto de Software que es desarrollado y distribuido libremente. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 20 Memoria Además del coste, otro atractivo que tiene el sistema 6LoWPAN es su funcionamiento directamente sobre protocolos IP lo que facilitará en gran medida la conexión con la red inalámbrica Wi-Fi, ya existente en la vivienda. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Introducción. 3 Objetivos y aplicaciones Los principales objetivos que seguiremos a la hora de alcanzar nuestra meta son los siguientes: 1) Documentación. Se procederá a la búsqueda de información referida a lo que este proyecto abarca, con el fin de crear una base para el posterior desarrollo del mismo. La búsqueda de información se enfocará a los recursos (software, hardware…) que se van a emplear. 2) Toma de contacto con Contiki y con el procesador MC13226V. A fin de saber utilizar el citado sistema operativo para el futuro del proyecto. El aprendizaje se realizara mediante tutoriales y uso del mismo. La toma de contacto con el procesador se llevará a cabo mediante la realización de aplicaciones sencillas usando dicho dispositivo. 3) Diseño de una placa básica. El fin de este objetivo es poder acoplar dicha placa al sistema de desarrollo y poder simular el sistema domótico. 4) Programación de MC13226V para uso en la comunicación entre dos tarjetas. Se desarrollara una aplicación capaz de realizar una comunicación correcta entre los dos dispositivos de tal forma que cuando se pulse un pulsador de una de las tarjetas se encienda un indicador (LED) en la otra. 5) Programación de MC13226V para montar una pequeña red domótica. Se creará una pasarela con Internet para poder conectar la red domótica a red local de casa. 4 Metodología Una vez instalados Contiki y sus diferentes aplicaciones se procederá al uso del mismo de forma sencilla a fin de conocer de forma precisa el DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 21 22 Memoria entorno. La metodología que se usará será el ir de menos complejidad a más en la creación de redes y comunicación entre dispositivos con el fin de llegar a nuestro objetivo de forma sencilla y eficiente. 5 Recursos / herramientas empleadas Para la realización del proyecto se van a utilizar diversas herramientas que a continuación se detallan: Contiki 2.5 Es un sistema operativo Open Source usado para el internet de las cosas. Es un sistema portátil, multitarea para sistemas de red que necesiten eficiencia en la memoria. Freescale Sensor Reference Board Es un sistema de desarrollo que cuenta con un procesador MC13226 además de múltiples entradas y salidas, así como sensores de temperatura, presión e incluso acelerómetros (Figura 1.7). Figura 1.7.Freescale Sensor Reference Board DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Introducción. 23 Redwire Econotag Es un sistema de desarrollo que cuenta con un procesador MC13226 además de múltiples conectores para su uso como entradas y salidas (Figuras 1.8 y 1.9). Figura 1.8. Redwire Econotag (Top) Figura 1.9. Redwire Econotag(Bottom) Placa Protoboard Para la construcción de un circuito sencillo (Figura 1.10). DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 24 Memoria Figura 1.10. Placa protoboard. PC Para ejecutar el sistema de desarrollo. Será necesario que el sistema operativo de dicho PC sea Linux o en su caso una máquina virtual sobre la que se pueda ejecutar la programación de los distintos dispositivos. Para el caso particular del desarrollo de este proyecto se ha elegido un sistema operativo Windows con una instalación de una máquina virtual gracias a la aplicación Instant Contiki que instala automáticamente en el ordenador el programa VMware Player, dentro del cual hay una versión completa de Linux con todas las librerías y todo lo necesario para el uso de Contiki. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Principios Teóricos. Capítulo 2 PRINCIPIOS TEÓRICOS 1 6LoWPAN En este apartado se procederá a introducir el estándar que permite el uso de IPv6 sobre redes inalámbricas de baja potencia2 (6LoWPAN). Gracias a este protocolo se puede romper la barrera para el uso de IPv6 en dispositivos de baja potencia. 6LoWPAN es un conjunto de estándares definidos y creados por el Internet Engineering Task Force (IETF), que crean y mantienen todos los estándares y arquitecturas basados en Internet. El estándar 6LoWPAN permite el uso eficiente de IPv6 en redes de baja potencia y baja tasa de datos en simples dispositivos empotrados mediante una capa de adaptación y la optimización de los protocolos referidos. 1.1 La arquitectura de 6LoWPAN El internet inalámbrico integrado se crea a partir de la conexión de pequeñas islas de dispositivos integrados, cada isla perteneciente a un “stub network”3 en internet. La estructura de 6LoWPAN está hecha a partir de redes inalámbricas de baja potencia (LoWPANs), que son IPv6 “stub networks”. El conjunto de arquitectura 6LoWPAN se muestra en la Figura 2.1. Como se observa en dicha figura hay definidos tres niveles diferentes de LoWPANs: Simple LoWPAN. Extended LoWPAN. Ad hoc LoWPAN. En inglés: IPv6 over Low-power Wireless Personal Area Networks = 6LoWPAN Un “stub network” es una red cuyos paquetes IP son enviados “desde” o “destinados a”, pero nunca funcionan como tránsito para otras redes. 2 3 DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 25 26 Memoria Figura 2.1. La arquitectura de 6LoWPAN Una red LoWPAN es un conjunto de nodos que comparten el prefijo de la dirección IPv6 (los primeros 64 bits de la dirección IPv6). Una red Ad hoc LoWPAN no está conectada a internet, pero en lugar de eso puede operar sin ninguna infraestructura. Por el contrario una red Simple LoWPAN está conectada mediante un Edge Router a otra red IP4. Finalmente, una red Extended LoWPAN abarca un conjunto de LoWPANs de múltiples edge routers a lo largo de un link principal que las conecta entre ellas. En este tipo de redes los edge routers juegan un papel muy importante ya que se encarga de conectar las redes y a la vez realizar la compresión o descompresión necesaria ya sea el flujo entrante o saliente a la red LoWPAN. 4 Internet Protocol DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Principios Teóricos. 1.2 Introducción a 6LoWPAN En este apartado se hará una pequeña introducción a los aspectos más importantes de 6LoWPAN. 1.2.1 Pila del protocolo En la Figura 2.2 se puede ver la pila de un protocolo 6loWPAN en comparación con la de un protocolo IP normal y las cinco capas del Modelo de Internet. Como se puede observar son prácticamente iguales exceptuando las siguientes diferencias: Lo primero de todo es que 6LoWPAN solo es compatible con IPv6, de tal forma que ha sido definida una pequeña capa de adaptación (llamada LoWPAN adaptation layer) para optimizar IPv6 sobre IEEE 802.15.4. El protocolo de transmisión comúnmente utilizado suele ser el user datagram protocol (UDP), que suele comprimirse usando el formato LoWPAN. Por el contrario el transmission control protocol (TCP) no suele usarse debido a razones de complejidad, eficiencia y rendimiento. Figura 2.2. Pilas de los protocolos IP y 6LoWPAN DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 27 28 Memoria La adaptación entre IPv6 completo y el formato LoWPAN suele realizarse en los routers que se encuentran entre las diferentes islas de dispositivos 6LoWPAN, los edge routers que ya se comentaron en el apartado anterior. En la Figura 2.3 se representa esto mismo con más detalle. Figura 2.3. IPv6 edge router con soporte para 6LoWPAN 1.2.2 Capas de enlace en 6LoWPAN Una de las ventajas del protocolo de comunicación IP es la capacidad que tiene de conectar enlaces heterogéneos formando una sola red en la que existe la interoperabilidad. Lo mismo ocurre con 6LoWPAN y las redes integradas, donde existen muchos tipos de enlaces inalámbricos (y en ocasiones por cable). Al existir tantos tipos de comunicaciones tiene que existir una aplicación con un rango más grande de integración que el existente para PC, por ejemplo, que suelen usar solo Ethernet o WiFi. Afortunadamente IEEE 802.15.4 es el estándar más utilizado en estos casos, y que casualmente es la base sobre la que se desarrolla 6LoWPAN. Como ya se describe en [RFC3819]5 para poder trabajar con IP es necesario cumplir una serie de requisitos tales como direccionamiento, control de errores, fiabilidad, etc. Por el contrario, 6LoWPAN está diseñado para usar un tipo especial de enlace y por ello tiene diferentes tipos de requerimientos. Los requisitos más importantes en el uso de 6LoWPAN tienen que ver con direccionamiento, las tramas (framing) y la transmisión punto a punto (unicast transmission). El direccionamiento es necesario para 5 http://www.ietf.org/rfc/rfc3819.txt DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Principios Teóricos. diferenciar entre nodos de un enlace, y para formar direcciones IPv6 que son luego comprimidas por 6LoWPAN. Los accesos de enlace múltiple suelen ser capaces de administrar un servicio broadcast, por eso no es necesario en 6LoWPAN multicast-service. IPv6 requiere una unidad de transmisión máxima (MTU6) de 1280 bytes desde un enlace. 6LoWPAN cumple con esto mediante la fragmentación de la capa de adaptación LoWPAN. El enlace debe proporcionar un tamaño de al menos 30bytes para que sea útil (preferiblemente de más de 60 bytes). Aunque UDP y ICMP proporcionan una suma de comprobación de 16-bit es recomendable que la capa de enlace proporcione una fuerte comprobación de errores. 1.2.3 Direccionamiento El direccionamiento IP en 6LoWPAN es prácticamente igual que en cualquier red IPv6, y muy similar, incluso, al direccionamiento sobre redes Ethernet como se define en [RFC2464]7. 1.2.4 Formato del encabezamiento La funcionalidad más importante de 6LoWPAN viene de la mano de la capa de adaptación LoWPAN, que permite comprimir IPv6. Esta compresión se basa en compartir información conocida a lo largo de todos los nodos que participan en esta LoWPAN. La cabecera de LoWPAN consiste en un valor que indica el tipo de cabecera que es, seguido por un byte de compresión de la cabecera IPv6 que indica qué campos están comprimidos. Un ejemplo de esta compresión en 6LoWPAN viene en la Figura 2.4. Se puede observar como en el paquete superior existe un único byte (L ) para indicar que es IPv6 completa sobre IEEE 802.15.4. Por el contrario, en 6 7 Maximum transmission unit http://www.ietf.org/rfc/rfc2464.txt DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 29 30 Memoria el paquete inferior, existen 2 bytes para indicar una compresión de la cabecera de IPv6. Figura 2.4. Ejemplo de compresión en 6LoWPAN 1.2.5 Arranque (Bootstrapping) Las aplicaciones más comunes a las que suele estar destinado 6LoWPAN requieren de una completa autonomía tanto en dispositivos como en redes, que deben autoconfigurarse solos. El arranque primero necesita ser ejecutado por la capa de enlace, de forma que habilite la comunicación con todos los nodos dentro del radio de acción. Para esto en 6LoWPAN se utiliza la herramienta de reconocimiento de nodos vecinos (Neighbor Discovery). Esta herramienta está basada en la ya existente para IPv6 pero optimizada para el uso en baja potencia, siendo capaz de autoconfigurar la actuación de los hosts, routers y edge routers en la red LoWPAN. El registro de todos los nodos se encuentra en el edge router, que simplifica así la actuación de IPv6 sobre la red y reduce la cantidad de flujo multipunto. Además 6LoWPAN Neighbor Discovery(6LoWPAN-ND) permite que las redes de baja potencia puedan tener más de un edge router bajo una misma raíz (e.g. Ethernet), y una única generación de la dirección de la capa de enlace. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Principios Teóricos. 2 Contiki Contiki es un sistema operativo “ligero” o de bajo consumo diseñado específicamente para la creación de redes de comunicación con gran cantidad de nodos. Es por eso que el sistema es capaz de soportar cargas de programas y sustitución de programas y “servicios” de forma dinámica, para no tener que parar el funcionamiento de toda la red para cambiar o reparar la programación de uno de los nodos. Está construido sobre un Kernel que actúa por eventos pero a su vez proporciona multitarea preferente que puede ser asignada a un proceso individual. 2.1 Resumen del sistema El sistema operativo Contiki necesita de un kernel, librerías, un programa de carga y una serie de procesos para poder funcionar. Los programas y aplicaciones pueden ser sustituidos mientras el dispositivo está en funcionamiento. La comunicación entre procesos siempre se realiza a través del kernel. Finalmente, el kernel no proporciona una capa de adaptación con el hardware, deja a las aplicaciones comunicarse directamente con el hardware. Un proceso es definido mediante una función de control de eventos. El estado del proceso está definido en la parte de la memoria destinada a este fin, de esta forma el kernel solo coge un puntero hacia el estado del proceso. Todos los procesos comparten el mismo espacio de direcciónes y no funcionan en diferentes dominios protegidos. La comunicación entre procesos se hace mediante un posting de eventos. Como se ve en la Figura 2.5 el sistema Contiki esta partido en dos mitades: el núcleo (core) y los programas ya cargados (loaded programs). La partición se realiza durante la compilación y es específica de donde Contiki vaya a ser usado. Normalmente, el núcleo está formado por el kernel, el cargador de programas (program loader), las partes más usadas del lenguaje del tiempo de ejecución y una pila de comunicación con drivers para el hardware de comunicación. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 31 32 Memoria Figura 2.5.Partición entre el nucleo y los programas cargados. 2.2 La arquitectura del Kernel El kernel de Contiki consiste en un sistema de planificación de eventos de bajo consumo que reparte eventos entre los procesos en ejecución y que periódicamente llama a una serie de procesos que controlan dichos eventos. El kernel soporta dos tipos de eventos: asíncronos y síncronos. Los asíncronos son colocados en una cola y luego son distribuidos a los procesos un tiempo después. Los eventos síncronos son similares a los asíncronos pero hacen que el proceso objetivo sea inmediatamente programado. Además de lo ya mencionado el kernel proporciona un sistema polling o de control de eventos. Este puede verse como un sistema de prioridad de eventos que hace que sean programados entre los eventos asíncronos. Suele ser usado por procesos que se encuentran “cerca” del hardware para controlar de forma periódica el estado de los dispositivos de dicho hardware. Por ejemplo, si se usa un puerto serie se tendrá que utilizar dicho mecanismo para ver el flag de recepción del UART, para comprobar si ha llegado un carácter y en caso afirmativo procesarlo. 2.2.1 Dos niveles de arquitectura de programación La programación de eventos en Contiki se hace en un solo nivel, de esta forma los eventos no se pueden adelantar unos a otros. La única DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Principios Teóricos. 33 forma de adelantarse es mediante las interrupciones. Normalmente estas interrupciones vienen implementadas por el uso del hardware, pero en ocasiones pueden estar implementadas usando un sistema en tiempo real subyacente (que utiliza la misma técnica previamente utilizada en el kernel de Linux). 2.2.2 Modo de ahorro de energía Un aspecto muy importante dentro de una red de sensores es ser capaz de apagar uno de los nodos cuando esté inactivo. El ahorro de energía en Contiki viene dado por dos fuentes, las aplicaciones y los protocolos usados por la red. El kernel de Contiki tiene el propósito directo de ahorrar energía. Para permitir a las aplicaciones saber cuándo apagar el sistema el programador de eventos proporciona la longitud de la cola de eventos. Gracias a esto se puede saber cuándo va a dejar de haber eventos y así apagar el sistema. El sistema arrancará de nuevo cuando surja una interrupción. 2.3 Servicios (services) en Contiki En Contiki, un servicio es un proceso que implementa funcionalidades que pueden ser usadas por otros procesos. Se puede ver como una forma de librería compartida por los procesos. Los servicios, al igual que los programas pueden ser reemplazados de forma dinámica en tiempo de ejecución, pero a su vez tienen que ser vinculados también de forma dinámica. Los servicios están organizados en una capa de servicios que está conceptualmente situada al lado del kernel. Dicha capa proporciona un rastreo de los servicios que están siendo ejecutados así como un camino para encontrar los ya instalados. Un servicio se identifica por una cadena de caracteres que lo describe. Un servicio se compone de una interfaz y un proceso que la implementa. La interfaz está compuesta por una tabla que apunta hacia las funciones que implementan dicha interfaz. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 34 Memoria 2.4 Librerias El kernel de Contiki solo proporciona las funcionalidades más básicas de la CPU. Para todo lo demás están las librerías. Un programa puede ser enlazado con una librería de tres formas diferentes. Primero, puede ser enlazado de forma estática con librerías que forman parte del núcleo. Segundo, puede ser enlazado de forma estática con librerías que forman parte del propio programa cargado. Tercero, los programas pueden llamar a servicios implementando una librería en particular. Para este último caso es necesario lo que ya se ha comentado antes sobre la sustitución dinámica de servicios en Contiki. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN El procesador MC13226V. Capítulo 3 EL PROCESADOR MC13226V En este capítulo se expondrá el desarrollo de la primera toma de contacto con el microprocesador MC13226V que va a ser usado en la mayor parte del desarrollo del proyecto. Para hacer un uso eficiente del procesador y eliminar los posibles problemas derivados de un fallo en el diseño del hardware o incluso en el montaje del mismo, el procesador será utilizado a través de una placa de desarrollo. En este caso dicha placa será la denominada como Freescale Sensor Reference Board, ya introducida en el capítulo primero de este documento. 1 Borrado de la memoria FLASH Antes de comenzar con la programación del microprocesador es necesaria la preparación del mismo para dicho fin. El dispositivo que se va a usar viene protegido contra escritura por defecto. Para cambiar dicho estado es necesario seguir las instrucciones que se detallan en el manual de referencia [8] y que a continuación se explican. El primer paso es identificar los jumpers J19 y J20. En la Parte cuatro del presente documento se adjuntan una serie de esquemas necesarios para dicho fin. Fijándose en el primero de estos esquemas podemos ver que los jumpers buscados se encuentran en la parte superior central de la tarjeta. En la Figura 3.1 se observa con más detalle estos dos jumpers. Finalmente, en la Figura 3.2 se muestra la ubicación en el dispositivo real. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 35 36 Memoria Figura 3.1. Jumpers J19 y J20 Figura 3.2. Situación de J19 y J20 en la tarjeta. El segundo paso que se debe realizar es el de cortocircuitar dichos jumpers a la vez. Lo tercero que debemos realizar es encender el dispositivo y pulsar el botón de reset durante unos segundos. Finalmente, se debe apagar la tarjeta y así concluir el proceso de borrado de la memoria Flash, ahora el dispositivo se encuentra en disposición de ser programado. En la Figura 3.3 se muestra el circuito que va detrás de este procedimiento y cómo para obtener el estado de recuperación es necesario poner la entrada ADC2_VREFH a 0 y la entrada ADC2_VREFL a 1. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN El procesador MC13226V. Figura 3.3.Circuito de recuperación 2 Carga de programas en MC13226V Antes de empezar a conocer el microprocesador es necesario conocer cómo se puede introducir un programa dentro del mismo, debido a que la comprensión del funcionamiento del dispositivo se va a realizar por medio de carga de distintos programas de prueba disponibles en la librería libmc1322x. Esta librería ha sido creada y distribuida libremente con el fin de facilitar el aprendizaje del sistema mediante el uso de tutoriales. La librería es un conjunto de programas tutoriales que abarcan la mayor parte de las funcionalidades del sistema. 2.1 Instalación de la librería libmc1322x El primer paso es instalar dicha librería en el ordenador. Para ello es necesario abrir el terminal del sistema operativo Linux e introducir el siguiente comando. git clone git://git.devl.org/git/malvira/libmc1322x.git Una vez realizado este paso con éxito se dispone ya de la librería completa dentro de la carpeta raíz del sistema. 2.2 Cargar imágenes en la RAM con mc1322x-load.pl Una vez instalada ya la librería es el momento de aprender a usar todas sus funcionalidades. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 37 38 Memoria Para poder cargar programas dentro del microprocesador se utilizará la herramienta mc1322x-load.pl. Con ella se conseguirá una carga de forma rápida y sencilla en un único paso. Es importante tener en cuenta que con esto se consigue introducir el programa en la memoria RAM, por lo que al apagar el dispositivo el programa se borrará automáticamente. Para introducir el programa primero se ha de conectar la tarjeta de desarrollo al ordenador por medio del puerto USB disponible. La carga del programa se hará vía UART. El siguiente paso es ir al terminal del ordenador y meter el comando con el que se conseguirá la carga del programa buscada. Dicho comando es el que se muestra a continuación. ~/libmc1322x/tools/mc1322x-load.pl –f nombredelprograma_freescalencb.bin –t /dev/ttyUSB0 Es importante tener en cuenta y ver en que entrada se encuentra conectado la tarjeta de desarrollo, ya que en muchas ocasiones no estará en la entrada USB0. Una vez introducido el comando es necesario pulsar una vez el botón de reset de la tarjeta para que funcione correctamente. 3 Entradas/salidas en MC13226V Una vez que se ha recuperado la memoria FLASH y se conoce la forma de cargar programas es el momento de empezar a tomar contacto con las distintas entradas/salidas del microprocesador y ver cómo actuar sobre ellas a la hora de realizar la programación. 3.1 Salidas en MC13226V Se empezará primero con las salidas, debido a que requieren una menor complejidad que las entradas y es un mecanismo más directo. Para esta toma de contacto y las sucesivas que se harán se utilizaran los ejemplos de la librería ya instalada que servirán de ayuda en la comprensión del funcionamiento perseguido. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN El procesador MC13226V. Los programas que se utilizarán se encuentran todos en la carpeta tests dentro de la carpeta libmc1322x en el directorio raíz. Antes de proceder a introducir ningún programa es necesario hacer la compilación de todos ellos para poder generar los archivos .bin que posteriormente serán introducidos en el micro. Para ello se procederá a ejecutar los siguientes comandos dentro del terminal, prestando atención de estar en la carpeta correcta donde se encuentran todos los archivos .c de los programas. cd ~/libmc1322x/tests make BOARD=freescale-ncb Como se puede observar hemos elegido la tarjeta para la que se quiere que se compilen todos los programas, así no generará archivos .bin de más. En caso de querer que el ordenador compile para todos las tarjetas disponibles en el Makefile únicamente se tendría que poner el comando make, sin especificar tarjeta. Se analizará en primer lugar todos los programas que únicamente trabajen con los LED disponibles en la tarjeta. Estos programas son todos los que comienzan su nombre con la palabra “blink”. Haciendo una pequeña revisión de los códigos se descubre que en todos ellos se utilizan un conjunto de funciones que previamente han sido definidas archivo gpio.c, archivo cuyo código se adjunta en la parte 3 del presente documento. Se puede observar como cada una de estas funciones simplemente da un valor a un conjunto de punteros que sirven tanto para definir el valor del puerto entrada/salida, como para inicializarlo. Para conseguir comprender en mayor medida el funcionamiento de estos punteros es necesario acudir al manual de referencia [9] y más concretamente al capítulo 11 donde se explica cómo utilizar estos registros, además de en que bit se encuentra cada entrada/salida de propósito general del microprocesador. Para no extender demasiado este DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 39 40 Memoria documento se ha preferido no introducir dicho manual de referencia debido a su longitud. A continuación se hace una pequeña explicación en el uso de dichos registros. 3.2 Registros GPIO Lo primero que hay que hacer antes de nada es ver en que parte de los registros se encuentran los LEDs y los pulsadores de la tarjeta de desarrollo. Para ello hay que examinar el esquema del circuito de la tarjeta que se adjunta en la parte cuatro de este documento. En la Figura 3.4 se observa que los LEDs y pulsadores se encuentran en los pines del micro denominados por KBI (de 0 a 7). Figura 3.4. Conexión de los Leds/pulsadores En el manual de referencia [9] que se ha mencionado antes viene la tabla de correspondencia entre los pines del micro y el bit del registro GPIO. En la Tabla 3.1 se muestra un extracto de la misma donde se ven los pines KBI. Register X Bit Function Pin 23 GPIO23/KBI1 41 24 GPIO24/KBI2 40 25 GPIO25/KBI3 39 26 GPIO26/KBI4 38 27 GPIO27/KBI5 37 28 GPIO28/KBI6 36 29 GPIO29/KBI7 35 Tabla 3.1. Correspondencia Pin-Registro GPIO DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN El procesador MC13226V. 41 Para acceder a los bits correspondientes del registro el sistema presenta una serie de punteros que facilitan la tarea de dar valor a dichos registros tanto para inicializarlos como para actuar sobre las entradas/salidas. Dichos punteros normalmente suelen estar divididos en dos, uno se encarga de los primeros 32bits del registro y el segundo se encarga de los otros 32bits. Generalmente, como los bits de los LEDs/pulsadores se encuentran dentro de los primeros 32 se hará únicamente referencia al puntero que los tiene en cuenta A continuación se hace un pequeño resumen de los registros más importantes y que se utilizarán en esta primera parte del proyecto. 3.2.1 GPIO_PAD_DIR0 Este registro es el encargado de definir la dirección de un determinado pin del micro, teniendo dos posibles valores, entrada o salida. Cuando se encuentra a 0 significa que el pin es una entrada, en cambio, cuando se encuentra a 1 el pin es una salida. A su vez tiene dos punteros complementarios: GPIO_PAD_DIR_RESET0. Cuando se pone un 1 en un correspondiente bit de este registro se pone automáticamente un 0 en el correspondiente bit de registro GPIO_PAD_DIR0. GPIO_PAD_DIR_SET0. Cuando se pone un 1 en un correspondiente bit de este registro se pone automáticamente un en el correspondiente bit de registro GPIO_PAD_DIR0. 3.2.2 GPIO_PAD_PU_SEL0 Este registro es el encargado de decir si en un determinado pin del micro la conexión se ha hecho mediante una resistencia pull-up ó pulldown. Poniéndolo a 0 se activa la opción pull-down y poniéndolo a 1 se activa la opción pull-up. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 42 Memoria 3.2.3 GPIO_DATA_SEL0 Este registro es el encargado de determinar si los datos de un determinado pin van a ser leídos desde el Data Register o directamente desde el pad. Cuando se pone un determinado bit a 0 quiere decir que la lectura se va a realizar desde el pad. Por el contrario, si al bit se le da el valor 1 quiere decir que la lectura se va a realizar desde el Data Register. 3.2.4 GPIO_DATA0 Es el puntero a través del cual se interactúa con la entrada/salida, de tal forma que si está en modo salida se le puede poner el valor que se elija. Mientras que si está en modo entrada desde él se puede leer el valor de dicha entrada. 3.2.5 GPIO_FUN_SEL1 Es el registro que se encarga de seleccionar la función que tendrá cada pin. Tiene dos bit por cada pin del microprocesador. A continuación se muestra la tabla de correspondencia entre el valor y la función a la que corresponde que ha sido extraída de [9]. Category Alternative Function Function 0 [00] (Default) Function 1 Function 2 Function 2 [01] [10] [11] 1 SSI GPIO SSI GPIO GPIO 2 SPI GPIO SPI GPIO GPIO 3 TIMER GPIO TIMER GPIO GPIO 4 I2C GPIO I2C GPIO GPIO 5 UART GPIO UART GPIO GPIO 6 KBI GPIO/KBI GPIO/KBI GPIO/KBI GPIO/KBI 7 ADC - - GPIO GPIO GPIO TX Control RX Control GPIO 8 EXT RF CTL DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN El procesador MC13226V. Category 9 Alternative Function 43 Function 0 [00] (Default) JTAG & JTAG & Nexus Nexus Function 1 Function 2 Function 2 [01] [10] [11] GPIO GPIO GPIO Tabla 3.2. Selección de Funciones en GPIO 3.2.6 Aplicación final a las salidas Así pues, si lo que se quiere es encender un determinado LED (o simplemente actuar sobre una salida) en un determinado pin se ha de proceder como se expone en el siguiente ejemplo. El primer paso que hay que dar es el de poner los “includes” necesarios. Para este caso en particular los serán los siguientes. #include <mc1322x.h> #include <board.h> A continuación se procede con el programa principal, donde (si no se necesita ninguna variable) lo primero es inicializar los puertos con los registros que ya se han explicado anteriormente. El LED elegido en este ejemplo es el que se encuentra en el pin KBI1, el bit 23 del registro. *GPIO_FUNC_SEL1 = 0; /*Eliges el LED con función GPIO*/ *GPIO_PAD_DIR0 |= (1 << 23); /*Pones el LED como salida*/ Finalmente, ya solo queda actuar sobre el LED como se estime oportuno para las diferentes aplicaciones a las que vaya dirigido el programa. En este caso ponemos un ejemplo de un parpadeo del determinado LED. while(1) { *GPIO_DATA0 |=(1 << 23); /*Enciendes el LED*/ for(i=0; i<DELAY; i++) { continue; } *GPIO_DATA0&=~(1 << 23);/*Apagas el LED*/ for(i=0; i<DELAY; i++) { continue; } } Una vez realizado el programa sólo queda compilarlo para la tarjeta a la que va destinada como ya se ha visto en anteriores apartados y cargarlo en la misma. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 44 Memoria 3.3 Entradas en MC13226V Una vez expuesto el funcionamiento de las salidas resulta más fácil entender las entradas, que prácticamente funcionan igual. Como todos los punteros necesarios ya han sido explicados, se analizarán las entradas a la luz de un ejemplo. En este caso el ejemplo será el que se adjunta en la parte III del documento, conpulsadores.c. Al igual que antes, una vez hechos todos los “includes”, hay que realizar las inicializaciones dentro del programa principal. Esta vez es muy importante seleccionar que tipo de resistencia va a haber a la entrada cuando actives el pulsador, es decir, como está implementado el circuito del pulsador (de esto dependerá que tengas un 0 o un 1 a la entrada cuando pulses) y seleccionar desde donde se va a leer el valor del registro para las posteriores operaciones que se vayan a realizar. *GPIO_FUNC_SEL1 = 0; /*Eliges los pulsadores con función GPIO*/ *GPIO_PAD_DIR0 |= (7 << 23); /*Pones el LED como salida*/ *GPIO_PAD_DIR_RESET0 = (1 << 26);/*Pones el pulsador como entrada*/ *GPIO_PAD_PU_SEL0 |= (1 << 26);/*Activas la resistencia de pullup, es decir que cuando pulses te va a poner un 0*/ *GPIO_DATA_SEL0 &= ~(1 << 26); /*Seleccionas que vas a leer desde el Data register un no desde el pad*/ A continuación viene realizar las operaciones, en este caso serán: Leer el registro. Seleccionar el bit del pulsador elegido. Dependiendo del valor del mismo actuar. t = *GPIO_DATA0; /*Lees las entradas */ a = ((t >> 26) & 1);/*Seleccionas el bit*/ if(a == 1){ *GPIO_DATA0|=(1 << 24);/*Enciendes el LED2*/ }else{ *GPIO_DATA0&=~(1 << 24);/*Apagas el LED2*/ } Para completar el programa se ha incluido la opción de sacar por pantalla, vía el UART, el valor del registro completo, por si en algún momento y por algún caso el programa no llega a funcionar del todo ver si el registro funciona correctamente. Este ha sido una de los pasos clave a la DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN El procesador MC13226V. 45 hora de conseguir entender y hacer funcionar las salidas dentro de este proyecto. Generalmente todo funciona correctamente y es en la elección de las inicializaciones donde se encuentra el fallo, por ello hay que tener especial cuidado en este paso. Para mostrar por pantalla el registro completo se utiliza una función, que viene previamente definida dentro del sistema que muestra un solo caracter, para definir una segunda función que sea capaz de mostrar una cadena de caracteres completa. Esta segunda función es la que se muestra a continuación. void uart1_puts(char *ps){ while (*ps != '\0'){ uart1_putc(*ps); ps++; } } Finalmente, lo único que se debe hacer es llenar la cadena de caracteres con el registro completo y sacarlo por pantalla. for(i=0;i<=31;i++){ /*El registro tiene 32bits de 0 a 31*/ j=((*GPIO_DATA0>>i)&1); if(j == 1){ buffer[i] = '1'; } else{ buffer[i] = '0'; } } uart1_puts(buffer); uart1_puts("\n"); Es muy importante tener en cuenta que para que esto funcione correctamente es necesario haber inicializado el módulo UART de la tarjeta. Para ello el sistema trae definida una función que hay que poner en las inicializaciones del programa. uart1_init(INC,MOD,SAMP); DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 46 Memoria 4 Primeras comunicaciones entre dos tarjetas Una vez que se han conseguido los pasos anteriores y ya se controlan tanto las entradas como las salidas el siguiente paso es el de ser capaz de hacer una comunicación básica entre dos tarjetas. Se intentará hacer que mientras se pulsa un pulsador en una de las tarjetas en la otra se encienda un LED. Para ello primero se hará de forma básica para probar que funcionan bien, usando una comunicación básica de 802.15.4. En la Figura 3.5 se muestra un simple esquema de lo que se pretende hacer en este apartado. Figura 3.5. Esquema comunicación entre dos tarjetas. La forma en la que se va a proceder para alcanzar el fin que se propone es introducir un programa en la tarjeta emisora que cuando detecte que se ha pulsado un determinado pulsador envíe un paquete cuyo contenido sea un ‘1’. A partir de esto habrá que introducir un segundo programa en la tarjeta receptora que detecte los paquetes entrantes y cuando alguno sea ‘1’ encienda un determinado LED. A continuación se explica más detalladamente estos programas. 4.1 Inicialización del módulo de comunicación Antes de comenzar las aplicaciones que hemos descrito antes, el programa tiene que tener una parte que se encargue de la inicialización de las comunicaciones. En este caso coincidirán tanto para el programa de transferencia como para el de recepción. Las inicializaciones que se deben hacer son las que se incluyen en los correspondientes códigos adjuntos en la parte de este documento destinada a los códigos fuentes. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN El procesador MC13226V. printf("trim_xtal"); trim_xtal(); printf("->done\n"); printf("vreg_init"); vreg_init(); printf("->done\n"); printf("maca_init"); maca_init(); printf("->done\n"); set_channel(0); /* 802.15.4 canal 11 */ set_power(0x12); /* 0x12 es la más alta, 4.5dBm */ Las tres primeras funciones vienen definidas en el propio sistema y son autónomas, no hay que configurarlas de ninguna manera. Con ellas se consigue que iniciar el regulador de voltaje del NVM (vreg_init()), que se inicie el hardware de comunicación y el bucle de interrupciones para la recepción y transmisión (maca_init()), y finalmente que el on-board crystal se ponga en exactamente 24MHz. Después de estas se encuentran otras dos funciones a las cuales si que hay que pasarles un valor. Con la primera de ellas se elige el canal en el cual se va a realizar la comunicación, generalmente el canal más usado es el 11. Y con la segunda se configura la potencia de emisión, en este caso se elige la más alta para no tener problemas en este sentido. 4.2 Programa emisor El primer programa que se va a realizar será el que vaya en el emisor. Antes de comenzar con la programación es importante saber qué forma tienen los paquetes que se van a enviar o recibir, para saber donde habrá que escribir o leer el valor de dicho paquete. 4.2.1 La estructura de los paquetes La estructura interna de dichos paquetes es la que se muestra a continuación. struct packet { uint8_t length; /* offset into data for first byte of the packet payload */ DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 47 48 Memoria /* On TX this should be 0 */ /* On RX this should be 1 since the maca puts the length as the first byte*/ uint8_t offset; uint8_t data[MAX_PAYLOAD_SIZE+2+1]; /* +2 for FCS; + 1 since maca returns the length as the first byte */ }; typedef struct packet packet_t; Se observa que los paquetes cuentan con tres partes claramente diferenciadas. La primera que define la longitud que van a tener los paquetes. Una segunda parte que define el offset que tendrán. Y finalmente una tercera parte donde se encuentra el verdadero valor del paquete y que será la parte útil del mismo que se deberá usar. 4.2.2 Función para rellenar paquetes Es necesario crearse una función cuyo cometido sea el de rellenar un paquete que después será enviado. Dicha función se muestra a continuación. void fill_packet(volatile packet_t *p){ (p->data)[0] = '1'; (*p).length = 1; (*p).offset = 0; } En este caso como solo se quiere mandar un único ‘1’ los valores del paquete se definen directamente. Si el paquete interesa que sea una cadena de caracteres, donde valores como la longitud del paquete vienen condicionados por dicha cadena la función encargada de rellenar un paquete tiene que ser como se muestra a continuación. void fill_packet(volatile packet_t *p){ sprintf(p->data, "Hola:\n"); p->length = strlen(p->data); (*p).offset = 0; } DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN El procesador MC13226V. 4.2.3 Bucle infinito Finalmente lo único que queda es definir el bucle infinito que se ejecutará durante el funcionamiento del dispositivo. Lo primero de todo se pone un LED de comprobación para ver que realmente el sistema pasa dentro del bucle. Luego se lee el registro GPIO y se extrae el bit que interese, como ya se hiciera en apartados anteriores. Finalmente lo que queda es actuar en función del valor de dicho bit. Si el bit tiene un valor de ‘0’ quiere decir que el pulsador está siendo pulsado y es el momento de enviar un paquete con valor ‘1’. Para ello primero es necesario obtener un nuevo paquete con la función ya definida en el sistema get_free_paqket(), si este paso ha sido correcto la función nos devuelve un TRUE. Si este paso ha sido correcto lo que hay que hacer es enviar el paquete. Para ello, primero le tenemos que llenar y luego enviar con la función ya definida tx_packet(). while(1) { *GPIO_DATA0 |=(1 << 23); /*Enciendes el LED1*/ t = *GPIO_DATA0; /*Lees las entradas */ a = ((t >> 26) & 1); if(a == 0){ p_mi_paquete = get_free_packet(); if(p_mi_paquete) { fill_packet(p_mi_paquete); tx_packet(p_mi_paquete); printf("Enviando\n"); } else { printf("can't get free packet\n"); } } } 4.3 Programa receptor Para el programa que hay que cargar en la tarjeta receptora lo único que hay que cambiar respecto al programa anterior es el bucle infinito. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 49 50 Memoria Además de la comprobación de que el sistema se ha introducido de forma correcta dentro del bucle esta vez hay que actuar solo cuando se detecte que se ha recibido un paquete. Para ello se utiliza la función rx_packet() que devuelve el paquete que se ha recibido cuando esto ocurre. Posteriormente hay que comprobar el valor que tiene dicho paquete y cuando este coincida con el requisito del programa (en este caso se quiere que el paquete tenga valor ‘1’) actuar. Esta vez la forma elegida de actuación es encender un LED en la tarjeta de recepción. Finalmente lo que se debe hacer es liberar la cola de paquetes para poder seguir recibiendo más. while(1) { *GPIO_DATA0 |=(1 << 23); /*Enciendes el LED1*/ if((p_mi_paquete = rx_packet())) { /* print and free the packet */ if( (p_mi_paquete->data)[p_mi_paquete->offset]=='1'){ *GPIO_DATA0 |=(1 << 24); /*Enciendes el LED1*/ } free_packet(p_mi_paquete); } } 4.4 Fallo en la inicialización del módulo de comunicación. Una vez se han realizado los pasos anteriores es el momento de probar su correcto funcionamiento. En este punto se comprueba que los programas tienen un fallo en común y el sistema no funciona debido a ello. El problema surge cuando el programa comienza su inicialización e intenta inicializar el módulo de comunicación. El fallo que se da es que el programa se queda bloqueado. Después de una minuciosa búsqueda poniendo textos de comprobación de paso para ver en qué función se quedaba parado el programa y dentro de esta en qué punto era, se descubrió que el problema venia de la inicialización del módulo NVM. Los dos programas, tanto enviapaquetes.c como recibepaquetes.c se quedaban parados en la función DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN El procesador MC13226V. maca_init() 51 y dentro de esta en la inicialización de la Non Volatile Memory. Una vez llegados a este punto hay dos posibles fuentes de fallo: Que haya que poner en esta parte del programa el sistema en modo THUMB para que entienda el código de forma correcta. Están mal las direcciones de memoria dentro de la inicialización del NVM. Lo lógico hubiese sido abordar en primera instancia el primer posible fallo y una vez resuelto o desechado pasar al siguiente. Pero un nuevo problema surgió en este punto, la falta de información al respecto. Se hizo una búsqueda intensiva de cómo proceder para funcionar en modo THUMB pero no se consiguió una guía apropiada, y lo poco que se consiguió hacía suponer que sería una tarea costosa. Por eso se determinó el abordar primero la segunda fuente de fallo y desecharla. A continuación se muestra el programa de inicialización del NVM. #include "nvm.h" nvmErr_t (*nvm_detect) (nvmInterface_t nvmInterface,nvmType_t* pNvmType) = (void *) 0x00006cb9;// 2a38; nvmErr_t (*nvm_read) (nvmInterface_t nvmInterface , nvmType_t uint32_t address, uint32_t numBytes) = (void *) 0x00006d69;// 2ae8; nvmType , void *pDest, nvmErr_t (*nvm_write) (nvmInterface_t nvmInterface, nvmType_t nvmType ,void *pSrc, uint32_t address, uint32_t numBytes) = (void *) 0x00006ec5;// 2c40; nvmErr_t (*nvm_erase) (nvmInterface_t nvmInterface, sectorBitfield) = (void*) 0x00006e05;// 2b80; nvmType_t nvmType ,uint32_t void(*nvm_setsvar) (uint32_t zero_for_awesome) = (void *)0x00007085;// 2df8; Se ha resaltado en rojo donde se encontraba el problema. Todos los punteros de las funciones definidas dentro de la ROM del Chip apuntaban a unas direcciones de memoria erróneas. Esto es debido a que todos los DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 52 Memoria programas y tutoriales que se han estado usando para el aprendizaje en el uso del microprocesador, y que se encontraban dentro de la librería libmc1322x estaban definidos para un microprocesador muy parecido pero a la vez diferente al se ha estado usando hasta el momento, el MC13224V. Esto hace que las direcciones de memoria a las que apuntan esos punteros estén destinadas a otros usos en el MC13226V. La forma en la que se intentó solucionar este problema fue en primer lugar contactar con el creador de los tutoriales y pedirle ayuda respecto a las direcciones de memoria de nuestro micro. Su respuesta fue inmediata y el resultado fue unas nuevas direcciones de memoria, que en el código anterior se han resaltado en azul. Una vez introducidas las nuevas direcciones de memoria en el programa se realizó una nueva prueba y se comprobó que el mismo problema persistía. La segunda forma de intentar solucionar el problema fue con el uso de la herramienta JTAG. Se procedió desensamblando la ROM y viendo si realmente en las direcciones de memoria que se nos habían proporcionado parecía iniciar una función. En la Figura 3.6 se puede apreciar que realmente en esa una de las direcciones de memoria dadas aparecía lo que parecía ser un inicio de función. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN El procesador MC13226V. Figura 3.6. Pantallazo del Terminal con ROM desensamblada. Viendo que esta dirección no era la correcta se recorrió todo el código de la ROM buscando funciones parecidas y probando las correspondientes direcciones de memoria, obteniendo un resultado negativo. Finalmente, por el fallo rotundo en el intento de cambiar las direcciones de memoria y viendo prácticamente imposible el aprender a manejar modo THUMB en poco tiempo se optó por cambiar de tarjetas y utilizar unas que tuviesen un microprocesador MC13224V, donde se sabía que realmente funcionaba todo correctamente. Buscando el consejo del creador de los tutoriales se determinó optar por comprar dos tarjetas Redwire Econotag, que parecían ser la opción mejor y menos costosa. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 53 El procesador MC13224V. Capítulo 4 EL PROCESADOR MC13224V En este capítulo se expondrá el desarrollo y la manera de proceder para la primera toma de contacto con el microprocesador MC13224V. Esta vez, a diferencia de en el anterior capítulo, no será necesario “flashear” la memoria para empezar con la programación del dispositivo, al igual que no será necesario el tener que hacer un repaso de todos los punteros que controlan el registro que se encarga de las entradas y salidas, ya que es el mismo y se usa de la misma manera en la programación. El microprocesador viene instalado en la tarjeta de desarrollo Redwire Econotag, cuyos esquemas más relevantes para este proyecto vienen adjuntos en la última de las partes del presente documento. 1 Adecuación previa de la tarjeta Antes de comenzar nuevamente con la revisión del funcionamiento de las entradas y las salidas en esta nueva tarjeta es necesario instalarle un LED y un pulsador a la misma ya que no trae dichos elementos. Si que es cierto que la tarjeta trae instalados dos pulsadores y dos LEDs pero están destinados a otros fines ya establecidos (los LEDs, por ejemplo, son para encenderse cuando se emite, el LED rojo, y cuando se recibe, el LED verde, un paquete). El primer paso para esto es buscar los pines en los cuales se van a conectar el LED y el pulsador. Como se puede ver en la Figura 1.6 la tarjeta cuenta con unos accesos directos a los pines que no están siendo usados con otro fin. Para la elección de pines hay que tener en cuenta que tanto las entradas como las salidas tienen que estar dentro de los pines nombrados por KBI, como ocurría en la tarjeta de desarrollo anterior. Leyendo todos los pines disponibles se observa que los únicos que son del tipo KBI son los que se muestran en la Figura 4.1, que es un zoom DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 55 56 Memoria que se le ha hecho a la tarjeta. Por lo tanto se debe conectar el LED y el pulsador a uno de estos cuatro pines KBI2, KBI3, KBI6 y KBI7. Figura 4.1.Zoom de la tarjeta Redwire Econotag. En la Figura 4.2 se observa una parte del esquema adjunto en la última parte del documento. En ella se puede ver como los pines KBI2, KBI3, KBI6, KBI7 están conectados a los pines de la tarjeta 40, 39, 36 y 35, que a su vez corresponden con los bits 24, 25, 28 y 29 del registro GPIO, como se vio en capítulos anteriores. Figura 4.2. Parte del esquema de Redwire Econotag. Una vez elegidos los pines sobre los que vamos a conectar las entradas/salidas, es el momento de elegir un punto del que se sacará la tierra de referencia. Es necesario sacar la tierra directamente de la tarjeta para que las tensiones en las entradas/salidas tengan el mismo nivel y todo funcione correctamente. Para buscar el pin que servirá de tierra es necesario mirar el esquema que aparece en la Figura 2.2 de la parte 4 de este documento. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN El procesador MC13224V. En la Figura 4.3 se muestra un zoom de dicho esquema donde aparece un pin, que es accesible, conectado a tierra. Por lo tanto el pin elegido para servir de tierra de referencia será el segundo conector del JP3 Figura 4.3. Zoom del esquema 2 de Redwire Econotag. En la Figura 4.4 se muestra en que parte de la tarjeta se puede acceder al pin elegido. Figura 4.4. Zoom 2 de la tarjeta Redwire Econotag Finalmente, ya solo queda soldar en los puntos elegidos unas hembras para poder conectar unos cables que saldrán hacia el circuito. En la Figura 4.5 se muestra como se ha realizado la soldadura y que tipo de hembras se ha utilizado. Figura 4.5. Soldadura de las hembras en los pines. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 57 58 Memoria 2 Diseño e implantación de un circuito sencillo (LED+Pulsador) Una vez soldadas las hembras en la tarjeta es la hora de diseñar e implantar el circuito. Para esta segunda parte, la implantación, se utilizará una placa protoboard, para que sea más rápido y sencillo de utilizar. El diseño del circuito es sencillo, solo hace falta un LED, una resistencia para limitar la corriente que pasa por el LED y finalmente un pulsador. Para el diseño de la resistencia no será necesario hacer ningún cálculo ya que en la propia tarjeta hay instalados dos LED con una resistencia en serie, por lo tanto se cogerá el mismo valor (Figura 4.6). Figura 4.6. LED+Resistencia instalado en la tarjeta de desarrollo. El pulsador se conectará directamente entre el pin y tierra por lo que a la hora de leer la entrada en el pin se tiene que tener en cuenta que cuando se pulsa se pone un ‘0’ y hay que habilitar en el correspondiente registro el pull-up. En la Figura 4.7 se muestra el esquema del diseño del circuito y en la Figura 4.8 se muestra su posterior implantación y conexión a una de las tarjetas de desarrollo. Figura 4.7. Circuito LED + Pulsador DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN El procesador MC13224V. Figura 4.8. Implantación y conexión del circuito a la tarjeta. 3 Entradas/Salidas en MC13224V Para comprobar el funcionamiento de las entradas y las salidas dentro de esta nueva tarjeta se procederá de igual forma que con la anterior tarjeta, teniendo en cuenta una serie de especificaciones. Al haber sido ya explicado el procedimiento esta vez se pasará más rápido sobre él, resaltando únicamente las variantes con respecto a lo anterior. Se utilizará directamente el programa conpulsadores.c, adjunto en la parte tres del documento y ya utilizado anteriormente. 3.1 Cambio en los pines y bits del registro GPIO Algo muy importante a tener en cuenta y sin lo que el programa no funcionará correctamente es que esta vez los LEDS y los pulsadores se encuentran en bits diferentes a la tarjeta anterior, por ello hay que cambiar la inicialización de los mismos y tenerlo en cuenta a la hora de manejarlos. Como se ve en la Figura 4.6, esta vez el LED se encuentra en la I/O KBI2, que corresponde con el bit GPIO24. El pulsador, por su parte, se encuentra en la I/O KBI6, que corresponde con el bit GPIO28. Con esto, hay que ir a la parte del programa que se encarga de la inicialización de los registros y cambiar el número de los bits, como se muestra a continuación. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 59 60 Memoria *GPIO_FUNC_SEL1 = 0; /*Eliges el pulsador con función GPIO*/ *GPIO_PAD_DIR0 |= (1 << 24); /*Pones el LED como salida*/ *GPIO_PAD_DIR_RESET0 = (1 << 28);/*Pones el pulsador como entrada*/ *GPIO_PAD_PU_SEL0 |= (1 << 28);/*Activas la resistencia de pullup, es decir que cuando pulses te va a poner un 0*/ *GPIO_DATA_SEL0 &= ~(1 << 28); /*Seleccionas que vas a leer desde el Data register un no desde el pad*/ *GPIO_DATA0 &= ~(1 << 24); /*Apagas el LED*/ 3.2 Modificación del archivo Makefile Es importante tener en cuenta que cada vez que se requiere que un nuevo programa, que no estaba previamente en la librería, se compile cuando se introduce el comando correcto, es necesario modificar el archivo Makefile para indicarle al sistema que también tiene que compilar dicho programa. Para conseguir esto es necesario introducir el nombre del programa dentro del apartado TARGETS, dentro del archivo. A continuación se muestra un ejemplo con el programa conpulsadores.c. # all of the target programs to build TARGETS := conpulsadores \ blink-red blink-green blink-blue blink-white blink-allio\ uart1-loopback \ u1u2-loopback \ tmr tmr-ints \ sleep \ printf \ asm \ adc \ pwm \ wdt \ xtal-trim Hay que tener en cuenta que si el programa va a hacer uso de la memoria ROM del micro es necesario meter el nombre del programa en la parte de TARGETS_WITH_ROM_VARS, como es el caso de los programas enviapaquete.c y recibepaquetes.c. # these targets are built with space reserved for variables needed by ROM services # this space is initialized with a rom call to rom_data_init TARGETS_WITH_ROM_VARS := enviapaquetes recibepaquetes \ #nvm-read nvm-write romimg flasher \ rftest-rx rftest-tx \ autoack-rx autoack-tx \ DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN El procesador MC13224V. 4 Primeras comunicaciones entre dos tarjetas. Una vez ya probadas las entradas/salidas del sistema es el momento de pasar al siguiente paso, como se hiciera con la anterior tarjeta sin un resultado satisfactorio. Se procederá de la misma forma y se utilizarán los mismos programas que en la anterior vez, enviapaquete.c y recibepaquetes.c. Como ya se ha comentado en el apartado 3 de este Capítulo, la única cosa que hay que variar es el número de bit en el que se encuentran los pines utilizados. En la Figura 4.9 se muestra un esquema de lo que se pretende conseguir en este apartado. Figura 4.9. Esquema primera comunicación entre dos tarjetas. Una vez que se ha entendido bien el esquema y que es lo que se va a hacer a continuación, es el momento de empezar. Para ello tenemos que introducir los archivos .bin correspondientes a los programas antes nombrados en sus correspondientes tarjetas. En este punto hay que tener una pequeña precaución, y es que cuando conectas los Redbee Econotag por el puerto USB generalmente aparecen dos dispositivos. Normalmente hay que introducir el programa en el segundo que aparece, pero no viene mal hacer una comprobación antes. Como se ve en la Figura 4.10 una vez que se conectan las dos tarjetas aparecen 4 dispositivos conectados por el DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 61 62 Memoria puerto USB. Es recomendable primero conectar una de las tarjetas y ver que puertos aparecen y luego conectar la otra, para ver cual corresponde a cada una. Figura 4.10. Vista Terminal con dispositivos conectados. 4.1 Fallo en la inicialización. Una vez que se han introducido los dos programas en las tarjetas correspondientes es el momento de ver si existe algún fallo en alguna parte. Cuando se realiza la carga de los programas dentro de las tarjetas el sistema muestra por pantalla todos los textos de paso que se habían puesto para ver el correcto funcionamiento del programa. Como se puede observar en la Figura 4.11 la salida por pantalla es totalmente correcta y efectivamente aparece en la misma todo lo que debe aparecer. Sin embargo aun apreciándose un correcto funcionamiento una vez que se intenta ejecutar, pulsando en una de las tarjetas para que en la otra se encienda un LED, no funciona. El posible fallo puede venir motivado por dos fuentes: No se han realizado correctamente la inicializaciones, no solo del modulo de comunicación sino del registro GPIO. Algo falla en las funciones de enviar (tx_packet()) y recibir (rx_packet()) definidas en el sistema. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN El procesador MC13224V. Figura 4.11. Vista Terminal corriendo enviapaquetes.c Antes de intentar meterse a fondo dentro de una de las posibles fuentes de fallo para solucionarla, es necesario ver cuál de las dos tarjetas es la que está fallando. Para determinar cuál es la que falla se empezará viendo si realmente el emisor está emitiendo algo, ya que si viene de aquí el fallo se descartará automáticamente el receptor como fuente de fallo. Para ver si el emisor emite se utilizará el sniffer Peryton S/SG que opera dentro de 802.15.4. Una vez montada nuevamente la red entre las dos tarjetas se comprueba gracias a esta aplicación que el emisor es el que está dando problemas y no está haciendo ninguna emisión. Para intentar solucionar el problema primero se hará una revisión de todas las inicializaciones que son necesarias y se verá si falta alguna o se ha hecho incorrectamente. Gracias a esta revisión se descubre la falta de una de las inicializaciones dentro del registro GPIO. Es necesario inicializar de forma correcta los pines de Tx. Es necesario ponerlos en la función de transferencia (Función 1). También será necesario poner los pines de SPI en función SPI (Función 1) Para ver en qué pin se encuentra se utilizará nuevamente el manual de referencia [9]. En la Tabla 4.1 se muestra un extracto de este manual donde se pueden ver los bits necesarios. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 63 64 Memoria GPIO Chip Pin PORT Name Functional Functional Functional Functional 0 1 2 3 GPIO_4 SPI_SS GPIO_4 SPI_SS GPIO_4 GPIO_4 GPIO_5 SPI_MISO GPIO_5 SPI_MISO GPIO_5 GPIO_5 GPIO_6 SPI_MOSI GPIO_6 SPI_MOSI GPIO_6 GPIO_6 GPIO_7 SPI_SCK GPIO_7 SPI_SCK GPIO_7 GPIO_7 … GPIO_44 TX_ON GPIO_44 TX Seq Mgr RX Seq Mgr GPO1 GPO1 GPIO_44 Tabla 4.1. Correspondencia pin-bit Por lo tanto el nuevo código de inicialización del registro quedará de la siguiente manera. *GPIO_FUNC_SEL0 |= (0x55<<8); /*Pones los pines de SPI en funcion 1*/ *GPIO_FUNC_SEL2 = (0x01 << ((44-16*2)*2)); /*Pones Tx ON*/ Gracias a esto se consigue que el programa y a su vez la red funcionen correctamente. 4.2 Impresión de paquetes. Como última comprobación antes de dar por concluida esta fase se añadirá al código una línea que saque por pantalla el paquete que se ha recibido, en caso del receptor, o que se ha emitido, en caso del emisor. Con esto se comprobará que realmente se está recibiendo bien lo que se está enviando. Para ello se utilizará una función previamente definida en el sistema, print_packet(). Esta función además de mostrar el paquete muestra más información como el tiempo que ha tardado desde que se envía hasta que se recibe. printf("rftest-tx --- "); print_packet(p); En las Figura 4.12 y Figura 4.13 se muestran los dos terminales donde se puede comprobar la correspondencia entre paquetes. Se observa como DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN El procesador MC13224V. cuando se pulsa en enviapaquetes se pone un ‘1’ y a la vez se recibe en recibepaquetes. Figura 4.12. Funcionamiento de enviapaquetes.c Figura 4.13. Funcionamiento de recibepaquetes.c Después de esta última comprobación se puede dar por concluida esta fase de primeros pasos en la tarjeta de desarrollo y el microprocesador. El siguiente paso será ya el inicio en el desarrollo de una pequeña red domótica con Contiki y 6LoWPAN. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 65 Programación de una red con Contiki y 6LoWPAN. Capítulo 5 PROGRAMACIÓN DE UNA RED CON CONTIKI Y 6LOWPAN Antes de empezar la programación de la red domótica con Contiki y 6LoWPAN y con el fin de no volver a caer en errores de inicialización, esta vez se va a comenzar la programación desde una buena base, una base que funcione correctamente y desde la cual se pueda construir una red propia. Para ello se probará primero una pequeña red con las dos tarjetas disponibles una de ellas haciendo de border router y la otra de un cliente udp. Para conseguir hacer esto se utilizarán los programas de prueba que vienen dentro del archivo de contiki una vez que se ha instalado la aplicación InstantContiki. 1 Compilar programas con Contiki Antes de dar ningún otro paso es necesario realizar una compilación de los programas para generar los archivos .bin que serán necesarios cargar dentro de la memoria de las tarjetas. Para realizar la compilación primero es necesario situarse en el directorio adecuado. Por ejemplo, para acceder al directorio del programa que va a ir dentro de la tarjeta que hará de border router la secuencia es la siguiente. cd contiki/examples/ipv6/rpl-border-router Dentro de este directorio hay que realizar la compilación con el siguiente comando. make TARGET=redbee-econotag Es importante tener en cuenta que ahora el comando ha cambiado ligeramente a como se hacía en anteriores capítulos, esta vez es necesario poner TARGET en lugar de BOARD. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 67 68 Memoria Se repite el proceso para el caso del cliente udp, cuyo directorio se encuentra donde se muestra a continuación. cd contiki/examples/ipv6/rpl-udp 2 Esquema básico de una programa en Contiki Todos los programas del sistema operativo Contiki tienen que tener obligatoriamente un esquema básico a partir del cual se desarrolla el programa completo y sin el cual no funciona correctamente. Este esquema es el que se muestra a continuación. #includes PROCESS(ejemplo_process, “proceso ejemplo”); AUTOSTART_PROCESSES(&ejemplo_process); PROCESS_THREAD(ejemplo_process,ev,data); { PROCESS_EXITHANDLER(goto exit); PROCESS_BEGIN(); while(1){ /*Espacio para el programa*/ exit: PROCESS_END(); } } El primer paso que hay que dar es el de definir el proceso con un nombre y con una cadena de caracteres que lo definan. Posteriormente, es necesario indicarle al sistema que se quiere que el programa empiece a ejecutarse automáticamente cuando se introduzca en la tarjeta. A partir de PROCESS_THREAD es donde realmente empieza a definirse el proceso. El programa que se va a ejecutar tiene que estar definido entre un PROCESS_BEGIN y un PROCESS_END pudiendo estar este último dentro o fuera del bucle infinito dependiendo de si se ha definido o no un punto de salida con la función PROCESS_EXITHANDLER(). DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Programación de una red con Contiki y 6LoWPAN. 3 Programación de una red sencilla border router-cliente udp Lo que se pretende en este apartado es que una de las tarjetas actúe como border router para poder así mandar información al ordenador a través de un SLIP tunnel, que será generado con la herramienta tunslip6. Una vez que la información es enviada se podrá ver a través de un navegador estándar, como es Mozilla, metiendo en la barra de direcciones la dirección IP del border router. 3.1 Esquema de la red El esquema de lo que se pretende conseguir en esta primera aproximación a nuestra red definitiva se muestra en la Figura 5.1. Figura 5.1. Esquema de la red. 3.2 Ejecución de la red Como en esta primera aproximación únicamente se van a utilizar los programas que vienen dentro de la librería, lo único que hay que hacer es cargarlos y comprobar su correcto funcionamiento, y una vez hecho esto empezar a ver cómo escribir un programa que cumpla con el fin perseguido en este proyecto. Una vez ya compilados ambos programas en sus respectivas carpetas se procede a la carga de los mismos en tarjetas diferentes. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 69 70 Memoria 3.2.1 Border Router Primero se hará la carga del programa border-router.c. Para ello se utilizará el comando ya utilizado anteriormente y que se muestra a continuación. mc1322x-load.pl -f border-router_redbee-econotag.bin -t /dev/ttyUSB1 Con este comando la dirección de la MAC es al azar, pero siempre se mantendrá la misma. Las direcciones IP de ambas tarjetas se muestran siempre en el comienzo de la ejecución del programa que se haya cargado en la respectiva tarjeta. Esto se puede observar en la Figura 5.2, en esta se ve como las primeras líneas de ejecución dan dicha información que después será necesaria para introducirla en la barra de direcciones de Mozilla. Figura 5.2. Primeras líneas de ejecución border-router.c En este caso, la tarjeta que va a hacer de border router tiene una dirección IP aaaa:0000:0000:0000:0250:c2ab:c000:0001. En este caso la dirección IP de la tarjeta a sido previamente programada. Para ello se ha utilizado la aplicación “flasher” que viene con la librería. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Programación de una red con Contiki y 6LoWPAN. Lo primero que hay que hacer es compilar las herramientas necesarias, en este caso BBMC (Bit-Bang the MC13224v). cd contitiki/cpu/mc1322x/tool/ftditools make Luego se procede a cargar el programa que se va a encargar del “flasheado”. ~/contiki/cpu/mc1322x/tool/mc1322x-load.pl –e –f ~/libmc1322x/test/flasher_redbee-econotag.bin –z –t /dev/ttyUSB1 –c ‘bbmc –l redbee-econotag reset’ 0x1e000, 0xABC25000, 0x010000C0 De esta forma la próxima vez que se use la tarjeta tendrá la dirección que se ha mostrado anteriormente. 3.2.1.1 SLIP tunnel Para generar el SLIP tunnel se utilizará la herramienta tunslip6 que viene con el sistema operativo Contiki. Para ello lo primero que hay que hacer es compilar el programa. cd contiki/tools make tunslip6 Finalmente, se ejecuta la aplicación introduciéndole sobre que puerto se va a realizar el túnel. El comando “-v3” se introduce para ejecutar la aplicación en modo debug para que aparezca sobre el terminal la actividad que hay sobre la conexión. La última parte del comando se introduce para indicarle que actúe sobre la dirección IP global. sudo ~/contiki/tools/tunslip6 -s /dev/ttyUSB1 -v3 aaaa::1/64 3.2.2 Udp-client Para cargar el programa del cliente udp en la otra tarjeta es necesario abrir un nuevo terminal para poder dejar corriendo la herramienta tunslip6. En este nuevo terminal lo que hay que hacer ahora es introducir el comando necesario para la carga del programa en la tarjeta. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 71 72 Memoria ~/contiki/cpu/mc1322x/tool/mc1322x-load.pl -f udp-client_redbeeeconotag.bin -t /dev/ttyUSB2 'bbmc -l redbee-econotag -i 0' En la Figura 5.3 se muestra las primeras líneas en la ejecución del programa, donde se puede ver la dirección que tiene esta tarjeta. Figura 5.3. Primeras líneas de ejecución udp-client.c 3.2.3 Comprobar la red en el servidor web Una vez realizados estos pasos ya solo queda el comprobar que la red se está ejecutando correctamente. Para ello se introduce simplemente la dirección de la tarjeta que hace las veces de border-router en la barra de direcciones del navegador. El resultado en una página web generada por esta tarjeta en la que aparecen los nodos vecinos en la red. En la Figura 5.4 se muestra el ejemplo de esta página web con la red que se ha realizado con los dos Econotags. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Programación de una red con Contiki y 6LoWPAN. Figura 5.4. Página web generada por border-router.c Se puede comprobar cómo efectivamente coinciden las direcciones mostradas en la página con las de las tarjetas que se han mostrado en anteriores figuras. 4 Entradas/salidas en Contiki Una vez que se ha conseguido montar una pequeña red entre dos tarjetas mediante el sistema operativo Contiki y con la base de comunicaciones de 6LoWPAN, es la hora de empezar a incluirle aplicaciones orientadas a la domótica. Con este fin el primer paso es ver el tratamiento que se le da a las I/O en Contiki. Al ser éste un sistema operativo orientado a la comunicación, el manejo de las entradas y salidas se realiza a base de una serie de funciones previamente definidas en el propio sistema y que se expondrán a continuación. 4.1 Salidas Todas las funciones que tienen que ver con el manejo de las salidas y más concretamente con el manejo de los LEDs vienen definidas en un archivo .c dentro del propio sistema. El archivo se encuentra en el siguiente directorio. ~/contiki/core/dev/leds.c DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 73 74 Memoria En este archivo se encuentran todas las funciones necesarias para el manejo de los LEDs. Entre ellas las más importantes serán las de encendido y apagado de los mismos así como la de invertir el estado de uno de los LED, que están definidas de la forma que se muestra a continuación. void leds_on(unsigned char ledv) { unsigned char changed; changed = (~leds) & ledv; leds |= ledv; show_leds(changed); } /*---------------------------------------------------------------------*/ void leds_off(unsigned char ledv) { unsigned char changed; changed = leds & ledv; leds &= ~ledv; show_leds(changed); } /*---------------------------------------------------------------------*/ void leds_toggle(unsigned char ledv) { leds_invert(ledv); } Fijándose en la definición de todas ellas se percibe como a todas hay que pasarles un argumento, que tiene la misma forma en todas. Este argumento tiene que ver con los pines en los que se quiere que funcione esa determinada función. Como ocurre casi con todo, estos argumentos vienen ya definidos en un archivo adjunto en el sistema. Dicho archivo se encuentra en el .h del archivo anteriormente citado. La definición a la que se está haciendo referencia es la siguiente. #ifndef LEDS_GREEN #define LEDS_GREEN 1 #endif /* LEDS_GREEN */ #ifndef LEDS_YELLOW #define LEDS_YELLOW 2 #endif /* LEDS_YELLOW */ #ifndef LEDS_RED #define LEDS_RED 4 #endif /* LEDS_RED */ #ifndef LEDS_BLUE #define LEDS_BLUE LEDS_YELLOW #endif /* LEDS_BLUE */ DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Programación de una red con Contiki y 6LoWPAN. #ifdef LEDS_CONF_ALL #define LEDS_ALL LEDS_CONF_ALL #else /* LEDS_CONF_ALL */ #define LEDS_ALL 7 #endif /* LEDS_CONF_ALL */ A su vez todos estos argumentos están definidos sobre otros que son específicos de cada tarjeta y que determinan en cada caso en que pin de la tarjeta se encuentran los LEDs que vienen instalados por defecto. En el caso concreto de este proyecto, se ha instalado un LED más a la tarjeta, con lo que el archivo debe ser modificado para poder actuar sobre el mismo. Dicho archivo se encuentra en la siguiente dirección. ~/contiki/cpu/mc1322x/board/redbee-econotag.h En este caso como la tarjeta tiene únicamente dos LEDs podemos definir el LED de más en cualquiera de los argumentos que se han visto anteriormente y que no se estén utilizando. En este caso se ha elegido LED_BLUE y la definición se ha realizado como sigue y teniendo en cuenta que el LED se instaló en el bit 25 del registro GPIO. #define LED_RED 44 #define LED_GREEN 45 #define LED_BLUE 25 Fijándose en los esquemas adjuntos en la parte cuarta del presente documento se puede comprobar que los LEDs que están definidos por defecto en la tarjeta (LED_RED y LED_GREEN) coinciden con lo esperado, ya que se encuentran en los bits del registro GPIO 44 y 45. En la Figura 5.5 se muestra un zoom de dicho esquema con lo que se ha comentado resaltado. Figura 5.5. Zoom del esquema 1 de Redwire Econotag. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 75 76 Memoria 4.2 Entradas El manejo de las entradas en Contiki es un proceso un tanto complicado pero que a la hora de usarlo resulta extremadamente sencillo. El uso es tan sencillo debido a que el propio sistema actúa de forma casi automática sin necesidad de hacer nada complicado. Cada vez que se pulsa un botón el sistema lo detecta y activa un flag para que tu programa actúe de una determinada forma. Para que esto ocurra lo primero de todo es inicializar el sensor que se va a encargar de detectar cada vez que se pulse, que en Contiki se denomina “button_sensor”. Para la inicialización es necesario introducir en el inicio del programa la siguiente línea de código. SENSORS_ACTIVATE(button_sensor); Finalmente, para que el sistema actúe cuando se pulse es necesario escribir dentro del bucle infinito la siguiente línea de código que se encargará de pausar el programa hasta que se produzca el evento deseado, en este caso que se pulse. PROCESS_WAIT_EVENT_UNTIL((ev==sensors_event) &button_sensor)); && (data == Todo lo que se escriba después de esta línea de código únicamente se ejecutará cuando se produzca el evento deseado. 4.3 Ejemplo Entradas/Salidas Para probar y ejemplificar todo lo que se ha explicado anteriormente se ha realizado un programa que abarque todo y en el que se pueda ver claramente el funcionamiento de todo. El programa se va a encargar de encender y apagar el LED de la tarjeta periódicamente cada vez que se pulse el pulsador. El código completo del programa se ha adjuntado en la tercera parte del presente documento con el nombre de entradasalida1.c. Lo primero que hay que hacer para que todo funcione correctamente es hacer los includes necesarios para poder usar las funciones. En este caso son los siguientes. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Programación de una red con Contiki y 6LoWPAN. 77 #include "dev/leds.h" #include "dev/button-sensor.h" Una vez hecho esto y ya dentro del programa hay que inicializar el sensor del pulsador y a la vez se enciende el LED. SENSORS_ACTIVATE(button_sensor); leds_on(LEDS_ALL); Lo único que queda ya es introducir la condición dentro del bucle infinito para que el programa funcione solo cuando pulsas, y la correspondiente actuación sobre el LED cuando esto ocurre. PROCESS_WAIT_EVENT_UNTIL((ev==sensors_event) &button_sensor)); && (data == if (push % 2 == 0) { leds_toggle(LED_BLUE); printf("[%d] APAGANDO EL LED ... [DONE]\n", push); push++; } else { leds_toggle(LED_BLUE); printf("[%d] ENCENDIENDO EL LED ... [DONE]\n", push); push++; } if (push == 255){ push = 0;} // previene el overflowing } En la Figura 5.6 se muestra la salida del programa donde se ve el correcto funcionamiento del mismo. Figura 5.6. Salida del programa entradasalida1.c DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 78 Memoria 5 Ejecución de una pequeña red domótica Después de haber conseguido con éxito comunicar dos tarjetas llegando a crear una pequeña red y después de manejar con éxito tanto entradas como salidas, es el momento de crear una pequeña red domótica donde en una tarjeta se elija el estado de la iluminación de la casa y en la otra se ejecute este estado. En un primer momento la idea más razonable era a partir de los programas de border router y de udp client generar un código que se amoldase a las necesidades de este proyecto. Tras un análisis de ambos códigos y con una escasa documentación al respecto se ha desechado esta idea. El fin ahora será el de generar un código propio que tenga unas funciones muy básica pero que sea a la vez capaz de llegar a la finalidad del proyecto. Se procurará desarrollar un programa donde en el momento en el que se pulse el botón en una de las tarjetas se envíe un paquete a la otra y esta lo indique con el LED. El flujo podrá ser bidireccional de forma que se pueda simular un sensor y un actuador en una vivienda. Para este caso se necesita un flujo bidireccional de forma que el sensor envíe lo que percibe y desde el actuador se envíe la manera de proceder. 5.1 Funciones necesarias A la hora de desarrollar el programa se necesitarán una serie de funciones previamente definidas en el sistema y que serán de mucha utilidad en el envío y recepción de paquetes. Todo este conjunto de funciones se encuentran en el archivo simple-udp.h, disponible en la siguiente dirección. ~/contiki/core/net/simple-udp.h 5.1.1 Función de envío La función que se utilizará para dicho fin será simple_udp_sendto(), cuya definición se muestra a continuación y cuyo fin es el de enviar un DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Programación de una red con Contiki y 6LoWPAN. paquete UDP a una determinada dirección IP. El envío se realizará entre los puertos que serán previamente definidos con la función de registro simple_udp_register(). int simple_udp_sendto(struct simple_udp_connection *c, const void *data, uint16_t datalen, const uip_ipaddr_t *to) { if(c->udp_conn != NULL) { uip_udp_packet_sendto(c->udp_conn, data, datalen, to, UIP_HTONS(c->remote_port)); } return 0; } Los argumentos que hay que pasarle a la función son los siguientes: c: es un puntero a una estructura simple_udp_connection. data: es un puntero a los datos que van a ser enviados. datalen: la longitud de los datos. to: la dirección IP del receptor. 5.1.2 Función de registro Esta va a ser una función imprescindible para el funcionamiento de la función de envío. Se encargará de registrar una conexión UDP viendo los nodos vecinos y probando la conexión por medio del éxito en el envío y posterior recepción de un paquete. La función que se utilizará será simple_udp_register(), cuya definición se muestra a continuación. int simple_udp_register(struct simple_udp_connection *c, uint16_t local_port, uip_ipaddr_t *remote_addr, uint16_t remote_port, simple_udp_callback receive_callback) { init_simple_udp(); c->local_port = local_port; c->remote_port = remote_port; if(remote_addr != NULL) { uip_ipaddr_copy(&c->remote_addr, remote_addr); } c->receive_callback = receive_callback; DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 79 80 Memoria PROCESS_CONTEXT_BEGIN(&simple_udp_process); c->udp_conn = udp_new(remote_addr, UIP_HTONS(remote_port), c); if(c->udp_conn != NULL) { udp_bind(c->udp_conn, UIP_HTONS(local_port)); } PROCESS_CONTEXT_END(); if(c->udp_conn == NULL) { return 0; } return 1; } Los argumentos necesarios en esta función son los siguientes: c: es un puntero a una estructura simple_udp_connection. local_port: el puerto UDP local con los bytes ordenados según host. remote_addr: la dirección IP remota. remote_port: el puerto UDP remoto con los bytes ordenados según host. receive_callback: un puntero a la función que tiene que ser llamada para paquetes entrantes. 5.1.3 Función de recepción Esta será la función que se ejecutará cada vez que exista un paquete entrante. La función que se utilizará será receiver() y la definición se tendrá que crear en el propio programa. 5.2 Desarrollo del programa A continuación se muestra el programa que se ha desarrollado explicado por pasos. El código del programa completo se encuentra en la tercera parte de este documento. El programa será el mismo para las dos tarjetas y tendrá que tener tanto la función de envío como la de recepción. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Programación de una red con Contiki y 6LoWPAN. 5.2.1 Include El primer paso importante que hay que dar es el de definir los includes necesarios. Los más importantes que hay que poner son los que se enumeran a continuación. #include "simple-udp.h" #include "dev/leds.h" #include "dev/button-sensor.h" El primero es el encargado de las funciones de comunicación entre las dos tarjetas, las que se han descrito anteriormente. Las dos siguientes son las necesarias para el manejo de los LED y del pulsador. 5.2.2 Definición de la función de recepción El siguiente paso a destacar es el de la definición de la función que se ha de ejecutar cada vez que se reciba un paquete. La definición es la que se muestra a continuación. static void receiver(struct simple_udp_connection *c, const uip_ipaddr_t *sender_addr, uint16_t sender_port, const uip_ipaddr_t *receiver_addr, uint16_t receiver_port, const uint8_t *data, uint16_t datalen) { static uint8_t push = 0; printf("Datos recibidos en el puerto %d de 2 desde el puerto %d de 1 con una longitud %d\n", receiver_port, sender_port, datalen); leds_toggle(LED_BLUE); } Lo único que hace la función es sacar un mensaje por pantalla y a la vez cambiar el estado del LED según este encendido o apagado. 5.2.3 Definición del proceso Lo único que queda ya es la definición del proceso y del bucle infinito. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 81 82 Memoria Dentro del proceso lo que hay que hacer es activar el sensor que se encarga del funcionamiento de los botones. Para ello se incluye la línea de código que se vió en capítulos anteriores. SENSORS_ACTIVATE(button_sensor); Después de esto lo que hay que hacer es registrar la conexión con la función que se ha visto antes y decir que cada vez que haya un paquete entrante se ejecute la función receiver(). simple_udp_register(&c, UDP_PORT,NULL, UDP_PORT,receiver); Finalmente ya solo queda definir el bucle infinito en el cual se debe ejecutar la función de envío cada vez que se pulse el botón de la tarjeta. while(1) { PROCESS_WAIT_EVENT_UNTIL( (ev==sensors_event) &button_sensor)); printf("Enviando paquete ...\n"); uip_create_linklocal_allnodes_mcast(&addr); simple_udp_sendto(&c, "Test", 4, &addr); } && (data == 5.3 Salida del programa en cada tarjeta En este apartado se muestran las salidas correspondientes a cada tarjeta. En la Figura 5.7 se muestra la salida del programa para la tarjeta 1. En esta imagen se puede observar como la dirección IP de la tarjeta permanece desde que se hiciera el flasheado de la MAC. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Programación de una red con Contiki y 6LoWPAN. Figura 5.7. Salida del programa redom.c en la tarjeta 1 En la Figura 5.8 se muestra la salida del programa para la tarjeta 2. Figura 5.8. Salida del programa redom.c en la tarjeta 2 Se puede comprobar viendo las dos imágenes como cada vez que se envía un paquete con una de las tarjetas en la otra se recibe correctamente y se imprime el mensaje en el correspondiente terminal. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 83 Conclusiones. 85 Capítulo 6 CONCLUSIONES El objetivo de este proyecto era el de implantar una pequeña red domótica con la que se pudiese comprobar la validez del sistema 6LoWPAN en estos casos. El primer pasó que se ha dado a sido el de tomar un primer contacto con las tarjetas de desarrollo que se iban a usar con el fin de hacer una programación más fluida posteriormente. En un principio se tomó como primera tarjeta de desarrollo Freescale Sensor Reference Board con la cual se obtuvo un resultado poco satisfactorio en uno de los primeros pasos del desarrollo del proyecto, debido a un problema en las direcciones de los punteros que apuntaban a las funciones almacenadas en la ROM. En un segundo caso se optó por la tarjeta de desarrollo Redbee Econotag, que monta un microprocesador diferente a la anterior tarjeta. Con esta tarjeta se consiguió satisfactoriamente completar todos los pasos. En primer lugar se consiguió dominar tanto los puertos de entradas como los de salida, donde se tuvo que instalar tanto un LED como un pulsador respectivamente debido a la falta de los mismos en la propia tarjeta y con los cuales la comprobación del funcionamiento de dichos puerto no sería sencilla. El siguiente paso sería la comprobación del funcionamiento del sistema de comunicación inalámbrica de la tarjeta, lo cual se consiguió de un modo satisfactorio por medio de pequeños programas de envio y recepción de paquetes. Finalmente ya solo quedaba crear la red inalámbrica deseada. Para ello se aunó una comunicación inalámbrica basada en direcciones IP, gracias a 6LoWPAN, y el manejo de las entradas y las salidas que previamente se había conseguido dominar. Todo esto fue incluido en un programa que fue introducido en las tarjetas y con el cual se consiguió DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 86 Memoria satisfactoriamente el resultado deseado en el proyecto, quedando demostrada y comprobada la validez del sistema 6LoWPAN para redes domóticas. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Futuros Desarrollos. Capítulo 7 FUTUROS DESARROLLOS A lo largo de este capítulo se analizarán los posibles futuros desarrollos que tienen como base el presente proyecto. Se trata de futuros proyectos que puede ser interesante abordar para utilizar lo que en este proyecto se ha utilizado y se ha conseguido. 1 Conexión de la red 6LoWPAN a Internet. Uno de los siguientes pasos más claros y directos que puede tener este proyecto es el de su uso para la realización de un control completo de una vivienda desde múltiples dispositivos. Una vez conseguido el objetivo de este proyecto y habiendo conseguido realizar una pequeña red domótica, sería lógico pensar en llevar a la práctica esto e implantarlo en una pequeña vivienda, o una simulación de ella. De esta forma y habiendo conseguido montar una red sobre IP, que es uno de los atractivos del sistema 6LoWPAN, el siguiente paso sería el de conseguir conectar la red de la vivienda con la red de internet de la misma, con el objetivo de poder actuar sobre ella con el único requisito de tener una conexión a internet desde cualquier punto del planeta. Esta conexión se realizaría siguiendo profundizando un poco más en uno de los pasos que se ha visto con anterioridad. Se trata de conectar la red de la vivienda a través de un border-router, que a su vez esté conectado con un PC desde el cual se puedan enviar y recibir paquetes. Como se ha visto la conexión a internet a partir de aquí es muy sencilla, dando pie al posible control de la vivienda multiplataforma. Como se puede ver en la Figura 7.1 un posible ejemplo de esto que se ha comentado es el control de la vivienda desde un dispositivo iPhone. Teniendo una simple conexión a internet puedes elegir entre distintos DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 87 88 Memoria estados de las luces de la vivienda e incluso controlar el estado de las mismas. Figura 7.1. Ejemplo de control via iPhone 2 Smart cities Un aspecto muy importante dentro de una smart city es el del control de la energía. Una fuente de consumo, y de derroche en ocasiones, muy importante de energía es el conjunto de todas las viviendas de una ciudad, en las cuales la legislación no puede entrar, como es el caso del sector industrial donde una serie de normas rigen los consumos y las instalaciones que es debido poner. Gracias a este proyecto es muy fácil el poder realizar un control, o consumo, más eficiente y moderado dentro de una vivienda. Así, por ejemplo, se puede dejar programado el funcionamiento de una lavadora o un lavavajillas para que la compañía eléctrica la accione en un momento en el que el consumo de energía presente un valle. Esto sería posible si dentro de la vivienda se ha creado una red domótica conectada a los electrodomésticos y a la vez conectada a internet, y es a través de este por donde la compañía es capaz de actuar. Esto es doblemente beneficioso, primero para el consumidor, que consume energía en un momento en el que esta está más barata, y segundo para la compañía que gracias a esto DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Futuros Desarrollos. puede conseguir tener una demanda de energía más plana que siempre es muy beneficioso para ella. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 89 Bibliografía BIBLIOGRAFÍA [1] Domótica – Wikipedia, la enciclopedia libre. http://es.wikipedia.org/wiki/Domótica. [Online; último acceso 18 de Julio de 2012]. [2] ZigBee – Wikipedia, la enciclopedia libre. http://es.wikipedia.org/wiki/ZigBee. [Online; último acceso 18 de Julio de 2012]. [3] Osiris RF Domótica Sistema RF domótico, alta sensoriazación domótica sin cables. http://www.domodesk.com/content.aspx?co=44&t=146&c=43. [Online; último acceso 18 de Julio de 2012]. [4] KNX Association [Official Website]. http://www.knx.org/es/. [Online; último acceso 18 de Julio de 2012]. [5] http://www.redwirellc.com/store/node/1 [6] http://www.danfoss.com [7] Shelby, Zach; Bormann, Carsten. 6LoWPAN, The wireless embedded internet. [8] Dunkels, A; Grönvall, Björn; Voigt, Thiemo. Contiki- a Lightweight and Flexible operating System for Tiny Networked Sensors. Swedish Institute of Computer Science. [9] Freescale. 1322x Sensor Node, Reference Manual. Document number: 1322xSNRM; Rev.1.5; 11/2010 [10] Freescale.MC1322xRM. Document number: 1322xRM; Rev.1.6; 01/2012. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 91 Parte II ESTUDIO ECONÓMICO DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Estudio económico Capítulo 1 ESTUDIO ECONÓMICO Este capítulo tiene como propósito estudiar la viabilidad del proyecto “Desarrollo de un sistema domótico basado en 6LoWPAN” y hacer de este modo un análisis de la realización de este proyecto. 1 Viabilidad del proyecto. Dentro del mundo de la vivienda en los últimos años está cobrando cada vez más importancia el campo de la domótica. Cada vez se hace más indispensable el uso de este tipo de tecnología de control de la vivienda para tener una vida más fácil y cómoda. De aquí que se haya visto la necesidad de sistemas de domóticos inalámbricos que tengan un bajo coste de licencias. La importancia de este proyecto radica en este punto, el poder proporcionar un estudio satisfactorio sobre técnicas para la domótica que sean capaces de generar una red inalámbrica en la vivienda con un bajo coste. Debido a que este proyecto se ha realizado con un fin de estudio y no meramente comercial, hacer un estudio económico resultaría poco apropiado. Debido a esto hay que tener en cuenta que el coste calculado en el Documento 3 tiene que ver únicamente con el desarrollo del propio estudio y no con la fabricación propia de sistemas domóticos que utilicen esta tecnología y que sin duda debido a economías de escala y al uso de caminos directos hacia el éxito tendrán un coste unitario mucho más reducido del expuesto en el documento citado. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 95 Parte III CÓDIGO FUENTE DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Código Fuente Capítulo 1 CÓDIGO FUENTE En este capítulo se exponen los códigos fuentes más significativos utilizados dentro del proyecto y a los que se hace referencia en la consecución de la memoria. 1 Entradas/salidas en MC13226V 1.1 gpio.c #include <mc1322x.h> #include <stdint.h> inline void gpio_pad_dir(volatile uint64_t data) { *GPIO_PAD_DIR0 = (data & 0xffffffff); *GPIO_PAD_DIR1 = (data >> 32); } inline void gpio_data(volatile uint64_t data) { *GPIO_DATA0 = (data & 0xffffffff); *GPIO_DATA1 = (data >> 32); } inline uint64_t gpio_data_get(volatile uint64_t bits) { uint64_t rdata = 0; rdata = *GPIO_DATA0 & (bits & 0xffffffff); rdata |= (*GPIO_DATA1 & (bits >> 32)) << 32; return rdata; } inline void gpio_pad_pu_en(volatile uint64_t data) { *GPIO_PAD_PU_EN0 = (data & 0xffffffff); *GPIO_PAD_PU_EN1 = (data >> 32); } inline void gpio_data_sel(volatile uint64_t data) { *GPIO_DATA_SEL0 = (data & 0xffffffff); *GPIO_DATA_SEL1 = (data >> 32); } inline void gpio_pad_pu_sel(volatile uint64_t data) { *GPIO_PAD_PU_SEL0 = (data & 0xffffffff); *GPIO_PAD_PU_SEL1 = (data >> 32); } inline void gpio_data_set(volatile uint64_t data) DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 99 100 Código Fuente { *GPIO_DATA_SET0 = (data & 0xffffffff); *GPIO_DATA_SET1 = (data >> 32); } inline void gpio_data_reset(volatile uint64_t data) { *GPIO_DATA_RESET0 = (data & 0xffffffff); *GPIO_DATA_RESET1 = (data >> 32); } inline void gpio_pad_dir_set(volatile uint64_t data) { *GPIO_PAD_DIR_SET0 = (data & 0xffffffff); *GPIO_PAD_DIR_SET1 = (data >> 32); } inline void gpio_pad_dir_reset(volatile uint64_t data) { *GPIO_PAD_DIR_RESET0 = (data & 0xffffffff); *GPIO_PAD_DIR_RESET1 = (data >> 32); } 1.2 conpulsadores.c #include #include #include #include #include <mc1322x.h> <board.h> "stdio.h" "tests.h" "config.h" void uart1_puts(char *ps); void main(void) { int a = 0; //int i=0; //int j; volatile uint32_t t; //char buffer[32]; print_welcome("ejecutando conpulsadores.c\n"); uart1_init(INC,MOD,SAMP); *GPIO_FUNC_SEL1 = 0; /*Eliges el pulsador con función GPIO*/ *GPIO_PAD_DIR0 |= (7 << 23); /*Pones el LED como salida*/ *GPIO_PAD_DIR_RESET0 = (1 << 26);/*Pones el pulsador como entrada*/ *GPIO_PAD_PU_SEL0 |= (1 << 26);/*Activas la resistencia de pullup, es decir que cuando pulses te va a poner un 0*/ *GPIO_DATA_SEL0 &= ~(1 << 26); /*Seleccionas que vas a leer desde el Data register un no desde el pad*/ while(1) { *GPIO_DATA0 |=(1 << 23); /*Enciendes el LED1*/ DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Código Fuente /*for(i=0;i<=31;i++){ j=((*GPIO_DATA0>>i)&1); if(j == 1){ buffer[i] = '1'; } else{ buffer[i] = '0'; } } uart1_puts(buffer); uart1_puts("\n");*/ t = *GPIO_DATA0; /*Lees las entradas */ a = ((t >> 26) & 1); if(a == 1){ *GPIO_DATA0|=(1 << 24);/*Enciendes el LED2*/ }else{ *GPIO_DATA0&=~(1 << 24);/*Apagas el LED2*/ } }; } void uart1_puts(char *ps){ while (*ps != '\0'){ uart1_putc(*ps); ps++; } } 2 Comunicación básica en MC13226V 2.1 enviapaquetes.c #include #include #include #include #include #include <mc1322x.h> <board.h> "stdio.h" "tests.h" "config.h" "crm.h" void uart1_puts(char *ps); void fill_packet(volatile packet_t *p); DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 101 102 Código Fuente int main(void){ volatile packet_t *p_mi_paquete; int a = 0; int i=0; volatile uint32_t t; char buffer[32]; uart1_init(INC,MOD,SAMP); *GPIO_FUNC_SEL1 = 0; /*Eliges el pulsador con función GPIO*/ *GPIO_PAD_DIR0 |= (7 << 23); /*Pones el LED como salida*/ *GPIO_PAD_DIR_RESET0 = (1 << 26);/*Pones el pulsador como entrada*/ *GPIO_PAD_PU_SEL0 |= (1 << 26);/*Activas la resistencia de pullup, es decir que cuando pulses te va a poner un 0*/ *GPIO_DATA_SEL0 &= ~(1 << 26); /*Seleccionas que vas a leer desde el Data register un no desde el pad*/ *GPIO_DATA0 &= ~(7 << 23); *GPIO_FUNC_SEL0 |= (0x55<<8);/*pones los pines de SPI en funcion 1*/ printf("input/output initialized\n"); printf("trim_xtal"); trim_xtal(); printf("->done\n"); printf("vreg_init"); vreg_init(); printf("->done\n"); printf("maca_init"); maca_init(); printf("->done\n"); for(i=0;i<=31;i++){ buffer[i]='1'; } uart1_puts(buffer); uart1_puts("\n"); set_channel(0); /* 802.15.4 channel 11 */ set_power(0x12); /* 0x12 es la más alta, 4.5dBm */ while(1) { *GPIO_DATA0 |=(1 << 23); /*Enciendes el LED1*/ t = *GPIO_DATA0; /*Lees las entradas */ DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Código Fuente 103 a = ((t >> 26) & 1); if(a == 0){ p_mi_paquete = get_free_packet(); if(p_mi_paquete) { fill_packet(p_mi_paquete); tx_packet(p_mi_paquete); printf("Enviando\n"); } else { printf("can't get free packet\n"); } } } } void fill_packet(volatile packet_t *p){ (p->data)[0] = '1'; //sprintf(p->data, "Hola:\n"); // p->length = strlen(p->data); (*p).length = 1; (*p).offset = 0; } void uart1_puts(char *ps){ while (*ps != '\0'){ uart1_putc(*ps); ps++; } } 2.2 recibepaquetes.c #include #include #include #include #include <mc1322x.h> <board.h> "stdio.h" "tests.h" "config.h" int main(void){ volatile packet_t *p_mi_paquete; //(*mi_paquete).data = 1; //mi_paquete->data; uart1_init(INC,MOD,SAMP); DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 104 Código Fuente *GPIO_FUNC_SEL1 = 0; /*Eliges el pulsador con función GPIO*/ *GPIO_PAD_DIR0 |= (7 << 23); /*Pones el LED como salida*/ *GPIO_PAD_DIR_RESET0 = (1 << 26);/*Pones el pulsador como entrada*/ *GPIO_PAD_PU_SEL0 |= (1 << 26);/*Activas la resistencia de pullup, es decir que cuando pulses te va a poner un 0*/ *GPIO_DATA_SEL0 &= ~(1 << 26); /*Seleccionas que vas a leer desde el Data register un no desde el pad*/ *GPIO_DATA0 &= ~(7 << 23); printf("input/output initialized\n"); printf("trim_xtal"); trim_xtal(); printf("->done\n"); printf("vreg_init"); vreg_init(); printf("->done\n"); printf("maca_init"); maca_init(); printf("->done\n"); set_channel(0); /* 802.15.4 channel 11 */ set_power(0x12); /* 0x12 es la más alta, 4.5dBm */ while(1) { *GPIO_DATA0 |=(1 << 23); /*Enciendes el LED1*/ if((p_mi_paquete = rx_packet())) { /* print and free the packet */ if( (p_mi_paquete->data)[p_mi_paquete->offset]=='1'){ *GPIO_DATA0 |=(1 << 24); /*Enciendes el LED1*/ } free_packet(p_mi_paquete); } } } 3 Entradas/Salidas con Contiki y MC13224V 3.1 entradasalida1.c #include #include #include #include "contiki.h" "dev/leds.h" "dev/button-sensor.h" <stdio.h> /* para el printf() */ DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Código Fuente 105 //----------------------------------------------------------------PROCESS(blink_process, "ejemplo blink"); AUTOSTART_PROCESSES(&blink_process); //----------------------------------------------------------------PROCESS_THREAD(blink_process, ev, data) { PROCESS_EXITHANDLER(goto exit); PROCESS_BEGIN(); SENSORS_ACTIVATE(button_sensor); leds_on(LED_BLUE); printf("+ El LED está encendido +\n\n"); printf(" Pulsa el botón para empezar \n\n"); while(1) { static uint8_t push = 0; se ha pulsado // Para ir contabilizando las veces que PROCESS_WAIT_EVENT_UNTIL((ev==sensors_event) &button_sensor)); && (data if (push % 2 == 0) { leds_toggle(LED_BLUE); printf("[%d] APAGANDO EL LED ... [DONE]\n", push); push++; } else { leds_toggle(LED_BLUE); printf("[%d] ENCENDIENDO EL LED ... [DONE]\n", push); push++; } if (push == 255){ push = 0;} // previene el overflowing } exit: leds_off(LEDS_ALL); PROCESS_END(); } 4 Red domótica 4.1 redom.c #include #include #include #include "contiki.h" "lib/random.h" "net/uip.h" "net/uip-ds6.h" #include "simple-udp.h" DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN == 106 Código Fuente #include "dev/leds.h" #include "dev/button-sensor.h" #include <stdio.h> #include <string.h> #define UDP_PORT 1234 static struct simple_udp_connection broadcast_connection; /*---------------------------------------------------------------------*/ PROCESS(red_domotica_process, "Red domotica process"); AUTOSTART_PROCESSES(&red_domotica_process); /*---------------------------------------------------------------------*/ static void receiver(struct simple_udp_connection *c, const uip_ipaddr_t *sender_addr, uint16_t sender_port, const uip_ipaddr_t *receiver_addr, uint16_t receiver_port, const uint8_t *data, uint16_t datalen) { static uint8_t push = 0; printf("Datos recividos en el puerto %d de 2 desde el puerto %d de 1 con una longitud %d\n", receiver_port, sender_port, datalen); leds_toggle(LED_BLUE); } /*---------------------------------------------------------------------*/ PROCESS_THREAD(red_domotica_process, ev, data) { uip_ipaddr_t addr; PROCESS_BEGIN(); SENSORS_ACTIVATE(button_sensor); simple_udp_register(&broadcast_connection, UDP_PORT, NULL, UDP_PORT, receiver); while(1) { PROCESS_WAIT_EVENT_UNTIL( (ev==sensors_event) && (data &button_sensor)); printf("Enviando paquete ...\n"); uip_create_linklocal_allnodes_mcast(&addr); simple_udp_sendto(&broadcast_connection, "Test", 4, &addr); DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN == Código Fuente } PROCESS_END(); } /*---------------------------------------------------------------------*/ DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 107 Parte IV DATASHEETS DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Esquemas de Freescale Sensor Reference Board Capítulo 1 ESQUEMAS DE FREESCALE SENSOR REFERENCE BOARD En este apartado se expondrán los principales esquemas necesarios para la correcta comprensión del desarrollo de la memoria del proyecto en lo que se refiere a la tarjeta de desarrollo Freescale Sensor Reference Board. Figura 1.1. Componentes del PCB (vista superior) DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 111 112 Datasheets Figura 1.2. Esquema de Freescale Sensor Reference Board DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Esquemas de Redbee Econotag Capítulo 2 ESQUEMAS DE REDBEE ECONOTAG En este apartado se expondrán los principales esquemas necesarios para la correcta comprensión del desarrollo de la memoria del proyecto en lo que se refiere a la tarjeta de desarrollo Redbee Econotag. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 113 114 Datasheets Figura 2.1. Esquema 1 Redwire Econotag DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Esquemas de Redbee Econotag Figura 2.2.Esquema 2 Redwire Econotag. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 115 116 DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Datasheets 117 Madrid, 3 de Septiembre de 2012 Firmado: DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Documento II Pliego de condiciones DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 2 DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN III ÍNDICE Parte I Capítulo 1 Condiciones generales y económicas ............................................. 5 Condiciones generales .................................................................. 7 1 Compromiso administrador y cliente............................................................. 7 2 Reclamaciones..................................................................................................... 7 3 Compromiso del suministrador ...................................................................... 7 4 Características diferenciadoras ........................................................................ 7 5 Plazo de entrega.................................................................................................. 8 6 Garantía................................................................................................................ 8 Capítulo 2 Condiciones económicas .............................................................. 9 1 Precios .................................................................................................................. 9 2 Pago ....................................................................................................................... 9 3 Gastos de embalaje y transporte ..................................................................... 9 4 Garantía................................................................................................................ 9 5 Costes de suministros ...................................................................................... 10 Parte II Capítulo 1 Condiciones técnicas y particulares ............................................ 11 Condiciones técnicas .................................................................. 13 1 Equipo informático. ......................................................................................... 13 2 Placas de circuito impreso. ............................................................................. 13 3 Sistema de radiofrecuencia. ........................................................................... 14 4 Normas de calidad. .......................................................................................... 15 5 Normas de seguridad e higiene. .................................................................... 15 6 Vida útil del producto. .................................................................................... 15 7 Otros criterios del diseño................................................................................ 15 DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Parte I CONDICIONES GENERALES Y ECONÓMICAS DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Condiciones generales 7 Capítulo 1 CONDICIONES GENERALES Las condiciones y cláusulas que se establecen en este documento son de obligado cumplimiento por las partes contratantes. 1 Compromiso administrador y cliente Tanto el administrador como el cliente se comprometen desde la fecha de la firma del contrato a llevar a cabo lo que se estipule. 2 Reclamaciones Ante cualquier reclamación o discrepancia en lo concerniente al cumplimiento de lo pactado por cualquiera de las partes, una vez agotada toda vía de entendimiento, se tramitará el asunto por la vía de lo legal. El dictamen o sentencia que se dicte será de obligado cumplimiento para las dos partes. 3 Compromiso del suministrador Al firmarse el contrato, el suministrador se compromete a facilitar toda la información necesaria para la instalación y buen funcionamiento del sistema, siempre que sea requerido para ello. 4 Características diferenciadoras Asimismo, el cliente entregará al suministrador todas las características distintivas del equipo comprado y aquellas que considere oportunas para el necesario conocimiento de la misma a efectos del diseño del presente equipo. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 8 Condiciones generales y económicas 5 Plazo de entrega El plazo de entrega será de tres meses, a partir de la fecha de la firma del contrato, pudiendo ampliarse en un mes. Cualquier modificación de los plazos deberá contar con el acuerdo de las dos partes. En caso de retrasos imputables al suministrador, se considerará una indemnización del 1 % del valor estipulado por semana de retraso. 6 Garantía Existirá un plazo de garantía de un año a partir de la entrega del sistema. Dicha garantía quedará sin efecto si se demostrase que el sistema ha estado sometido a manipulación o uso indebido. Cumplido dicho plazo de garantía, el suministrador queda obligado a la reparación del sistema durante un plazo de cinco años, fuera del cual quedará a su propio criterio atender la petición del cliente. En ningún momento tendrá el suministrador obligación alguna frente a desperfectos o averías por uso indebido por personas no autorizadas por el suministrador. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Condiciones económicas Capítulo 2 CONDICIONES ECONÓMICAS 1 Precios Los precios indicados en este proyecto son firmes y sin revisión por ningún concepto, siempre y cuando se acepten dentro del periodo de validez del presupuesto que se fija hasta Diciembre de 2012. 2 Pago El pago se realizará como sigue: 75% a la firma del contrato. 25% en el momento de entrega. La forma de pago será al contado mediante cheque nominativo o mediante transferencia bancaria. En ningún caso se aceptarán letras de cambio. 3 Gastos de embalaje y transporte El suministrador se hará cargo de los gastos de embalaje y del transporte, dentro de la ciudad donde se encuentre la instalación. En caso de ser necesario transporte interurbano, el gasto correrá por cuenta del cliente. En todo caso, el responsable de los posibles desperfectos ocasionados por el transporte será el suministrador. 4 Garantía Durante el plazo de garantía, la totalidad de los gastos originados por las reparaciones correrán por cuenta del suministrador. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 9 10 Condiciones generales y económicas 5 Costes de suministros Fuera de dicho plazo y durante los siguientes cinco años, los costes serán fijados mediante acuerdo por ambas partes. Pasados 5 años, éstos los fijará exclusivamente el suministrador. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Parte II CONDICIONES TÉCNICAS Y PARTICULARES DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Condiciones técnicas 13 Capítulo 1 CONDICIONES TÉCNICAS 1 Equipo informático. El dispositivo debe estar homologado conforme a la normativa Europea y Española a fecha de Septiembre de 2012. El dispositivo debe instalarse conforme a las indicaciones del fabricante, manteniendo las condiciones de humedad y temperatura entre los límites marcados. Los programas informáticos empleados han de contar con la licencia preceptiva y cumplir con las condiciones de la misma. En caso de usar programas de licencia GNU, se deberán respetar las condiciones de la misma. 2 Placas de circuito impreso. 2.1 Soporte El tipo de soporte aislante utilizado en las placas de circuito impreso será de fibra de vidrio, con las características siguientes (recomendadas): Resistencia superficial en M 105 Resistencia volumétrica en M 107 Constante dieléctrica (a f=1 MHz) 0,25 Temperatura máxima de trabajo 125ºC Temperatura máxima de soldadura (máx. 20 seg.) 260ºC DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 14 Condiciones técnicas y particulares El espesor de las placas será de 1,6 mm (valor normalizado). Las placas serán de una o dos caras, fabricadas por el método sustractivo basado en máscaras. Deberán acompañarse de un esquema que contenga los taladros a realizar, así como la colocación exacta de los componentes. 2.2 Diseño de las pistas El diseño se realizará teniendo en cuenta las recomendaciones para equipos de alta frecuencia y de telecomunicaciones que dicta la normativa Europea en cuanto a: Compatibilidad electromagnética (89/36/EEC). Niveles de tensión (73/23/EEC). Asimismo, se realizarán las pistas con el siguiente grosor recomendado (suponiendo un espesor típico): Grosor(pulgadas) Corriente Máxima 0.010" 0.3 A 0.015" 0.4 A 0.020" 0.7 A 0.025" 1A 0.05" 2A 0.1" 4A 0.15" 6A 3 Sistema de radiofrecuencia. El sistema de radio frecuencia cumplirá con los requisitos establecidos en la normativa Europea (R&TTE Directive 1999-5-EC). El sistema de radiofrecuencia se atendrá a la normativa vigente de protección del espacio radioeléctrico y protección de la salud: LEY GENERAL DE TELECOMUNICACIONES 11/1998, DE 24 DE ABRIL DE 1998. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Condiciones técnicas 4 Normas de calidad. Los sistemas se diseñarán de forma que cumplan las normas UNE, CEI y EN aplicables a este tipo de productos, así como las normas ETSI (European Telecommunications Standards Institute) para sistemas de radiofrecuencia. 5 Normas de seguridad e higiene. El proyecto cumplirá con la Ley 31/95 de Prevención de Riesgos Laborales. 6 Vida útil del producto. El proyecto cumplirá con la Ley 31/95 de Prevención de Riesgos Laborales. 7 Otros criterios del diseño. Se emplearán componentes normalizados para los circuitos electrónicos. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 15 Documento III Presupuesto DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN II DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN III ÍNDICE Parte I Capítulo 1 1 Presupuestos parciales ..................................................................... 7 Sumas Parciales ............................................................................ 9 Hardware ............................................................................................................. 9 1.1 Placas de desarrollo ........................................................................................................ 9 1.2 Equipo .............................................................................................................................. 9 1.3 Total Hardware............................................................................................................. 10 2 Software ............................................................................................................. 10 3 Mano de obra .................................................................................................... 10 4 Costes indirectos .............................................................................................. 11 Parte II Capítulo 1 1 Presupuesto total ............................................................................ 13 Total de gastos de desarrollo .................................................... 15 Coste total del proyecto ................................................................................... 15 DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN IV DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN V ÍNDICE DE TABLAS Parte I Capítulo 1 Presupuestos parciales ..................................................................... 7 Sumas Parciales ............................................................................ 9 Tabla 1.1: Coste de las placas de desarrollo. .......................................................... 9 Tabla 1.2: Coste de equipo ........................................................................................ 9 Tabla 1.3: Coste total del Hardware....................................................................... 10 Tabla 1.4: Coste del Software.................................................................................. 10 Tabla 1.5: Coste de la mano de obra ...................................................................... 10 Tabla 1.6: Costes indirectos ..................................................................................... 11 Parte II Capítulo 1 Presupuesto total ............................................................................ 13 Total de gastos de desarrollo .................................................... 15 Tabla 1.1: Coste total del proyecto ......................................................................... 15 DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Parte I PRESUPUESTOS PARCIALES DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Sumas Parciales 9 Capítulo 1 SUMAS PARCIALES En este apartado se tendrán en cuenta todos los costes que implican el desarrollo del proyecto. Se incluyen en dichos costes los de hardware, que en el caso concreto de este proyecto simplemente incluyen el precio de compra del dispositivo, los de software, como son las licencias de los programas utilizados en el diseño, los de mano de obra, es decir las personas que trabajan tanto en el diseño como en el desarrollo del proyecto, y los costes indirectos. 1 Hardware 1.1 Placas de desarrollo Concepto Unidades Precio Unitario (€/und) Coste Total (€) 1322x-SRB(Sensor Reference Board) 2 432,87 865,74 Redwire Econotag 2 44,08 88,16 Placa protoboard prof. mediana 1 15,75 15,75 Total 969,65 Tabla 1.1: Coste de las placas de desarrollo. 1.2 Equipo Concepto Ordenador Unidades 1 Precio Unitario Amortización (€/und) Coste Total en el proyecto (€) 5 años 170 850 Total 170 Tabla 1.2: Coste de equipo DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 10 Presupuestos parciales 1.3 Total Hardware Concepto Placas de desarrollo Equipo Unidades Precio Unitario (€/und) 1 1 969,65 170 Total Coste Total (€) 969,65 170 1139,65 Tabla 1.3: Coste total del Hardware 2 Software Concepto Unidades Precio Unitario (€/und) Amortización Coste Total en el proyecto (€) VMWare Player Instant Contiki Mozilla 1 1 1 0 0 0 - 0 0 0 Microsoft Office® 1 199 5años 39,8 Total 39,8 Tabla 1.4: Coste del Software 3 Mano de obra Concepto Precio Unitario (€/h) Horas Coste Total (€) Desarrollo de software Pruebas 140 220 35 25 4900 5500 Documentación 100 30 3000 20 30 600 Trabajo de revisión y corrección Total 14000 Tabla 1.5: Coste de la mano de obra DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Sumas Parciales 11 4 Costes indirectos Coste Total (€) Concepto Gastos de luz y equipos Gastos de comunicación Gastos de transporte Total 37 30 55 122 Tabla 1.6: Costes indirectos DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Parte II PRESUPUESTO TOTAL DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Total de gastos de desarrollo 15 Capítulo 1 TOTAL DE GASTOS DE DESARROLLO 1 Coste total del proyecto A continuación se muestra el total de los costes del proyecto: Concepto Hardware Software Mano de obra Costes Indirectos Total Coste Total (€) 1139,65 39,8 14000 122 15301,45 Tabla 1.1: Coste total del proyecto Por tanto el presupuesto total para este proyecto asciende a QUINCEMIL TRESCIENTOS UNO euros con CUARENTA Y CINCO céntimos. DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN 16 DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN Presupuesto total 17 Madrid, 3 de Septiembre de 2012 Firmado DESARROLLO DE UN SISTEMA DOMÓTICO BASADO EN 6LOWPAN