El sensor de infrarrojos está conformado en su función básica por un LED que emite pulsos de luz infrarroja siguiendo un patrón determinado que permite al dispositivo conocer la función a realizar.
Para poder controlar nuestro Arduino mediante un control remoto a distancia y un sensor IR, deberemos conocer el protocolo interno de comunicación del mando.
Este sensor tiene un filtro interno para detectar frecuencias infrarrojos cercanas a 38KHz, lo que lo hace compatible con la mayoría de mandos infrarrojos, posee 3 pines de conexión GND, VCC y OUT (o DATA) , el cual nos permite conectar directamente a un pin digital de nuestro Arduino o cualquier microcontrolador que deseemos usar.
Cada fabricante de control remoto desarrolla su propio protocolo de comunicación, por lo que no todos son iguales. Pero sí tienen en común el uso de unas señales que oscilan en unas frecuencias de 36 a 50KHz, siendo la más utilizada la de 38KHz.
El control remoto que usa el protocolo NEC que trabaja a 38KHz de frecuencia, el formato del tren de pulsos que envía al presionar una tecla se muestra en la siguiente gráfica:
La particularidad de este protocolo, es que envía doble vez tanto la dirección como el comando, de forma normal y negado, con esto posteriormente se puede validar los datos.
La dirección está asociada a un dispositivo, por ejemplo un TV, un equipo de sonido, un VCR, etc. Y el comando está asociado a la acción o función del botón. Por ejemplo subir el volumen, apagar, el número 1 o 2, etc.
Vamos a ver como si se tratase de un solo bloque de datos 32 bits.
A continuación se muestra los valores de los datos correspondientes a los botones del control en mención:
También si se realiza con el control remoto de TV SONY.
EL protocolo SONY trabaja con una frecuencia de 40KHz, en la siguiente figura se muestra los pulsos que se envían cuando se presiona una botón.
Trabaja con 12 bits de datos , de los cuales 5 bits son para la direccion y 7 bits para comando o función. Existen variaciones de 15 bits y 20 bit pero en todos los bits de comando son de 7 bits.
A continuación se muestra algunos de los datos correspondientes al protocolo SONY.
¿Cómo podemos distinguir en cada caso que botón de nuestro mando estamos pulsando?
El control remoto emite una señal al dispositivo de entrada, en este caso es un receptor de infrarrojos. Lo hace codificando una orden mediante un led infrarrojo que emite un haz de luz que debe ser leído por el dispositivo. Tendremos, por tanto, para cada botón del mando, una codificación distinta, de forma que podemos distinguir cada caso.
Para determinarlo, es necesario utilizar una nueva librería que deberemos incorporar al programa. IRremote es una de las librerías más usadas y completas para trabajar con protocolos de controles infrarrojos, tiene implementado varios protocolos de las marcas más conocidas como Sony, LG, Samsung, Sanyo, etc
https://github.com/Arduino-IRremote/Arduino-IRremote
Posteriormente, debe ser incluida en el apartado de Librerías del IDE.
Conexiones
Viendo el sensor de frente:
– patilla derecha conectada a 5V (el valor de la tensión puede variar entre 2,5 y 5,5V)
– patilla central conectada a tierra
– patilla izquierda, la que manda datos, con resistencia 220 a un pin digital.
El sketch para la lectura que emplearemos será el siguiente:
#include <IRremote.h> int RECV_PIN = 8; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // Empezamos la recepción por IR } void dump(decode_results *results) { // Dumps out the decode_results structure. // Call this after IRrecv::decode() Serial.print("("); Serial.print(results->bits, DEC); Serial.print(" bits)"); if (results->decode_type == UNKNOWN) { Serial.print("Unknown encoding: "); } else if (results->decode_type == NEC) { Serial.print("Decoded NEC: "); } else if (results->decode_type == SONY) { Serial.print("Decoded SONY: "); } else if (results->decode_type == RC5) { Serial.print("Decoded RC5: "); } else if (results->decode_type == RC6) { Serial.print("Decoded RC6: "); } else if (results->decode_type == PANASONIC) { Serial.print("Decoded PANASONIC - Address: "); Serial.print(results->address, HEX); Serial.print(" Value: "); } else if (results->decode_type == LG) { Serial.print("Decoded LG "); } else if (results->decode_type == JVC) { Serial.print("Decoded JVC "); } else if (results->decode_type == AIWA_RC_T501) { Serial.print("Decoded AIWA RC T501 "); } else if (results->decode_type == WHYNTER) { Serial.print("Decoded Whynter "); } Serial.print(results->value, HEX); Serial.print(" (HEX) , "); Serial.print(results->value, BIN); Serial.println(" (BIN)"); } void loop() { if (irrecv.decode(&results)) { dump(&results); irrecv.resume(); // empezamos una nueva recepción } delay(500); }
Utilizando algún control remoto y monitorizando los valores que va adquiriendo cada botón mediante la opción Monitor Serial del IDE.
Ejemplo de uso del Sensor IR
Encendido y apagado de un Led
Para el control remoto que hemos utilizado , la lectura del ON/OFF se corresponde a el código del botón (3125149440) . pulsado enciende el led/ apaga el led.
#include <IRremote.h> int RECV_PIN = 8; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { irrecv.enableIRIn(); // Empezamos la recepción por IR pinMode(7, OUTPUT); } boolean on = LOW; void loop() { if (irrecv.decode(&results)== 3125149440) { // Dato recibido, conmutamos el LED on = !on; digitalWrite(7, on? HIGH : LOW); irrecv.resume(); // empezamos una nueva recepción } delay(500); }
En el armado de este sencillo circuito, teniendo en cuenta las conexiones del sensor IR y el ejemplo de la lectura de los códigos, tenemos que incorporar a la conexión un LED junto con una resistencia, en el pin 7.
- Tutorial
- Arduino
Excelente material. Saludos
Gracias
yo tengo un control LG que me decodifico los códigos sin problemas. Gracias
Si , decodifica controles de diferentes marcas
Gracias por la información. Abraxo