TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Algec en 08 de Mayo de 2006, 13:44:32

Título: Control remoto IR/RF
Publicado por: Algec en 08 de Mayo de 2006, 13:44:32
He pensado hacer un control remoto que sirva tanto para pequeños robots, pequeño electrodomestico o algun tipo de equipo con pocas necesidades.
Usaria el protocolo que se usa en los mandos a distancia por IR, protocolo RC5, ya que este es fiable y se puede implementar directamente tanto en un receptor IR y un mando a distancia RC5, o a mas distancia con pic usando un transmisor RF con pic codificador y  un receptor RF con otro PIC de decodificacion. Lo unico que cambiaria es el medio de transmision, por lo que seria muy versatil.
El problema es que no encuentro nada sobre RC5 en C, todo lo que encuentro esta en ensamblador.
Alguien ha visto rutinas de codificacion y decodificacion RC5 o de algun tipo de mando a distancia IR en C?
¿Donde puedo encontrarlas?
Título: Re: Control remoto IR/RF
Publicado por: pocher en 08 de Mayo de 2006, 16:06:10
Yo te las busco en el saco del disco duro. Mañana te las pongo, ahora me voy a cenar.

Un saludo
Título: Re: Control remoto IR/RF
Publicado por: pocher en 09 de Mayo de 2006, 02:29:48
Por fin lo encontré.

Esta rutina creo recordar que a Radon no le funcionaba, sin embargo yo la probé y sí que funciona.

Código:

Código: C
  1. //***************************************************
  2. // CCS Compiler
  3. // Receptor IR (código RC5 de Philips)
  4. //
  5. // Autor : HEILIG Yves ; Editado por RaDoN
  6. //***************************************************
  7.  
  8. #include <16F876.h>
  9. #fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
  10. #use delay(clock=4000000)
  11. #include <lcd_c.c>
  12.  
  13. #define REC_IR PIN_B0
  14.  
  15. main()
  16. {
  17.         int1 bit;
  18.         int i, nbit, error;
  19.         byte buffer[2];
  20.  
  21.         lcd_init();
  22.         printf(lcd_putc,"\fReceptor IR:");                              // El sensor receptor invierte el código
  23.                                                                                                         // RC5 del emisor (mando a distancia)
  24.         lcd_gotoxy(1,2);
  25.         printf(lcd_putc,"RC5 de PHILIPS\n");   
  26.         delay_ms(2000);
  27.  
  28.         while(1)
  29.         {
  30.                 buffer[0]=0;
  31.                 buffer[1]=0;
  32.                 error=0;
  33.                 nbit=0;
  34.                 i=0;
  35.                
  36. // Sin este trozo de programa va igual         
  37. /*
  38.                 while( i++ != 4)
  39.                 {                                                                                       // Test si REC_IR au repos prolongé
  40.                         if(REC_IR == 0) i=0;
  41.                         delay_us (889);
  42.                 }
  43. */
  44.                 while(input(REC_IR)==1);                        // Espera al 1er bit de START (flanco de bajada)
  45.                 delay_us(444);                                                          // Se posiciona en el medio
  46.  
  47.                 while((nbit++ != 13) && (error == 0))           // 2º bit de START + 1 bit TOGGLE +
  48.                 {                                                                                       // 5 bits DIR + 6 bits COMANDO
  49.                                                                                                         // nbit varía de 0 a 12 = 13 bits
  50.                                                                                                        
  51.                         delay_us (889);                                                 // Mide en el primer semiperiodo del
  52.                                                                                                         // bit, para que invierta el código y
  53.                                                                                                         // dé el original RC5 del emisor
  54.  
  55.                         if(input(REC_IR)==0)
  56.                         {
  57.                                 delay_us (889);
  58.                                 if(input(REC_IR) != 1) error=1;
  59.                                 bit=0;                                                          // Es un 0
  60.                         }
  61.  
  62.                         else
  63.                         {
  64.                                 delay_us(889);
  65.                                 if (input(REC_IR) != 0) error=1;
  66.                                 bit=1;                                                          // Es un 1
  67.                         }
  68.  
  69.                         shift_left(buffer,2,bit);       // buffer=buffer[0], 2·8=16bits, bit=0 ó 1
  70.                 }
  71.  
  72.                 if(error)
  73.                         printf(lcd_putc,"\fError\n");
  74.                 else
  75.                         printf(lcd_putc,"\f%x %x Comando %d\n",buffer[1],buffer[0],buffer[0]);
  76.         }
  77. }

Un saludo
Título: Re: Control remoto IR/RF
Publicado por: Algec en 09 de Mayo de 2006, 08:40:14
Potcher como siempre en mi ayuda, mil gracias tio, las busque por entre las piedras y no la encontraba. Ya comentare si funciona o no.