|   FOROS      |         |     KIO4 |      
   Inicio B4A (Basic4Android) App inventor 2 WAMP - PHP - MySQL
   Elastix - VoIP Cosas de Windows Webs interesantes Arduino
  Estación meteorológica Visual Basic Script (VBS) Translate:
Búsqueda en este sitio:


Nuevo concurso para España, Argentina, Brasil, Chile, Colombia, Ecuador, México, Perú y Portugal.

Arduino en español
Circuitos con Arduino - Juan Antonio Villalpando

-- Tutorial de iniciación a Arduino --

Volver al índice del tutorial

____________________________

26.- Infrarrojo.

En esta ocasión voy a presentar la emisión/recepción por infrarrojo (IR) con el Arduino.

Me baso en este kit infrarrojo para Arduino: IR Receiver Module Wireless Remote Control Kit for Arduino (1 x CR2025)

Se puede encontrar en Aliexpress por 1 €,

Se trata de un diodo emisor de infrarrojo, un modulo receptor de infrarrojo, un mando a distancia y unos cablecillos.
NOTA: el diodo emisor no me convence demasiado, llega a poca distancia, prueba con un diodo LED-rojo normal como emisor IR.

- Emite y recibe a una frecuencia de 38KHz.
- Puede ser utilizado a distancia de unos 8 metros.
- Ángulo de efectividad: 60º

- Atención: hay modelos del módulo infrarrojo donde el patillaje es: Señal, GND y Vcc.
- En el caso del módulo infrarrojo utilizado el patillaje es: GND, Vcc y Señal.


Patillaje del módulo utilizado en este tutorial.

Tutorial: http://learn.adafruit.com/ir-sensor/reading-ir-commands en él podemos ver cómo obtener la señal infrarroja enviada por un mando a distancia y cómo enviar señal infrarroja al receptor.
_______________________ 
- Librerías.

- Bajas esta: IRremote.zip de Ken Shirriff.

La descomprimes y copia la carpeta en ../libraries/IRremote.

Esta librería tiene un problema, que es incompatible con la librería RobotIRremote.

IMPORTANTE:

La librería IRremote es incompatible con RobotIRremote, que posiblemente ya estaba instalada.
Debes borrar o comprimir esa librería y reiniciar el IDE, para que funcione.

 

(Si sigues teniendo problemas bajas el IDE 0022 y copia en su carpeta libraries el IRremote)
_______________

Vamos a comenzar viendo varios programas y utilizando el módulo infrarrojo y el mando a distancia.
(En estos programas no hace falta el diodo emisor del kit).


_______________
1.- IRrecvDemo

- Este programa viene como ejemplo en la librería: IRremote.zip

- Al pulsar el mando a distancia, en el Serial Monitor saldrá el código de la tecla pulsada.
- Debemos conectar el pin S del módulo de infrarrojo al pin 11 del Arduino.
- El mando a distancia puede estar a varios metros del receptor (5 m...).

IRrecvDemo
/*
 * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */

#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

- El código está en hexadecimal.
- Cada tecla tiene un código.
- Comienza por FF
- Si dejamos le tecla pulsada saldrá:
FFFFFFFFFFFFF

- Este programa muestra los códigos del mando a distancia del kit (NEC) y de los mando a distancia de SONY, PANASONIC, SAMSUNG, JVC. Si es otro modelo de mando a distancia saldrá 0.


______________

2.- IRrecvDump
- Este programa viene como ejemplo en la librería: IRremote.zip

- Al pulsar el mando a distancia, en el Serial Monitor saldrá el código de la tecla pulsada e información del envío.
- Debemos conectar el pin S del módulo de infrarrojo al pin 11 del Arduino.

IRrecvDump
/*
 * IRremote: IRrecvDump - dump details of IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 * JVC and Panasonic protocol added by Kristian Lauszus 
   (Thanks to zenwheel and other people at the original blog post)
 * LG added by Darryl Smith (based on the JVC protocol)
 */

#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
//  decode_results *results = (decode_results *)v
void dump(decode_results *results) {
  int count = results->rawlen;
  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(" (");
  Serial.print(results->bits, DEC);
  Serial.println(" bits)");
  Serial.print("Raw (");
  Serial.print(count, DEC);
  Serial.print("): ");

  for (int i = 0; i < count; i++) {
    if ((i % 2) == 1) {
      Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
    }
    else {
      Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
    }
    Serial.print(" ");
  }
  Serial.println("");
}


void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    dump(&results);
    irrecv.resume(); // Receive the next value
  }
}

- El código está en hexadecimal.
- Cada tecla tiene un código.
- Comienza por FF

______________
3.- Encender/apagar LED 13


- Este programa está basado en el primero que hemos visto: IRrecvDemo.
- Se trata de pulsar las teclas 1 y 2.
- Cuando pulsamos la tecla 1, se encenderá el LED13
- Cuando pulsamos la tecla 2, se apagará el LED13.
- El código decimal de la tecla 1 es 12495
- El código decimal de la tecla 2 es 6375
- Podemos ver los códigos decimales de cada tecla mediante el Serial Monitor.

- Al pulsar el mando a distancia, en el Serial Monitor saldrá el código de la tecla pulsada.
- Debemos conectar el pin S del módulo de infrarrojo al pin 11 del Arduino.

Apaga/enciende_LED13
#include <IRremote.h>

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
int tecla;

void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
pinMode(13, OUTPUT); 
}

void loop() {
if (irrecv.decode(&results)) {
// Serial.println(results.value, HEX);
tecla=results.value; // Obtenemos el valor decimal de la tecla pulsada
Serial.println(tecla);
if (tecla==12495){ // Código de la tecla 1 
digitalWrite(13, HIGH);
}
if (tecla==6375){ // Código de la tecla 2 
digitalWrite(13, LOW);
}
irrecv.resume(); // Receive the next value
}
}

Códigos

0
1
2
3
4
5
6
7
8
9
+
-

26775
12495
6375
31365
4335
14535
23205
17085
19125
21165
-28561
-22441

- Estos programas están preparados para recibir señales infrarrojas del emisor que viene en el kit (NEC) así como de varios mandos como SONY, REC5, JVC, SAMSUNG, REC6...

______________________
______________________

4.- Ahora vamos a utilizar el diodo y el módulo infrarrojo.


Nota: como se verá, no funciona correctamente en la misma placa Arduino el emisor y el receptor.

Lo primero que se nos ocurre es poner en la misma placa el diodo y el módulo y con un mismo programa enviar un dato mediante el diodo y que lo reciba el módulo, pero parece que esto no funciona.

Desde la misma placa de Arduino no podemos realizar un programa que envíe y reciba datos:
http://arduino.cc/forum/index.php/topic,20794.0.html

Asi que vamos a utilizar dos Arduinos, uno envía la señal mediante el diodo y el otro la recibe mediante el módulo.

Debemos tener en cuenta que un Arduino utilizará un puerto COM y el otro Arduino otro puerto COM. Y que para enviar y recibir datos lo haremos desde el Serial Monitor.

http://www.arcfn.com/2010/11/testing-arduino-ir-remote-library.html
El ejemplo lo puedes bajar de la librería carpeta examples/test2
Debes instalar ese programa en los dos Arduinos.
Automáticamente detectará quién es el emisor (Sender mode) y quién es el receptor (Receiver mode).
El emisor (diodo) envía varios códigos de SONY, PANASONIC, SAMSUNG, JVD, NEC, RC5 y RC6.
El receptor (módulo) recibe esos códigos y escribe un OK.

El diodo emisor de IR es de poca potencia, debes acercar mucho el diodo al receptor (1 cm).

___________________________
5.- Mi versión

Yo voy a realizar un proyecto más modesto.

- En el Arduino donde está el diodo emisor cargamos el siguiente programa de Envio de dato.
- Luego entramos en el Serial Monitor. Escribimos en el casillero de arriba del Serial Monitor cualquier caracter repetidamente: 1111111111

- y luego pulsamos Enviar (Send).

Envío de dato.
#include <IRremote.h>

IRsend irsend;

void setup()
{
Serial.begin(9600);
}

void loop() {
if (Serial.read() != -1) {
for (int i = 0; i < 3; i++) {
irsend.sendNEC(0xFF30CF, 32); // envia el codigo del 1 

delay(100);

}
}
}
void loop() {
if (irrecv.decode(&results)) {
// Serial.println(results.value, HEX);
tecla=results.value; // Obtenemos el valor decimal de la tecla pulsada
Serial.println(tecla);
if (tecla==12495){ // Código de la tecla 1 
digitalWrite(13, HIGH);
}
if (tecla==6375){ // Código de la tecla 2 
digitalWrite(13, LOW);
}
irrecv.resume(); // Receive the next value
}
}


-----------------------

- En el otro Arduino, donde se encuentra el módulo infrarrojo, cargamos el programa: IRrecvDump que hemos visto anteriormente.
- Entramos en su Serial Monitor.

Cuando enviamos un carácter mediante el diodo emisor, lo recibirá el módulo receptor.

1.- En el Arduino del diodo emisor escribimos 1111111 (escribir cualquier caracter) y pulsamos el botón Send. Se enviará la señal FF30CF
2.- En el Arduino del módulo receptor recibimos (mediante el programa IRrecvDemo), la señal enviada.

Problemas: el diodo emisor que trae el kit, es de "poca potencia", con lo cual debemos acercar muchísimo, prácticamente tocar el diodo y el módulo receptor, para que funcione.
He probado utilizar un diodo LED-rojo normal como diodo emisor de IR y resulta que tiene "más potencia" que el diodo de IR que viene en el kit.

De todos modos para que la señal del diodo emisor active el módulo los dos dispositivos deben estar a menos de 5 cm.

______________________
6.- Enviar códigos para actuar sobre electrodomésticos SONY, SAMSUNG,...

- SONY

Podemos enviar códigos a dispositivos SONY mediante:

SONY
void loop() {
if (Serial.read() != -1) {
for (int i = 0; i < 3; i++) { // Cada código se envia 3 veces
irsend.sendSony(0xa90, 12); // Sony TV power code. El codigo a90 es el apagado en SONY.
delay(100);
} } }

- Si tenemos un mando SONY, mediante el programa visto anteriormente IRrecvDump, podemos obtener los códigos de cada tecla.
Luego lo aplicamos al programa de Envío de datos y podemos actuar sobre el dispositivo SONY mediante IR.

-----------------------

- SAMSUNG


- También a SAMSUNG: http://arduinostuff.blogspot.com.es/

En este caso debemos enviar una fila de códigos:

// Power ON/OFF
const unsigned int S_pwr[68]={4600,4350,700,1550,650,1550,650,1600,650,450,650,450,650,450,650,450,700,
400,700,1550,650,1550,650,1600,650,450,650,450,650,450,700,450,650,450,650,450,650,1550,700,450,650,
450,650,450,650,450,650,450,700,400,650,1600,650,450,650,1550,650,1600,650,1550,650,1550,700,1550,650,1550,650};

irsend.sendRAW(S_pwr,68,38);

 

// Se enviará una fila de 68 números a 38 KHz

// De esta manera se encenderá o apagará el televisor SAMSUNG.

Esos códigos los podemos obtener mediante el programa: IRrecvDump.

Vamos al programa IRrecvDump.

Pulsamos un botón de un mando SAMSUNG y obtenemos...

Could not decode message
Raw (68): -9366 4500 -4450 550 -1650 600 -1650 600 -1600 600 -550 550 -550 600 -500 600 -550 550 -550 550 -1650 etc

- Copiamos en el Bloc de notas el código obtenido. Quitamos Raw (68) y el primer número -9366
- Reemplazamos espacio en blanco por ,
- Reemplazamos signo - por ""
El número obtenido lo insertamos en...

unsigned int S_pwr[68]={4500,4450,550,1650,600,1650,600,1600,600,550,550,550,600,500,600,550,550,550,550,1650 etc ...};

irsend.sendRAW(S_pwr,68,38);

Programa para el Arduino. Envío de dato SAMSUNG.

#include <IRremote.h>

IRsend irsend;

unsigned int S_pwr[68]={4550,4400,550,1700,550,1650,600,1600,600,550,550,550,
600,500,600,500,600,500,650,1600,600,1650,550,1650,600,500,600,550,550,550,600,
500,600,500,600,550,550,1650,600,500,600,550,550,550,600,500,600,500,600,550,550,
1650,600,500,600,1650,550,1650,600,1650,550,1650,600,1650,600,1600,600};

void setup()
{
Serial.begin(9600);
}

void loop() {

irsend.sendRAW(S_pwr,68,38);
delay(100);

}

-----------------------

- Otras web.

- LG TV USB IR-Hack with Arduino

- A Multi-Protocol Infrared Remote Library for the Arduino. Ken Shirriff's Blog

________________________________

 

- Mi correo:
juana1991@yahoo.com
- KIO4.COM - Política de cookies. Textos e imágenes propiedad del autor:
© Juan A. Villalpando
No se permite la copia de información ni imágenes.
Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus hábitos de navegación y realizan análisis de uso de nuestro sitio.
Si continúa navegando consideramos que acepta su uso. Acepto    Más información