Problema Emisor Infrarojo (El receptor recibe otros datos)

Buenas tardes compañeros !!

Estoy partiéndome la cabeza con un problema que tengo, resulta que tengo un receptor de infrarrojos con el siguiente código (seguro que mas de uno sabe que código es)

#include <IRremote.h>
int recvPin = 12;
IRrecv irrecv(recvPin);

void  setup ( )
{
  Serial.begin(9600);   // Status message will be sent to PC at 9600 baud
  irrecv.enableIRIn();  // Start the receiver
}
void  ircode (decode_results *results)
{
  if (results->decode_type == PANASONIC) {
    Serial.print(results->address, HEX);
    Serial.print(":");
  }
  Serial.print(results->value, HEX);
}
void  encoding (decode_results *results)
{
  switch (results->decode_type) {
    default:
    case UNKNOWN:      Serial.print("UNKNOWN");       break ;
    case NEC:          Serial.print("NEC");           break ;
    case SONY:         Serial.print("SONY");          break ;
    case RC5:          Serial.print("RC5");           break ;
    case RC6:          Serial.print("RC6");           break ;
    case DISH:         Serial.print("DISH");          break ;
    case SHARP:        Serial.print("SHARP");         break ;
    case JVC:          Serial.print("JVC");           break ;
    case SANYO:        Serial.print("SANYO");         break ;
    case MITSUBISHI:   Serial.print("MITSUBISHI");    break ;
    case SAMSUNG:      Serial.print("SAMSUNG");       break ;
    case LG:           Serial.print("LG");            break ;
    case WHYNTER:      Serial.print("WHYNTER");       break ;
    case AIWA_RC_T501: Serial.print("AIWA_RC_T501");  break ;
    case PANASONIC:    Serial.print("PANASONIC");     break ;
    case DENON:        Serial.print("Denon");         break ;
  }
}
void  dumpInfo (decode_results *results)
{
  if (results->overflow) {
    Serial.println("IR code too long. Edit IRremoteInt.h and increase RAWBUF");
    return;
  }
  Serial.print("Encoding  : ");
  encoding(results);
  Serial.println("");
  Serial.print("Code      : ");
  ircode(results);
  Serial.print(" (");
  Serial.print(results->bits, DEC);
  Serial.println(" bits)");
}
void  dumpRaw (decode_results *results)
{
  Serial.print("Timing[");
  Serial.print(results->rawlen-1, DEC);
  Serial.println("]: ");
  for (int i = 1;  i < results->rawlen;  i++) {
    unsigned long  x = results->rawbuf[i] * USECPERTICK;
    if (!(i & 1)) {  // even
      Serial.print("-");
      if (x < 1000)  Serial.print(" ");
      if (x < 100)   Serial.print(" ");
      Serial.print(x, DEC);
    } else {  // odd
      Serial.print("     ");
      Serial.print("+");
      if (x < 1000)  Serial.print(" ");
      if (x < 100)   Serial.print(" ");
      Serial.print(x, DEC);
      if (i < results->rawlen-1) Serial.print(", ");
    }
    if (!(i % 8))  Serial.println("");
  }
  Serial.println("");
}
void  dumpCode (decode_results *results)
{
  Serial.print("unsigned int  ");
  Serial.print("rawData[");
  Serial.print(results->rawlen - 1, DEC);
  Serial.print("] = {");  
  for (int i = 1;  i < results->rawlen;  i++) {
    Serial.print(results->rawbuf[i] * USECPERTICK, DEC);
    if ( i < results->rawlen-1 ) Serial.print(",");
    if (!(i & 1))  Serial.print(" ");
  }
  Serial.print("};");  
  Serial.print("  // ");
  encoding(results);
  Serial.print(" ");
  ircode(results);  
  Serial.println("");  
  if (results->decode_type != UNKNOWN) {    
    if (results->decode_type == PANASONIC) {
      Serial.print("unsigned int  addr = 0x");
      Serial.print(results->address, HEX);
      Serial.println(";");
    }    
    Serial.print("unsigned int  data = 0x");
    Serial.print(results->value, HEX);
    Serial.println(";");
  }
}
void  loop ( )
{
  decode_results  results;
  if (irrecv.decode(&results)) {
    dumpInfo(&results);
    dumpRaw(&results);
    dumpCode(&results);
    Serial.println("");
    irrecv.resume();
  }
}

El caso es que luego tengo el típico mando a distancia que viene en esos kits de inicio de Arduino, el cual cuando presiono el botón 1, obtengo la siguiente información:

17:46:45.510 -> Code      : FF30CF (32 bits)
17:46:45.510 -> Timing[67]: 
17:46:45.544 ->      +8950, -4500     + 550, - 600     + 500, - 600     + 550, - 600
17:46:45.611 ->      + 550, - 550     + 550, - 550     + 600, - 550     + 550, - 600
17:46:45.678 ->      + 550, - 550     + 550, -1650     + 600, -1650     + 550, -1650
17:46:45.747 ->      + 550, -1700     + 550, -1650     + 550, -1700     + 550, -1650
17:46:45.817 ->      + 550, -1700     + 500, - 600     + 550, - 600     + 550, -1650
17:46:45.919 ->      + 550, -1650     + 600, - 550     + 550, - 600     + 550, - 550
17:46:45.988 ->      + 550, - 600     + 550, -1650     + 550, -1650     + 600, - 550
17:46:46.056 ->      + 550, - 600     + 550, -1650     + 550, -1700     + 550, -1650
17:46:46.126 ->      + 550, -1650     + 600
17:46:46.160 -> unsigned int  rawData[67] = {8950,4500, 550,600, 500,600, 550,600, 550,550, 550,550, 600,550, 550,600, 550,550, 550,1650, 600,1650, 550,1650, 550,1700, 550,1650, 550,1700, 550,1650, 550,1700, 500,600, 550,600, 550,1650, 550,1650, 600,550, 550,600, 550,550, 550,600, 550,1650, 550,1650, 600,550, 550,600, 550,1650, 550,1700, 550,1650, 550,1650, 600};  // NEC FF30CF
17:46:46.537 -> unsigned int  data = 0xFF30CF;

Hasta aquí todo correcto. Debo decir que esto es parte de un código el cual tengo conectado 3 relés a 3 luces, las cuales las puedo encender con botón/pulsados, desde Bluetooth, con el mando a distancia e incluso con un programador de tiempo.
Ahora bien, mi siguiente reto era hacerme mi propio mando a distancia, el caso es que tengo una placa Arduino nano, que he conectado el led emisor de infrarrojo y este otro código que envía señales RAW (he probado también otro código que envía por NEC). En ambos códigos, el resultado es el mismo, me envía la señal, sin embargo, la señal que recibo no es la que me esperaba:

8:04:19.628 -> Encoding  : UNKNOWN
18:04:19.662 -> Code      : [color=#0000ff]7F5A2467 [/color](32 bits)
18:04:19.696 -> Timing[67]: 
18:04:19.696 ->      +8750, -4500     + 500, - 700     + 400, - 700     + 450, - 650
18:04:19.767 ->      + 500, - 650     + 450, - 600     + 550, - 650     + 450, - 700
18:04:19.868 ->      + 450, - 600     + 500, -1750     + 500, -1800     + 300, -1750
18:04:19.937 ->      + 450, -1800     + 450, -1700     + 550, -1750     + 450, -1750
18:04:20.007 ->      + 450, -1750     + 400, - 650     + 500, - 700     + 400, -1800
18:04:20.077 ->      + 450, -1750     + 500, - 550     + 500, - 650     + 500, - 650
18:04:20.147 ->      + 500, -2800     + 450, -1750     + 550, - 600     + 200, - 100
18:04:20.230 ->      + 150, - 750     + 400, -1800     + 400, -1800     + 450, -1750
18:04:20.286 ->      + 450, -1700     + 500
18:04:20.321 -> unsigned int  rawData[67] = {8750,4500, 500,700, 400,700, 450,650, 500,650, 450,600, 550,650, 450,700, 450,600, 500,1750, 500,1800, 300,1750, 450,1800, 450,1700, 550,1750, 450,1750, 450,1750, 400,650, 500,700, 400,1800, 450,1750, 500,550, 500,650, 500,650, 500,2800, 450,1750, 550,600, 200,100, 150,750, 400,1800, 400,1800, 450,1750, 450,1700, 500};  // UNKNOWN 7F5A2467
18:04:20.697 ->

Si os fijáis el código en Hexadecimal es distinto. Pero es que a cada envío este código cambia sin saber el motivo.

Este es el código que tengo para enviar:

#include <IRremote.h>
IRsend irsend;
void setup() {}
void loop() {
  int khz = 38;
  unsigned int irSignal[] = {8950,4500, 550,600, 500,600, 550,600, 550,550, 550,550, 600,550, 550,600, 550,550, 550,1650, 600,1650, 550,1650, 550,1700, 550,1650, 550,1700, 550,1650, 550,1700, 500,600, 550,600, 550,1650, 550,1650, 600,550, 550,600, 550,550, 550,600, 550,1650, 550,1650, 600,550, 550,600, 550,1650, 550,1700, 550,1650, 550,1650, 600};
  irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); //Note the approach used to automatically calculate the size of the array.
  delay(10000);
}

Las conexiones son simples, el led emisor en el pin digital 3, y ya está. Y no creo que el problema lo tenga en el receptor, ya que con el mando a distancia a cada pulsación del botón, me devuelve la misma información.

¿Hay alguna alma caritativa que me pueda orientar o ayudar con esto?

Muchas gracias.

Si necesitáis alguna foto de las conexiones las pongo sin problemas, pero vamos, que son conexiones la mar de simples.

Que módulo emisor usas?
Parece como que la corriente no es suficiente pero lo estoy suponiendo

Buenas noches @surbyte!!

Gracias por contestar. Pues uso este diodo led: Diodo LED IR
Debo decir que en estos momentos en la conexión no utilizo ninguna resistencia, he probado con una de 100 y de 220, con idéntico resultado, es decir, transmite información, pero no la que yo he puesto, no se si tiene algo que ver la corriente.

Adjunto unas imágenes de la conexión, si no lo ves claro hago otra tanda de fotos para que se vea mejor.

Muchas gracias !!

Tal vez ese diodo ya está fuera de rango porque lo estás "matando" o "quemando", como más te guste.

Fíjate la hoja de datos, según cual sea la versión del diodo, la tensión de trabajo (forward voltage) es de 1.2V a 1.4V, vos lo estás alimentando con 5V.

Debes colocarle una resistencia de 180 ohms en serie, para una corriente de trabajo de 20 mA aproximadamente.

El problema es que probablemente la juntura ya esté degradada y aún con la resistencia siga funcionando mal. Tendrías que colocar un diodo nuevo y, obviamente, con su resistencia en serie.

@gatul se me adelantó pero es exactamente la sospecha que tenía.
Ademas.. el LED emite en forma longitudinal con un angulo solido muy cerrado, o traducido. Imagina el led de modo horizontal y con el apuntas al receptor. No pongas el receptor de manera transversal ni en cualquier otro ańgulo que no este exactamente por encima de ese led en el protoboard.

Buenas tardes @gatus, @surbyte

Muchísimas gracias por la ayuda, un inciso, me imagino que lo que @gatus comenta sobre la alimentación de 5v, es porque lo tengo en el pin3, ya que la conexión es con el pin3 y luego con Ground, lo que he hecho ha sido poner la resistencia precisamente en el pin3 (perdonad, pero estoy metiéndome en el mundo de Arduino y mi intrusismo me lleva a no conocer tanto el tema de la electrónica y electricidad jeje) El caso es que he puesto la resistencia y luego con comenta @surbyte, he cambiado la inclinación del led (vamos que lo he cogido a mano y he empezado a apuntar directamente al receptor :D) haciéndolo de esta manera, he conseguido recibir el código correcto!! He hecho un pequeño gran paso !!

Un saludo y gracias

Como te decía, tu problema era direccional. El emisor o sea el LED propiamente dicho emite en forma longitudinal en realidad imagina un pequeño cono que parte del led y aumenta muy poco de diametro a lo largo que te alejas.

El tema de la resistencia es para proteger al led y al pin del arduino.

Estudia la Ley de Ohm. Es muy simple, solo 3 elementos Tension, Corriente y Resistencia. Los tres estan relacionados.
Hay miles de videos y tutoriales.

Con ello y alguna cosilla mas te puedes manejar en estos primeros pasos.
Si dudas, pregunta que no molestas.

Así estoy haciendo, ando con un curso de Arduino un poco completo, donde explican las distintas corrientes, calculo de resistencia y la ley de Ohm jeje lo que a veces hay términos que se me escapan, pero ahí estoy !!

Muchísimas gracias por vuestra ayuda/consejo :slight_smile:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.