jueves, 19 de enero de 2012

ARDUINO - MANDO A DISTANCIA POR INFRARROJOS

ARDUINO - MANDO A DISTANCIA POR INFRARROJOS

Ya tenemos creado circuitos receptores de infrarrojos, ahora me toca crear un mando a distancia por infrarrojos.
El protocolo utilizado es el SIRCS, utilizado en la mayoría de la televisiones SONY, para las pruebas solo voy a poner un pulsador de subir volumen(código 18). El que quiera ampliar el circuito para gobernar mas cosas deberá modificar el circuito colocando pulsadores para las diferentes funciones.
Para consultar los códigos de las televisiones SONY ver la página http://www.hifi-remote.com/sony/Sony_tv.htm.
El formato que debemos generar es el siguiente:


Además debemos poner los datos en una portadora de 40KHz.
En un principio iba a utilizar un 555 para generar la portadora de 40KHz, pero después de visitar la página http://tthheessiiss.wordpress.com/2009/08/05/dirt-cheap-wireless/, vi que era posible generar los 40KHz mediante los contadores del ATMEGA.
En la siguiente  circuito  podemos ver como hago la mezcla de la portadora y los datos. También pongo un diodo LED de piloto de indicación visible de emisión de datos.
Hemos colocado un pulsador para la función de subir volumen, en un principio utilice la función de PWR, pero después de encender y apagar varias veces la TV, creí conveniente cambiar de función para no cargarme la TV.
Una cosa que no figura en el circuito y que debemos colocar, es un condensador de 50uF en la alimentación, cerca de los transistores.



Código fuente.
// seta - Emisor de infrarrojos
//Código SIRCS de SONY
//1-12-2011
//xsetaseta@gmail.com


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

void setup()
{
  Serial.begin(9600);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);

  pinMode(11, INPUT);
  pinMode(12, INPUT); //devolver codigo
 
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);

  // Clear Timer on Compare Match (CTC) Mode
  bitWrite(TCCR1A, WGM10, 0);
  bitWrite(TCCR1A, WGM11, 0);
  bitWrite(TCCR1B, WGM12, 1);
  bitWrite(TCCR1B, WGM13, 0);

  // Toggle OC1A and OC1B on Compare Match.
  bitWrite(TCCR1A, COM1A0, 1);
  bitWrite(TCCR1A, COM1A1, 0);
  bitWrite(TCCR1A, COM1B0, 1);
  bitWrite(TCCR1A, COM1B1, 0);

  // No prescaling
  bitWrite(TCCR1B, CS10, 1);
  bitWrite(TCCR1B, CS11, 0);
  bitWrite(TCCR1B, CS12, 0);

  OCR1A = 200;    // 40KHz
  OCR1B = 200;
}

void loop()
{
 
if (digitalRead(12)==LOW)
    {   
      x=WriteIR(18,1);  //repetición de 3 veces el dato
      delay(24);
      x=WriteIR(18,1);
      delay(24);
      x=WriteIR(18,1);
      delay(100);
    }
}


int WriteIR(byte com,byte dir)
{
      digitalWrite(3, HIGH);
      digitalWrite(2, HIGH);
      for(xx=0;xx<5500;xx++);
      digitalWrite(2, LOW);
      for(x=0;x<7;x++)
          {
           for(xx=0;xx<1375;xx++);
           digitalWrite(2, HIGH);
           if(com & 1)
               for(xx=0;xx<2750;xx++);
             else
               for(xx=0;xx<1375;xx++);
           digitalWrite(2, LOW);
           com = (com >> 1);          
          }
      for(x=0;x<5;x++)
          {
           for(xx=0;xx<1375;xx++);
           digitalWrite(2, HIGH);
           if(dir & 1)
               for(xx=0;xx<2750;xx++);
             else
               for(xx=0;xx<1375;xx++);
           digitalWrite(2, LOW);
           dir = (dir >> 1);          
          }   
      digitalWrite(3, LOW);
}

No hay comentarios:

Publicar un comentario