Full text
Placa de control WiFi para dispositivo de orientación temporal Autor Roberto Pérez Cacho Director José Ignacio Artigas Especialidad Electrónica Industrial Convocatoria Diciembre 2012
2 Placa de control WiFi para dispositivo de orientación temporal Resumen El presente proyecto trata de la implementación de la tecnología WiFi en un dispositivo de orientación temporal. Es un proyecto perteneciente al grupo de investigación de la Universidad de Zaragoza, Tecnodiscap. El dispositivo de orientación temporal consiste en una tira de leds a los que se les debe de poder modificar tanto el color como el brillo. También incluye la funcionalidad de parpadeo. La configuración del dispositivo se realiza desde un ordenador a través de un módulo WiFi. Las partes de las que consta son: diseño y montaje de una placa de circuito impreso (PCB) que contenga un microcontrolador y el módulo WiFi, comunicación con los leds mediante I2C, comunicación con el módulo WiFi por puerto UART, comunicación vía WiFi entre el módulo y el ordenador. Es un trabajo más bien práctico, ya que el grueso del proyecto ha consistido en la programación y depuración del microcontrolador. Como conocimientos adquiridos cabe destacar: tecnología I2C, comunicación por puerto serie (UART), redes WiFi, programación en lenguaje C, selección de componentes a utilizar, diseño y montaje de PCBs.
3 Placa de control WiFi para dispositivo de orientación temporal Índice Índice de figuras……………………………………………………………………………………..….5 Índice de tablas…………………………………………………………………………………..………6 1 – Introducción………………………………………………………………………………………….7 2 – Diseño de la PCB………………………………………………………………………..……….10 3 – Microcontrolador………………………………………………………………………………..12 4 – I2C………………………………………………………………………………………………………14 4.1 – I2C en el proyecto…………………………………………………………………..17 4.2 – I2C en MSP430…………………………………………………………………….…17 5 – Controlador de LEDs MAX7315…………………………………………………………..19 6 – UART………………………………………………………………………………………………..…24 6.1 – UART en el proyecto…………………………………………………………..….25 6.2 – UART en MSP430……………………………………………………………………25 7 – WiFi…………………………………………………………………………………………………….27 7.1 – Módulo RN-XV…………………………………………………………………….…28 7.2 – Configuración y manejo del módulo WiFi……………………………….29 8 – Formato mensajes……………………………………………………………………………...32 8.1 – Mensajes PC->Nodo…………………………………………………………….…32 8.2 – Mensajes Nodo->PC……………………………………………………………….32 8.3 – End_Point……………………………………………………………………….……..33 8.4 – Cluster_Id……………………………………………………………………………….33 8.5 – Command…………………………………………………………………………..….33 8.6 – Event……………………………………………………………………………………..35
4 Placa de control WiFi para dispositivo de orientación temporal 8.7 – Ejemplo……………………………………………………………………………….…36 9 – Programa………………………………………………………………………………….…………37 9.1 – Diagramas de flujo………………………………………………………………….39 10 – Conclusiones…………………………………………………………………………………....45 11 – Bibliografía……………………………………………………………………………………..…47 Anexo A – Planos………………………………………………………………………………………48 Esquema general del circuito Circuito impreso cara top Circuito impreso cara bottom Serigrafía de componentes cara top Serigrafía de componentes cara bottom Taladrado Anexo B – Listado de componentes………………………………………………………....55
5 Placa de control WiFi para dispositivo de orientación temporal Índice de figuras Fig. 1 – Diagrama general del proyecto……………………………………………………….7 Fig. 2 – Dispositivo de orientación temporal. Vista frontal………………………….8 Fig. 3 – Dispositivo de orientación temporal. Reverso…………………………………8 Fig. 4 – Dispositivo de orientación temporal. Detalle…………………………….……9 Fig. 5 – Serigrafía PCB cara top……………………………………………………….…………11 Fig. 6 – Serigrafía PCB cara bottom…………………………………………………………..11 Fig. 7 – Características MSP430F5172……………………………………………………...12 Fig. 8 – Diagrama de bloques MSP430F5172………………………………………….…12 Fig. 9 – Conexión MSP-FET430UIF……………………………………………………….……13 Fig. 10 – Slave address……………………………………………………………………………..14 Fig. 11 – Start and Stop conditions…………………………………………………………...15 Fig. 12 – Bit transfer…………………………………………………………………………….……15 Fig. 13 – Diagrama de flujo I2C dispositivo master…………………………………...16 Fig. 14 – Diagrama de conexión del bus I2C……………………………………………...17 Fig. 15 – Placa de leds 1……………………………………………………………….……………19 Fig. 16 – Placa de leds 2…………………………………………………………………….……..19 Fig. 17 – Esquema conexión MAX7315……………………………………………………..20 Fig. 18 – PWM…………………………………………………………………………………………..21 Fig. 19 – Módulo comunicaciones USB-I2C…………………………………………..…..21 Fig. 20 – Conexión UART…………………………………………………………………………..24 Fig. 21 – Protocolo comunicación puerto serie………………………………..……….25 Fig. 22 – Módulo WiFi RN-XV……………………………………………………………….……28
6 Placa de control WiFi para dispositivo de orientación temporal Fig. 23 – Ejemplo conexión a red WiFi………………………………………………………30 Fig. 24 – Captura TCPIP Builder………………………………………………………………...31 Fig. 25 – Formato mensajes PC->Nodo……………………………………………..………32 Fig. 26 – Formato mensajes Nodo->PC………………………………………….………….32 Fig. 27 – Array “efecto* +”…………………………………………………………………………38 Fig. 28 – Diagrama de flujo main……………………………………………………………...40 Fig. 29 – Diagrama de flujo interrupción timer………………………………………….41 Fig. 30 – Diagrama de flujo envío de datos por I2C……………………………………42 Fig. 31 – Diagrama de flujo transmisión de datos por UART……………………..43 Fig. 32 – Diagrama de flujo interrupción recibir datos por UART………….…..44 Fig. 33 – Emulador conectado a la placa……………………………………………………46 Fig. 34 – Puesto de trabajo……………………………………………………………………….46 Índice de tablas Tabla 1 - Master, 08 Intensity register………................................……………….22 Tabla 2 - Outputs Intensity Register………………………………………………………….23
7 Placa de control WiFi para dispositivo de orientación temporal 1 - Introducción Este proyecto fin de carrera se ha realizado en el grupo de investigación Tecnodiscap de la Universidad de Zaragoza, dentro del proyecto global de realizar un dispositivo de orientación temporal que permita a los alumnos de un colegio de educación especial comprender mejor cuándo deben de realizar las actividades programadas por medio de leds de colores. El estado de estos leds (color, intensidad, parpadeo…) debe de ser modificado desde un ordenador, a través de una red wifi. Se hace necesaria la aplicación de la tecnología para mejorar el aprendizaje de alumnos con capacidades educativas especiales. Como punto de partida del proyecto se tenía un dispositivo de orientación temporal que constaba de 5 placas de leds, una placa controladora y la carcasa. Los objetivos de este PFC eran sustituir la placa controladora existente con tecnología ZigBee por una nueva con tecnología WiFi, adaptándola a la carcasa y las placas de leds existentes, así como programar las funciones definidas para esta nueva versión del proyecto. Las partes básicas del proyecto son el diseño de una nueva placa de circuito impreso (PCB), adaptada a la nueva tecnología, y la programación del microconrolador, mediante el cual se controlan el módulo Wifi mediante UART, y las placas de leds mediante I2C. A través de I2C también se implementa un sensor de luz, para adecuar la intensidad luminosa de los leds a las necesidades ambientales. Aunque el control de este sensor no se ha desarrollado en esta versión del proyecto, se ha incluido en el diseño de la PCB. Fig. 1 – Diagrama general del proyecto
8 Placa de control WiFi para dispositivo de orientación temporal Fig. 2 – Dispositivo de orientación temporal. Vista frontal Fig. 3 – Dispositivo de orientación temporal. Reverso
9 Placa de control WiFi para dispositivo de orientación temporal Fig. 4 – Dispositivo de orientación temporal. Detalle
16 Placa de control WiFi para dispositivo de orientación temporal Fig. 13 – Diagrama de flujo I2C dispositivo master
17 Placa de control WiFi para dispositivo de orientación temporal 4.1 - I2C en el proyecto En el caso específico del dispositivo de orientación temporal, el dispositivo maestro, como es obvio, es el microcontrolador (MSP430F5172), y los dispositivos esclavos son los controladores de los leds (MAX7315), y en las futuras modificaciones del proyecto también lo será el sensor de intensidad luminosa. Fig. 14 – Diagrama de conexión del bus I2C En el caso de los dispositivos MAX7315, se utilizará el modo escritura sobre el esclavo, ya que lo que se desea es modificar el estado de los leds, mientras que en el sensor, lo que se desea es leer la información proporcionada. 4.2 - I2C en MSP430 Los principales registros para la configuración, transmisión y recepción de datos son los siguientes: - P1SEL: Función I2C en los pines P1.4 y 1.5. - UCB0CTL0: - UCMST: Selección del modo master/slave. - UCMODE: Modo de trabajo del USCI_B0. - UCSYNC: Modo síncrono. - UCB0CTL1: - UCSSEL: Selecciona la fuente de reloj. - UCTR: Transmitir/recibir. - UCTXNACK: Envía un NACK.
18 Placa de control WiFi para dispositivo de orientación temporal - UCTXSTP: Envía un STOP. - UCTXSTT: Envía un START. - UCSWRST: Mantiene congelado al USCI. - UCB0BR0: Low Byte del Prescaler Baud Rate. - UCB0BR1: High Byte del Prescaler Baud Rate. - UCB0I2COA: Registro que almacena la dirección I2C propia. - UCB0I2CSA: Registro que almacena la dirección del esclavo. - UCB0STAT: - UCBBUSY: Bus inactivo/ocupado. - UCNACKIFG: Se ha recibido un NACK. - UCSTPIFG: Se ha recibido un STOP. - UCSTTIFG: Se ha recibido un START. - IFG2: - UCB0TXIFG: Transmisión. Se activa cuando el buffer UCB0TXBUF está vacío. - UCB0RXIFG: Recepción. Se activa cuando el buffer UCB0RXBUF está cargado. - UCB0TXBUF: Aquí se guarda el dato que va a ser enviado. - UCB0RXBUF: Contiene el último dato recibido.
19 Placa de control WiFi para dispositivo de orientación temporal 5 – Controlador de LEDs MAX7315 Para fijar el color y el brillo de los leds, se utilizan controladores MAX7315. Estos dispositivos permiten, de una manera simple, cambiar la intensidad de sus salidas, estando cada una de ellas conectada a un led. Estos controladores se controlan por I2C a una velocidad máxima de 400kbps. El rango de tensión de operación está entre 2 y 3.6V, teniendo protección contra sobretensiones de 5.5V. Consta de 8 pines de entrada/salida, proporcionando cada uno un máximo de 20mA de corriente cuando funcionan todos al mismo tiempo. En las figuras 15 y 16 se muestran fotografías de las dos caras de una placa de leds, indicando dónde están posicionados los controladores MAX7315, los microinterruptores encargados de seleccionar la dirección slave y los leds. Fig. 15 – Placa de leds: reverso Fig. 16 – Placa de leds: anverso Cada placa de leds tiene tres MAX7315, uno para el color rojo, otro para el azul, y otro para el verde. Cada placa tiene ocho leds RGB, por tanto cada MAX7315 controla ocho leds. Cada dispositivo MAX7315 tiene una dirección slave, que se puede modificar mediante unos microinterruptores existentes en la misma placa.
20 Placa de control WiFi para dispositivo de orientación temporal En la Fig. 17 se puede ver un esquema básico de conexionado. Los pines AD0, AD1 y AD2 están conectados a los microinterruptores, y son los encargados de seleccionar la dirección slave del MAX7315. Cada salida P0 - P7 está conectada al Led 0 – Led 7 de esa placa. En este esquema faltarían las resistencias pull-up necesarias para el correcto funcionamiento de la comunicación I2C y las resistencias limitadoras de corriente de los leds. Fig. 17 – Esquema conexión MAX7315 El MAX7315 permite realizar tanto control global de las salidas como control PWM, además del control de intensidad master. También tiene posibilidades de parpadeo y de interrupciones. Para el presente proyecto sólo he utilizado el control PWM y el control de intensidad global. Como el control global debe de estar desactivado para usar el PWM, se ha decidido utilizar el control de intensidad master para el brillo, y el control PWM para modificar el color. El control de intensidad master tiene 15 niveles de control (ver tabla 1), del 1 al 15, ya que el nivel 0 deshabilita el PWM. El PWM tiene 16 niveles de control para cada nivel de intensidad master, por tanto combinándolos se pueden alcanzar los 240 niveles.
21 Placa de control WiFi para dispositivo de orientación temporal Fig. 18 – PWM Para despejar dudas del funcionamiento del MAX7315, se ha utilizado el conversor USB- I2C S310425 que permite manejar el bus I2C desde un PC de forma sencilla, con un programa de tipo terminal serie. Así se pueden probar los comandos que hay que mandar en cada caso, antes de entrar en la programación del microcontrolador. Fig. 19 – Módulo comunicaciones USB-I2C S310425 Cuando se usa el conversor USB-I2C, el comando que hay que enviar contiene la dirección del MAX7315 que queremos modificar, el registro interno al que nos referimos, y el dato. Cuando se realiza la programación del microcontrolador, la dirección del MAX7315 se especifica aparte, por tanto el comando solo contiene la dirección interna y el byte o bytes de datos. Cuando queremos actuar sobre los leds, los primeros registros que hay que modificar son el “Blink Phase 0 Outputs” (0x01), que hay que ponerlo a 0x00 y, el registro “Configuration” (0x0F) que también hay que ponerlo a 0x0, ya que queremos que el control global esté desactivado. El siguiente registro es el “Ports Configuration” (0x03), en el que hay que declarar los puertos como entrada o salida. Para el caso de los leds que deban estar encendidos, el valor de ese bit en el registro es “0”. En los leds que queramos apagados, su bit vale “1”. Los siguientes datos que hay que enviar son los que modifican el control de intensidad master y el control PWM. El control de intensidad master se controla con el registro 0x0E, y el PWM con los registros 0x10, 0x11, 0x12 y 0x13, controlando cada uno dos
22 Placa de control WiFi para dispositivo de orientación temporal leds. Además, estos cuatro registros de PWM se auto incrementan, es decir, se puede enviar el mensaje con la dirección slave 0x10 y los datos de los cuatro registros sin necesidad de mandar cada uno con su dirección slave. Para comprender mejor los registros encargados del brillo (master) y del color (PWM), a continuación se muestran las tablas 1 y 2 respectivamente. Tabla 1 - Master, 08 Intensity register
23 Placa de control WiFi para dispositivo de orientación temporal Tabla 2 - Outputs Intensity Register A continuación se expone un ejemplo de cómo hay que configurar el MAX7315 para poner los leds de una placa al 80 % de brillo y con un nivel del 40 % de color. La cadena a enviar sería: START (S) 0x01 0x00 (S) 0x0F 0x00 (S) 0x03 0x00 (S) 0x0E 0xCF (S) 0x10 0x66 0x66 0x66 0x66 STOP Como se ve, hay que enviar una señal de Start antes de introducir otro registro. A partir del 0x10, los registros se autoincrementan.
24 Placa de control WiFi para dispositivo de orientación temporal 6 - UART A diferencia del I2C, el UART es un puerto serie asíncrono (Universal Asynchronous Receiver-Transmitter). El UART transmite los datos bit a bit de manera secuencial. En el dispositivo de destino el otro UART recompone cada byte. Son necesarias dos líneas para la comunicación, una para transmitir (TX), y otra para recibir (RX). Cuando conectamos dos dispositivos que queremos comunicar por UART debemos de conectar la línea TX del primero con la RX del segundo, y viceversa. Así conseguimos que lo que uno transmite, el otro lo reciba. Fig. 20 – Conexión UART Para que la transmisión y recepción de datos mediante UART sea satisfactoria, ambos módulos deben de tener programada la misma velocidad de transmisión (baudrate), longitud de caracter, paridad y bits de stop. El protocolo de comunicación se muestra en la Fig 21. Estando la señal a “1”, el comando empieza con un “0” correspondiente al bit de start. A continuación los bits de datos (7 u 8), que empiezan por el bit menos significativo y terminan por el más significativo. El siguiente bit corresponde a la paridad (par o impar). En un caso concreto sin paridad, este bit se omite. Por último, la señal de stop (1 ó 2 bits), “1” lógico.
25 Placa de control WiFi para dispositivo de orientación temporal Fig. 21 – Protocolo comunicación puerto serie. 6.1 - UART en el proyecto El bus UART se usa para enviar información desde el microcontrolador al módulo wifi, y viceversa. En este caso, he usado un baudrate de 9600, datos de 8 bits, sin paridad, y 1 bit de stop. Por consiguiente, para cada byte de datos que se quiera enviar, habrá que mandar un “0” lógico (start), 8 bits del dato (empezando por el LSB), y un “1” lógico (bit de stop). 6.2 - UART en MSP430 Los principales registros para la configuración, transmisión y recepción de datos son los siguientes: - P1SEL: Función UART en los pines P1.1 y 1.2. - UCA0CTLW0: - UCPEN: Habilita o deshabilita paridad. - UCPAR: Paridad par o impar. - UC7BIT: Longitud dato 7 u 8 bits. - UCSPB: Uno o dos bits stop. - UCMODEx: Selección modo de trabajo. - UCSYNC: Modo síncrono o asíncrono.
32 Placa de control WiFi para dispositivo de orientación temporal 8 – Protocolo de comunicación vía WiFi El protocolo que se va a seguir en la comunicación vía WiFi es el osgi4ami. Es un protocolo promovido por Tecnodiscap en varios foros relacionados con Ambient Assisted Living. Este protocolo busca homogeneizar las comunicaciones en los ambientes inteligentes. Es válido tanto para la comunicación WiFi como para cualquier otro estándar que se pudiera plantear. El hecho de que no tenga interfaces predefinidas para los dispositivos hace que sea un protocolo muy extendido en las aplicaciones relacionadas con los entornos inteligentes. Entrando en la explicación del protocolo, hay que diferenciar entre los mensajes enviados desde el PC al nodo, y los enviados desde el nodo al PC. 8.1 - Mensajes PC->Nodo Fig. 25 – Formato mensajes PC->Nodo Los bytes de ADDR_TO y PROFILE_ID no se utilizan. El End_Point es el identificador del dispositivo lógico al que se refiere el mensaje. Cada componente físico implementa por lo menos dos dispositivos lógicos, un Base_Device y uno o más Virtual_Device. El Cluster_Id es el grupo de atributos al que pertenece el mensaje. Cada dispositivo lógico puede implementar varios Cluster. El campo Length es la longitud en bytes del resto del payload (N+1). El Command es el comando del mensaje. Cada Cluster tiene definidos una serie de comandos que se pueden invocar. El campo Data son los parámetros, la información específica del comando Command, perteneciente al cluster Cluster_Id correspondiente al dispositivo End_Point para el que se ha construido el mensaje. 8.2 - Mensajes Nodo->PC Fig. 26 – Formato mensajes Nodo->PC
33 Placa de control WiFi para dispositivo de orientación temporal Los campos en este caso son los mismos que en el caso anterior. La única diferencia es que el Command ahora es el campo Event. 8.3 - End_Point Cada End_Point tiene los siguientes atributos: - Dev_Category. - Dev_Type. - Dev_Implementation. - Dev_Version. - Clusters. El End_Point del Base Device (encargado de gestionar las comunicaciones) es 0x10. Los End_Point correspondientes a los dispositivos lógicos implementados en el nodo (Virtual Devices) pueden ir desde el 0x11 hasta el 0x1F. En nuestro caso, como solo hay un dispositivo implementado, se usa el 0x11. En cuanto al Dev_Category, para el Base Device es 0x01 (04A_DEVICE), y para el Virtual Device es 0x30 (Simple_HMI). El valor Dev_Type es 0x01 (04A_DEVICE) y 0x04 (Led_Pannel) respectivamente. 8.4 - Cluster_Id En cuanto a los cluster implementados son: - Device (0x00): Conjunto de operaciones asociadas al dispositivo base de OSGi4AMI. - Simple_HMI_Output (0x32): Conjunto de operaciones asociadas al dispositivo Simple HMI de salida. 8.5 - Command Los command que se han implementado en esta versión del proyecto se pueden dividir en dos bloques: - Los referentes al nodo de comunicaciones (Cluster_Id 0x00). - Los referentes al panel de leds (Cluster_Id 0x32). Los command del nodo de comunicaciones son:
34 Placa de control WiFi para dispositivo de orientación temporal - Get_Type (0x00). - Ping (0x02). Los del panel de leds son: - Get_Max_Spots (0x00). - Set_Backg_Color (0x01). - Set_All_Color (0x02). - Get_All_Color (0x03). - Set_Spot_Color (0x04). - Set_Backg_Effect (0x05). - Set_Spot_Effect (0x06(. - Set_Progress_Bar (0x07). Get_Type Este comando consulta el tipo de dispositivo. No necesita enviar ningún parámetro. El dispositivo debe responder con el evento Dev_Type. Ping Con el comando ping se comprueba que los mensajes llegan al dispositivo. No envía parámetros. La respuesta del dispositivo es un ACK. Get_Max_Spots La funcionalidad del Get_Max_Spots es consultar el número total de puntos del panel. No envía parámetros, y responde con el evento Dev_Max_Spots. Set_Backg_Color Se utiliza este comando para configurar todos los puntos con el mismo color y brillo. Los parámetros que envía son 4 bytes con la información de los colores. El primer byte contiene la información del color rojo, el segundo del verde, y el tercero del azul. El cuarto byte corresponde al brillo. “Red, Green, Blue, Bright”. La respuesta es un ACK, si el envío es satisfactorio, o un Error si los parámetros enviados no son correctos. Set_All_Color Con Set_All_Color se configura una lista de puntos, cada uno con su color y su brillo. Los parámetros a enviar son una lista que contiene para cada led el número de punto, la información del rojo, el verde, el azul, y el brillo. “Npunto, Red, Green, Blue, Bright”.
35 Placa de control WiFi para dispositivo de orientación temporal La respuesta, como en el caso anterior, puede ser un ACK o un Error. Get_All_Color Este comando sirve para tener la información de cada punto del panel. No envía parámetros, y responde con el evento Dev_All_Color. Set_Spot_Color Este comando configura el color y el brillo de un único punto del panel. Los parámetros necesarios son el número de punto, la intensidad del rojo, la del verde, la del azul, y el brillo. “Npunto, Red, Green, Blue, Bright”. La respuesta es un ACK si todo es correcto, o un Error si hay fallos en los parámetros. Set_Backg_Effect Configura todos los puntos del panel con el mismo efecto. Los parámetros que envía son “Effect_Type, y Time”. El Effect_Type informa del efecto que se debe aplicar a los leds. Por el momento el único efecto que se aplica a este panel es el parpadeo. Cuando el parámetro Effect_Type vale “1” se aplica parpadeo, cuando vale “0” no hay efecto. Por su parte, el parámetro Time informa del periodo que debe tener el parpadeo. Este parámetro, a diferencia del resto, ocupa 2 bytes, y contiene la información del periodo en milisegundos. El evento con el que responde este comando es un ACK o Error si los parámetros son incorrectos. Set_Spot_Effect Se comporta de la misma manera que el anterior, pero solo afecta a un punto del panel. Así pues, esta función necesita un parámetro más, el número de punto, “Npunto, Effect_Type, Time”. La respuesta también es un ACK o un Error. Set_Progress_Bar Este comando se utiliza para encender un porcentaje de puntos del panel, empezando desde el uno hacia arriba. Los parámetros necesarios son, además de la información de los tres colores y el brillo, el porcentaje de puntos que deben de estar encendidos, “Percent On, Red, Green, Blue, Bright”. La respuesta es, como en los casos anteriores, un ACK. 8.6 - Event ACK El evento ACK es una respuesta como confirmación a un comando. Los parámetros que envía son “Cluster_Id, y Command”. Error
36 Placa de control WiFi para dispositivo de orientación temporal El evento de Error notifica de este con los siguientes parámetros: “Cluster_id, Command, y Error_Code”. El Error_Code puede ser “error_numero_parametros” (0x01) o “periodo_elevado” (0x02). El primero se usa para los command “set_spot_color”, “set_backg_color” y “set_all_color”, cuando la cantidad de parámetros que se reciben es distinta de la correcta. El segundo tiene lugar en los comandos “set_spot_effect” y “set_backg_effect”, cuando el parámetro “time” tiene un valor superior al periodo máximo definido. El periodo máximo que se ha definido es de 8 segundos, ya que un parpadeo que permanece más de cuatro segundos encendido y cuatro apagado no tiene sentido. Not_Supported Cuando el dispositivo recibe un comando que no es ninguno de los anteriores, responde con este evento. A diferencia del evento Error, que indica que los parámetros no son correctos, el Not_Supported notifica que el comando no está soportado. Los parámetros que acompañan a este evento son: “Cluster_Id, y Command”. Dev_Type Éste informa de la lista de EndPoints implementados por el dispositivo físico. Los parámetros con los que responde son una lista que incluye para cada EndPoint: “End_Point, Dev_Category, Dev_Type, Dev_Implement, y Dev_Version”. Dev_Max_Spots Esta respuesta lleva el parámetro Max_Spots, que es el número de leds. Dev_All_Color Este evento contiene como parámetros una lista con el número de punto, el color rojo, el verde, el azul, y el brillo, de cada uno de los leds del panel. “Npunto, Red, Green, Blue, Bright”. 8.7. – Ejemplo A continuación se muestra un pequeño ejemplo de comunicación. Si quisiéramos poner todos los leds de color azul a la máxima intensidad (set_backg_color), el mensaje que habría que enviar desde el ordenador sería: 0x11 0x32 0x05 0x01 0xFF 0x00 0x00 0xFF El dispositivo respondería con un ACK: 0x11 0x32 0x03 0x00 0x32 0x01
37 Placa de control WiFi para dispositivo de orientación temporal 9 - Programa A la hora de programar el microcontrolador se ha tratado siempre de que el código resultante fuera fácilmente ampliable en las posteriores modificaciones del proyecto. La mayoría de cambios leves que puedan llevarse a cabo en el dispositivo supondrán que la única modificación del código sea introducir los nuevos datos en la declaración de constantes. El lenguaje elegido para la programación del microcontrolador ha sido el lenguaje C. La estructura básica del programa consiste en atender mediante interrupción los datos que llegan del módulo wifi, enviar a la función correspondiente, y actuar. La recepción por wifi se atiende con la interrupción UART Rx. La cadena de datos recibidos se almacena en el array “dato_recibido”. Una vez que la cadena de datos está completa, se pasa a procesar el dato. Para esto, se cuenta el número de bytes recibidos con la variable “z”, y se compara con la longitud que debe tener el dato (byte length del mensaje), cuando la cadena de datos ha terminado se pone z=255. Desde el main se comprueba cuándo “z” es igual a 255, entonces se pone a 0 y se llama a la función “elegir_opción”. Mediante la función “elegir_opción” se almacenan los datos recibidos por UART en sus correspondientes variables. Atendiendo al valor de las variables “cluster_id” y “command” se averigua a qué función hay que ir. Para el control de I2C se ha creado el array “guardado” donde se almacenan los valores de cada registro para todos los leds con sus tres colores. La implementación de una interrupción “timer” que actúa cada 100 ms, pone a “1” el flag “enviar”, de modo que en el main se ejecutarán las funciones “enviar_I2C” y “actualiza_efecto” cuando este flag esté a “1”, o lo que es lo mismo, cada 100 ms. La función “actualiza_efecto” se explica más adelante. La función “enviar_I2C” se encarga de crear el array de datos a enviar a partir del array “guardado”. Introduce la dirección I2C correspondiente, y envía el array de datos. Cada vez que se llama a la función “enviar_I2C” (cada 100 ms) se actúa sobre todos los leds. Así, cuando se quiera modificar alguno solo hay que cambiar el valor correspondiente del array “guardado”. Conviene explicar, antes de entrar a ver específicamente lo que hacen las funciones que utilizan I2C para modificar el estado de los leds, que para apagar del todo el color de los puntos se ha optado por poner los pines correspondientes del MAX 7315 como entrada. Así pues, cuando se quiera que ese led emita de nuevo, se deberá configurar el pin como salida. La función “set_backg_color” pone a todos los puntos con el mismo color y brillo. Para empezar comprueba si algún color debe de estar apagado del todo. Si es así configura los pines de los MAX7315 correspondientes a ese color como entradas. Si no, como salidas. Asimismo, si el brillo es cero, configura los tres colores como cero, esto es, poner los pines como entadas. Con esos datos de entrada/salida, y con los de brillo y
38 Placa de control WiFi para dispositivo de orientación temporal colores recibidos por UART, compone el array “guardado”. Este array es modificado totalmente, ya que esta función afecta a todos los puntos. La función “set_spot_color” hace lo mismo que la anterior, pero solo con un punto. Así pues, mira si en el punto en cuestión el valor de alguno de los tres colores o del brillo debe ser cero. Como en el caso anterior configura el pin correspondiente a ese led como entrada o salida, según corresponda. En cuanto a modificar el valor de los colores, se ha explicado en el punto 5 de esta memoria que cada registro afecta a dos puntos (ver tabla 2). Por tanto, como esta función solo afecta a uno, hay que crear el dato a guardar en el array con el nuevo valor de ese led y con el valor antiguo del array “guardado” correspondiente al otro led. En este caso no se modifica todo el array “guardado”, si no solo la parte correspondiente a esa pareja de puntos. Atendiendo al protocolo de comunicaciones, debería de haber otra función que modifique una lista de puntos (“set_all_color”). Este command no se ha implementado como función en el código fuente, y se ha optado por llamar a la función “set_spot_color” para cada punto de la lista. La función “set_progress_bar” calcula el número de puntos que deben de estar encendidos a partir del porcentaje recibido. A continuación llama a la función “set_spot_color” tantas veces como puntos deba haber encendidos. Las otras dos funciones que también modifican el estado de los puntos son “set_spot_effect” y “set_backg_effect”. Lo que se busca con ellas es que un determinado led o todos parpadeen. Para estas dos funciones, se ha creado un array “efecto”, que almacena el efecto que atañe a cada punto y su periodo. Este array se forma con dos bits correspondientes al tipo de efecto, y el resto con el periodo dividido entre 200 ms para ahorrar memoria RAM del microcontrolador (Fig. 27). Al guardarse el tipo de efecto en dos bits, se ha dejado espacio por si en otras versiones se quiere incluir otros tipos, además del parpadeo. Caben un total de tres efectos diferentes. Fig. 27 – Array “efecto[ ]” Para producir el parpadeo, además de crear el array “efecto”, necesitamos una función que periódicamente encienda y apague los puntos que corresponda. Para esto, en la
39 Placa de control WiFi para dispositivo de orientación temporal interrupción “timer” que hemos definido antes cada 100 ms, además de activar el flag “enviar”, incrementa un contador llamado “contador_efecto”. La idea de este contador es que cuando sea múltiplo del semiperiodo expresado en bloques de 100 ms, conmute el estado del led. Para limitar el tamaño del contador, y se pueda reiniciar sin que esto afecte a la temporización que realiza, se ha hecho la siguiente operación: 24 * 33 * 5 * 7 = 15120 Por consiguiente el contador va de 0 a 15119. Los números que no se pueden formar multiplicando algunos de estos números entre sí, se han evitado con una lista de números prohibidos. Si el número de bloques de 100 ms es igual a alguno de estos números prohibidos se le suma 1. La lista de números prohibidos es: 11, 13, 17, 19, 22, 23, 25, 26, 29, 31, 32, 33, 34, 37, 38, y 39. En la función “actualiza_efecto”, a la que se llama cuando el flag “enviar” está a uno (cada 100 ms), se comprueba todo el array “efecto”, y en los puntos que tienen parpadeo, se mira si les toca conmutar. Esto es cuando el resto de la división entre el contador y el número de bloques de 100 ms es cero. Si les toca conmutar, hay que ver si alguno de los tres colores está definido como salida, y por tanto el punto está encendido. Si es así, se configuran los tres colores como entrada. Si por el contrario, el punto está apagado, se configuran como salida los colores que deban de estar encendidos. En lo que respecta a las funciones que no modifican el estado de los puntos, deben de enviar datos por WiFi. Para esto hay que enviar los datos por el buffer Tx de la UART, así los recibe el módulo WiFi RN-XV y los envía al ordenador. Al principio del código, en el main, hay que conectar el módulo WiFi a la red. Para esto, enviamos por el buffer Tx la secuencia para entrar en command mode y conectar el módulo. Hay que tener en cuenta los retardos necesarios antes y después de entrar en command mode especificados en el manual de usuario del módulo RN-XV. Una vez conectado, ya podemos enviar y recibir datos por UART. Todas las funciones cuya misión es enviar datos al módulo WiFi lo que hacen es componer el array “frase”, que es el que se envía por UART, y llamar a la función “enviar_wifi”. Ésta función va colocando los sucesivos bytes del array “frase” en el buffer Tx. 9.1 - Diagramas de flujo A continuación, se muestran los principales diagramas de flujo.
40 Placa de control WiFi para dispositivo de orientación temporal Fig. 28 – Diagrama de flujo main
41 Placa de control WiFi para dispositivo de orientación temporal Fig. 29 – Diagrama de flujo interrupción timer
48 Placa de control WiFi para dispositivo de orientación temporal Anexo A Planos
1 1 2 2 3 3 4 4 5 5 6 6 D D C C B B A A 100nF C5 VCC GND VCC VDD_3V3 1 UART_TX 2 UART_RX 3 GPIO 8 4 RESET 5 GPIO 5 6 GPIO 7 7 GPIO 9 8 GPIO 1 9 GND 10 GPIO 14 11 UART_RTS 12 GPIO 4/SEN6 13 14 GPIO6/SEN7 15 UART_CTS 16 SENSOR 5 17 GPIO 3/SEN4 18 GPIO 2/SEN3 19 SEN2 20 U2 MÓDULO Wi-Fi GND VCC C2 10uF L1 330 R1 100nF C1 1 2 3 J1 PWR2.5 AVCC 1 PJ.4/XOUT 2 PJ.5/XIN 3 AVSS 4 P1.0/PM_UCA0CLK/PM_UCB0STE/A0/CB0 5 P1.1/PM_UCA0TXD/PM_UCA0SIMO/A1/CB1 6 P1.2/PM_UCA0RXD/PM_UCA0SOMI/A2/CB2 7 P1.3/PM_UCB0CLK/PM_UCA0STE/A3/CB3 8 P1.4/PM_UCB0SIMO/PM_UCB0SDA/A4/CB4 9 P1.5/PM_UCB0SOMI/PM_UCB0SCL/A5/CB5 10 PJ.0/SMCLK/TDO/CB6 11 PJ.1/MCLK/TDI/TCLK/CB7 12 PJ.2/ADC10CLK/TMS/CB8 13 PJ.3/ACLK/TCK/CB9 14 P1.6/PM_TD0.0 15 P1.7/PM_TD0.1 16 P2.0/PM_TD0.2 17 P2.1/PM_TD1.0 18 P2.2/PM_TD1.1 19 P2.3/PM_TD1.2 20 DVIO 21 DVSS 22 P2.4/PM_TEC0CLR/PM_TEC0FLT2/PM_TD0.0 23 P2.5/PM_TEC0FLT0/PM_TD0.1 24 P2.6/PM_TEC0FLT1/PM_TD0.2 25 P2.7/PM_TEC1CLR/PM_TEC1FLT1/PM_TD1.0 26 P3.0/PM_TEC1FLT2 /PM_TD1.1 27 P3.1/PM_TEC1FLT0/PM_TD1.2 28 VCORE 29 DVSS 30 DVCC 31 PJ.6/TD1CLK/TD0.1/CB15 32 P3.2/PM_TD0.0/PM_SMCLK/CB14 33 P3.3/PM_TA0CLK/PM_CBOUT/CB13 34 TEST/SBWTCK 35 RST/NMI/SBWTDIO 36 P3.5/PM_TA0.2/A8/VEREF+/CB12 37 P3.6/PM_TA0.1/A7/VEREF-/CB11 38 U1 VCC GND VCC R5 1K5 R6 1K5 R2 100K VCC TXD RXD WIFI_RST C6 10uF C7 100nF GND TXD RXD SDA_IN SCL_IN A0 1 SDA 5 A2 3A1 2WP 7 VSS 4 SCL 6 VCC 8 U5 24LC512-E/SM SCL SDA GND 100nF C11 GND VCC VCC INT_LIGHT WIFI_RST GND GND SDA SCL VCC R8 1K5 R7 1K5 VCC C9 100nF GND SCL_INSDA_IN NC 1 Lx 2 Sx 3 GND 4NC 5 Sy 6 Ly 7 Vcc 8 U4 I2C DRIVER C3100nF R4 47K C8 2.2nF GND TDO/TDI 1 Vcc TOOL 2 3 Vcc TARGET 4 56 TCK 7 TEST/Vpp 8 GND 9 10 1112 1314 P3 FET430UIF GND GND GND R3 20 VCC SDA SCL INT_LIGHT Vdd 1 ADDR SEL 2 GND 3 SCL 4 INT 5 SDA 6 U3 TSL2561 SENSOR LUZ 1 2 3 4 5 6 P4 Header 6
1 1 2 2 3 3 4 4 5 5 6 6 D D C C B B A A
1 1 2 2 3 3 4 4 5 5 6 6 D D C C B B A A
1 1 2 2 3 3 4 4 5 5 6 6 D D C C B B A A
1 1 2 2 3 3 4 4 5 5 6 6 D D C C B B A A
1 1 2 2 3 3 4 4 5 5 6 6 D D C C B B A A
55 Placa de control WiFi para dispositivo de orientación temporal Anexo B Listado de componentes
56 Placa de control WiFi para dispositivo de orientación temporal Cantidad Descripción Referencia (Distibuidor) Precio (hasta 10u.) Precio (+500u) 1 Conector de alimentación 1217039 (Farnell) 1,02 0,66 1 Conector 6 vías 1638946 (Farnell) 1,91 1,32 1 Conector emulador 1099256 (Farnell) 0,60 0,26 1 Sensor luz 1226888 (Farnell) 2,31 1,79 1 Amplificador bus I2C 1627047 (Farnell) 2,95 1,89 1 Led rojo alimentación 1226392 (Farnell) 0,23 0,127 1 Condensador 10uF 1962120 (Farnell) 0,057 0,039 5 Condensadores 100nF 1740665 (Farnell) 0,041 0,019 1 Condensador 2,2nF 1301778 (Farnell) 0,036 0,032 1 Condensador electrolítico 10uF 9452338 (Farnell) 0,093 0,038 1 Resistencia 330 ohm 1099797 (Farnell) 0,029 0,023 1 Resistencia 100 Kohm 1469860 (Farnell) 0,024 0,018 1 Resistencia 20 ohm 2057582 (Farnell) 0,021 0,01 4 Resistencias 1500 ohm 1099801 (Farnell) 0,03 0,025 1 Resistencia 47 Kohm 1469929 (Farnell) 0,024 0,018 1 Módulo WiFi RN-XV Cooking Hacks 40,80 40,80 1 Microcontrolador MSP430F5172 2057047RL (Farnell) 5,34 1,85