jueves, 19 de enero de 2012

ARDUINO - RECEPTOR INFRARROJOS-2

ARDUINO - RECEPTOR INFRARROJOS-2
Creando rutina propia
Después de mi anterior circuito de receptor de infrarrojos mediante librería IRremote, he decidido hacer mi propia rutina.
Utilizo el mismo circuito de Receptor de infrarrojos por lo que conviene ver el mismo.
El protocolo utilizado es el SIRCS utilizado en la mayoría de la televisiones SONY.
En la siguiente imagen podemos ver el formato del mensaje con los diferentes tiempos.




Formato visto en osciloscopio.


Las tres tramas iguales de la pulsación de una tecla.

Código fuente del programa, donde podemos ver que mediante el puerto serie se mandan los códigos al ordenador. Mediante las teclas 1-2 , 4-5 , 7-8 , se encienden y apagan los LED.
No se hace una comprobación de que las tres tramas iguales de cada tecla de el mismo resultado, solo se lee la primera trama de datos. Es raro que exista diferencia entre las tres tramas pero puede ocurrir, por lo que el que quiera asegurarse deberá modificar el programa.
// seta detector infrarojos
//Código SIRCS de SONY
//28-11-2011
//xsetaseta@gmail.com

// 1Logico=110      0Logico=60
#define xT4  190
#define xT5  240
#define xT3  140
#define xT15  75

  byte datos[20];
  byte x;
  byte x1;
  byte comando;
  byte direccion;
  int xx;
 

void setup()
{
  Serial.begin(9600);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
 
  pinMode(11, INPUT);
  pinMode(12, INPUT); //devolver codigo

}

void loop() {
 
      if((x=ReadIR())==0)
        {
          if(comando==0) digitalWrite(2, HIGH);
          if(comando==1) digitalWrite(2, LOW);
   
          if(comando==3) digitalWrite(3, HIGH);
          if(comando==4) digitalWrite(3, LOW);
   
          if(comando==6) digitalWrite(4, HIGH);
          if(comando==7) digitalWrite(4, LOW);
         
          Serial.println("--");      
          Serial.print("-Comando=");
          Serial.print(comando,DEC);
          Serial.print("-Direccion=");
          Serial.print(direccion,DEC);          
        }
        else
        {
         if(x!=1)Serial.print("E");
        }           
}



//Valor retornado en comando y direccion
//Si existe error retorna mayor de 0, y valor correcto retorna 0
//si retorna 1 significa tiempo de espera excesivo
int ReadIR()
 {
  xx=400;
  while(xx>1)
   {  
   xx--; 
   if (digitalRead(11)==LOW)
    {
      x1=0; 
      while(digitalRead(11)==LOW)
          {
            x1++;
            for(xx=0;xx<15;xx++);
          }
      if(x1<xT4 || x1>xT5) goto error;
      datos[0]=x1;
      for(x=1;x<13;x++)
          {
           x1=0;
           while(digitalRead(11)==HIGH)
              {
                x1++;
                for(xx=0;xx<15;xx++);
              }
           x1=0;
           while(digitalRead(11)==LOW)
              {
                x1++;
                for(xx=0;xx<15;xx++);
                if(x1>xT3)goto error;                    
              }
           datos[x]=x1;
          }
         
      comando=0;
      for(x=7;x>0;x--)
          if(datos[x]>xT15)
            comando = (comando << 1) | 1;
           else
             comando <<= 1;
      direccion=0;
      for(x=12;x>7;x--)
          if(datos[x]>xT15)
            direccion = (direccion << 1) | 1;
           else
             direccion <<= 1;
//      for(x=0;x<13;x++) Serial.println(datos[x], DEC);    
      goto salto;
  error:
      //Serial.print("E-");
      //Serial.print(x1,DEC);
      return x1;
  salto:
      return 0;
    }
    return 1;
   }
}


Lugares donde he sacado información:

http://users.telenet.be/davshomepage/index.htm
http://www.fullcustom.es/guias/control-remoto-infrarrojo-software-usb-serie
http://www.sharatronica.com/decodificador_infrarrojo_sony.html
http://www.hifi-remote.com/sony/Sony_tv.htm

Saludos.
SETA43

No hay comentarios:

Publicar un comentario