lunes, 29 de marzo de 2010

Mando Infrarrojo

A la hora de configurar algún dispositivo, se hace uso de los teclados, que, por lo general, hacen uso de muchos pines para gestionar las teclas por multiplexación. Aún cuando es un método muy utilizado, a veces nos trae problemas, sobre todo cuando necesitamos esos preciados pines de I/O.

Una forma muy útil de tener un teclado, es usar un mando de TV (y de paso aprovechamos que son muy económicos y fáciles de conseguir) el cual envía tramas características para cada tecla. Estas tramas se pueden adquirir por un solo pin del microcontrolador haciendo uso de un sensor de recepción infrarroja como el TSOP17xx.

Hay diversas frecuencias de trabajo para los mandos de TV: 38kHz, 40kHz, etc. Según la frecuencia de trabajo son las xx del sensor, por ejemplo: para 38kHz, está el TSOP1738.

Este sensor, nos entrega por su pin de salida, la señal modulada en ancho de pulso, lo cual evita interferencias y demás. Una trama característica, por ejemplo para la tecla POWER de un control es:


Al revisar un poco la literatura acerca de los protocolos que hay para los mandos infrarrojos, encontramos algunos como el famoso RC5, el NEC32, etc. Al revisar la trama, vemos que coincide con la del NEC32 ya que envía 32bits y envía un byte y luego el mismo pero negado.

Para recibir la trama captada por el sensor, usamos un pin que posea interrupción externa con el pin RB0 o el CCPx, este último posee también relación con los timer lo cual facilita la forma de calcular el tiempo que dura cada pulso de la trama.

Los tiempos a tener en cuenta son:


  • t1 = 2.24mS
  • t0 = 1.12mS
  • ts = 13.5mS


  • El tiempo se cuenta entre cada flanco ascendente o descendente, según como lo configuremos.

    Un código alternativo podría ser el siguiente:
    #int_CCP1
    void RecepcionIR(void)
    {
    set_timer1(0);
    
    if(FlagInicia)
    {
    if(CCP_1>=625 && CCP_1<=760)
     bit_clear(ByteNEC32,Count++);  
    if(CCP_1>=1250 && CCP_1<=1500)  
     bit_set(ByteNEC32,Count++);
    }
    if(CCP_1>=8062 && CCP_1<=8688)
     FlagInicia=1;
    } 


    Esto si tenemos un cristal de 20MHz y configuramos el Timer1 con un preescaler de 8, para obtener un Tick de 1.6uS.

    Como aplicación, se tiene un reloj el cual enciende un relé cada hora durante 1 minuto -predefinido-. La configuración de la hora y la fecha y el encendido y apagado del relé -a gusto del usuario- se hacen mediante un mando infrarrojo.



    1 comentario:

    1. Hola:

      Tu Blog http://mlopic.blogspot.com.es me parece muy interesante. ¿Le interesa enlazarnos entre nosotros?
      Mi blog es: http://electronica-pic.blogspot.com.es

      Un cordial saludo.

      ResponderEliminar