TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: Cryn en 17 de Enero de 2008, 00:33:08

Título: Un inicio para LED's RGB
Publicado por: Cryn en 17 de Enero de 2008, 00:33:08
saludos amigos! por fin me ha quedado algo interesante mi proyecto sobre el manejo de un LED RGB, todo comenzo aca (http://www.todopic.com.ar/foros/index.php?topic=19609.0), talvez sea muy poco, pues en el youtube vi que hasta hacen con una matriz 3x3x3 o mas grandes, muy buenos, y este se queda chiquito, pero weno, es un inicio :mrgreen:

Ya lo traía hace tiempo, paso que tube algunos problemas y no podia acabarlo, y hace dos dias que lo acabe, y siento el viento chocar con mi cara :mrgreen:

aca el codigo, lo hice con un 16f648a, y un pequeño video :mrgreen:

me base en la teoria de Nocturno que es usar un timer, con el mismo Periódo para el PWM, queria hacerme codigo propio :mrgreen: ya saben que es mas valioso para uno mismo.

Aca lo dejo, por si a alguien le sirve, y pues estoy con los oídos abiertos (mejor con los ojos abiertos :D), para que ustedes le den una ojeada y talvez pueda corregirse algo (o mejorarse), ya que tiene algunos problemillas en los límites, y a veces se traba, tb ire en ello, y habra seguramente una Fe de Erratas :D

Código: [Seleccionar]
#include <16f648a.h>
#FUSES NOWDT,INTRC,NOPROTECT,BROWNOUT,PUT,NOLVP,MCLR,NOCPD
#use delay(internal=4000000)
#use fast_io(a)
#use fast_io(b)
#define Rojo PIN_B0
#define Verde PIN_B1
#define Azul PIN_B2
#define Retardo 15

int16 caida_rojo,caida_verde,caida_azul,count_pwm;
int16 caida_rojo_2,caida_verde_2,caida_azul_2;
int i;

#int_Timer0
void tmr0_handle()
{
   count_pwm++;
   if(count_pwm==caida_rojo)
      output_low(Rojo);
   if(count_pwm==caida_verde)
      output_low(Verde);
   if(count_pwm==caida_azul)
      output_low(Azul);
   if(count_pwm==255)
   {
      count_pwm=0;
      if(caida_rojo_2==0 || caida_rojo==0)
      output_low(Rojo);
      else
      output_high(Rojo);
      if(caida_verde_2==0 || caida_verde==0)
      output_low(Verde);
      else
      output_high(Verde);
      if(caida_azul_2==0 || caida_azul==0)
      output_low(Azul);
      else
      output_high(Azul);
   }
   set_timer0(231);
}

void demo()
{
   caida_rojo=0;
   caida_verde=0;
   caida_azul=0;
   for(i=0;i<=31;i++)   // solo rojo++
   {
      caida_rojo=8*i;
      delay_ms(Retardo);
   }
   caida_rojo=0;
   for(i=0;i<=31;i++)   // solo verde++
   {
      caida_verde=8*i;
      delay_ms(Retardo);
   }
   caida_verde=0;
   for(i=0;i<=31;i++)   // solo azul++
   {
      caida_azul=8*i;
      delay_ms(Retardo);
   }
   for(i=0;i<=31;i++)   // azul(full) con rojo++
   {
      caida_rojo=8*i;
      delay_ms(Retardo);
   }
   for(i=31;i>0;i--)    // rojo(full) con azul--
   {
      caida_azul=8*i;
      delay_ms(Retardo);
   }
   caida_azul=0;
   for(i=0;i<=31;i++)   // rojo(full) con verde++
   {
      caida_verde=8*i;
      delay_ms(Retardo);
   }
   for(i=0;i<=31;i++)    // rojo(full) con verde(full) con azul++
   {
      caida_azul=8*i;
      delay_ms(Retardo);
   }
   for(i=31;i>0;i--)    // azul(full) verde(full) rojo--
   {
      caida_rojo=8*i;
      delay_ms(Retardo);
   }
   caida_rojo=0;
   for(i=31;i>0;i--)    // verde(full) azul--
   {
      caida_azul=8*i;
      delay_ms(Retardo);
   }
   caida_azul=0;
   for(i=31;i>0;i--)    // verde--
   {
      caida_verde=8*i;
      delay_ms(Retardo);
   }
   caida_verde=0;
}

void main()
{
   setup_oscillator(OSC_4MHZ);
   set_tris_a(255);
   set_tris_b(0xf8);
   output_b(0);
   set_timer0(231);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
   while(true)
   {
      if(input(PIN_A0))
      {
         delay_ms(20);
         while(input(PIN_A0))
         {delay_ms(20);}
         caida_rojo_2++;
         caida_rojo=caida_rojo_2*16;
         if(caida_rojo>255)
            caida_rojo_2=0;
      }
      if(input(PIN_A1))
      {
         delay_ms(20);
         while(input(PIN_A1))
         {delay_ms(20);}
         caida_verde_2++;
         caida_verde=caida_verde_2*16;
         if(caida_verde>255)
            caida_verde_2=0;
      }
      if(input(PIN_A2))
      {
         delay_ms(20);
         while(input(PIN_A2))
         delay_ms(20);
         caida_azul_2++;
         caida_azul=caida_azul_2*16;
         if(caida_azul>255)
            caida_azul_2=0;
      }
      if(input(PIN_A3))
      {
         delay_ms(20);
         while(input(PIN_A3))
         {delay_ms(20);}
         demo();
      }
   }
}

Funciona con 4 pulsadores, uno para cada color (Rojo, Verde y Azul) y uno para el DEMO :mrgreen:

aca el esquemita:
(http://img85.imageshack.us/img85/1553/eskemaxf4.jpg)

y el video :-/:

y por si acaso, todo comprimido en un rar: http://www.4shared.com/file/35068382/e3282203/RGB.html (simulado con proteus 7.2 SP2)

beuno pues, ahi se los dejo, un saludo :-/ :-/
Título: Re: Un inicio para LED's RGB
Publicado por: Nocturno en 17 de Enero de 2008, 06:19:30
¡Como te diviertes, eh!  :D
Título: Re: Un inicio para LED's RGB
Publicado por: J1M en 17 de Enero de 2008, 06:51:12
Enhorabuena Cryn, esto de los colorines y los leds es fantástico! :)

Un par de ideas:
- En el post dedicado al código RGB que Manolo Nocturno puso en su web se expuso un problemilla que algunos tenían y otros no, era un pequeño tililar de la luz, o incluso algún flashazo. Un compañero lo solucionó cambiando esta expresión:
count_pwm==caida_rojo    por esta otra    count_pwm>=caida_rojo
A mí ciertamente me solucionó el problema que tenía... pq? aún no lo tengo claro, ya que supuestamente la interrupción no se 'escapa' nunca.... pero en la práctica parece que si que lo hace, por eso el flashazo......

- No tengo claro del todo que haces aquí dentro:
if(count_pwm==255)
Creo que podrías optimizar un poco el código si declaras variables int8 y te ahorras este último 'if' aprovechando que las variables son 'circulares', es decir, de 255 pasa a 0.

- Las resistencias de los led también tendrías que tenerlas en cuenta. Aquí hay una calculadora para leds online:
http://led.linear1.org/1led.wiz
Generalmente la resistencia de los colores Verde y Azul es la misma, mientras que la del Rojo varía, ya que la Vf es distínta.  En cualquier caso esto es solo si quieres que los colores tengan el mismo brillo y se consiga un blanco 'más puro'. Realmente la forma óptima de controlar los leds es por intensidad. Esta noche cuando llegue a casa pongo un par de links e ideas sobre Drivers que es con lo que me ando peleando últimamente para conectarselos a un Luxeon de 3w! :D


Un saludillo y enhorabuena por ponerlo a brillar, que doy fé que eso de generar PWM por software da dolores de cabeza!! :)
Título: Re: Un inicio para LED's RGB
Publicado por: Azicuetano en 17 de Enero de 2008, 06:57:13
Ohhh que bien que se ve eso!

Pon un folio en forma de cilindro (para que la luz se quede un poco difusa) y póntelo por las noches para dormir, ya verás, es toda una experiencia.  :mrgreen:


Un saludo desde Alicante.
Título: Re: Un inicio para LED's RGB
Publicado por: stk500 en 17 de Enero de 2008, 07:23:50
estupendo Cris! :-/ :-/ :-/
pero yo pienso como dice Jim, asi evitaria detello al Dimmar, yo lo quiero hacer con un LM324 y controlar 3 LED RGB, estoy esperando que me lleguen :mrgreen:
por aqui habras sorpresas :lol:
Título: Re: Un inicio para LED's RGB
Publicado por: LABmouse en 17 de Enero de 2008, 12:09:44
FELICITACIONES!!! ta muy bueno el proyecto!

Eso de empezar con 1 led para luego enfrentar la matriz, es el derecho de las cosas.  Nuevamente felicidades.
Título: Re: Un inicio para LED's RGB
Publicado por: Cryn en 17 de Enero de 2008, 14:08:08
muchas gracias a todos por sus respuestas :mrgreen:

J1M, vere esos detalles que me has planteado y los corregire, gracias

Azicuetano, estaba intentando buscar algo mas solido que un folio, peor todavia no lo he encontrado por ahora :(, seguire buscando, pero para probar si puede ir mejor el el video con el folio, ya me fabrico unito :mrgreen:

stk500, esperare tus sorpresa, porque suenan muy interesantes

gracias de verdad muchachos :mrgreen: es muy incentivador leer vuestros mensajes :-/
Título: Re: Un inicio para LED's RGB
Publicado por: Cryn en 17 de Enero de 2008, 20:26:11
no creo que los encuentre por el mercado de mi pais, pero si puedo conseguirlos los utilizare, talvez sean mas necesarios cuando trabajes con mas RGB's

gracias un saludo
Título: Re: Un inicio para LED's RGB
Publicado por: jeremylf en 17 de Enero de 2008, 23:42:56
Y yo q pense q solo habian bicolores  :lol:

Muy bueno! algun dia podre iniciarme con esto y sin duda alguna tendre como base este gran inicio q le has dado.  :mrgreen:


salu2 8)
Título: Re: Un inicio para LED's RGB
Publicado por: Cryn en 18 de Enero de 2008, 17:09:13
gracias por las palabras :mrgreen:; ya hace bastante tiempo que existen, de una fecha exacta nose, pero si recuerdo haber leido algo sobre ellos hace algun par de años (y talvez hayan sido mas caros tb)

espero te sirva cuando te inicies en ello, pues estos leds son muy llamativos y vistosos :-/
tienen muchas aplicaciones :mrgreen:
Título: Re: Un inicio para LED's RGB
Publicado por: micronet3 en 28 de Junio de 2009, 02:09:01
tambien se puede hacer leds rgb, a partir de leds de los tres colores basicos,  el Rojo, el Verde y el Azul. juntalos y veras como se combinan