# Interpretar trenes de pulsos de un receptor infrarrojo



## Manonline (May 5, 2007)

Hola!! No se mucho sobre pics ni nada por el estilo pero me apasiona todo esto... y quiero probar de hacer un control de potencias controlado por un pic (vi un minidimmer en www.micropic.es pero el codigo no es de libre distribucion) y mandado por un control remoto.

En estos dias voy a hacer el dimmer con mando de esa misma pagina (es la version anterior al minidimmer y es de libre distribucion) para probar pero me encantaria hacer un control de potencias a control remoto.

Desde ya muchas gracias,
Mano.


----------



## niten (May 6, 2007)

utiliza un osciloscopio conectado a tu control remoto (en las patas del emisor)
de esa forma podras ver el tren de pulsos especifico de tu control y manejarlo como te plasca
saludos..


----------



## tiopepe123 (May 6, 2007)

con la targeja de sonido del PC
Un enlace importante

http://www.lirc.org/
http://www.epanorama.net/links/irremote.html#codes

Una sencilla prueba es coger un programa de grabacion tipo cooledit o el que incorpora el grabador Nero y lo conectas a la entrada de micro.
Con un led normal, creo que uno de rojo mejor,lo conectas como si fuera un micro y prueba de distintas formas hasta que detecte algo. 
Debes colocar el mando tocando el diodo led


Ojo no lo he probado pero deberia funcionar, aunque solo de forma mediocre.

pero algo veras...


----------



## Manonline (May 6, 2007)

Gracias por la información!!

Igual me referia a alguna forma de que un micro identifique un tren de pulsos de otro como para poder hacer un control de potencias de varios canales... y si hay alguna forma de que el micro grabe en la memoria esos trenes de pulsos para poder configurarlo con cualquier control remoto..

Muchas gracias de nuevo,
Mano.


----------



## jorgeme (May 14, 2007)

existe una pagina donde explica muy bien los protocolos de los controles y dice como decodificar, el problema es que existen como 10 protocolos estandares, rc.5,nec,etc... debes buscar en los foros ya que ahora mismo no tengo conmigo el nombre del topico pero de que hay, hay. a mi me costo encontrar pero el link esta en alguna lugar de "microcontroladores y sistemas embebidos"... el que busca encuentra Manonline....


----------



## Manonline (May 14, 2007)

Sip... ya habia buscado bastante en el foro.. encontre un par de topics relacionados pero ninguno daba justo la información que necesitaba... 

Gracias x sus respuestas, voy a buscar lo de los protocolos..

gracias,
mano.


----------



## niten (May 15, 2007)

insisto, usa un osciloscopio.
es mas facil k lo del audio y te da el tiempo de tus pulsos, acabamos de hacer un mando a distancia con un control casero usando el osciloscopio para ver el tren de pulsos
y funciona.
saludos..


----------



## tiopepe123 (May 15, 2007)

Si os interesa mirar aqui
http://www.remotecentral.com/cgi-bin/files/rcfiles.cgi?area=other&db=other&br=programs

Yo por ejemplo realice un mando a distancia para una camara canon a partir del fichero


----------



## Manonline (May 15, 2007)

jaja... lo que tenia pensado hacer era que un pic aprendiera solo el tren de pulsos de un control remoto para despues activar una carga con el control por ejemplo.

gracias x la informacióno...

mano.


----------



## Willington (May 15, 2007)

ojo no olvidar que la señal del unfrarojo esta modulada en 40KHz, generalmente
los receptores completos hacen la demodulacion internamente, es mejor usar estos y
no un FOTO-LED o Foto-transistor.

debido a la cantidad de protocolos lo moejor seria hacer una copia de la señal
con tiempo de muestreo adecuado y asi olvidarse de los protocolos ...


----------



## tiopepe123 (May 15, 2007)

Hoy en dia no vale la pena utilizar diodos, demoduladores... te compras un "modulo" o lo reciclas de cualquier cacharro, todos son iguales solo cambian el encapsulado.

Si que se puede copiar, lo unico es que debes hacer una rutina adecuada, no puedes copiarlo a saco ya que tienes muy poca memoria, es como querer meter un video dentro de un disquet, no cabe.

Deberias deducir o ver aproximadamente la duracion de los pulsos y el dutycicle para reconocer si es un 1 o 0 y a partir de ahi copiar los 1 y 0.

Como minimo debes conocer  cuanto dura un pulso, luego ya pensaras como reducir los datos.

Otra forma es comprimir los datos, 

Lo mejor es utilizar algun mando compatible con RC5 que ya tienes rutinas hechas por todos lados.


----------



## Manonline (May 15, 2007)

a mi me falta programacion... pero ya me voy a poner leer algunos tutoriales...

si qieren ver mas o menos lo que quiero hacer entren a http://www.micropic.es

ahi hay dos proyectos... dimmer con mando y minidimmer... el primero es exactamente eso, el primero =P jaja y el otro es la ultima version... usan un receptor IR de 3 patitas...

en vez de hacer un dimmer qeria hacer un control de potencia... = me estoy apurando xq ni termine el dimmer... me falta el optoacoplador xq no consegui el MOC3021... y no se donde conseguirlo =(

gracias a todos ^^ tengo qe estudiar un poco de programacion jajaj

suerteee,
manoo.


----------



## rizomorfo (Feb 14, 2009)

Estoy con un problema con un receptor IR.

El cable de datos del receptor me tira siempre 4 voltios, es decir que no esta apagado cuando no envio una señal.

Lo mas raro es que si miro la señal con el osciloscopio se ve bien, y cuando suelto el boton la señal se va.
Pero siempre hay 4v segun mi multimetro.

El tema es que me esta poniendo en alto un pin del pic SIEMPRE, y no puedo leer la señal (siempre hay 1)

Alguna idea?


----------



## Manonline (Feb 15, 2009)

el receptor es asi... invierte la señal... si te molesta, podes invertirlo por software... y si estas usando interrupciones, ponelas en flanco descendente


----------



## rizomorfo (Feb 15, 2009)

Ya solucioné el tema, tenia mal conectado los pines del receptor :S

Gracias de todos modos.

Saludos


----------



## Manonline (Feb 15, 2009)

jejeje, al parecer estamos trasnochando un ppoco...


----------



## ELIUSM (Feb 16, 2009)

Hola!

Mira, aquí en este Link...

https://www.forosdeelectronica.com/f24/protocolo-rc5-pic-ahora-funciona-10966/

... sale un programa en assembler para interpretar señales infrarrojas de RC5 de controles remotos.

A partir de allí puedes conquistar el mundo con un control remoto, ya que a partir de las señales decodificadas por el programa publicado, puedes hacer cualquier cosa... dimmers..... por ejemplo.

Saludos!


----------



## Manonline (Feb 16, 2009)

ELIUSM, por casualidad probaste el pedacito de programa? En caso de ser asi, podrias contarme un poco como funciona? Creo que en su momento lo habia entendido pero me parecia incoherente, pero tal vez (seguro) se me escapaba algo.

gracias,
mano.

EDITO: Volvi a entrar al post y me encontre con que se habia desarrollado mucho mas... ahora lo leo bien todo...


----------



## franko1819 (Feb 16, 2009)

hola:
yo necesitaria hacer un circuito que interprete 2 señales. 
me explico: cuando activo un pulsador envia señales al receptor y luego las codifique para hacer funcionar por ejemplo un led y cuando pulse otro se encienda otro led por ejemplo


gracias desde ya


----------



## ELIUSM (Feb 16, 2009)

Hola Manonline!

El programita que hay que usar es el último que sale, y si, lo probé, ya que yo mismo lo hice.
Ahora observaciones:
Si usas un control remoto universal, el código que mejor funciona hasta ahora es el 043 para la función TV.

Otra observación, es que en mi programa todavía hay un problema con el bit 6 de la cadena de bits de comando. Por alguna razón no sale, nunca se activa. Pero en fin, una buena cantidad de teclas del control funcionan bien hasta ahora.

Justo ahora, volví a retomar este tema, y tengo el circuito armado frente mío, y revisando el programa para saber ahora qué rayos pasa con el bit 6. Espero poder solucionarlo pronto, y lamentablemente no tengo mucho tiempo.

Trata de leer el Post entero, ya que entremedio también hay informaciónes interesantes que ayudan.

Un saludo!


----------



## rizomorfo (Feb 17, 2009)

Hola gente, vuelvo al tema. Ya solucionado el tema de la adquisicion de datos del sensor, paso a comentarles mi nuevo problemita 



En ésta imagen se pueden ver dos señales que son del mismo botón. Cada vez que apreto un botón alternan unos bits del principio (rectángulo amarillo). Me explico mejor: si apreto el botón una vez aparece la primer señal, si apreto de nuevo aparece la siguiente, si apreto de nuevo vuelve la primer señal y así sucesivamente (creo que se llaman bits de toggle).

Como notarán cada ciclo son 2 bits, esto se debe a que en algunos botones, lo único que cambiaba en la señal era la duración de algún semiciclo (por ejemplo: en el asterisco azul de la imagen hay un bit (1 en este caso), pero hay otro botón que lo único que cambia es la duración de ese semiciclo.

La barrita verde marca que de ese bit para adelante son los comandos (bit 11).

En la imagen se puede ver que la señal tiene 21bits, sin embargo la mitad de los botones tienen 19bits. (el control remoto es de la placa "Asus My Cinema 7131").







Éste es el código que funciona bien leyendo botones que emiten señales de 19bits (también lee los de 21bits pero se come los ultimos dos bits).


```
#include <16F84A.h>

#fuses XT,NOWDT,NOPROTECT,PUT
#use delay (clock=4000000)
#use fast_io(a)
#use fast_io(b)

int bit[21], i;

void main() {

      set_tris_a(0);
      set_tris_b(0x10);

      for(i=0;i<21;i++) {
         bit[i]=0;
      }
      i=0;
      while(1) {
            do {
               while(input(PIN_B4));
               delay_us(1200);

               if(!input(PIN_B4)) {
                  bit[i]=1;
               }else {
                  bit[i]=0;
               }
               i++;

               while(!input(PIN_B4));

               delay_us(950);
               if(input(PIN_B4)) {
                  bit[i]=1;
               }else {
                  bit[i]=0;
               }
               i++;
            }while(i<18); // no se porque si pongo i<19 no sale en la primer pulsada del botón, como q lee un bit menos.

            if(i==18) {
               output_bit(PIN_A2,bit[11]); // primer bit del comando
               output_bit(PIN_A3,bit[12]);
               output_bit(PIN_B0,bit[13]);
               output_bit(PIN_B1,bit[14]);
               output_bit(PIN_B2,bit[15]);
               output_bit(PIN_A1,bit[16]);
               output_bit(PIN_A0,bit[17]);
               output_bit(PIN_B7,bit[18]); // siempre en 0 pq el while es i<18 y no i<19
               output_bit(PIN_B6,bit[19]); // siempre en 0 pq el while es i<18 y no i<21 (en este codigo no leeo los comandos de 21bits enteros)
               output_bit(PIN_B5,bit[20]); // siempre en 0 pq el while es i<18 y no i<21 (en este codigo no leeo los comandos de 21bits enteros)
               delay_ms(250);
               output_bit(PIN_A2,0);
               output_bit(PIN_A3,0);
               output_bit(PIN_B0,0);
               output_bit(PIN_B1,0);
               output_bit(PIN_B2,0);
               output_bit(PIN_A1,0);
               output_bit(PIN_A0,0);
               output_bit(PIN_B5,0);
               output_bit(PIN_B6,0);
               output_bit(PIN_B7,0);

               for(i=0;i<21;i++) {
                  bit[i]=0;
               }
               i=0;
            }
      }
}
```


Éste es el código que debería leer tanto 19bits como 21bits, pero no funciona (por algún motivo no sale de un while).


```
#include <16F84A.h>

#fuses XT,NOWDT,NOPROTECT,PUT
#use delay (clock=4000000)
#use fast_io(a)
#use fast_io(b)

long ticks=0;
int bit[21], i, seconds=0;

#INT_TIMER0
void int_timer() {
      set_timer0(156);
      if (++ticks == 10000) {
         seconds++;
         ticks=0;
      }
}

void main() {

      set_tris_a(0);
      set_tris_b(0x10);
      
      setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
      set_timer0(156);
      
      enable_interrupts(GLOBAL);
      enable_interrupts(INT_TIMER0);

      for(i=0;i<21;i++) {
         bit[i]=0;
      }
      i=0;
      while(1) {
            while(input(PIN_B4));
            do {
               delay_us(1200);
               
               if(!input(PIN_B4)) {
                  bit[i]=1;
               }else {
                  bit[i]=0;
               }
               i++;

               while(!input(PIN_B4));

               delay_us(950);
               if(input(PIN_B4)) {
                  bit[i]=1;
               }else {
                  bit[i]=0;
               }
               i++;
               ticks=0;
               seconds=0;
               set_timer0(156);
               while(input(PIN_B4) || seconds < 1); // aparentemente no sale nunca de éste while
               if(seconds >= 1) {
                  bit[19]=0;
                  bit[20]=0;
                  i=21;
               }
            }while(i<21);

            if(i==21) {
               output_bit(PIN_A2,bit[11]); // primer bit del comando
               output_bit(PIN_A3,bit[12]);
               output_bit(PIN_B0,bit[13]);
               output_bit(PIN_B1,bit[14]);
               output_bit(PIN_B2,bit[15]);
               output_bit(PIN_A1,bit[16]);
               output_bit(PIN_A0,bit[17]);
               output_bit(PIN_B7,bit[18]); 
               output_bit(PIN_B6,bit[19]);
               output_bit(PIN_B5,bit[20]);                          
               delay_ms(250);
               output_bit(PIN_A2,0);
               output_bit(PIN_A3,0);
               output_bit(PIN_B0,0);
               output_bit(PIN_B1,0);
               output_bit(PIN_B2,0);
               output_bit(PIN_A1,0);
               output_bit(PIN_A0,0);
               output_bit(PIN_B5,0);
               output_bit(PIN_B6,0);
               output_bit(PIN_B7,0);
               
               for(i=0;i<21;i++) {
                  bit[i]=0;
               }
               i=0;
            }
      }
}
```


----------



## vicbit (Nov 20, 2014)

tengo la señal de control para un infrarrojo para controlar un minisplit pero no se como generar la señal portadora de 38khz.
 uso el pic16f690. este es el código en c de la señal de control en MPLABX.

```
void onoff() {
    PORTCbits.RC0=0;
    PORTCbits.RC0=1;
    __delay_ms(9);
    PORTCbits.RC0=0;
    __delay_ms(4.5);
    PORTCbits.RC0=1;
    __delay_us(600);
    PORTCbits.RC0=0;
    __delay_ms(1.6);
    PORTCbits.RC0=1;
    __delay_us(600);
    PORTCbits.RC0=0;
    __delay_ms(1.6);
    for (int i=1;i<=5;i++) {
       PORTCbits.RC0=1;
       __delay_us(600);
       PORTCbits.RC0=0;
       __delay_us(500);
    }
    __delay_ms(1.1);
    for (int i=1;i<=4;i++) {
        PORTCbits.RC0=1;
        __delay_us(600);
        PORTCbits.RC0=0;
        __delay_ms(1.6);
    }
    for (int i=1;i<=11;i++) {
        PORTCbits.RC0=1;
        __delay_us(600);
        PORTCbits.RC0=0;
        __delay_us(500);
    }
    __delay_ms(1.1);
    for (int i=1;i<=4;i++) {
        PORTCbits.RC0=1;
        __delay_us(600);
        PORTCbits.RC0=0;
        __delay_ms(1.6);
    }
    PORTCbits.RC0=1;
    __delay_us(600);
    PORTCbits.RC0=0;
    __delay_us(500);
    PORTCbits.RC0=1;
    __delay_us(600);
    PORTCbits.RC0=0;
    __delay_ms(1.6);
    for (int i=1;i<=10;i++) {
        PORTCbits.RC0=1;
        __delay_us(600);
        PORTCbits.RC0=0;
        __delay_us(500);
    }
    __delay_ms(1.1);
    PORTCbits.RC0=1;
    __delay_us(600);
    PORTCbits.RC0=0;
    __delay_us(500);
    PORTCbits.RC0=1;
    __delay_us(600);
    PORTCbits.RC0=0;
    __delay_ms(1.6);
    for (int i=1;i<=38;i++) {
        PORTCbits.RC0=1;
        __delay_us(600);
        PORTCbits.RC0=0;
        __delay_us(500);
    }
    __delay_ms(1.1);
    for (int i=1;i<=3;i++) {
        PORTCbits.RC0=1;
        __delay_us(600);
        PORTCbits.RC0=0;
        __delay_us(500);
    }
    __delay_ms(1.1);
    for (int i=1;i<=4;i++) {
        PORTCbits.RC0=1;
        __delay_us(600);
        PORTCbits.RC0=0;
        __delay_ms(1.6);
    }
    for (int i=1;i<=4;i++) {
        PORTCbits.RC0=1;
        __delay_us(600);
        PORTCbits.RC0=0;
        __delay_us(500);
    }
    __delay_ms(1.1);
    PORTCbits.RC0=1;
        __delay_us(600);
        PORTCbits.RC0=0;
        __delay_us(500);
        PORTCbits.RC0=1;
        __delay_us(600);
        PORTCbits.RC0=0;
        __delay_ms(1.6);
    for (int i=1;i<=6;i++) {
        PORTCbits.RC0=1;
        __delay_us(600);
        PORTCbits.RC0=0;
        __delay_us(500);
    } ...
```


----------



## TRILO-BYTE (Nov 20, 2014)

*dios mio *cuantos Delay!!!
bueno si ya sale la señal como deberia ahora lo que debes hacer es generar una señal de 38khz con un timer y sacarla por algun pin del micro las sumas externamente y deberia de funcionar


----------

