Autor Tema: Dimmer 2ch con mando RF  (Leído 4010 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1836
    • IDEAA
Dimmer 2ch con mando RF
« en: 13 de Julio de 2010, 12:02:29 »
Buenas!
Queria compartir con todos un dimmer que hice a partir de toda la informacion que hay en el foro.
Es un dimmer de dos canales, aunque de momento solo me funciona uno  :oops:
Controlado por mando a distancia RF. Lo utilizo para iluminar mis espectaculos mas pequeños en los que no me hace falta mas que luz blanca y luz de publico.
De momento, como no pude hacer funcionar los dos canales, un canal solo se enciende y se apaga, y el otro se puede dimmear.
En el canal "dimeable" hay dos botones, el de subir y el de bajar intensidad. Cuando se presiona uno, la intensidad empieza a subir/bajar progresivamente hasta que se vuelva a presionar el boton, y entonces la intensidad queda fija en esa posicion. Si no se presiona el boton la intensidad llegara al maximo/minimo.

El cruce por cero se hace con un optoacoplador PS2505-1 que es igual a un opto normal, pero en vez de tener solo un led emisor, tiene 2 en antiparalelo, por lo que al estar conectado a la corriente alterna en un semiciclo se enciende un emisor, y en siguiente se enciende el otro, pero justo en el cruce por cero ambos estan apagados. Esto es lo que detecta el fototransistor receptor.

El dispositivo es apto para 110v/220v y 50/60hz ya que el mismo programa se encarga de contar la duracion de los semiciclos, y la conversion de alterna a continua lo hago con un "modulo" que quite de un cargador de moviles, que como sabeis son universales y aceptan todo el rango de voltajes alternos disponibles. Por ultimo, para no quemar los leds del optoacoplador utilizo una resistencia en serie con la alterna, pero dependiendo si son 110v o 220v utilizo una resitencia diferente que se selecciona con un jumper.

Para conmutar la alterna utilizo un triac BTA12 con un pequeño disipador para soportar un maximo de 4A por canal. Y para disparar el triac utilizo un optotriac MOC3021 que se conecta al pic.

El diseño del esqumatico y como conectar el pic, optotriac y triac junto con la red snubber estan copiadas de otros diseños del foro.

Todas las pistas por donde circula alterna son de 40mils (1.016mm) y revestidas con una capa gordita de estaño para que soporten mejor la intensidad.

El receptor RF es un modulo de 4 canales. De sus 7 pines 2 son de alimentacion, uno es un avisador de recepcion de señal y los 4 restantes son los 4 canales que se ponen a 5v cuando se presiona el pulsador correspondiente del emisor.

El pic es un 16f648 y el codigo es el siguiente:
Código: C
  1. #include <16F648A.h>
  2.  
  3. #FUSES XT,INTRC_IO,NOWDT,PUT,NOMCLR,NOBROWNOUT,NOLVP,NOCPD,NOPROTECT
  4.  
  5. #use delay(clock=4000000)
  6. #use fast_io(a)
  7. #use fast_io(b)
  8.  
  9. //GPIO
  10. #byte PORTA    =  0x05
  11. #byte PORTB             = 0x06
  12.  
  13. #bit LAMP1      = PORTA.0
  14. #bit LAMP2      = PORTA.1
  15. #bit LED2       = PORTA.2
  16. #bit LED1       = PORTA.3
  17.  
  18. #bit CRUCE      = PORTB.0
  19. #bit DWN2       = PORTB.1
  20. #bit UP2        = PORTB.2
  21. #bit DWN1       = PORTB.3
  22. #bit UP1        = PORTB.4
  23.  
  24. //Constantes
  25. #define LIMINF  2                       //limite inferior de intensidad (de cero a cien)
  26. #define LIMSUP  96                      //limite superior de intensidad (de cero a cien)
  27. #define ONOFF   5000            //tiempo que tarda en encenderse/apagarse completamenta la luz en mS
  28.  
  29. #define DELAY   (ONOFF/LIMSUP)  //tiempo de cada paso de dimmer
  30. #define IGUAL           0
  31. #define LAMPARA1        1
  32. #define LAMPARA2        2
  33.  
  34. //Variables
  35. short flagIntExt = FALSE;       //flag de interrupcion externa
  36. int Primero = 0;                        //establece que lampara tiene la intensidad mas baja
  37. int Intensidad1 = LIMINF;       //intensidad actual de la lampara1
  38. int Intensidad2 = LIMINF;       //intensidad actual de la lampara2
  39. long IntensidadCCP1 = 0;        //cuando tiene que saltar la interrupcion CCP
  40. long IntensidadCCP2 = 0;        //cuando tiene que saltar la interrupcion CCP
  41. long Semiciclo = 0;                     //duracion del semiciclo
  42.  
  43. //Rutinas
  44. void CalcularIntensidad(void);
  45.  
  46. #int_EXT
  47. void INT_EXT_isr(void){
  48.         LAMP1 = FALSE;
  49.         //LAMP2 = FALSE;
  50.         Semiciclo = get_timer1();       //establece la duracion del semciclo
  51.        
  52.         CalcularIntensidad();
  53.         set_timer1(0);                  //restablece timer
  54. }
  55.  
  56. #int_CCP1
  57. void CCP1_isr(void){
  58.        
  59.         //if(Primero == LAMPARA1){
  60.                 LAMP1 = TRUE;   //enciendo lampara 1
  61.                 //LED1 = TRUE;
  62.                 /*CCP_1 = IntensidadCCP2;       //establezco proximo CCP
  63.         }
  64.         else if(Primero == LAMPARA2){
  65.                 LAMP2 = TRUE;   //enciendo lampara 2
  66.                 LED2 = TRUE;
  67.                 CCP_1 = IntensidadCCP1; //establezco proximo CCP
  68.         }
  69.         else{
  70.                 LAMP1 = TRUE;
  71.                 LAMP2 = TRUE;
  72.                 LED1 = TRUE;
  73.                 LED2 = TRUE;
  74.         }*/
  75. }
  76.  
  77. void main() {
  78. short Luz2 = FALSE;
  79.  
  80.         setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  81.         setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
  82.         setup_timer_2(T2_DISABLED,0,1);
  83.         setup_ccp1(CCP_COMPARE_INT);
  84.         setup_comparator(NC_NC_NC_NC);
  85.         setup_vref(FALSE);
  86.  
  87.         enable_interrupts(INT_TIMER1);
  88.         enable_interrupts(INT_EXT);
  89.         enable_interrupts(INT_CCP1);
  90.         enable_interrupts(GLOBAL);
  91.  
  92.         setup_oscillator(OSC_4MHZ);
  93.         set_tris_a(0b00000000);
  94.         set_tris_b(0b00011111);
  95.         ext_int_edge(0,L_TO_H); //configura INT para que solo se active a la subida
  96.         CalcularIntensidad();
  97.        
  98.         LAMP1 = FALSE;
  99.         LAMP2 = FALSE;
  100.         LED1 = FALSE;
  101.         LED2 = FALSE;
  102.        
  103.         do{
  104.                 if((UP1 == TRUE) && (UP2 == FALSE) && (DWN1 == FALSE) && (DWN2 == FALSE)){
  105.                         while(UP1 == TRUE){delay_ms(50);}       //espera que se suelte
  106.                         //subir luz 1
  107.                         while((Intensidad1 < LIMSUP) && (UP1 == FALSE)){
  108.                                 Intensidad1++;  //aumenta intensidad
  109.                                 delay_ms(DELAY);
  110.                         }
  111.                        
  112.                         while(UP1 == TRUE){delay_ms(50);}       //espera que se suelte
  113.                 }
  114.                 /*
  115.                 if((UP2 == TRUE)){// && (UP1 == FALSE) && (DWN1 == FALSE) && (DWN2 == FALSE)){
  116.                         //subir luz 2
  117.                         while((Intensidad2 < LIMSUP) && (DWN2 == FALSE)){
  118.                                 Intensidad2++;  //aumenta intensidad
  119.                                 delay_ms(DELAY);
  120.                         }
  121.                        
  122.                         while(DWN2 == TRUE){delay_ms(50);}      //espera que se suelte
  123.                 }
  124.                 */
  125.                 if((DWN1 == TRUE) && (UP1 == FALSE) && (UP2 == FALSE) && (DWN2 == FALSE)){
  126.                         while(DWN1 == TRUE){delay_ms(50);}      //espera que se suelte
  127.                        
  128.                         //bajar luz 1
  129.                         while((Intensidad1 > LIMINF) && (DWN1 == FALSE)){
  130.                                 Intensidad1--;  //disminuye intensidad
  131.                                 delay_ms(DELAY);
  132.                         }
  133.                        
  134.                         while(DWN1 == TRUE){delay_ms(50);}      //espera que se suelte
  135.                 }
  136.                 /*
  137.                 if((DWN2 == TRUE)){// && (UP1 == FALSE) && (UP2 == FALSE) && (DWN1 == FALSE)){
  138.                         //bajar luz 2
  139.                         while((Intensidad2 > LIMINF) && (UP2 == FALSE)){
  140.                                 Intensidad2--;  //aumenta intensidad
  141.                                 delay_ms(DELAY);
  142.                         }
  143.                        
  144.                         while(UP2 == TRUE){delay_ms(50);}       //espera que se suelte
  145.                 }
  146.                 */
  147.  
  148.                 if(UP2 == TRUE)
  149.                         Luz2 = TRUE;
  150.  
  151.                 if(DWN2 == TRUE)
  152.                         Luz2 = FALSE;
  153.                        
  154.                 LAMP2 = Luz2;
  155.                 LED2 = Luz2;
  156.                
  157.         }while(TRUE);
  158. }
  159. void CalcularIntensidad(void){
  160. long Step = 0;
  161.  
  162.         if(Intensidad1 > LIMINF)
  163.                 LED1 = TRUE;
  164.         else
  165.                 LED1 = FALSE;
  166.  
  167.         Step = Semiciclo / LIMSUP;
  168.         IntensidadCCP1 = Semiciclo - (Step * Intensidad1);
  169.         //IntensidadCCP2 = Semiciclo - (Step * Intensidad2);
  170.        
  171.         //if(Intensidad1 < Intensidad2){
  172.                 //Primero = LAMPARA1;
  173.                 CCP_1 = IntensidadCCP1;
  174.         /*}
  175.         else if(Intensidad1 > Intensidad2){
  176.                 Primero = LAMPARA2;
  177.                 CCP_1 = IntensidadCCP2;
  178.         }
  179.         else{
  180.                 Primero = IGUAL;
  181.                 CCP_1 = IntensidadCCP1;
  182.         }*/
  183. }

Como digo, solo se puede dimear el canal 1, el codigo lo hice para que funcionaron los dos canales, pero en la practica no va... por eso estan partes comentadas. Ademas el limite inferior y superior no son CERO y CIEN, porque parpadea. Creo que los problemas que tengo son por la velocidad a la que va el micro. Quizas deberia ponerlo a correr mas rapido. Probare con un 16F88 que tiene oscilador interno de 8Mhz a ver que tal.

Cualquier sugerencia es bienvenida ya que tengo varios proyectos en los que necesitare un dimmer y pretendo que funcionen bien  :mrgreen:
El esquema del circuito se puede descargar.

Salu2!
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: Dimmer 2ch con mando RF
« Respuesta #1 en: 22 de Julio de 2010, 20:54:44 »
Hola Marttyn, muy bueno!, gracias por compartir...  una consulta, que modulo estas empleando en RF pata TX y RX?

Gracias

Norberto
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1836
    • IDEAA
Re: Dimmer 2ch con mando RF
« Respuesta #2 en: 25 de Julio de 2010, 07:22:05 »
Hola jefe!
Los modulos rf los compro a esta pagina: http://rfremotech.com/
Yo los compro en cantidad, para comprar sueltos mejor por ebay: http://wap.ebay.es/Pages/SellerAboutPage.aspx?uid=rfremotech&aid=290368703543&emvcc=0
Si buscas algo en concreto y necesitas ayuda avisa.
Salu2!
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado jhoser

  • PIC10
  • *
  • Mensajes: 14
Re: Dimmer 2ch con mando RF
« Respuesta #3 en: 21 de Octubre de 2010, 21:33:50 »
saludos señores del foro,

Espero estar en el tema correcto, deseo costruir un dimmer, y primera duda es....en la deteccion de cruce por cero, ¿que método me recomiendan? directo al pic o mediante un comparador...necesito un funcionamiento robusto que n reaccione a perturbaciones de la linea..aaahh y cabe recalcar que la lampara a controlar va conectada a un transformador de salida 14Vac, osea mi dimmer trabaja con esa tensión. Espero sus sugerencias, gracias de antemano :)

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Dimmer 2ch con mando RF
« Respuesta #4 en: 21 de Octubre de 2010, 21:59:45 »
si ya usas un transformador reductor, ahi esta una solucion robusta, usa esos 14Vac para detectar el cruce por cero
mira este detector, aunque no se si los 14vac corresponden con ese esquematico, la otra seria poner una resistencia de alto valor a la salida de los 14Vac y mandarla al pin donde vayas a hacer la deteccion
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA


 

anything