Hoy en dia podemos encontrar una infinidad de anuncios luminosos con efectos multicolor la finalidad de esta practica es crear diferentes gamas de colores utilizando un hardware muy sencillo para manejar la corriente que implica utilizar multiples leds al mismo tiempo.
Objetivo:Generar una secuencia con diferentes gamas de
colores usando una barra de leds RGB y pulsos PWM.
Material:
El ULN2803 es muy práctico para dar corriente de hasta 500 mA por cada salida, en su interior tiene un arreglo de transistores Darlington, es ideal para relevadores, motores, solenoides y displays. Se puede activar con voltaje TTL (5 Volts).
#include <16F88.h>
#FUSES NOWDT, INTRC, PUT, NOPROTECT, BROWNOUT, NOMCLR, NOLVP, NOCPD
#use delay(clock=4000000)
#use fast_io(B)
int8 redLed; //Ciclo de trabajo para el led rojo (0-255)
int8 greenLed; //Ciclo de trabajo para el led verde (0-255)
int8 blueLed; //Ciclo de trabajo para el led azul (0-255)
int8 counter; //contador para comparar el ciclo de trabajo con el periodo del pwm
#int_TIMER2 //Interrupcion cada 50us para simular el pwm
void TIMER2_isr(void)
{ counter+=4;
if(redLed>counter) //Se suman 4 para reducir la resolucion del pwm y evitar parpadeos en los
{ output_high(PIN_B0); } //leds ya que la frecuencia actual del microcontrolador no es suficiente
else //para un pwm con resolucion de 255
{ output_low(PIN_B0); }
if(greenLed>counter)
{ output_high(PIN_B1); }
else
{ output_low(PIN_B1); }
if(blueLed>counter)
{ output_high(PIN_B2); }
else
{ output_low(PIN_B2); }
}
void main()
{ int8 i; //Variable para el ciclo for
//Configuramos los timers
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,49,1); //Configuracion para interrupcion cada 50us
setup_comparator(NC_NC_NC_NC); //Deshabilitamos las entradas analógicas
setup_vref(FALSE);
SET_TRIS_B( 0b11110000 ); //Configuramos el puerto B
enable_interrupts(INT_TIMER2); //Habilitamos las interrupciones del timer 2
enable_interrupts(GLOBAL);
counter=0;
redLed=0;
greenLed=0;
blueLed=0;
while(true)
{ for(i=0; i<254; i++) //Variamos de verde a rojo
{ redLed=i;
greenLed=254-i;
delay_ms(3);
}
for(i=0; i<254; i++) //Variamos de rojo a azul
{ blueLed=i;
redLed=254-i;
delay_ms(3);
}
for(i=0; i<254; i++) //Variamos azul a verde
{ greenLed=i;
blueLed=254-i;
delay_ms(3);
}
}
}
El código controla el ancho de cada pulso con un entero de 8 bits (0-255), por medio de ciclos va variando la intensidad de cada color, cada salida del Pic va directo al ULN2803 para darle tierra a cada color.