# [Aporte] - Librería para leer códigos de controles RF (PICs)



## juanma2468 (Nov 30, 2021)

En otras oportunidades, hice el aporte de programas que permitían guardar códigos en un receptor de RF, pero modificarlos para quien no lo había hecho era un poco complicado y confuso LINK. Por lo que decidí realizar una librería que permita ser incluida de forma sencilla en los micros para que de esa forma el código para el usuario que la use sea los más sencillo posible. Adjunto la librería, un ejemplo de como usarla (solo detecta un código válido, no evalúa el código que lee) y un video donde se ve su funcionamiento.


```
#include <12F683.h>

#fuses INTRC_IO,NoWdt,NoBrownout,Protect
#fuses NoMclr,noCpd,Put,NoIeso,NoFcmen

#use delay(clock=4000000)

#define datos PIN_A2       // Defino el pin donde ingresan los datos
#define led PIN_A1         // Defino el pin donde conecto el led

#include <receptor.c>      // Llamo a la librería

#use fast_io(A)         

unsigned int codigo[3];    // Vector donde se van a guardar el código del control

void main()
{
   set_tris_a (0b00000100);                               // Configuro el pin de datos como entrada
   configurarRx();                                        // Configura el timer1 a 1useg dependiendo de si trabaja con 4 u 8 MHz de oscilador interno
   while(TRUE)
   {
      if(obtenerCodigo(&codigo[0],&codigo[1],&codigo[2])){// Si hay un código válido en el receptor prendo el led
         output_high (led);                               // Código válido
      }
      else{
         output_low (led);                                // Código inválido
      }
   }
}
```


----------



## resistencio (Jul 6, 2022)

juanma2468 dijo:


> En otras oportunidades, hice el aporte de programas que permitían guardar códigos en un receptor de RF, pero modificarlos para quien no lo había hecho era un poco complicado y confuso LINK. Por lo que decidí realizar una librería que permita ser incluida de forma sencilla en los micros para que de esa forma el código para el usuario que la use sea los más sencillo posible. Adjunto la librería, un ejemplo de como usarla (solo detecta un código válido, no evalúa el código que lee) y un video donde se ve su funcionamiento.
> 
> 
> ```
> ...



Hola Juan Manuel, tengo una central de alarma, que funciona bien desde el teclado, pero no funciona desde el control remoto...el módulo de RF anda bien, al menos se ve que llega una trama, que va directo a un MCU ATMEL AT89S52, esto me hace suponer, que decodifican directamente con el MCU, porque no veo ningún decoder por ningún lado y porque la trama entra derecho al MCU (transistor de por medio)...Mi idea es poder recibir el código de los remotos y recuperar las funciones de "armado" y "desarme" de la central...La pregunta es si este código me puede servir para obtener el código de los controles y poder validarlos con otro micro...??? Te mando saludos y gracias por el aporte.


----------



## switchxxi (Jul 6, 2022)

resistencio dijo:


> La pregunta es si este código me puede servir para obtener el código de los controles y poder validarlos con otro micro...???



Si tu alarma usa "rolling code" no podrás hacer nada ya que el código cambia cada vez que se presiona una tecla -se destruye una vez enviado si se quiere ver así y no se vuelve a enviar-.

Compara varias tramas, presionando varias veces un botón y si cambia cada vez pues mala suerte sino puede que tengas posibilidades.


----------



## resistencio (Jul 6, 2022)

Gracias SWITCH...no cambia...tiene más de 20 años, creo que ni existia el "rolling code" en esos tiempos, jaja...no estoy seguro de eso...Lo que estoy haciendo ahora mismo, es cargar este código y efectivamente se enciende el LED testigo, cuando aprieto cualquier tecla de cualquier remoto...Lo curioso (o no) es que el led parpadea solo cuando no aprieto ninguna tecla (cuando aprieto prende de manera franca, continua) y en algunos casos queda latcheado ON...Basta con apretar nuevamente para sacarlo del LATCH y de nuevo empieza a parpadear solito...Con esto lo único que tengo confirmado es que sirve mi receptor (por lo menos esta sintonizado con el remoto) y que entran códigos válidos...JUAN MANUEL, publicó otro programa que graba el código recibido, quizás con ese puede leer la trama y después discriminarla, todavía no se me ocurre como...En fin, esperemos a ver que dice JM...Saludos.


----------



## switchxxi (Jul 7, 2022)

Si el control tiene mas de 20 años entonces desarma uno y revisa que chip usa. Lo mas probable es que sea uno comercial de los conocidos e incluso posea los dipswitch o las pistas (medias lunas para soldar o no) para configurar el código.

Si lo anterior es cierto ya tienes el 80% del trabajo echo y hasta quizás no necesites un microcontrolador dependiendo que quieras hacer.


----------



## resistencio (Jul 7, 2022)

Efectivamente SWITCH, estos tienen los dipswitch para codificar, pero todo eso lo "bypasié" del lado del receptor que ahora es directamente un MCU...Usando el código de JUAN MANUEL, saque los códigos de varios controles, y después conociendo ya este dato, los cargué en un array[3] y listo...Anda super bien, sin fallas o falsos disparos, probé incluso con remotos de timbres inalambricos que tenía en desuso y andan bien, además que tienen más alcance que esos remotos de color "marrón" que venden ahora !!! Un GENIO JM...Anda de maravilla, como bien el mismo anticipa...Si alguna vez lee esto, le quiero dar las gracias porque me dejó patear el penal y sin arquero...Como El dice, se puede retocar la librería de su versión más reciente, armar configuraciones propias y no hay ningún problema con ello...GRACIAS JUANMA2468...!!!


----------



## VICTOROU (Ago 27, 2022)

switchxxi dijo:


> Si tu alarma usa "rolling code" no podrás hacer nada ya que el código cambia cada vez que se presiona una tecla -se destruye una vez enviado si se quiere ver así y no se vuelve a enviar-.
> 
> Compara varias tramas, presionando varias veces un botón y si cambia cada vez pues mala suerte sino puede que tengas posibilidades.


Muchos mandos que veo yo por ahí de alarmas usan código fijo en cambio los mandos de puertas de garaje la mayoría usan Rolling-Code (HCS301), aunque los Rolling-Code la mitad de la trama es fija y la otra es "cambiante"


switchxxi dijo:


> Si el control tiene mas de 20 años entonces desarma uno y revisa que chip usa. Lo mas probable es que sea uno comercial de los conocidos e incluso posea los dipswitch o las pistas (medias lunas para soldar o no) para configurar el código.
> 
> Si lo anterior es cierto ya tienes el 80% del trabajo echo y hasta quizás no necesites un microcontrolador dependiendo que quieras hacer.


Los mandos de alarma que me tienen coincidido son de código fijo puenteando las pistas para configurar el código.

Mi primer mando Rolling-Code que vi fue hace casi 30 años y llevaba un HCS301 a 433,92MHz.


resistencio dijo:


> Efectivamente SWITCH, estos tienen los dipswitch para codificar, pero todo eso lo "bypasié" del lado del receptor que ahora es directamente un MCU...Usando el código de JUAN MANUEL, saque los códigos de varios controles, y después conociendo ya este dato, los cargué en un array[3] y listo...Anda super bien, sin fallas o falsos disparos, probé incluso con remotos de timbres inalambricos que tenía en desuso y andan bien, además que tienen más alcance que esos remotos de color "marrón" que venden ahora !!! Un GENIO JM...Anda de maravilla, como bien el mismo anticipa...Si alguna vez lee esto, le quiero dar las gracias porque me dejó patear el penal y sin arquero...Como El dice, se puede retocar la librería de su versión más reciente, armar configuraciones propias y no hay ningún problema con ello...GRACIAS JUANMA2468...!!!


Es de bien nacido ser agradecido


----------



## juanma2468 (Dic 29, 2022)

Luego de más de un año de la publicación original, subo una versión actualizada de la misma librería con arreglos menores. Saludos.


----------



## resistencio (Dic 29, 2022)

Genio JUANMA...yo me armé un sistema para vagos con el código anterior, y ahora ya no me levanto del sillón ni a prender ni a apagar las luces de la terraza o de la calle, ni las del arbolito de navidad, que armé recientemente...le agregué un buffer a la entrada del decodificador y anda bárbaro...si en los próximos meses subo de peso más de 10 kilos, voy a tener que seguir como antes, mientras sillón y control remoto...mejor aporte 2022 del foro...gracias...!!!


----------



## juanma2468 (Dic 29, 2022)

juanma2468 dijo:


> Luego de más de un año de la publicación original, subo una versión actualizada de la misma librería con arreglos menores. Saludos.


Fe de erratas, adjunto la librería correcta, disculpen el error.


----------



## resistencio (Ene 2, 2023)

@juanma2468, *¿*y c*ó*mo habilito o deshabilito el receptor*...??*?
*¿*Con alguna llave*...??*?
No*,* no tiene sentido*, *llave no*,* pero si llamo a las funciones con el remoto, solo puedo deshabilitar, y el próximo llamado no me daría mi la hora.*..
¿O* se puede hacer de alg*ú*n modo*...??*?


----------



## VICTOROU (Ene 2, 2023)

A que te refieres?


resistencio dijo:


> Genio JUANMA...yo me armé un sistema para vagos con el código anterior, y ahora ya no me levanto del sillón ni a prender ni a apagar las luces de la terraza o de la calle, ni las del arbolito de navidad, que armé recientemente...le agregué un buffer a la entrada del decodificador y anda bárbaro...si en los próximos meses subo de peso más de 10 kilos, voy a tener que seguir como antes, mientras sillón y control remoto...mejor aporte 2022 del foro...gracias...!!!


*¿*Qu*é* chip tiene tu mando?


----------



## resistencio (Ene 2, 2023)

Hola VICTOROU...me puse a leer la nueva librería de JUANMA, y hay 2 funciones nuevas que ponen el estado de RX en ocupado o libre...no se me ocurre como implementar el llamado a esas funciones desde el control remoto...no lo probé todavía, quizás estoy entendiendo mal el concepto, pero se me ocurre pensar que si uso una trama para ponerlo en OCUPADO, ya no será capaz de leer otra trama para dejarlo LIBRE, porque el receptor estará deshabilitado, por su condición de OCUPADO...hasta que no me ponga a toquetear y ver que hace, estoy suponiendo que anda así...descartaba una llave del lado del receptor, porque para eso no hace falta ninguna función, le corto la alimentación y listo...a ver que dice JUANMA.


----------



## VICTOROU (Ene 2, 2023)

resistencio dijo:


> Hola VICTOROU...me puse a leer la nueva librería de JUANMA, y hay 2 funciones nuevas que ponen el estado de RX en ocupado o libre...no se me ocurre como implementar el llamado a esas funciones desde el control remoto...no lo probé todavía, quizás estoy entendiendo mal el concepto, pero se me ocurre pensar que si uso una trama para ponerlo en OCUPADO, ya no será capaz de leer otra trama para dejarlo LIBRE, porque el receptor estará deshabilitado, por su condición de OCUPADO...hasta que no me ponga a toquetear y ver que hace, estoy suponiendo que anda así...descartaba una llave del lado del receptor, porque para eso no hace falta ninguna función, le corto la alimentación y listo...a ver que dice JUANMA.


Tienes razón, podría ser éso.
Voy probar a ver si se me ocurre algo.
Que chip usas en tu control remoto?
Que chip usas en tu receptor?


----------



## resistencio (Ene 2, 2023)

Quizás mandar trama válida y habilitar y con otra trama válida deshabilitar...ya que siempre interpreta tramas válidas...quien no use el código correcto no podría hacerlo recepcionar sino usa esta librería...hay que ensayar...yo use cuanto control remoto encontré en el cajón, los encoders SC2260, SC2262, PT2262, EV1527...lo único que recuerdo es que tuve que invertir la trama, porque yo envió desde LSB a MSB o al revés (no me acuerdo ahora, pero era al revés seguro) y son Fixed Code...no probé con Learning Code...!!!


----------



## VICTOROU (Ene 2, 2023)

resistencio dijo:


> Quizás mandar trama válida y habilitar y con otra trama válida deshabilitar...ya que siempre interpreta tramas válidas...quien no use el código correcto no podría hacerlo recepcionar sino usa esta librería...hay que ensayar...yo use cuanto control remoto encontré en el cajón, los encoders SC2260, SC2262, PT2262, EV1527...lo único que recuerdo es que tuve que invertir la trama, porque yo envió desde LSB a MSB o al revés (no me acuerdo ahora, pero era al revés seguro) y son Fixed Code...no probé con Learning Code...!!!


EV1527 es Learning Code y es Fixed Code
También se podría tocar el código para la parte fija de la trama de un Rolling-Code (HCS300).
Voy probar con unos receptores que tengo (PIC12F683 y PIC16F630)


----------



## resistencio (Ene 2, 2023)

Si, si podés leer la parte fija de la trama tiene que funcionar...no sabía que tenían una parte fija, jaja, por eso ni los probé, pero siendo así, podría intentar con los controles de los autos.


----------



## DJ T3 (Ene 2, 2023)

resistencio dijo:


> JUANMA, y como habilito o deshabilito el receptor...???


Las funciones de habilitar y deshabilitar, tiene sentido segun la aplicacion.
A veces es necesario dejar de recibir datos, ya sea por un tiempoo por definicion de las funciones.
Es allí donde entra en juego esas funciones.



resistencio dijo:


> no se me ocurre como implementar


Te doy un ejemplo simple;
En una alarma, al ingresar el codigo erroneamente, comienza a sonar la sirena, allí deshabilita el receptor, lo mantienes así por...unos segundos, y luego lo habilitas.

Otras formas  ya estará en tu imaginacion.


----------



## Dr. Zoidberg (Ene 2, 2023)

No entiendo cuales son los problemas. El hardware del receptor siempre está activo y el proceso de la trama es por software. No hay bloqueo ni nada similar a menos que el software lo decida...


----------



## DJ T3 (Ene 2, 2023)

Dr. Zoidberg dijo:


> No entiendo cuales son los problemas.


Estoy en la misma.

Si hay funciones, no quiere decir que estrictamente tengan que usarlas a todas...


----------



## resistencio (Ene 2, 2023)

Así es DJ y DR...en mi caso no me resultan útiles o no me doy cuenta como darles utilidad a esas funciones...por ahí buscarle la vuelta con el ejemplo de DJT3...voy a ver si sale algo.


----------



## juanma2468 (Ene 5, 2023)

Buenas tardes a todos, perdón que no leí antes. Para aclarar las dudas, como bien ya comentaron antes, las nuevas funciones de deshabilitar y habilitar el receptor no necesariamente deben estar implementadas en su código, pero hay veces que es necesario, según la aplicación, ignorar la lectura del receptor por un lapso de tiempo, la razón más obvia es que la ejecución de lectura se hace en un tiempo muy breve para nosotros, por lo que es muy normal que se leea varias veces el código recibido y si se está implementando una aplicación tipo latch entonces en un segundo que apretes el botón del control vas a estar prendiendo/apagando tu dispositivo varias veces en un segundo, para ello se implementa la deshabilitación del receptor (supongamos por 2 segundos) una vez recibida una trama correcta e ignorar las subsiguientes, luego se vuelve a activar para volver a escuchar nuevas tramas. Para aclarar dudas, la deshabilitcion/habilitcion es por software no es por hardware, por lo que en la pata de datos del receptor siguen habiendo datos, solo que el micro no los lee.
Les pongo un pequeño ejemplo de como implementar las nuevas funciones.


```
// Declaro el microcontrolador que voy a utilizar //

#include <12F683.H> // Directivas del PIC 12F683

// Declaro la palabra de configuración del microcontrolador //

#fuses INTRC_IO,noWdt,noBrownout,noProtect // Intrc_io(no clkout), noWatchDog, noBrownOut, noProtect
#fuses noMclr,noCpd,put,noIeso,noFcmen     // noMasterClear, noEEProtection, put, noIeso, noFcmen

// Configuro el cristal que voy a utilizar //
#use delay(clock=8000000) // Frecuencia de 8MHz interna

// Definiciones de los pines del micro

#define LED_VERDE            PIN_A1 // GP1 como salida de indicación de estado
#define DATOS                   PIN_A2 // GP2 como entrada de datos del control remoto
#define VALOR_TIKTOK     122

#use fast_io(A) // Asignación rápida de los pines del puerto A

// Llamo la libreria del receptor

#include <receptor.c>      // Llamo a la librería

// Variables
unsigned int codigo1[3];    // Vector donde se va a guardar el código 1 del control
unsigned int codigo2[3];    // Vector donde se va a guardar el código 2 del control
unsigned int tiktok = 0;

// Declaro las funciones utilizadas

void inicializacionDispositivo (); // Rutina de inicialicación del dispositivo
boolean compararCodigo(int codigo1[], int codigo2[]);

// Interrupción del timer0
#INT_TIMER0
void temporizador (void)             // Este timer es el encargado de manejar los tiempo del receptor
{
   while (++tiktok>VALOR_TIKTOK){   // Habilito receptor luego de 2 segundos
      tiktok = 0;
      habilitarRX ();
      disable_interrupts (INT_TIMER0);                         // Deshabilito la interrupción por timer 0
   }
}

void main (void){
   inicializacionDispositivo();
   configurarRx();
   for(;;){
      if(obtenerCodigo(&codigo1[0],&codigo1[1],&codigo1[2])){
         obtenerCodigo(&codigo2[0],&codigo2[1],&codigo2[2]);
         if(compararCodigo(codigo1,codigo2)){
            output_high (LED_VERDE);
            deshabilitarRX();
            clear_interrupt (INT_TIMER0);                                     // Borro la bandera de la interrupción del timer 0
            enable_interrupts (INT_TIMER0);                                   // Habilito la interrupción por timer 0
         }
      }
      else{
         if (tiktok == 0)
            output_low (LED_VERDE);
      }
   }
}

void inicializacionDispositivo(void)  // Rutina de inicialicación del dispositivo
{
   set_tris_a (0b00001101);                     // Pines como entrada: A0,A2,A3 - Pines como salida: A1,A4,A5
   output_a (0);                                // Borro las salidas del puerto A
   setup_timer_0 (T0_DIV_128);                  // Seteo el timer 0 para interrupciones cada 16,384 mseg
   enable_interrupts (GLOBAL);                  // Habilito las interrupciones globales
}

boolean compararCodigo (int codigo1[], int codigo2[]){
   if(codigo1[0] != codigo2[0]) return false;
   if(codigo1[1] != codigo2[1]) return false;
   if(codigo1[2] != codigo2[2]) return false;
   return true;
}
```

Este código hace lo siguiente, cuando inicia, el led se encuentra apagado hasta que recibe un código válido (cualquiera), ahí prende el led y deshabilita el receptor por 2 segundos y durante ese tiempo el led permanece prendido, luego se vuelve a habilitar el receptor y el led se apaga.


----------



## resistencio (Ene 5, 2023)

Buenísimo JUANMA...Yo había hecho algo asi, pero en lugar de esperar un tiempo, armé un contador de códigos válidos, si estos eran entre 1 y 3, hacía algo, si eran más de 3 lo contrario, pero solo para probar si servía. Como trabajo con un XTAL de 4MHZ, teniendo el pulsador apretado, le toma como segundo y medio interpretar un ON/OFF, así que no era un problema.

Después, como lo uso para controlar luces que no tengo a la vista, como para verificar si se encienden o no, decidí usar una trama para ON y otra para OFF, y entonces estoy seguro de que estoy PRENDIENDO o APAGANDO las luces, aún cuando no las vea, jaja...Me compré un control por ML que tiene 12 botones, así que tengo para 6 canales y anda "joya"...Por ahí hay otra manera de hacerlo, pero no me puse a pensar mucho sobre el tema, con el control de 12 botones me sobra, y lo mejor que tiene un alcance de + 250mts. que probé cuando saqué a pasear a RINGO (my dog)...Ahora estuve viendo que venden unos programables, que hacen varias funciones, latch, ON/OFF, repeticiones, y no se que cosas más, intentaré emular esos códigos a partir de tu librería.

NOTA: lo probé con unos viejos timbres inalámbricos que tienen enconder LP801B, recontra CHINO, si buscan la hoja de datos, tienen que ir a preguntarle al chino de la esquina que dice...El dato importante es que funciona con esta librería...!!!


----------



## juanma2468 (Ene 6, 2023)

resistencio dijo:


> Buenísimo JUANMA...Yo había hecho algo asi, pero en lugar de esperar un tiempo, armé un contador de códigos válidos, si estos eran entre 1 y 3, hacía algo, si eran más de 3 lo contrario, pero solo para probar si servía. Como trabajo con un XTAL de 4MHZ, teniendo el pulsador apretado, le toma como segundo y medio interpretar un ON/OFF, así que no era un problema.
> 
> Después, como lo uso para controlar luces que no tengo a la vista, como para verificar si se encienden o no, decidí usar una trama para ON y otra para OFF, y entonces estoy seguro de que estoy PRENDIENDO o APAGANDO las luces, aún cuando no las vea, jaja...Me compré un control por ML que tiene 12 botones, así que tengo para 6 canales y anda "joya"...Por ahí hay otra manera de hacerlo, pero no me puse a pensar mucho sobre el tema, con el control de 12 botones me sobra, y lo mejor que tiene un alcance de + 250mts. que probé cuando saqué a pasear a RINGO (my dog)...Ahora estuve viendo que venden unos programables, que hacen varias funciones, latch, ON/OFF, repeticiones, y no se que cosas más, intentaré emular esos códigos a partir de tu librería.
> 
> NOTA: lo probé con unos viejos timbres inalámbricos que tienen enconder LP801B, recontra CHINO, si buscan la hoja de datos, tienen que ir a preguntarle al chino de la esquina que dice...El dato importante es que funciona con esta librería...!!!


Les comparto el siguiente LINK donde muestro un receptor de 2 canales que realice utilizando dicha librería, utilizando un PIC 12F683 trabajando a 8MHz de reloj interno sin cristal, no les puedo compartir el código fuente de dicho receptor dado que los comercializo, pero para que tengan una idea de las cosas que se pueden hacer.


----------



## resistencio (Ene 6, 2023)

Siiiiii, eso es lo que ví que hacen, así que parece que otros te copiaron la idea, o todos venden tus artículos, jaja...para no volverme loco voy a intentar el modo seguidor nomás, el que prende y apaga sólo después de un tiempo...para el resto me compro uno ya programado, no creo que viva tantos años hasta lograr eso, jaja.


----------

