Computing">
Proyecto Iluminacion RGBW para Mural Itsta
Proyecto Iluminacion RGBW para Mural Itsta
Proyecto Iluminacion RGBW para Mural Itsta
La solución encontrada fue utilizar leds ultra brillantes de potencia, armando tres
reflectores que contenían 4 leds ultra brillantes cada uno con los colores RGBW,
es decir ROJO, VERDE, AZUL Y BLANCO (correspondientes a sus siglas en
ingles).
El desafío y lo que compete a este tutorial fue armar un controlador digital capaz
de crear combinaciones y efectos de iluminación, que fuesen reflejados sobre un
mural (el mural ITSTA) creando una visualización agradable y por qué no artística.
1.- ATtiny2313
2.- ATmega48.
También:
1 botón pulsador.
También podemos ver que las entradas de los dos ATMEGA48 están distribuidas
de distinta forma. Esto es por cuestiones de diseño, en la explicación del código
del programa se entenderá el reacomodo.
El wizard nos generará muchas líneas, por lo que el programa se verá muy
extenso. Una técnica que aplico es hacer valida una regla de los registros o
variables; que es “todo registro o variable se inicializa con un valor de cero”, y
como al generar el programa, muchos registros propios de la librería del
componente son plasmados, dentro del código, y además valen “0”, lo que hago
es quitar esas líneas y también la de los comentarios y así el código queda más
reducido.
Una vez que quite lo registros que valían cero y los comentarios que ocupan
espacio; agregué nuevos comentarios; estos permiten saber una idea más clara
de acuerdo con la programación en C, de cada línea de código.
/*****************************************************
ESTE EL CHIP Nº 1 DE TRES QUE ESTÁN ANIDADOS___ ESTE ES EL
PRINCIPAL
YA QUE LOS OTROS DOS DEPENDERAN DE ESTE, ESTE COMUNICARÁ A
LOS 2 SIGUIENTES
A TRAVES DE UN BCD. Y GUARDARÁ EN EEPROM LA SELECCION
REALIZADA POR EL USUARIO
Project : ILUMINACION RGBW PARA MURAL ITSTA
Version :
Date : 22/01/2011
Author : DANIEL FROYLAN MONTERO GOMEZ
Company : INSTITUTO TECNOLOGICO SUPERIOR DE TANTOYUCA
Comments:
Chip type : ATtiny2313
Clock frequency : 1,000000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 32
*****************************************************/
bit botonp; // variable tipo bit solo almacenan dos valores "0" y "1".
bit botona; // variable tipo bit solo almacenan dos valores "0" y "1".
// NOTA: estas variables cumplen una función específica
// Explicada en otro tutorial.
unsigned char var,selec; // estas variables son del tipo carácter sin signo
// Pueden almacenar hasta 256 valores.
// Estas son variables FLASH
eeprom unsigned char datoaguardar; // esta variable nos sirve
// Para guardar información no volátil,
// Es decir que sigue manteniendo su valor
// Aun después de ser apagado el sistema.
#define boton PINA.1 // se define al pin 1 del puerto A con el apodo
// boton
void main(void)
{
#pragma optsize-
CLKPR=0x80;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
PORTA=0x01; //registros del microcontrolador que fueron afectados
// evaluada en el menú.
break;
case 3: // se evalúa a selec con "3".
var=0;
datoaguardar=var; //se grabara la eeprom con el valor de var
delay_ms(40); //Se coloca retardo de 40mS para eliminar rebotes
}
if ((botonp==0)&&(botona==1)) //hubo cambio de flanco de 0 a 1
delay_ms(40); //Se coloca retardo de 40mS para eliminar rebotes
botonp=botona;
} // fin de la funcion checa_boton, regresará a la línea de código
// siguiente en donde fue llamada la función.
Las salidas que son PWM, son correspondientes a los pines de salida
relacionados a los “timer0, timer1 y timer2” que son correspondientes a los
registros OCR0A, OCR0B, OCR1AL, OCR1BL, OCR2A y OCR2B. En la primera
imagen se aprecia la distribución de los registros con relación a los pines de
salida. Utilizamos los mismos pasos para llegar al asistente (el wizard).
• Los timers. La configuración de los timers (nos servirá para mostrar la señal
en los pines de salida), es la misma para los dos micros.
Aparecerán unos cuadros que dicen “desea configurar al pin tal como salida”
/*****************************************************
ESTE EL CHIP Nº 2 DE TRES QUE ESTAN ANIDADOS___ LAS SALIDAS CON
PWM SON DEPENDIENTES DE LAS ENTRADAS; SON DECODIFICADOS A UN
BCD. ATRAVEZ DE UNA INTERRUPCION GLOBAL EXTERNA.
Project : ILUMINACION RGBW PARA MURAL ITSTA
Date : 22/01/2011
Author : DANIEL FROYLAN MONTERO GOMEZ
Company : INSTITUTO TECNOLÓGICO SUPERIOR DE TANTOYUCA
Comments:
#include <mega48.h>
#include <delay.h>
bit ret1,uno,dos;//-- bandera de retorno para la función 1 es del tipo bit.
unsigned char selec;
//1 2 3 4 5 6 7 8 9 A B C ---- LAMPARAS RGB
unsigned char r1, v1, a1, b1, r2, v2 ,i,i2,i3,a2, b2, r3, v3, a3, b3;//---- SIMULAN EL
//COLOR DE LAS LAMPARAS Y SIRVEN DE VARIABLES CONTROLADORAS
//DE SALIDAS RGBW
unsigned char lamparas[12]; // se declara un arreglo de 12 casillas del tipo
//unsigned char, se utilizará para posicionar
//en cada una de las casillas las variables
//arriba declaradas, que son las que se modificarán
//en el programa para hacer varios efectos
//cambiantes.
void rojo_f (void); //estas funciones son las correspondientes a una función
void verde_f (void); //de salida. Lo que hacen estas funciones es un corrimiento
void azul_f (void); // infinito al estar posicionada la variable selec en 4.
void amarillo_f (void); // la explicación de estos eventos corresponden a
// una imagen, explicada fuera del programa.
OCR0A=0+lamparas[0] ;
}
interrupt [TIM0_COMPB] void timer0_compb_isr(void)
{
OCR0B=0+lamparas[1] ;
}
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
OCR1AL=0+lamparas[2];
}
interrupt [TIM1_COMPB] void timer1_compb_isr(void)
{
OCR1BL=0+lamparas[3];
}
interrupt [TIM2_COMPA] void timer2_compa_isr(void)
{
OCR2A=0+lamparas[4];
}
interrupt [TIM2_COMPB] void timer2_compb_isr(void)
{
OCR2B=0+lamparas[5];
}
/*****************************************************
El código de arriba, tiene que ver con las interrupciones configuradas en un
Principio con el wizard, esto es para alterar el valor correspondiente a cada
registro de control: para el timer0, timer1 y timer2. Como podemos observar
cada vez que tenga que ser comparado, el registro del timer correspondiente
con el registro de comparación este cambiara a su salida (el pin correspondiente)
un voltaje PWM, que se mantendrá hasta que la variable correspondiente a las
casillas del arreglo, cambie de valor en el programa, estos valores cambian
según, la función que las altere.
*****************************************************/
void main(void)
{
// Declare your local variables here
PCICR=0x04;
PCMSK2=0x07;
PCIFR=0x04;
TIMSK0=0x06;
TIMSK1=0x06;
TIMSK2=0x06;
ACSR=0x80;
while (1)
{
// estamos dentro del ciclo infinito
// cada vez que el seguimiento del código pase
//por aquí, se actualizará el valor de cada una de
//las casillas del arreglo. Este valor lo tomaran las
//interrupciones de comparación de los timers,
// para crear la visualización de los colores de salida.
lamparas[0]=r1;
lamparas[1]=v1;
lamparas[2]=a1;
lamparas[3]=b1;
lamparas[4]=r2;
lamparas[5]=v2;
lamparas[6]=a2;
lamparas[7]=b2;
lamparas[8]=r3;
lamparas[9]=v3;
lamparas[10]=a3;
lamparas[11]=b3;
case 0: // se evalúa a "selec" con cero, nos dice que las salidas
break;
r3=i;
v3=i;
a3=i;
b3=i;
funcion_incdec();
break;
case 2:
b1=0x1F;//blanco variables
r2=i; //i,i2 e i3
v2=i2; // pero esta vez la función que las
a2=i3; // afecta es diferente.
b2=0x1F;//blanco
r3=i;
v3=i2; // también deja al color blanco con
a3=i3; // un valor constante en todas los reflectores
b1=0x1F;//blanco
funcion_navidad();
break;
case 4:
rojo_f(); // dentro de este cuerpo
verde_f(); // se puede hacer visible en la salida
azul_f(); // un corrimiento
amarillo_f(); // el como lo hace se explica fuera del programa.
break;
case 5:
r1=0;
v1=0;
a1=0;
b1=0xFF; // cuando el código del programa
r2=0; // cae aquí lo que hace es
v2=0; // que solo activa las lámparas blancas
a2=0; // y las mantiene fijas como cualquier reflector
b2=0xFF; // mientras que las demás las mantiene apagadas.
r3=0;
v3=0;
a3=0;
b3=0xFF;
break;
}
};
}
void funcion_incdec(void){
// aproximadamente tarda 10s en encenderse moduladamente y de regreso
if (i<=0xFE && ret1==0){
i++;
delay_ms(50);
}
if (i==0xFF){
ret1=1;
}
if (i>0 && ret1==1){
i--;
delay_ms(50);
if (i==0)
ret1=0;
}
}
i=0;
i3=0;
i2++;
delay_ms(10);
}
if (i2>0xFE && uno==0 ){
i3=0;
i++;
delay_ms(10);
}
if (i==0xFE){
dos=1;
}
if(i2>0xFE && dos==1) {
uno=1;
i3++;
delay_ms(10);
}
if (i3>0xFE)
i3=0xFE;
}
i3++;
delay_ms(1);
i2++;
delay_ms(3);
void rojo_f(void){
lamparas[7]=0x00;
lamparas[0]=0xFF;
delay_ms(1000);
lamparas[0]=0x00;
lamparas[5]=0xFF;
delay_ms(1000);
lamparas[5]=0x00;
lamparas[10]=0xFF;
delay_ms(1000);
lamparas[10]=0x00;
lamparas[7]=0xFF;
delay_ms(1000);
void verde_f(void){
lamparas[7]=0x00;
lamparas[1]=0xFF;
delay_ms(1000);
lamparas[1]=0x00;
lamparas[6]=0xFF;
delay_ms(1000);
lamparas[6]=0x00;
lamparas[11]=0xFF;
delay_ms(1000);
lamparas[11]=0x00;
lamparas[4]=0xFF;
delay_ms(1000);
void azul_f(void){
lamparas[4]=0x00;
lamparas[2]=0xFF;
delay_ms(1000);
lamparas[2]=0x00;
lamparas[5]=0xFF;
delay_ms(1000);
lamparas[5]=0x00;
lamparas[8]=0xFF;
delay_ms(1000);
lamparas[8]=0x00;
lamparas[7]=0xFF;
delay_ms(1000);
}
void amarillo_f(void){
lamparas[7]=0x00;
lamparas[3]=0xFF;
delay_ms(1000);
lamparas[3]=0x00;
lamparas[6]=0xFF;
delay_ms(1000);
lamparas[6]=0x00 ;
lamparas[9]=0xFF;
delay_ms(1000);
lamparas[9]=0x00;
lamparas[7]=0xFF;
delay_ms(1000);
}
Nota: esta función esta estratégicamente diseñada para que recorra reflector a
reflector encendiendo un led de distinto color siempre.
Una vez reducido el código, nos damos cuenta de que el código en la parte de la
interrupción global externa cambia ligeramente, esto es por lógica porque
ocupamos otro bloque de interrupciones; aun así pegaremos el código referente al
segundo microcontrolador. Y cambiaremos el nombre de los pines, en este caso
pues porque los pines no son el PD0, PD1 Y el PD2 sino el PC2, PC3 y PC4.
Por otra parte lo correspondiente a las salidas, esto es en donde están las
interrupciones de los timer, no ocuparemos las casillas del 0 al 5, sino del 6 al 11.
proceso, y como tanto las variables como las funciones fueron declaradas y
también nombradas al compilar cada programa no nos genera errores ni de lógica
ni de sintaxis, y solo tuvimos que cambiar la interpretación a la salida.
Referencias: