¿Funciona el circuito infrarrojos? Solucionado

Bueeeeeeno, antes de nada,uenas noches a tod@s, ya vuelvo a rondar enredando por aquí. Después de cargarme un par de receptores IR, vuelvo a la carga (parece que no escarmiento). Pero finalmente parece que he conseguido conectar el receptor IR correctamente. Al menos no se ha quemado.

La cosa es que, antes de nada, quiero saber que códigos gobierna cada uno de los botones de mando del emisor (un mando de TV genérico).

He cargado el programa para localizar los códigos en la placa Arduino

/* Raw IR decoder sketch!
This sketch/program uses the Arduno and a PNA4602 to
decode IR received. This can be used to make a IR receiver
(by looking for a particular code)
or transmitter (by pulsing an IR LED at ~38KHz for the
durations detected
Code is public domain, check out www.ladyada.net and adafruit.com
for more tutorials!
*/

// We need to use the 'raw' pin reading methods
// because timing is very important here and the digitalRead()
// procedure is slower!
//uint8_t IRpin = 2;
// Digital pin #2 is the same as Pin D2 see
// http://arduino.cc/en/Hacking/PinMapping168 for the 'raw' pin mapping
#define IRpin_PIN PIND
#define IRpin 2
// for MEGA use these!
//#define IRpin_PIN PINE
//#define IRpin 4

// the maximum pulse we'll listen for - 65 milliseconds is a long time
#define MAXPULSE 65000

// what our timing resolution should be, larger is better
// as its more 'precise' - but too large and you wont get
// accurate timing
#define RESOLUTION 20

// we will store up to 100 pulse pairs (this is -a lot-)
uint16_t pulses[100][2]; // pair is high and low pulse
uint8_t currentpulse = 0; // index for pulses we're storing

void setup(void) {
  Serial.begin(9600);
  Serial.println("Ready to decode IR!");
}

void loop(void) {
  uint16_t highpulse, lowpulse; // temporary storage timing
  highpulse = lowpulse = 0; // start out with no pulse length
  
  
// while (digitalRead(IRpin)) { // this is too slow!
    while (IRpin_PIN & (1 << IRpin)) {
     // pin is still HIGH

     // count off another few microseconds
     highpulse++;
     delayMicroseconds(RESOLUTION);

     // If the pulse is too long, we 'timed out' - either nothing
     // was received or the code is finished, so print what
     // we've grabbed so far, and then reset
     if ((highpulse >= MAXPULSE) && (currentpulse != 0)) {
       printpulses();
       currentpulse=0;
       return;
     }
  }
  // we didn't time out so lets stash the reading
  pulses[currentpulse][0] = highpulse;
  
  // same as above
  while (! (IRpin_PIN & _BV(IRpin))) {
     // pin is still LOW
     lowpulse++;
     delayMicroseconds(RESOLUTION);
     if ((lowpulse >= MAXPULSE) && (currentpulse != 0)) {
       printpulses();
       currentpulse=0;
       return;
     }
  }
  pulses[currentpulse][1] = lowpulse;

  // we read one high-low pulse successfully, continue!
  currentpulse++;
}

void printpulses(void) {
  Serial.println("\n\r\n\rReceived: \n\rOFF \tON");
  for (uint8_t i = 0; i < currentpulse; i++) {
    Serial.print(pulses[i][0] * RESOLUTION, DEC);
    Serial.print(" usec, ");
    Serial.print(pulses[i][1] * RESOLUTION, DEC);
    Serial.println(" usec");
  }
  
  // print it in a 'array' format
  Serial.println("int IRsignal[] = {");
  Serial.println("// ON, OFF (in 10's of microseconds)");
  for (uint8_t i = 0; i < currentpulse-1; i++) {
    Serial.print("\t"); // tab
    Serial.print(pulses[i][1] * RESOLUTION / 10, DEC);
    Serial.print(", ");
    Serial.print(pulses[i+1][0] * RESOLUTION / 10, DEC);
    Serial.println(",");
  }
  Serial.print("\t"); // tab
  Serial.print(pulses[currentpulse-1][1] * RESOLUTION / 10, DEC);
  Serial.print(", 0};");
}

He abierto la pantalla del monitor serie y únicamente me dice que “Ready to decode IR” (Imagen1), es decir, que detecta el sistema y se dispone a decodificar. Por mucho botones del mando a distancia que pulse no lee nada.

Si desconecto uno de los cables de alimentación, y vuelvo a conectarlo, aparece en la pantalla una lectura “Received” y unos datos (Imagen2), pero sigue sin marcar nada más, ni que pulse botones.

Si desconecto el cable de datos, y vuelvo a conectarlo, aparece toda otra lectura (Imagen3), que no consigo entender de que es ni de donde viene.

Espero que no se me olvide nada y que haya suficientes datos para ver si alguien tiene alguna idea de donde pueda estar el problema.

¿Alguien puede echarme un cable?

Gracias por la ayuda

salu2

una pregunta tonta el mando genérico este funciona? es decir lo has comprobado

Go_zalo, hahahahaha, sí, claro que funciona y no te preocupes, que la pregunta no és tan tonta, yo tambien conozco casos de estos, hahahahahaha... Per coñas a parte, lo he comprobado con la camara del móvil y tambien con otro mando, por si acaso... Pero sí, és el que uso diariamente para la TV...

salu2

Bueno amigo buscando un poco sobre mi problema con el código del cronometro he encontrado esto creo q es lo que estas buscando bueno es una forma de hacerlo por si te funcionase

http://geekayuda.blogspot.com.es/2013/12/arduino-sensor-ir-infrarrojo.html

Chelas, lo siento, pero no consigo detectar los errores de complilación, que son bastantes, solamente en el primer skech, el de decodificar los botones del mando...

Mañana volveré a probar, pero...

Gracias de todas maneras.

salu2

Hola Lokko, seguí tu post pero no quise opinar pero como no veo progreso debo preguntarte por algo que yo hubiera hecho.

Porque no usas la librería IRremote?

A ver, este problema ya lo tuve la primera vez que me metí en el tema IR, y gracias a Noter, Jose y Srubyte, funcionó. La cosa es que entonces, conseguí que funcionara, hasta que quemé el receptor. Pero ahora, con ese sketch, ni tan siquiera da señales que se prepare para leer:

/*Codis per ordenar a Arduino que executi les ordres
Enviades pel comandament a distància.

(01 Control per infrarojos)
http://www.trastejant.es/circuitos/ArduinoIR.html

Març 2015*/

#include <Arduino.h>
		//Llamamos a librería del protocolo NEC
		#include <NECIRrcv.h>
		//Pin del sensor
		#define sensor 2
		
		//Indicamos el pin en el que tenemos conectado el Led				
		int led = 12;
		
		/*Ahora vamos a definir cada orden del mando a distancia 
                     con una variable para que nos sea más cómodo utilizarlas despues. 
                     Recuerda que cada modelo y/o marca de mando a distancia 
                     envia sus propios códigos,asi que tendrás que investigar cuales 
                     son los de tu mando antes de poder usarlo.
		
		En la sección de circuitos encontrarás todo lo necesario para hacerlo.*/
		
		//Código del botón que usaremos para encender. 
		long enciende =  0xEF10BF00;
		//Código del botón que usaremos para apagar.
		long apaga = 0XEE11BF00;
		
		//Creamos un objeto de la libreria NEC llamado ir para poder usarla.
		NECIRrcv ir(sensor);		
		void setup(){
		
			//iniciamos la recepcion
			ir.begin();
			
			//indicamos que el pin del led es una salida
			pinMode(led,OUTPUT);
		}
		
		void loop(){
			//Almacenaremos la orden del mando en una variable llamada orden
			unsigned long orden; 
			
			//mientras la conexion de infrarrojos este disponible...
			while (ir.available()) {
			//..Comprobaremos si es la que estamos esperando
				if(orden == enciende){
				
					//si lo es, encendemos
					digitalWrite(led,HIGH);
					
				}else if(orden == apaga){
				
					//Si la orden es apagar, apagamos
					digitalWrite(led,LOW);
				
				}
			}
		}

El sketch que sí da señales es este:

/* Raw IR decoder sketch!
This sketch/program uses the Arduno and a PNA4602 to
decode IR received. This can be used to make a IR receiver
(by looking for a particular code)
or transmitter (by pulsing an IR LED at ~38KHz for the
durations detected
Code is public domain, check out www.ladyada.net and adafruit.com
for more tutorials!
*/

// We need to use the 'raw' pin reading methods
// because timing is very important here and the digitalRead()
// procedure is slower!
//uint8_t IRpin = 2;
// Digital pin #2 is the same as Pin D2 see
// http://arduino.cc/en/Hacking/PinMapping168 for the 'raw' pin mapping
#define IRpin_PIN PIND
#define IRpin 2
// for MEGA use these!
//#define IRpin_PIN PINE
//#define IRpin 4

// the maximum pulse we'll listen for - 65 milliseconds is a long time
#define MAXPULSE 65000

// what our timing resolution should be, larger is better
// as its more 'precise' - but too large and you wont get
// accurate timing
#define RESOLUTION 20

// we will store up to 100 pulse pairs (this is -a lot-)
uint16_t pulses[100][2]; // pair is high and low pulse
uint8_t currentpulse = 0; // index for pulses we're storing

void setup(void) {
  Serial.begin(9600);
  Serial.println("Ready to decode IR!");
}

void loop(void) {
  uint16_t highpulse, lowpulse; // temporary storage timing
  highpulse = lowpulse = 0; // start out with no pulse length
  
  
// while (digitalRead(IRpin)) { // this is too slow!
    while (IRpin_PIN & (1 << IRpin)) {
     // pin is still HIGH

     // count off another few microseconds
     highpulse++;
     delayMicroseconds(RESOLUTION);

     // If the pulse is too long, we 'timed out' - either nothing
     // was received or the code is finished, so print what
     // we've grabbed so far, and then reset
     if ((highpulse >= MAXPULSE) && (currentpulse != 0)) {
       printpulses();
       currentpulse=0;
       return;
     }
  }
  // we didn't time out so lets stash the reading
  pulses[currentpulse][0] = highpulse;
  
  // same as above
  while (! (IRpin_PIN & _BV(IRpin))) {
     // pin is still LOW
     lowpulse++;
     delayMicroseconds(RESOLUTION);
     if ((lowpulse >= MAXPULSE) && (currentpulse != 0)) {
       printpulses();
       currentpulse=0;
       return;
     }
  }
  pulses[currentpulse][1] = lowpulse;

  // we read one high-low pulse successfully, continue!
  currentpulse++;
}

void printpulses(void) {
  Serial.println("\n\r\n\rReceived: \n\rOFF \tON");
  for (uint8_t i = 0; i < currentpulse; i++) {
    Serial.print(pulses[i][0] * RESOLUTION, DEC);
    Serial.print(" usec, ");
    Serial.print(pulses[i][1] * RESOLUTION, DEC);
    Serial.println(" usec");
  }
  
  // print it in a 'array' format
  Serial.println("int IRsignal[] = {");
  Serial.println("// ON, OFF (in 10's of microseconds)");
  for (uint8_t i = 0; i < currentpulse-1; i++) {
    Serial.print("\t"); // tab
    Serial.print(pulses[i][1] * RESOLUTION / 10, DEC);
    Serial.print(", ");
    Serial.print(pulses[i+1][0] * RESOLUTION / 10, DEC);
    Serial.println(",");
  }
  Serial.print("\t"); // tab
  Serial.print(pulses[currentpulse-1][1] * RESOLUTION / 10, DEC);
  Serial.print(", 0};");
}

El IR que utilicé entonces, era un kit comprado al chino, compuesto por un mando a distancia y un KY-022 de IR. En el esquema que llevaba el zócalo del IR, con led, ponía claramente las conexiones (mirando el receptor de cara): 1 Datos, 2 VSS y 3 GND. Conectándolo de esta manera funcionó. Como lo quemé, compre otros en una tienda física, esta vez STOP4838. Segun la hoja de datos (desconozco el fabricante), las conexiones son las mismas, pero cuando veo algunos proyectos sobre el tema, el positivo y negativo cambian de posición. Al final, ya no se como conectarlos.

Si utilizo el mismo esquema de conexiones y el mismo sketch (el segundo), no funciona (dice que está preparado para leer y punto). El led del zocalo se enciende permanente, pero no da ningun dato… He probado con otro receptor y sigue igual. Si desconecto el cable de datos y lo vuelvo a conectar, sigue dando el mismo tren de codigos, pero sin haber pulsdao ningun boton del mando, de ningún mando…

“No creo en brujas, pero haberlas aylas…”

Gracias

bueno, yo comenzaría por lo que tengo físico como bien has dicho. Pondría un esquema electrónico para poder darte sugerencias y ver que podemos hacer con minimos elementos que nos asegure que funciona, que recibe señales. Luego si detectamos que recibe señales pasemos a ver si las interpreta. Porque ahora estas ahi, no sabes si es la rutina o si es el receptor. Asi que al menos para que otro o yo te demos una mano, necesitamos esa información.

A ver, llevo todo el día con la juerga esta, y he descubierto varias cosas:

1.- Estoy trabajando delante del ordenador, con un lámpara de despacho de sobremesa, con una lámpara fluorescente (de esas que tienen dos tubos), a poca distancia del proyecto… Y resulta que este tipo de lámpara AFECTA AL RECEPTOR IR, por eso marca códigos indescifrables sin tocar ningún mando… Lo he solucionado poniendo el receptor a oscuras, sin esa luz.

2.- He probado con un receptor extraído de un vídeo y, casualidad, lo he conectado correctamente y ahora funciona!!! Da lecturas al pulsar un botón (y también si lo acerco al fluorescente). En otro momento haré exactamente la misma instalación, pero con los receptores anteriores, para comprobar si funcionan o que pasa.

3.- Pero tenemos otro problema: los códigos que da en el monitor serie son raros: pulso un botón y da una lectura. Pulso el mismo botón y la lectura es diferente. Vuelvo a pulsar el mismo botón y vuelve a dar otra lectura diferente Adjunto imagen, de tres códigos diferentes pulsando el mismo botón). Con este panorama no veo la manera de interpretar los códigos, de manera de poderlos utilizar para programar ningún sistema.

¿Alguien entiende porque da códigos diferentes pulsando el mismo botón del mando?¿Sabe alguien como descifrar este jeroglífico para poder discriminar que código corresponde a cada tecla que se pulse, para poder darle un número a cada tecla y poder utilizarlo en los proyectos?

Gracias por la ayuda

salu2

Ready to decode IR.pdf (17.6 KB)

Haz por ahora un truco simple, ponle un tubo que cubra la interferencia posible del ambiente. e intenta apuntar dirctamente con el control remoto al Receptor a ver si repite dos veces los códigos.

Hola, Surbyte, gracias por responder. Te explico:

Sabiendo que el circuito funciona, he cambiado el receptor que funciona, por los otros dos que no sabía si eran buenos. Pues con ninguno de los dos funciona. Ya empiezo a dudar de si están fritos o que. ¿Sabes si hay manera de comprobarlos? ¿No será que atienden a otra frecuencia, no compatible con la mayoría de los mandos generalistas? (el receptor que me funciona está extraído de una reproductor de vídeo viejo. Los otros dos son comprados en tienda física).

Me he dado cuenta que, después de sacar el receptor que no funciona y colocar el que sí, debía resetear la placa, porqué si no, no funcionaba.

Con el receptor que funciona, lo he aislado. He apagado la lámpara de la mesa, lo he encerrado en el puño y he puesto lejos el móvil.

También lo he encerrado en un tubo de cartulina y le he abierto un pequeño agujero para el sensor.

De todas las pruebas que he hecho, alguna coincidía en algunos códigos, pero no la mayoría, es decir, que parece inestable. De cuando en cuando, en estas mismas condiciones, aparece espontáneamente un tren de códigos (diferentes de los que da el mando), sin que haga nada ni pulse ningún botón. Debe haber alguna interferencia, pero no se de donde procede (¿Tal vez de módem, la pantalla del ordenador o algún aparato electrónico asociado al ordenador?). Lo dicho, es inestable.

Pero lo que más me despista, es que se trata de un receptor estándar de un reproductor de vídeo corriente, es decir, que durante su vida útil se encontraba en un ambiente en condiciones “normales”, con interferencias de todo tipo, y debería de funcionar sin problemas.

¿Alguna idea?

Gracias por la ayuda

Salu2

Mi idea de nuevo es la misma de antes.
Usa IRremote.h Library!

Sigue un tutorial como este IRremote Library, Send & Receive Infrared Remote Control

Ves este código? Usa la librería IRremote.h que te dije antes.
Mira abajo y verás que reconoce PROTOCOLOS SONY, RC5,RC6, NEC o DESCONOCIDO (UNKNOWN)

#include <IRremote.h>

const int RECV_PIN = 6;

IRrecv irrecv(RECV_PIN);

decode_results results;

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

void loop() {
  if (irrecv.decode(&results)) {
    if (results.decode_type == NEC) {
      Serial.print("NEC: ");
    } else if (results.decode_type == SONY) {
      Serial.print("SONY: ");
    } else if (results.decode_type == RC5) {
      Serial.print("RC5: ");
    } else if (results.decode_type == RC6) {
      Serial.print("RC6: ");
    } else if (results.decode_type == UNKNOWN) {
      Serial.print("UNKNOWN: ");
    }
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
}

Otro tutorial muy bien armado, paso a paso, con esquemas y códigos. Recomendable también.

A ver, esta librería ya la tengo en la biblioteca.

Probando el sketch que me envías, me el siguiente error (también da el mismo error probando los sketch de examples de la carpeta Arduino-IRremote-master):

C:\Users\Jaume\Desktop\Documents\Arduino\libraries\RobotIRremote\src\IRremoteTools.cpp:5:16: error: 'TKD2' was not declared in this scope
 int RECV_PIN = TKD2; // the pin the IR receiver is connected to
                ^
Error compilant.

Sobre las páginas que recomiendas, a parte de que el inglés y yo estamos peleados y no nos entendemos, ya estamos en lo mismo, las conexiones del receptor estan al revés: en lugar de Datos-vss-gnd, que es como me funciona a mi, marcan datos-gnd-vss...

Usa Chrome que te lo traduce bastante bien.

Sí, ese navegador utilizo, pero insisto, las conexiones del receptor son diferentes y ya dudo de todo...

Y sobre el error?

Bueno, ya he vuelto a lidiar con el problema. Finalmente, y con el mosqueo de la variación en las lecturas, he probado otro sketch y otro receptor (correctamente conectado), y he conseguido que funcione, es decir, que me de la misma lectura con el mismo botón y mucho más sencilla la lectura, incluso sin interferencias extrañas. Por lo tanto, he desestimado el trabajo anterior y he conseguido funcionar con este programa. Dejo el enlace aquí, por si le sirve a alguien:

http://elcajondeardu.blogspot.com.es/2014/02/utilizacion-mando-infrarrojos-i-lectura.html

Gracias a todos los que habéis echado un cable, especialmente a Surbyte, por su infinita paciencia conmigo.

Cierro el post y me pongo a investigar con otro tema. Ahora toca trastear con un display de cuatro dígitos... A ver si lo consigo...

Venga, saludos y gracias.

Finalmente nosotros te damos una guía pero lo resuelves tu. Es como dar un empujoncito para que arranques.
El mérito es tuyo por ser perseverante. Mira sino el foro, la cantidad de preguntas sin respuesta final.

Gracias por seguir hasta resolverlo.