CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA...

34
CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 45 CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 4.1 INTRODUCCIÓN ……………………………………………46 4.2 EL DECODOFICADOR DMX ...……………………………47 4.2.1 Circuitería ...…………………………………………47 4.2.2 Programación ...…………………………………….50 4.3 EL CONTROLADOR DE PANTALLA ...…………………..56 4.3.1 Circuitería ...…………………………………………59 4.3.2 Programación ...…………………………………….61 Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

Transcript of CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA...

Page 1: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 45

CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 4.1 INTRODUCCIÓN ……………………………………………46 4.2 EL DECODOFICADOR DMX ...……………………………47 4.2.1 Circuitería ...…………………………………………47 4.2.2 Programación ...…………………………………….50 4.3 EL CONTROLADOR DE PANTALLA ...…………………..56 4.3.1 Circuitería ...…………………………………………59 4.3.2 Programación ...…………………………………….61

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

Page 2: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 46

4.1 INTRODUCCIÓN Una vez expuesto el entorno de trabajo en que se enmarca nuestro proyecto, incluyendo la descripción de los programas y herramientas utilizados para su desarrollo, los protocolos de comunicación y componentes implicados y la arquitectura general en que se estructurará el diseño, estamos en condiciones de exponer detenidamente las distintas fases en las que se dividió el proceso de desarrollo, para dar lugar a la implementación final en forma de placa de circuito impreso. En este capítulo nos encargaremos de explicar la primera de estas fases. En un principio, el objetivo de este proyecto consistía exclusivamente en desarrollar un sistema de control por DMX, incorporándose más tarde el control por mando a distancia. El resultado de esta primera fase puede considerarse, por tanto, como la primera versión de este proyecto, y sobre ella se basará el diseño final. En esta primera fase partimos de cero. Tras estudiar el protocolo DMX en profundidad, la primera cuestión que se plantea es cómo utilizar nuestro microcontrolador para detectar, recibir y decodificar la señal. Una vez logrado esto, debe buscarse la manera de utilizar la información obtenida para actuar sobre la pantalla adecuadamente. El principal problema en este sentido radica en que la pantalla estaba diseñada inicialmente para reproducir vídeo, y el sistema de codificación de información desarrollado a tal efecto era demasiado complejo para ser usado en nuestra aplicación. Por lo tanto, se desarrolló uno nuevo, más sencillo y adecuado. A continuación se procederá a describir, por separado, el desarrollo de las dos partes que componen el sistema interfase desarrollado: en primer lugar, el decodificador de señal, seguido éste del controlador de pantalla. En ambos casos comenzaremos describiendo la circuitería implicada, para pasar después a detallar las principales características de los programas implementados. El código de cada uno de estos programas se adjunta como anexo a esta memoria.

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

Page 3: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 47

4.2 EL DECODIFICADOR DMX A la hora de afrontar la detección, recepción y decodificación de la señal, y tras varias ideas que resultaron ser poco adecuadas, se llega a la conclusión de que el mejor método consiste en utilizar el Timer X en modo de medida de ancho de pulso para detectar el break que indica el comienzo de cada señal DMX. Después se activará la recepción por el puerto serie (UART0), que lógicamente es totalmente compatible con el estándar RS-485 sobre el que se construye el protocolo DMX, para ir recibiendo la información contenida en cada canal, que se irá almacenando adecuadamente. Tras esto van surgiendo necesidades que irán determinando la inclusión de ciertos componentes electrónicos. Es el caso del SN75176B, para convertir la señal diferencial que se recibe en otra simple, o del latch 74AC373, para tener preparada la información a la salida en el instante adecuado.

4.2.1 Circuitería En general, la circuitería implicada en nuestro sistema resulta bastante sencilla, debido en gran parte a la posibilidad de simplificar la misma utilizando la inteligencia del microcontrolador. El circuito desarrollado en Multisim para implementar el decodificador DMX es el siguiente:

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

Page 4: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 48

Varios son los detalles de interés que pueden comentarse con respecto a este circuito. En esta representación, la entrada DMX carece de conector. En la práctica, se usó un conector de cable IDE de 20 pines, simplemente porque los conectores son robustos y abundaban en el laboratorio. A continuación se muestra la adaptación que se realizó entre el cable XLR3 proveniente del controlador DMX y el conector IDE: Para la implementación final, por su parte, sí se usó un conector de tres pines y conectores XLR3 adecuados, como se mostrará en su momento La salida se conecta, igualmente, a través de un conector IDE de 20 pines. Además de los dos motivos anteriormente expuestos para optar por dicha elección, aquí se suma el hecho de que a la salida tendremos 8 bits de datos y, por ahora, una señal de control, que en un futuro podrían ser más, por lo que puede ser positivo tener vías de conexión sobrantes. Los pines no utilizados se conectan a tierra. A la izquierda de la imagen tenemos un bloque de nueve jumper-pins, que por un lado se conectan a nivel alto y por el otro a nueve entradas digitales del microcontrolador, con sus respectivas resistencias de pull-down. Estos jumpers nos permitirán fijar la dirección DMX a partir de la cual se situarán los seis canales que gobiernan nuestro sistema, dentro los 512 que contempla el protocolo. En el diseño definitivo, esta selección se realizará mediante un DIP.

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y

mando a distancia infrarrojo

Page 5: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 49

Podemos observar que la salida del SN75176B se conecta a dos pines del microcontrolador: el pin número 8 y el pin número 10. Esto se debe a que, como se comentó, se utilizan dos periféricos internos distintos para procesar la señal de entrada. Por un lado, usamos el Timer X en modo de medida de ancho de pulso para captar el break inicial. La conexión con el exterior de dicho periférico se sitúa en el pin CNTR0, el octavo del micro. Una vez detectado el break, se desactivará la cuenta del Timer y se activará la recepción por la UART0, la cual se encargará de recibir los bytes de datos correspondientes a cada canal. El pin de recepción de este puerto serie es el pin 10 del microcontrolador, RxD0. La información contenida en cada canal se irá almacenando en una tabla de seis elementos. Una vez recibido el último, se procederá a transmitirlos al siguiente microcontrolador. Para ello, se extraen a través del puerto cero del micro (pines del 24 al 27 y del 29 al 32), de donde pasan al latch de salida. Una vez los datos están listos, se da la señal de control indicada al siguiente micro, a través del pin3_3. Las imágenes que aparecen a continuación nos muestran el frontal y el reverso de la implementación realizada en el laboratorio del circuito descrito: z

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

Page 6: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50

4.2.2 Programación El centro neurálgico de nuestro diseño se localiza en los dos R8C/13 presentes en el mismo, que se encargan de llevar a cabo y controlar las principales tareas en todo el proceso. Por ello resulta fundamental dentro de este proyecto la programación de ambos microcontroladores. El programa que maneja el microcontrolador en esta primera versión del decodificador es el más simple de todos los que se expondrán a lo largo de esta memoria, si bien presenta ciertas complicaciones debido al trabajo con varias interrupciones y el uso de distintos periféricos internos. Comenzaremos dando una explicación global del funcionamiento del programa, para después describir detenidamente cada rutina y la programación de cada periférico. La secuencia que sigue la ejecución del programa es la siguiente (los paréntesis hacen referencia al diagrama de flujo que aparece a continuación):

- Al comienzo del programa es llamada la función init(), en la que se inicializan los distintos registros implicados en la configuración de funcionamiento del micro y los periféricos. Además, se activará el Timer X, que esperará la llegada de un pulso a nivel bajo para comenzar la cuenta y comprobar si la duración se corresponde con un break. Por último, se guardará la dirección DMX fijada en los jumpers (1).

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

RESISTENCIAS

DE PULL-DOWN

ENTRADA SALIDA

Page 7: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 51

- Tras esto, empieza a ejecutarse un bucle infinito, que contiene el

grueso del programa y se ejecutará indefinidamente (2). - A partir de ahí se esperará a la activación de la recepción de la

UART0, lo cual tendrá lugar cuando el Timer X detecte la llegada de un break.

- El final del break provoca que se ejecute la rutina de servicio correspondiente a la interrupción INT_1. En ésta, se comprueba primero si la duración del pulso a nivel bajo que se midió se corresponde realmente con un break; en caso afirmativo, se desactiva la cuenta del Timer y se activa la recepción por el puerto serie. A partir de ese momento, deben empezar a llegar bytes de datos, empezando por el start-byte de la señal DMX y siguiendo por cada uno de los correspondientes a los distintos canales.

- Cada vez que se reciba un byte, se activará una bandera ri_u0c1 en el registro de control de la UART0 correspondiente, por lo que se cumplirá la primera condición de entrada que aparece dentro del bucle infinito (3).

- Dentro de este bucle, se borrará la bandera y se incrementará un contador, encargado de contar el número de canales que van llegando. Hasta que no se alcance el canal correspondiente a la dirección DMX de nuestro dispositivo, se saldrá de la rutina sin hacer nada más (4).

- Cuando llega el primer canal que nos interesa, se cumple la condición de entrada en el siguiente bucle dentro de la rutina de recepción (5). A partir de ahora, se comprobará que no se ha sobrepasado el número de canales cuyos datos nos son útiles (6). Mientras sí lo sean, se irán almacenando los datos recibidos, y se llevará la cuenta de los mismos hasta llegar a seis, que es el número de canales que usamos (7).

- Cuando llega el último canal deja de cumplirse la condición en (5) y se pasa a entrar en el else (8). Aquí primero se desactiva la recepción por el puerto serie y se reinician los contadores (9), para después comenzar un bucle while en el que se transmitirán los seis bytes de datos almacenados hacia el siguiente micro (10). Esto implica colocar el byte en el puerto 0, cargarlos en el latch y poner durante un instante el pin3_3 a nivel bajo, informando así de que los datos están listos.

- Entre la transmisión de un byte y el siguiente se ejecutará un breve bucle de espera (11). La razón radica en que el micro receptor, el que deberá controlar la pantalla, requiere un cierto tiempo para procesar la información que va recibiendo.

- Cuando se han transmitido los datos correspondientes a los seis canales, se reactivará el Timer X (12), y el programa volverá a situarse a la espera de la llegada de un nuevo break.

Esta explicación sobre la secuencia que sigue la ejecución del programa se complementa con el diagrama de flujo expuesto a continuación.

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y

mando a distancia infrarrojo

Page 8: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

Inicio

init ( )

Comienzobucle infinito

¿Byte recibido?

- Borra bandera de recepción dedatos

- Incrementa contador de dirección

No

- Desactiva recepción por UART0- Reinicia contador de canales

while( contador decanales<=DMX_channels)

- Activa latch de salida- Coloca datos a la salida

- Activa línea que genera interrupción de recepción en e lsiguiente micro- Desactiva latch

- Incremeta contador de canales- Bucle de espera antes de transmitir dato siguiente

No

¿contador dedirección>=dirección

DMX?

¿contador decanales<=DMX_channels?

- Almacena datos- Incremeta contador de

canales

- Reinicia contador de canales- Reactiva cuenta del Timer X

No

No

(1)

(2)

(3)

(4)

(5)

(6)

(7)

(8)

(9)

(10)

(11)

(12)

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 52

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

Page 9: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

Inicio

Fin

- Inicializacón deoscilador inte rno como

reloj a 20 MHz

- Inicialización pines deentrada y salida

- Inicialización Timer X

- Inicialización UART0

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 53

Una vez expuesto el núcleo del programa, procederemos ahora a profundizar un poco en el funcionamiento interno de las distintas rutinas que complementan a la rutina principal. Función init() El programa comienza con la ejecución de esta rutina. Esto debe ser así porque es en esta rutina en la que se inicializan los distintos parámetros del microcontrolador, así como los modos de funcionamiento y distintas características de los periféricos. El diagrama de flujo que la describe es el siguiente: Veamos con más detalle que parámetros configuramos y que valores les asignamos:

- Reloj del microcontrolador (1): o Selección de oscilador interno o Frecuencia de funcionamiento máxima:20MHz

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

(1)

(2)

(3)

(4)

Inicio

Fin

- Inicializacón deoscilador inte rno como

reloj a 20 MHz

- Inicialización pines deentrada y salida

- Inicialización Timer X

- Inicialización UART0

(1)

(2)

(3)

(4)

Page 10: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

Inicio

Fin

contador++

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 54

- Pines de entrada y salida (2): o Entradas para los jumpers de direcciones: p1_0, p1_1, p1_2,

p1_3, p1_6, p3_7, p3_2, p3_1, p3_0. o Entradas para señal DMX: p1_5 (UART0), p1_7 (Timer X). o Salidas de datos: p0 al completo o Salidas de control: p4_5 (latch_enable), p3_3 (activar

recepción siguiente micro) - Inicialización del Timer X (3):

o Modo de funcionamiento: medida de ancho de pulso o Pulso a medir: nivel bajo o Tiempo de cuenta:

� Factor de división del reloj (fj): f1 � Registros de inicialización de cuenta: Tx=159, PREX=0 Tiempo de cuenta= = 8ms

o Prioridad de las interrupciones:

� Interrupción asociada al Timer X; se produce cada vez que éste desborda: 5

� Interrupción asociada a INT_1; se produce cada vez que finaliza el pulso medido: 6

- Inicialización de la UART0 (4): o Reloj usado: reloj interno o Dos bits de stop, comprobación de paridad desactivada datos

de 8 bits o Velocidad de conexión: 250kbit/s

Rutina de interrupción del Timer X Ésta se ejecutará cada vez que el contador desborde. Se trata de una función muy simple:

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

Page 11: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

Inicio

No

Fin

¿contador>=10?

- Detiene cuenta deTimer X

- Activa recepciónpor UART0

- Continúacuenta

- Reiniciaregistros de

TimerX- Reiniciacontador

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 55

Como vemos, lo único que hace es ir contando el número de desbordes. Es decir, mientras esté activado el Timer y se esté detectando un pulso a nivel bajo, esta rutina se atenderá cada 8ms. Cuando el pulso a nivel bajo que se está midiendo termine, el dato almacenado en esta variable será utilizado para determinar si el pulso bajo era realmente un break o una simple perturbación. Rutina de interrupción de INT_1 Cada vez que el pulso a nivel bajo que se esta midiendo termina, se atiende esta rutina de interrupción. En ella, se comprobará si la duración del pulso medido está dentro de los márgenes establecidos, es decir, mayor de 80ms. Si es así, se procederá a activar la recepción por el puerto serie y se deshabilitará el Timer. Si no es así, simplemente se esperará al siguiente pulso bajo. Veamos el diagrama de flujo correspondiente:

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y

mando a distancia infrarrojo

Page 12: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 56

4.3 EL CONTROLADOR DE PANTALLA Tras encontrar un procedimiento válido para recibir y decodificar la señal DMX, el siguiente paso debe consistir en buscar la manera de actuar sobre la pantalla según los dictados de los seis canales DMX que procesamos. Primero debemos decidir qué deseamos controlar con cada uno de dichos canales. En esta primera versión, la función de cada uno de ellos será, respectivamente:

- 1er canal: control de intensidad para diodos rojos - 2º canal: control de intensidad para diodos verdes - 3er canal: control de intensidad para diodos azules - 4º canal: selección de un color de entre una serie de colores

predeterminados - 5º canal: activación de función de parpadeo a distintas velocidades,

hasta un máximo de 15 parpadeos por segundo, logrando producir un efecto de estrobo

- 6º canal: selección de efectos dinámicos que juegan con distintos colores e intensidades

Antes de pasar a describir en profundidad esta parte del diseño, vamos a detenernos un instante en explicar como funciona el estándar RGB, así como el método que utilizamos para aplicarlo a nuestra pantalla, jugando con el tiempo de encendido de los diodos mediante una modulación en ancho de pulso. Entendido esto resultará más sencilla la comprensión del programa. El estándar RGB Un sistema RGB (del inglés Red, Green y Blue) se basa en el principio de que la luz consta de tres colores primarios: rojo, verde y azul. Combinando esos colores primarios en diversas intensidades podemos conseguir todos los colores visibles.

Así, si representamos la intensidad de cada color primario con un número, entonces podemos representar cada color con tres números (uno para el rojo, uno para el verde y uno para el azul).

El estándar usará números enteros en el rango 0…255, es decir, tendremos 256 valores posibles para cada color primario. Por lo tanto, con tres bytes podemos representar 256 x 256 x 256 combinaciones, teniendo una gama de más de 16 millones de colores, lo que se conoce como "color verdadero”. Estos tres bytes forman los llamados “códigos RGB”.

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

Page 13: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 57

La siguiente paleta, que representa una versión simplificada de dicha gama, nos muestra la correspondencia entre algunos colores y sus códigos en hexadecimal:

Los colores primarios se representan como RGB(255,0,0) (Rojo claro), RGB(0,255,0) (Verde claro) y RGB(0,0,255) (Azul claro) y sus versiones oscuras (menos intensas) serían RGB(128,0,0), RGB(0,128,0) y RGB(0,0,128), respectivamente. Por otro lado, el negro es la ausencia de color (o la ausencia de luz) y se representa como RGB(0,0,0) y el blanco es la presencia de todos los colores (en su intensidad máxima) y se representa entonces como RGB(255,255,255).

En nuestra pantalla, formada por LEDs, esos tres valores entre 0 y 255 significarán, evidentemente, distintos niveles de intensidad lumínica de los diodos de cada uno de los tres colores.

La modulación PWM (Pulse Width Modulation)

Visto el funcionamiento general de un sistema RGB, cabe preguntarnos cómo manipular nuestro sistema para tener la posibilidad de establecer los distintos valores de intensidad de los diodos.

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

Page 14: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 58

En principio, podría pensarse que lo más sencillo sería jugar con el voltaje de alimentación de los diodos, pero como se vio en el epígrafe dedicado a la descripción de la pantalla, el bloque dedicado a la alimentación es independiente y ajeno a nuestro sistema, por lo que esta posibilidad queda descartada. El método utilizado sigue una orientación muy distinta. Nos basaremos en las limitaciones del ojo humano, para “engañarlo” con una frecuencia de refresco superior a la que es capaz de percibir. El procedimiento será sencillo. Refrescaremos la pantalla aproximadamente cada 10ms es decir, con una frecuencia por encima de 95Hz. Dentro de estos 10ms, los diodos permanecerán encendidos más o menos tiempo, lo que dará una sensación visual de que lucen con más o menos intensidad. Por ejemplo, el valor 128 dentro del código RGB significará que los diodos permanecerán encendidos un 50% del tiempo. Este control se ejercerá, evidentemente, de manera independiente para cada color primario. En definitiva, lo que estamos aplicando es una modulación de ancho de pulso, con siglas en inglés PWM. Teóricamente, el ancho relativo en que la señal (en nuestro caso la alimentación de los diodos) permanece a nivel alto, con respecto al período, se denomina ciclo de trabajo, y se expresa como: D: ciclo de trabajo (D<=1) t: tiempo que la señal permanece a nivel alto T: período El siguiente gráfico muestra como se modularían dos señales con ciclos de trabajo D2 y D1, siendo D2>D1:

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y

mando a distancia infrarrojo

Page 15: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 59

En el apartado dedicado a la programación veremos más detalladamente como nos las arreglamos para refrescar la pantalla cuando corresponda y para gestionar estos ciclos de trabajo adecuadamente.

4.3.1 Circuitería A continuación se presenta un esquema del circuito encargado de tomar la información decodificada y actuar según ésta sobre la pantalla:

Se situará inmediatamente después del decodificador DMX. Por ello, a la entrada aparece un conector IDE de 20 pines, al igual que a la salida de aquél. Como se observa, son nueve las entradas que llegan a través de este conector. Las ocho superiores, que se conectan directamente con el puerto cero del microcontrolador, se corresponden con los 8 bits de datos recibidos. El noveno se corresponde con una señal de control, que informará de que los datos están preparados para ser captados, generando una interrupción en el R8C. Para ello se conecta al pin4_5, que se corresponde con la interrupción INT_0. Como comentamos al describir la estructura de la pantalla, nuestro sistema se conectará directamente con los repartidores de datos, a través del conector IDE de 34 pines que se observa a la izquierda de la imagen.

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

Page 16: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 60

Como salida del micro hacia los distribuidores de datos utilizaremos el puerto uno (pines entre el ocho y el quince). Podemos ver que estos pines se conectan, por un lado, a las ocho entradas de un latch, pero que también van directamente al conector de salida. La razón de esta doble conexión a la salida es un detalle importante. Para actuar sobre la pantalla, vimos que son necesarios dos bytes, uno de datos y otro de dirección. Ambos deben enviarse simultáneamente, lo que significaría que deberíamos dedicar 16 de los 32 pines del microcontrolador sólo a este fin, lo cual es claramente excesivo. En lugar de ello, se utiliza un latch para emular un puerto más de salida. Primero, se colocarán los datos en el puerto uno del micro, y se activará la señal de control para que se almacenen en el latch. La salida de éste, que está siempre conectada, tiene además conexión directa con el conector de salida. Una vez hecho esto, se coloca en el puerto uno del micro la dirección sobre la que se quiere actuar, y es entonces cuando, a través del pin3_0, se activan los repartidores de datos, que tienen a su disposición los dos bytes que necesitan. Por otro lado, vemos que este conector de 34 pines se utiliza también para proveer a los distribuidores de datos de la alimentación que requieren, a través de varios pines que van conectados a Vcc y tierra. A continuación podemos ver la implementación del circuito realizada en el laboratorio:

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y

mando a distancia infrarrojo

Page 17: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 61

La siguiente imagen nos muestra la conexión completa del sistema: controlador DMX, decodificador y controlador de pantalla, junto con la necesaria fuente de alimentación de 5V:

4.3.2 Programación Al comienzo de este apartado se citaron las tareas que deberá realizar el controlador de pantalla en función de los valores recibidos de cada uno de los canales. El programa contendrá varias funciones que se encargarán de gestionar cada una de estas tareas, aunque todas ellas girarán en torno a la rutina principal, que es la que se encarga directamente del control de encendido de los diodos, o lo que es lo mismo, de fijar la intensidad de los tres colores primarios para la generación de los distintos colores. Por lo tanto, comenzaremos exponiendo el funcionamiento de la función principal, para después explicar como interactúan con él las funciones encargadas del tratamiento de los distintos efectos. La secuencia de ejecución del mismo sigue los siguientes pasos:

- El primer paso es, una vez más, inicializar el microcontrolador y los periféricos correctamente; para ello es llamada la función init() (1). En ella, también se activará el Timer X, que en combinación con un contador se encargará de medir el tiempo de ciclo para tener una frecuencia de refresco adecuada.

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

Page 18: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 62

- A continuación se llama a la función control(OFF,ALLES) (2). Esta función será la que envíe datos y dirección a los distribuidores de datos; en este caso, con los dos parámetros recibidos, provoca que la pantalla se apague completamente (ALLES significa “todo”, en alemán).

- A partir de aquí comienza a ejecutarse de manera indefinida un bucle infinito (3).

- Una vez dentro de éste, tendremos un bucle if-else, cuya condición de selección será si el contador counter es o no igual a cero (4). Este contador, junto con el Timer X, marcará el tiempo de refresco. Counter estará inicializado a 256.

- Cuando la condición sea cierta y se ejecute el código correspondiente al if, lo primero que se comprobará a continuación es si la bandera flag se encuentra a uno (5). Esta bandera es activada por la rutina de interrupción del Timer X, exactamente cada 40us. Cuando se cumpla la condición y la ejecución continúe dentro de este bucle, se actuará como corresponda sobre los diodos rojos, verdes y azules, respectivamente, para luego decrementar counter y desactivar flag (6). Por lo tanto, tenemos que cada 40us se decrementará counter, hasta un total de 256 veces, momento en el que éste será cero y pasará a ejecutarse el código correspondiente al else (7). En este momento, se reinicializarán counter y las variables que se encargan de controlar el nivel de intensidad de los diodos, rotcounter, gruencounter y blaucounter (8). Haciendo un sencillo cálculo vemos podemos ver que counter se reinicializa aproximadamente cada 10ms, que es el tiempo de refresco que necesitamos:

o 256 decrementos, uno cada 40us � 256 x 40us = 10ms (aprox)

- Sabiendo ya como generamos los ciclos de 10ms que necesitábamos, veamos ahora cómo, dentro de dicho ciclo, actuamos sobre los diodos, para lograr generar los distintos colores e intensidades. En nuestro programa tendremos nueve variables, tres correspondientes a cada color primario, que se encargarán de dicha labor:

o rot, blau y gruen: actuarán como banderas, indicando si los diodos en cuestión se encuentran encendidos o apagados.

o r, g y b: contendrán los tres valores del código RGB de cada color. Como se verá después, dichos valores serán determinados según la información recibida de los distintos canales.

o rotcounter, gruencounter y blaucounter: se utilizarán como contadores del tiempo que cada color debe permanecer encendido dentro de cada ciclo.

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

Page 19: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 63

- El procedimiento será el siguiente: o al iniciar cada ciclo, rotcounter, gruencounter y blaucounter

son inicializados con los valores de r, g y b, respectivamente. o Hemos dicho que los 10ms de cada ciclo de refresco se

dividirán en 256 subciclos, en los que se irá decrementando counter.

o En cada uno de estos subciclos, se comprobará el contador de tiempo de cada color (9); si es cero, significará que ha llegado el momento de apagar ese color, o que continúe apagado; si no es cero, este se encenderá, o continuará encendido, al menos hasta el siguiente subciclo.

o Por ejemplo, si la intensidad de rojo debe ser máxima (r=255) y la del verde y azul media (g=128, b=128), al comenzar el ciclo tendremos rotcounter=255, blaucounter=128 y gruencounter=128. Comenzará a transcurrir el ciclo, y cuando lleguemos a su mitad, los dos últimos habrán llegado a cero, por lo que el verde y el azul se apagarán, mientras que el rojo permanecerá encendido todo el ciclo.

- En la parte de código correspondiente al else (7), además de reinicializar los contadores, se comprobarán las variables blinken y random (10). Éstas contienen la información recibida relativa a los canales cinco y seis, respectivamente. Si el contenido del primero es distinto de cero, se llamará a la función que se encargan de producir el parpadeo (activado por el quinto canal), En el caso de random, se activará la selección de efectos luminosos dinámicos.

El siguiente diagrama de flujo ayudará a entender lo expuesto: (sigue en la página siguiente)

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

(1)

(2)

(3)

Page 20: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 64

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y

mando a distancia infrarrojo

(4)

(5)

(7)

(6)

(6)

(8)

(9)

(9)

(9)

(9)

(10)

Page 21: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

Inicio

Fin

- Inicializacón deoscilador interno como

reloj a 20 MHz

- Inicialización pines deentrada y salida

- Inicializaciónregistros para Int_0

- Inicialización Timer Y

- Inicialización Timer X

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 65

Pasemos ahora a describir el resto de funciones que participan en el control de la pantalla. Función init() Esta rutina cumple la misma función que la que aparece, bajo el mismo nombre, en el programa del decodificador DMX, aunque existen varias diferencias en cuanto a los periféricos configurados. El diagrama de flujo que la representa es el siguiente:

- Reloj del microcontrolador: o Selección de oscilador interno o Frecuencia de funcionamiento máxima:20MHz

- Pines de entrada y salida: o Entrada de datos: p0 al completo o Entrada de control: p4_5 (activación INT_0) o Salidas de datos: p1 al completo o Salidas de control: p3_2 (latch_enable), p3_0 (datos y

dirección listos a la salida)

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

Page 22: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 66

- Inicialización del Timer X: o Modo de funcionamiento: timer o Tiempo de cuenta:

� Factor de división del reloj (fj): f8 � Registros de inicialización de cuenta: Tx=99, PREX=0 Tiempo de cuenta= = 40us

- Inicialización del Timer Y (usado en la función de parpadeo): o Modo de funcionamiento: timer o Tiempo de cuenta:

� Factor de división del reloj (fj): f8 � Registros de inicialización de cuenta: TYPR=249,

PREY=249 Tiempo de cuenta= = 25ms

o Prioridad de las interrupciones:

� Interrupción asociada al Timer X; se produce cada vez que éste desborda: 6

� Interrupción asociada al Timer Y; se produce cada vez que éste desborda: 6

� Interrupción asociada a INT_0; se produce cada vez que el pin4_5 pasa a nivel bajo (llegada de datos): 6

Función control(char value, char farbe) Como ya se comentó, esta es la función que, en última instancia, se encarga de enviar los datos, junto con la dirección correspondiente, a los distribuidores de datos de la pantalla. Como vemos recibirá dos parámetros por referencia: value y farbe. El primero sólo tiene dos valores posibles, que son precisamente los que pueden tener los diodos: encendido, ON, o apagado, OFF. Farbe (en alemán color), podrá tener cuatro valores válidos: ROT(rojo), BLAU(azul), GRUEN(verde) o ALLES(todos). Todas estas etiquetas están definidas en el fichero defines.h. Esta rutina funcionará de la siguiente forma:

- Al comenzar, se declararán las variables a usar en el programa, todas locales, exceptuando las recibidas como argumentos.

- A continuación, tendremos un bucle switch, que en función del valor recibido en farbe, esto es, del color sobre el que vayamos a actuar, asignará a las variables a y c unos valores determinados.

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

Page 23: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 67

- Las variables a y c se utilizarán como índices en los bucles for que aparecen a continuación, los cuales harán recorrer los diodos correspondientes a un cierto color encendiéndolos o apagándolos, según value.

- La parte más importante de esta función es la que se encarga de actuar sobre la pantalla. Esto se realiza recorriendo todas las direcciones del color o colores que corresponda, a través de tres bucles for anidados. Veamos las variables que intervienen y el significado de cada una de ellas, para luego detallar el funcionamiento concreto de dichos bucles:

o Variable x: recorrerá cada una de las cinco salidas de los repartidores de datos, por lo que toma valores entre 0 y 4. Es decir, con la x seleccionamos el módulo sobre el que actuamos de entre los 5 de una fila controlados por cada distribuidor. Ya comentamos que no era posible distinguir entre filas; las cinco filas actuarán de manera idéntica.

o Variable y: toma valores entre 0 y 3, y con el recorreremos los 4 cuadrantes en que se divide cada módulo LED. Éstos se ordenarán de la siguiente manera:

o Variable z: tomará valores entre a y c, en función del color a

direccionar.

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y

mando a distancia infrarrojo

0 1

2 3

Page 24: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 68

o Para entender mejor como funciona esta rutina, puede resultar

útil observar las líneas de programa correspondientes a esta parte:

for (x=0;x<=4;x++) { for (y=0;y<=3;y=y++) { for (z=a;z<=c;z++) { p1=value; p3_2=1; p3_2=0; p1=x*32+y*8+z; p3_0=0; p3_0=1; } } }

o El procedimiento transcurre como sigue:

� Vemos que primero se fija la x, seleccionando un módulo, y a continuación la y, para referirnos a uno de los cuatro cuadrantes.

� Seguidamente se utiliza la variable z para recorrer las direcciones correspondientes a un cierto color dentro de ese cuadrante, que serán cuatro en caso de los diodos rojos y dos si actuamos sobre diodos verdes o azules.

� Para cada dirección, esta rutina carga los datos en el latch de salida y luego coloca en el puerto 1 la dirección correspondiente. Cuando ésta está lista, da la señal al repartidor de datos a través de p3_0.

� Una vez recorrido todo un cuadrante, se pasa al siguiente dentro del módulo. Al terminar con los cuatro cuadrantes, se saltará al siguiente módulo.

o En la práctica, el espacio de direcciones de cada fila es en realidad continuo. Fijémonos en la manera de utilizar los índices x, y y z, y en concreto en la orden p1=x*32+y*8+z. La primera dirección del primer módulo será la dirección cero (x=0, y=0, z=0), siendo la última la dirección 31 (x=0, y=3, z=7). Para referirnos al segundo módulo, tendremos x=1, por lo que partiremos de la dirección número 32 (x=1, y=0, z=0), llegando hasta la dirección 63 (x=1, y=3, z=7). Así nos referiremos sucesivamente a cada uno de los cinco módulos de cada fila, por lo que podemos hablar de un espacio total de 160 direcciones (32x5) a direccionar.

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

Page 25: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

Inicio

Fin

- Declaración e inicialización devariables locales:

x=0;y=0;z=0;a=0;c=0;

switch(farbe)

a=0;c=7;

- Actúa sobre la pantallasegún color y posición

que corresponda

a=0;c=3;

a=4;c=5;

a=6;c=7;

ALLES BLAUROT GRUEN

for(x=0;x<=6;x++);

for(y=0;y<=3;y++);

for(z=a;z<=c;z++);

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 69

El siguiente diagrama de flujo representa a la función descrita:

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

Page 26: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

Inicio

Fin

flag=1;

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 70

Rutina de interrupción del Timer X Este contador sólo se encargará de marcar el tiempo de duración de cada uno de los 256 subciclos en los que se divide cada período de refresco, de unos 40us cada uno. La rutina será muy sencilla, pues sólo activará una bandera cada vez que se alcance dicho tiempo: Rutina de interrupción de la INT_0 Esta interrupción se activará cada vez que se detecte un flanco de bajada a la entrada del pin p4_5, es decir, cuando los datos enviados por el decodificador DMX estén preparados para ser procesados. Su labor consiste, en general, en almacenar los datos recibidos y utilizarlos como corresponda. Veamos el procedimiento seguido por esta rutina:

- Los datos correspondientes a los seis canales se irán recibiendo siempre de manera secuencial y por orden, del primero al último. Con la llegada de cada dato se ejecutará la rutina de interrupción.

- El dato se procesará y se incrementará un contador para indicar a que canal corresponderá el siguiente dato en llegar. Con la llegada del sexto, se reiniciará dicho contador.

- Dicho contador funcionará como índice de una tabla que almacenará la información de los seis canales, y además actuará como condición de entrada en los distintos casos del bucle switch que constituye el grueso de la función.

- Dentro de cada caso se procederá a realizar la tarea correspondiente. La acción de los tres primeros canales, los que controlan la intensidad de los colores primarios, se verá anulada si están activados el canal cuatro (que seleccionará un color prefijado) o el seis (que activa los efectos de color e intensidad dinámicos).

- Los efectos generados por el sexto canal tendrán además prevalencia sobre los producidos por el cuarto.

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

Page 27: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

Inicio

- Captura de datos

switch(i)

r=data[0];i++;

1er canal

blinken=data[4];i++;

2º canal

3er canal

4º canal

5º canal

¿data[3]==0&data[5]==0?

¿data[3]==0&data[5]==0?

¿data[3]==0&data[5]==0?

¿data[3]!=0&data[5]==0?

g=data[1];i++;

b=data[2];i++;

getcolor(data[3]);i++;

random=data[5];i=0;

6º canal

i=3

i=1

i=4

i=0

i=2

default

Fin

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 71

- La acción realizada en cada caso depende, evidentemente, del factor

a controlar por cada uno de los canales: o Los tres primeros controlan la intensidad de rojo, verde y azul.

Éstos simplemente almacenarán el valor de intensidad recibido en las variables r, b y g, respectivamente, variables globales que marcan la intensidad de cada color en el programa principal.

o El dato recibido del cuarto canal se pasará como parámetro a la función getcolor(). Ésta seleccionará un color determinado según el valor recibido.

o El quinto y el sexto canal controlan la función de parpadeo de la pantalla y los efectos luminosos dinámicos, respectivamente. Los valores recibidos en ambos serán almacenados en sendas variables globales (blinken y random), que serán utilizados adecuadamente en la función principal.

A continuación presentamos una explicación gráfica de lo expuesto:

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

Page 28: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

Inicio

channel4<=6Sí r=0xff;

g=0xff;b=0xff;

Fin

channel4<=12r=0x60;g=0x60;b=0x60;

No

channel4<=18r=0x8b;g=0x00;b=0x00;

No

No...

channel4<=244r=0xff;

g=0x63;b=0x47;

No

channel4<=250r=0xcd;g=0x5c;b=0x5c;

No

No

r=0xa5;g=0x2a;b=0x2a;

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 72

Función getcolor(char channel4) La rutina encargada de seleccionar colores predefinidos según determine el cuarto canal es bastante extensa pero sencilla. Consiste en una serie bucles if-else anidados. El rango de posibles valores (entre 0 y 255) en el que puede encontrarse el valor recibido es dividido en intervalos. Según dicho valor se encuentre contenido en uno u otro, se seleccionará un color. Para fijar un color determinado, simplemente hay que asignar los valores adecuados (extraídos de una tabla de códigos RGB) a las variables r, b y g.

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y

mando a distancia infrarrojo

Page 29: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 73

Funciones encargadas del efecto de parpadeo: getblinken(char blinken) y rutina de interrupción del Timer Y De cara a aplicaciones profesionales de nuestro sistema en discotecas, la posibilidad de lograr reproducir un efecto de estrobo resulta muy atractivo. Para conseguir dicho efecto, deben producirse como mínimo 12 parpadeos por segundo. Nuestro sistema estará programado para parpadear a siete velocidades distintas, según el valor recibido a través del quinto canal. Como máximo, alcanzaremos 15 parpadeos por segundo, por lo que se satisface sobradamente la especificación que se presentaba. Para gestionar este efecto, se trabaja con dos funciones. La primera, getblinken(), será llamada desde la función principal cuando el quinto canal sea activado y se encargará de contabilizar el tiempo de espera adecuado hasta que llegue el momento de apagar la pantalla. Esta función trabaja de la siguiente manera:

- Primero, se comprobará si ha cambiado el valor recibido del quinto canal, lo que implicará reiniciar todo el proceso.

- A continuación se incrementará un contador, blinkcounter, que será el encargado de contabilizar el número de veces que se accede a esta función, o lo que es lo mismo, el tiempo transcurrido desde que se activó el quinto canal.

- A partir de ahí, y según el valor recibido a través del argumento blinken (una vez más seleccionaremos entre intervalos utilizando bucles if-else anidados), se esperará a que blinkcounter alcance el valor adecuado para activar la bandera blinkflag2.

- Una vez llegado este momento, se ejecutará el último bucle de la función, en el que se realizan varias acciones:

o Se desactiva la bandera y se reinicia el contador. o Se apaga la pantalla y se desactiva el Timer X mientras ésta

deba permanecer apagada, lo que evitará que se ejecute el código de la rutina principal encargada de encenderla (pues nunca se activará flag).

o Se activa el Timer Y, que será el utilicemos para, a través de su rutina de interrupción, contar el tiempo que la pantalla permanece apagada.

Esta rutina de interrupción presentará una estructura muy parecida a la función getblinken(). Usando el mismo contador blinkcounter y una serie de bucles if-else anidados cuya condición de entrada será de nuevo el valor de blinken, mantendrá la pantalla apagada un cierto tiempo, tras el cual se activará la bandera blinkflag1.

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y

mando a distancia infrarrojo

Page 30: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 74

La activación de esta bandera provocará que se ejecute la parte final del código, formado por un bucle if. En él, además de desactivar la bandera y reiniciar blinkcounter, se desactivará el Timer Y y se activará el Timer X, volviendo a la ejecución normal de la rutina principal. Veamos el diagrama de flujo de la función getblinken():

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

Page 31: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 75

El diagrama de flujo de la rutina de interrupción del Timer Y es prácticamente igual, exceptuando algunos detalles, por lo que no se considera necesario mostrarlo. Función getrandom(char random) Esta función será llamada desde la función principal después de cada ciclo de refresco, siempre que la variable random, que almacena el dato llegado a través del sexto canal, sea distinta de cero. Su labor consistirá en gestionar los distintos efectos luminosos dinámicos que se controlan a través de dicho canal. Los efectos programados son de tres tipos:

- Cambio gradual de la intensidad de un color, de máxima a mínima y viceversa, de manera continuada. Esta opción estará disponible para los tres colores primarios, así como para magenta (rojo y azul a intensidad máxima) y cian (verde y azul a intensidad máxima). Además, podremos elegir entre dos velocidades distintas a la hora de ir cambiando la intensidad.

- El segundo efecto implicará a varios colores, cambiando gradualmente de uno a otro. Por ejemplo, comenzaremos con cian, se irá degradando, y al llegar al mínimo comenzará a aumentar sólo la intensidad del verde, que al llegar al máximo decrecerá. Cuando de nuevo se alcance el mínimo, comenzará a aumentar la intensidad del azul para luego disminuir. Cuando ésta sea nula, de nuevo aumentarán simultáneamente las intensidades de azul y verde, para volver a tener cian y comenzar de nuevo todo el proceso. Las combinaciones de colores serán también varias en este caso, así como las velocidades a las que estos vayan cambiando.

- El último efecto que podremos generar consistirá en un cambio aleatorio del color de la pantalla cada cierto tiempo. Para ello, utilizaremos la función de librería rand(), que asignará valores aleatorios a r, g y b cuando convenga.

De nuevo el código del programa se divide en varios bucles if-else anidados, cuya condición de entrada será el valor de la variable recibida como argumento, random, que contendrá el dato recibido del sexto canal DMX. Una vez dentro de cada caso, siempre aparecerá en primer lugar un bucle if-else, cuya condición de entrada dependerá del valor de una bandera, flag2. La condición de entrada en este if será alternante de un caso al siguiente, es decir, si dentro del primer caso (random<15) tenemos que se entrará en el if si flag2==1, dentro del segundo (random>30), la condición de entrada será que flag2==0. El objetivo es que siempre que se pase de un caso a otro, las condiciones iniciales sean las correctas.

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

Page 32: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

¿primera vez que se ejecutael efecto (según flag2)?

¿intensidad máxima?

- cambia valor de flag2-establece valores iniciales para

los colores-reinicia counter2

Sí No

¿counter2==mínimo?

- incrementaintensidad

- Decrementa intensidad-decrementa contador

No

No

- re inicia counter2

Fin

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 76

Al entrar en un determinado caso, se fijan las condiciones iniciales y se cambia el valor de flag2. Sabemos que cuando se actúa sobre uno de los interruptores del controlador DMX que controlan un canal, el valor del mismo irá variando de manera gradual. Así, al entrar en un cierto intervalo de acción, se llegará a éste siempre desde el intervalo siguiente o desde el anterior. En ambos casos, la condición referente a flag2 es opuesta al actual, por lo que al llegar a éste se entrará en el bucle if, se fijarán las nuevas condiciones iniciales y se volverá a cambiar el valor de la bandera. Así, garantizaremos que no se darán efectos extraños en las transiciones entre los distintos casos. Para facilitar la comprensión de los pasos seguidos a la hora de programar el micro para generar los distintos efectos, procederemos a explicar por separado el procedimiento que se sigue en cada tipo. Comenzaremos con el primero de los efectos, en el que va cambiando gradualmente la intensidad de un color. Veamos por pasos como se genera:

- Lo primero será se comprobar si es la primera vez que se entra en este caso, a través de flag2. En caso afirmativo, se establecen los valores iniciales de cada color y se cambia el valor de la bandera. Si no es la primera vez, este paso será innecesario.

- Tras esto, comienza a decrecer la intensidad, paralelamente a un contador, que indicará el momento en que debe comenzar a incrementarse ésta. Llegado el momento (intensidad mínima, pero sin llegar a apagarse), comienza a incrementarse la intensidad. Este proceso se repetirá de manera continuada mientras el valor del sexto canal DMX no salga del intervalo correspondiente.

El diagrama de flujo resulta sencillo:

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

Page 33: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 77

El segundo tipo de efecto, que juega con varios colores y sus intensidades, resulta más complicado de gestionar. El código encargado de controlar estos procesos se dividirá en una serie de bucles if-else; utilizando ciertas banderas como condiciones de entrada, iremos seleccionando sobre qué color habrá que actuar en cada momento. Además, en este caso, en vez de sólo un contador (como era counter2), tendremos tres, que utilizaremos para cada uno de los colores primarios. Los tres deben ser inicializados al comenzar cada iteración. Por ello, además de flag2 para regular la transición de un caso a otro, utilizaremos la bandera flag6 como condición de entrada en el bucle if inicial, para provocar que se entre en éste al inicio de cada iteración. Veamos como ejemplo el diagrama de flujo de un caso en el que se juega con los tres colores primarios:

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y mando a distancia infrarrojo

Page 34: CAPÍTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX · 2020. 6. 12. · CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 50 4.2.2 Programación El centro neurálgico

CAPíTULO 4. PRIMERA FASE: DESARROLLO DE LA INTERFASE DMX 78

Sólo nos queda describir la tercera posibilidad que nos ofrece el sexto canal DMX. Si situamos el interruptor correspondiente en el último tramo de su recorrido, la pantalla irá cambiando de color periódicamente, de manera aleatoria. Este efecto será generado utilizando la función de librería rand(), presente en stdlib.h. Cada vez que es llamada, rand() devuelve un número aleatorio entre 0 y RAND_MAX (cuyo valor es 231-1). La manera de utilizar este recurso será igualando nuestras variables de color, r, g y b, a dicha función. Pero éstas, según el estándar DMX, deberán tener un valor entre 0 y 255, un rango bastante menor al ofrecido por rand(). Para acotar dicho rango, simplemente tendremos que igualar nuestras variables no a rand(), sino a rand()%256. La operación módulo (%) dará como resultado el resto de la división del valor devuelto por rand() y 256, que será, efectivamente, un número entre 0 y 255. Realmente el número generado por rand() es pseudoaleatorio, pues será el resultado de ciertos cálculos que parten de un número llamado semilla, el cual, si no se evita, tendrá siempre el mismo valor. Este hecho es para nosotros indiferente, pues simplemente buscamos una manera sencilla de que la pantalla cambie de color, y no importa que cada vez que se ejecute la rutina el orden de los colores que vayan apareciendo sea siempre el mismo. La rutina que se encarga de controlar esta tarea simplemente irá incrementando un contador y cambiará el valor de r, g y b, usando la orden mencionada arriba, cada vez que éste alcance un cierto valor.

Desarrollo e implementación de sistema de control para pantalla RGB con LEDs a través de protocolo DMX512 y

mando a distancia infrarrojo