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!

:D 

About these ads

79 pensamientos en “Recepción IR con Arduino

  1. hola estuve probando tu código y me sale el siguiente error:
    C:\Users\SHesTa\Desktop\uni\arduino-1.0.4\libraries\NECIRrcv/NECIRrcv.h:84: error: ‘byte’ does not name a type

    y lo que me interesa hacer es lo que dice: cristian

    13/04/2013 en 21:15
    kiero que comunicar dos arduinos, me podrias pasar un ejemplo de como enviar la info q yo desee no solo protocolos de televisión, etc si no datos aleatorios.

    • Meka, el problema que te da es porque a partir de la versión 1.0.0 del IDE de Arduino se han eliminado las variables tipo “Byte” por lo que para poder utilizar la librería NECIRrcv tendrás que utilizar una versión anterior.

      Por ejemplo la 0022 o 0023.

      Saludos!

    • todos esos códigos del tipo “0x10EF” son números hexadecimales, de esta forma no son más que números y si buscas por internet hay conversores de hexadecimal a decimal(numeros normales que todos conocemos), asi solo tienes que convertir un número decimal a hexadecimal y colocarlo enviarlo con alguna libreria de infrarrojos NEC( como irRemote) y luego leerlos con el otro arduino igual que haces con este programa.

    • Bryan, el problema que te da es porque a partir de la versión 1.0.0 del IDE de Arduino se han eliminado las variables tipo “Byte” por lo que para poder utilizar la librería NECIRrcv tendrás que utilizar una versión anterior.

      Por ejemplo la 0022 o 0023.

      Saludos!

    • Uziel, habría que ver exactamente cómo es tu receptor (modelo y datasheet) para ver la conexión cómo se realiza.

      Seguramente cambie el código también, si puedes darnos los datos del receptor, vemos como solucionarlo.
      Saludos

  2. Hola, me gustaría hacer esto de proyecto pero no entiendo como agregar la librería NEC, ya tengo la versión 0022, podrías ayudarme.

    • Luis Enrique, la libreria NEC debes colocarla en la carpeta “Libraries” de la carpeta Arduino 0022.

      A partir de ahi puedes hacer referencia a ella utilizando #include .

      Saludos!

  3. Se descarga la libreria si viene en .rar se descomprime,se copia a la carpeta” libraries” del arduino y automaticamente la carga,se abre en “file” — luego en “examples”

  4. oye mira tengo una gran duda ya tengo la vecion 0022 pero ahora me aparece este error y no se por qur pueda ser In file included from C:\Users\jarrvis\Desktop\Nueva carpeta (3)\arduino-0022\hardware\arduino\cores\arduino/WProgram.h:6,
    from sketch_nov09a.cpp:6:
    c:/users/jarrvis/desktop/nueva carpeta (3)/arduino-0022/hardware/tools/avr/lib/gcc/../../avr/include/math.h:439: error: expected unqualified-id before ‘double’
    c:/users/jarrvis/desktop/nueva carpeta (3)/arduino-0022/hardware/tools/avr/lib/gcc/../../avr/include/math.h:439: error: expected `)’ before ‘double’
    c:/users/jarrvis/desktop/nueva carpeta (3)/arduino-0022/hardware/tools/avr/lib/gcc/../../avr/include/math.h:439: error: expected `)’ before ‘double’

  5. Pingback: Robot controlado por Infrarrojos |

  6. Amigo, Está excelente tu pagina web, te agradesco por compartir tus conocimientos con nosotros. solo quiero mencionarte que el link de descarga de la libreria NECIRrcv no me abre la pagina de descarga. hay algun problema?

  7. ahora ya tengo la version 0022 y cargue el ejemplo de la libreria NEc de tu link..a mi tambien me sale exactamente el mismo mensaje de error compiling :
    In file included from E:\arduino-0022\hardware\arduino\cores\arduino/WProgram.h:6,
    from printcodes.cpp:6:
    e:/arduino-0022/hardware/tools/avr/lib/gcc/../../avr/include/math.h:439: error: expected unqualified-id before ‘double’
    e:/arduino-0022/hardware/tools/avr/lib/gcc/../../avr/include/math.h:439: error: expected `)’ before ‘double’
    e:/arduino-0022/hardware/tools/avr/lib/gcc/../../avr/include/math.h:439: error: expected `)’ before ‘double’

    es el mismo codigo get codes del ejemplo y misma version 0022 sale este error; ayuda por favor gracias

    • Marcos, si has copiado y pegado el código de ejemplo del blog, a veces las comillas se copian distintas a la sintaxis del lenguaje de Arduino.

      Sustituye todas las comillas “” que veas en el código por las que aparecen pulsando Shift + Numero 2.

      Y prueba nuevamente.

      Saludos!

  8. Hola, no se cual es mi problema, no puedo ni compilar, me marca esto:

    In file included from C:\arduino-0023\hardware\arduino\cores\arduino/WProgram.h:6,
    from printcodes.cpp:6:
    c:/arduino-0023/hardware/tools/avr/lib/gcc/../../avr/include/math.h:439: error: expected unqualified-id before ‘double’
    c:/arduino-0023/hardware/tools/avr/lib/gcc/../../avr/include/math.h:439: error: expected `)’ before ‘double’
    c:/arduino-0023/hardware/tools/avr/lib/gcc/../../avr/include/math.h:439: error: expected `)’ before ‘double’

    estoy tratando de compilar el ejemplo de la libreria, ojala sepas que puede ser :(

  9. ya instale la version 0022 e inluso la 0023 pero a un aparece el error de NECIRrcv.h:84: error: ‘byte’ does not name a type. Me podrías apoyar para solucionar el problema. No tienes la libreria con la correccion?

    • Eduvidal, seguro que estas usando la version 0022 o 0023?

      Parece un error más probable de lsa versiones 1.05 en adelante, donde han desaparecido las variables tipo BYTE.

      Saludos!

  10. Hola, gracias por el tutorial. Comentarte por si sirve de ayuda, que para que compile bien la librería NECIRrcv, hay que cambiar en el fichero NECIRrcv.h la línea #include “WConstants.h” por #include y en el fichero NECIRrcv.cpp la línea #include “WProgram.h” por #include
    Un saludo.

    • Perdón, se ha cortado el mensaje supongo que por tema del HTML, en ambos ficheros poner el #include “Arduino.h” pero en vez de encerrado entre comillas, entre los símbolos “mayor que” y “menor que”.

Deja un comentario!

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s