Autor Tema: Control remoto infrarrojo para TV philips protocolo RC5  (Leído 8469 veces)

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

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Control remoto infrarrojo para TV philips protocolo RC5
« en: 13 de Marzo de 2012, 20:31:34 »
Hola amigos!

Les comparto este proyectito totalmente funcional con el pic12F1822 ( Una maravilla de uC).
Lo he probado en 3 televisores philips y anda al 100%.

-->Adjunto código fuente,diagrama electrónico,pcb y simulación en proteus vsm en archivo *ZIP<--

**
**Programa realizado con PIC C de CCS version 4.128,versiones anteriores tenían error con función delay,manejo de registros y otras **cosas sospechosas.
**

-pic12F1822
-5 botones ( ON/OFF , Vol+ , Vol- , Ch+ , Ch - )
-protocolo RC5 de philips
-Uso del toggle bit.

El micro se queda en reposo mientras no se presione tecla alguna,si se presiona alguna tecla envía el código correspondiente.
Si se mantiene presionada la misma tecla sigue enviando el código tras X tiempo como marca el protocolo.
Al soltar la tecla modifica el toggle bit para ser reconocido nuevamente por el receptor como nueva tecla.
Regresa a modo reposo(sleep).

Se hace uso de componentes mínimos , se activan Resistencias de pull-up internas.
Puede omitirse el transistor pero la distancia de transmisión disminuye.

*El programa todavía no esta del todo optimizado para bajo consumo,ya que uso el oscilador a 32MHZ xD.Solo habría que bajarlo y modificar la configuración de puertos,etc...

Programa
Código: C
  1. // IR Remote Control for Philips TV using RC5 protocol
  2. //--------------------------------------------------------------------
  3. //AKENAFAB
  4. //http://www.todopic.com.ar/foros/
  5. //--------------------------------------------------------------------
  6. //      14bits wide ->|START|START|TOGGLE|5BIT ADDRESS|6BIT COMMAND|<-
  7. //      38KHz Carrier Frequency
  8. //--------------------------------------------------------------------
  9. #include <12F1822.h>
  10. //--------------------------------------------------------------------
  11. #FUSES   INTRC_IO,NOCLKOUT,NOWDT,PUT,NOMCLR,BROWNOUT,BORV25,PROTECT,CPD,NOIESO,NOFCMEN,NOLVP
  12. #use     delay(clock=32M)
  13. #use     fast_io(A)
  14. #zero_ram
  15. //--------------------------------------------------------------------
  16. #byte IOCAP             =   0x391               //ON rising-edge        interrupt
  17. #byte IOCAN             =   0x392               //ON falling-edge       interrupt
  18. #byte IOCAF             =   0x393               //IOC FLAG register
  19. #byte INTCON    =   0x0B                //Interrupt Control Register
  20. //--------------------------------------------------------------------
  21. //---------                     --------------------------------------------------
  22. #define IR_LED  PIN_A2
  23. #define ON      1
  24. #define OFF 0
  25. //--------------------------------------------------------------------
  26. long pwm_duty_cycle=416;                //PWM MAX = 832 , PWM DUTY SET to 50%
  27. char button_pressed;
  28. char new_button_pressed;
  29. char RA_FLAG;
  30. //--------------------------------------------------------------------
  31. long commands[5]={      0b11000000001100,0b11000000010000,0b11000000010001,
  32.                                         0b11000000100000,0b11000000100001};
  33. char command_index;
  34. /*
  35. long TV_STAND_BY        =0b11000000001100;              // ON-OFF
  36. long TV_VOL_UP          =0b11000000010000;              // Volumen +
  37. long TV_VOL_DOWN        =0b11000000010001;              // Volumen -
  38. long TV_CH_UP           =0b11000000100000;              // Channel +
  39. long TV_CH_DOWN         =0b11000000100001;              // Channel -
  40. */
  41. //--------------------------------------------------------------------
  42. void ir_transmit(char command);         //      Transmits the COMMAND
  43. void PWM_pulse(char state);                     //      Controls the PWM output
  44.  
  45. void main(){
  46.  //-------------------------------------------------------------------
  47.         setup_comparator(NC_NC);                //      COMPARATOR OFF
  48.         SETUP_ADC(ADC_OFF);                             //      ADC OFF
  49.         SETUP_ADC_PORTS(NO_ANALOGS);    //      NO ANALOG PINS
  50.  
  51.         output_A(0x00);                 //      OutputLatch
  52.         set_tris_A(0B111011);           //
  53.                                         //      RA0=INPUT
  54.                                         //      RA1=INTPUT
  55.                                         //      RA2=IR_LED OUTPUT
  56.                                         //      RA3=INPUT
  57.                                         //      RA4=INPUT
  58.                                         //      RA5=INPUT
  59.  
  60.         PORT_A_PULLUPS(0b111011);               //      Internal pull-ups resistor enabled
  61.  
  62. //--------------------------------------------------------------------
  63.         enable_interrupts(INT_RA);      //Interrupt On-Change on PORT
  64.         IOCAN=0b111011;                                 //Interrupt On-Change RA High to Low
  65.         IOCAP=0b000000;
  66.         bit_clear(INTCON,0);                    //Clearing IOCF flag bit
  67.         IOCAF=0;                                //Clearing IOC flags
  68.  
  69.         enable_interrupts(GLOBAL);              //Global interrupts enabled
  70. //--------------------------------------------------------------------
  71. //---------  MAIN PROGRAM  -----------------------------\\\\
  72. while(1){
  73.  
  74.         sleep();               
  75.  
  76.         if(RA_FLAG==TRUE){                                              //If any button was pressed
  77.                 RA_FLAG=FALSE;                                          //Resefting the RA FLAG for the new incoming data detection
  78.                
  79.                 button_pressed=~button_pressed;         //Masking buttons
  80.                 button_pressed&=0b111011;                       //getting the pressed button
  81.  
  82.                 switch(button_pressed){
  83.                        
  84.                         case 0x01:      command_index=0;        //Button 0
  85.                                                 break;
  86.                         case 0x02:      command_index=1;        //Button 1
  87.                                                 break;
  88.                         case 0x08:      command_index=2;        //Button 2
  89.                                                 break;
  90.                         case 0x10:      command_index=3;        //Button 3
  91.                                                 break;
  92.                         case 0x20:      command_index=4;        //Button 4
  93.                                                 break;
  94.                
  95.                         }//switch button-command
  96.  
  97.                 ir_transmit(command_index);                     //Transmiting selected code    
  98.  
  99.                 IOCAF=0;                                        //Clearing IOC flags
  100.                 bit_clear(INTCON,0);                            //Clearing IOCF Global flag big
  101.                 bit_set(INTCON,3);                                      //Enabling IOC interrupt
  102.         }//IF-RA FLAG
  103.  
  104. }////end while
  105. }// main
  106.  
  107. //--------      INTERRUPTS                      -------------------------------------
  108. #INT_RA
  109. void port_change(){
  110.         IOCAF=0;                                                //Clearing IOC flags
  111.         bit_clear(INTCON,0);                                    //Clearing IOCF Global flag bit
  112.         bit_clear(INTCON,3);                                    //Disabling IOC interrupt to avoid reentrance
  113.  
  114.         button_pressed=input_A();                               //Reading PORT
  115.  
  116.         RA_FLAG=TRUE;                                                   //Botton pressed Flag
  117. }//Interrupt On Change
  118. //--------------------------------------------------------------------
  119. //--------      FUNCTIONS                       --------------------------------------
  120. void ir_transmit(char index){                   //Transmits the IR command
  121. char x;
  122. char rc5_bit;
  123.  
  124. do{                                                                             //At Least once transmitted
  125. rc5_bit=13;                                                             //MSB firts
  126. for(x=0;x<14;x++){                                              //Transmiting 14 bits
  127.  
  128.                 if(bit_test(commands[index],rc5_bit)==1){               //Transmiting _01_
  129.                         PWM_pulse(OFF);
  130.                         delay_us(880);
  131.                         PWM_pulse(ON);
  132.                         delay_us(880);
  133.                 }
  134.  
  135.                 else {
  136.                         PWM_pulse(ON);                                                          //Transmiting _10_
  137.                         delay_us(880);
  138.                         PWM_pulse(OFF);
  139.                         delay_us(880);
  140.                
  141.                 }
  142.  
  143.                 rc5_bit--;
  144.         }//for x address
  145.         PWM_pulse(OFF);
  146.         delay_ms(114);                                                                          //Delay between same command
  147.  
  148.         new_button_pressed=input_A();
  149.         new_button_pressed=~new_button_pressed;
  150.         new_button_pressed&=0b111011;
  151.  
  152. }while(new_button_pressed==button_pressed);                             //While the same button stays pressed
  153.  
  154. //Updating Toggle-bit
  155. if(bit_test(commands[index],11)==0)bit_set(commands[index],11);
  156. else bit_clear(commands[index],11);
  157.  
  158. }//ir-transmit function
  159.  
  160. //--------------------------------------------------------------------
  161. void PWM_pulse(char state){                                     //Controls the PWM output
  162.  
  163.         if(state==ON){
  164.                 SETUP_CCP1(CCP_PWM);                // PWM
  165.                 SETUP_TIMER_2(T2_DIV_BY_1, 207,1);      // Frequency = 38KHz -
  166.                 SET_PWM1_DUTY(pwm_duty_cycle);      // Duty cycle = 50%  -
  167.         }      
  168.         else{
  169.             SETUP_CCP1(CCP_OFF);                // PWM OFF
  170.                 SETUP_TIMER_2(T2_DISABLED, 207,1);  // Timer2 disabled
  171.                 SET_PWM1_DUTY(pwm_duty_cycle);      // Duty cycle = 50%   - JUST FOR MATCHING TIME
  172.                 output_low(pin_A2);                                     // Ensures the output is on LOW state
  173.         }//else
  174. }//function PWM PULSE
  175.  
  176. //--------------------------------------------------------------------

Diagrama



PCB
Más tarde adjunto el pcb con componentes through hole para que sea mas facil el montaje.
YA esta el archivo completo.


SaludoS!
« Última modificación: 16 de Marzo de 2012, 01:29:32 por AKENAFAB »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Control remoto infrarrojo para TV philips protocolo RC5
« Respuesta #1 en: 13 de Marzo de 2012, 20:35:41 »
Muy interesante!

Gracias por compartirlo!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Control remoto infrarrojo para TV philips protocolo RC5
« Respuesta #2 en: 13 de Marzo de 2012, 20:42:19 »
Gracias BrunoF xD

Ando retomando proyectos que por falta de tiempo se quedaron tirados xD

Saludos!

Desconectado stk500

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4923
Re: Control remoto infrarrojo para TV philips protocolo RC5
« Respuesta #3 en: 14 de Marzo de 2012, 04:58:49 »
 :shock: me esta haciendo la concurrencia Amigo Akenafab  :D :D
muy chulo esta eso ,
espero que le pongan una Chincheta a tu proyecto.
 a ver si el jefe se motiva hacerlo  :P

Saludos

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Control remoto infrarrojo para TV philips protocolo RC5
« Respuesta #4 en: 14 de Marzo de 2012, 05:27:05 »
Extraordinario, Akena.
¿Tienes también la PCB o estás probando en protoboard?

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Control remoto infrarrojo para TV philips protocolo RC5
« Respuesta #5 en: 14 de Marzo de 2012, 05:59:44 »
:shock: me esta haciendo la concurrencia Amigo Akenafab  :D :D
muy chulo esta eso ,
espero que le pongan una Chincheta a tu proyecto.
 a ver si el jefe se motiva hacerlo  :P

Saludos

Extraordinario, Akena.
¿Tienes también la PCB o estás probando en protoboard?

Gracias por sus comentarios panas!

Lo tengo en protoboard y estoy terminando el pcb para que quede en un gabinete plástico.

Saludos!

Desconectado stk500

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4923
Re: Control remoto infrarrojo para TV philips protocolo RC5
« Respuesta #6 en: 15 de Marzo de 2012, 02:51:14 »
pues si el gabinete lo esta haciendo asi, te va a quedar muy chulos , lastima que yo me lo tengo que hacer a mano, no tengo una maquina CNC para hacerlo, claro es que quiero usar 10 teclas , cuando lo tenga listo subo un video por aqui funcionando.

Saludos

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Control remoto infrarrojo para TV philips protocolo RC5
« Respuesta #7 en: 15 de Marzo de 2012, 03:20:24 »
pues si el gabinete lo esta haciendo asi, te va a quedar muy chulos , lastima que yo me lo tengo que hacer a mano, no tengo una maquina CNC para hacerlo, claro es que quiero usar 10 teclas , cuando lo tenga listo subo un video por aqui funcionando.

Saludos

Pues de hacer gabinete nada xD.
Lo voy a comprar y solo hacerle las perforaciones.

Desconectado stk500

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4923
Re: Control remoto infrarrojo para TV philips protocolo RC5
« Respuesta #8 en: 15 de Marzo de 2012, 03:57:35 »
Y cuantos te cuestas el gabinete completo`? porque yo pensaba comprarlo hecho, pero pero........., al final de decidi por comprar un mando a distancia, y me costo casi 5€, despues de hacer mi calculo para hacer yo mismo., haciendo yo mismo me salia casi por 15€ ya que gabinete hecho con tantas teclas (12) que necesitaba me salio caro.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Control remoto infrarrojo para TV philips protocolo RC5
« Respuesta #9 en: 15 de Marzo de 2012, 04:01:58 »
Y cuantos te cuestas el gabinete completo`? porque yo pensaba comprarlo hecho, pero pero........., al final de decidi por comprar un mando a distancia, y me costo casi 5€, despues de hacer mi calculo para hacer yo mismo., haciendo yo mismo me salia casi por 15€ ya que gabinete hecho con tantas teclas (12) que necesitaba me salio caro.

Tiene un precio de $8 dolares en newark,el gabinete es muy pequeño y esta muy padre,ya lo he visto fisicamente.