Recepción IR con Arduino

Hace tiempo que vengo queriendo toquetear un poco las tecnologías inalámbricas, ya que nos permiten la transmisión de datos entre dos puntos sin necesidad de utilizar cables para conectarlos, lo que es una gran ventaja en muchos proyectos.

Hoy por hoy, hay muchos tipos de tecnología inalámbrica como wifi, bluetooth, radiofrecuencia, infrarrojos, gprs, gsm, etc. Yo me voy a centrar en los infrarrojos.

Esta tecnología conocida como IrDA (Infrared Data Association), es desarrollada por HP, IBM y SHARP allá por 1993 y está basada en rayos de luz que se mueven en el espectro infrarrojo.
(Invisible a los ojos humanos).

Se trata de mediante emisores y receptores (normalmente leds) de ondas infrarrojas, establecer comunicación desde un punto al otro. Es necesario que emisor y receptor se  «vean», sin obstáculos de por medio.

Existen muchos protocolos de comunicación infrarroja, ya que este tipo de tecnología inalámbrica se ha utilizado en muchos dispositivos como portátiles, móviles,  PDA’s, y los que más conocemos y seguro todos tenemos en casa, los mandos de TV.

Yo voy a utilizar el protocolo NEC, protocolo que utilizan los mandos universales de TV.

Sigue leyendo!!
 

Para empezar, necesitamos de un receptor de infrarrojos. Yo en mi caso, destrozé un TV de 28» hace tiempo para reciclaje electrónico, y uno de los componentes reciclados fue un receptor TSOP 1238. (Datasheet) .

El TSOP1238 es un receptor de señales infrarrojas, con pre-amplificador de señal incluído que puede alimentarse desde 2,5V hasta 5,5V y su encapsulado de epoxy funciona como filtro IR.
Este receptor, está preparado para ser conectado a un microcontrolador (Arduino en mi caso) y es capaz de recibir señales a 38Khz, que para mi suerte, es la misma frecuencia que utiliza el protocolo NEC de los mandos universales de TV.

Para entender el protocolo NEC me he ayudado de esta web Wiki-Altium – NEC donde está muy bien explicado y básicamente copiaré el funcionamiento.

El protocolo NEC utiliza pulsos a distancia para la transmisión de un mensaje.
Cada ráfaga de pulsos tiene una duración de 562.5 μs a una frecuencia de 38Khz.
Para transmitir los bits correspondientes al mensaje, lo hace de la siguiente manera:

– 0 lógico: Envía un pulso de 562,5 μs, seguido de un espacio de 562,5 μs de duración,  con un tiempo de transmisión de 1,125 ms.
– 1 lógico: Envía un pulso de 562,5 μs seguido de un espacio de 1.6875 ms  de duración, con un tiempo de transmisión de 2,25 ms.

Al pulsar una tecla del mando, el mensaje se compone de la siguiente cadena de pulsos:

1) Una ráfaga de pulsos de 9 ms.
2) Un espacio 4,5 ms
3) La dirección para el dispositivo receptor (8 bits)
4) El inverso lógico de la dirección (8 bits)
5) El comando (8 bits)
6) El inverso lógico del comando (8 bits)
7) Un pulso de 562.5 μs para indicar el final de la transmisión del mensaje.

La siguiente imagen ilustra perfectamente el mensaje transmitido en la pulsación de una tecla de un mando a distancia para una dirección 00000000b y un comando 10110101b.

Para mi suerte, existe una librería para Arduino que se encarga de recibir esta señal y entregarnos un código hexadecimal a partir de los 4 bytes (32 bits) enviados por el mando para poder distinguir cada una de las teclas que hemos pulsado y así poder configurar las teclas del mando a nuestro antojo.

La librería en cuestión, se llama NECIRrcv y podemos descargarla de aquí:  NECIRrcv

Aparcamos la librería un momento y procedemos al montaje del circuito, utilizando el esquema que viene en el datasheet del receptor TSOP1238 para conectarlo al Arduino.

Donde vemos que el IR Receiver (TSOP1238) se conecta por su pin Vs a una resistencia (100Ω valen) y esta a 5V. El pin GND conectado a masa. Y el pin OUT, al microcontrolador, que en nuestro caso será el Arduino.

Listo el circuito y conectado al Arduino, el siguiente paso será recibir los códigos de los botones del mando que vayamos a utilizar en nuestro proyecto,  por lo que cargamos en el entorno de Arduino el ejemplo que viene en la librería NECIRrcv y lo ejecutamos.

Este ejemplo viene preparado para mostrar por el Serial Monitor los códigos correspondientes al botón que hayamos pulsado, como vemos en la siguiente imagen:

Códigos Hexadecimales

Ya utilizando estos códigos o su correspondiente en decimal (Al mostrarlos por el serial monitor quitamos el formateo en hexadecimal de modo que quede: Serial.println(ircode);) podemos controlar cualquier tipo de elemento conectado al Arduino con un mando de TV.

Yo sin complicarme mucho, conecté un led RGB al Arduino y con el mando a distancia podemos controlar el apagado y encendido de los distintos colores del led.
Está programado para controlar el led de la siguiente manera.

– Con el botón «Power» del mando apagamos el led.
– Con el botón «1» del mando encendemos el color ROJO.
– Con el botón «2» del mando encendemos el color VERDE.
– Con el botón «3» del mando encendemos el color AZUL.

El circuito:

Y con el circuito terminado, solo queda hacer las pruebas.
El código de este ejemplo lo dejo para descarga en los siguientes enlaces:

– Archivos librería protocolo NEC para Arduino: NECIRrcv
– Código ejemplo de control de un led RGB con mando a distancia: LedRGBIR.pde

Y una prueba de funcionamiento!

😀 

90 comentarios en “Recepción IR con Arduino

Deja un comentario!