Problemi spedire messaggi infrarossi in RAW

Ciao a tutti!

Come già scritto sul forum inglese (Infrared Issue - Send RAW data - Networking, Protocols, and Devices - Arduino Forum) sto riscontrando dei problemi nello spedire un segnale IR. Il mio scopo ultimo è quello di accendere/spegnere una stufa clonando il segnale del telecomando. Riesco a leggere il segnale con arduino, ma evidentemente ho problemi a replicarlo. Sto usando la seguente libreria:
https://github.com/shirriff/Arduino-IRremote
Per meglio capire se sto facendo le cose nel modo corretto, sto prima testando gli stessi procedimenti clonando il segnale di un telecomando SONY, prima con le direttive irsend.sony e poi, lo stesso identico segnale in RAW. Il primo metodo va, il secondo no :frowning: Una volta che sarò in grado di inviare il segnale SONY anche in RAW, credo mi sia più facile capire/clonare il segnale RAW del telecomando della stufa. Ecco i dettagli dei test fatti.

Hardware:

2x Arduino nano.

Primo Arduino con:
1x IR Receiver 1838T
Sketch caricato: Example 'IRrecvDump' avente codice:

/*
 * 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->panasonicAddress,HEX);
    Serial.print(" Value: ");
  }
  else if (results->decode_type == LG) {
     Serial.print("Decoded LG: ");
  }
  else if (results->decode_type == JVC) {
     Serial.print("Decoded JVC: ");
  }
  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
  }
}

Secondo Arduino:

1x IR LED connesso al PWM 3 via resistenza 330 Ohm.

Test 1: Decodificare segnale SONY

Sparando il segnale del telecomando al primo arduino, ottengo:

Decoded SONY: 540A (15 bits)
Raw (32): -27774 2500 -450 1200 -600 600 -600 1150 -600 600 -600 1150 -600 600 -600 550 -600 600 -600 600 -550 600 -600 600 -600 1150 -600 600 -600 1150 -600 600

Significa che la libreria ha identificato un segnale SONY.

Test 2: Spedire segnale SONY con funzione sendSony

Se questo segnale (540A) lo invio tramite Arduino 2 con le funzioni apposite della libreria, funziona! Ovvero riesco sia a decodificare il segnale clonato tramite l'Arduino 1, sia far accendere/spegnere il lettore DVD. Questo lo sketch usato:

#include <IRremote.h>

IRsend irsend;

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

void loop() {
     
     irsend.sendSony(0x540A, 15);

     delay(3000);
}

Dopo l'upload, l'arduino 1 (quello che riceve), registra quanto segue:

540A
Decoded SONY: 540A (15 bits)
Raw (32): -18630 2550 -450 1350 -450 750 -450 1350 -450 750 -450 1250 -550 650 -550 600 -600 600 -600 600 -600 600 -550 650 -600 1200 -550 600 -600 1200 -600 600
540A
Decoded SONY: 540A (15 bits)
Raw (32): -18580 2550 -450 1350 -450 750 -450 1350 -450 700 -500 1250 -550 600 -600 600 -600 600 -600 600 -600 600 -600 600 -600 1200 -550 650 -600 1200 -550 600
540A
Decoded SONY: 540A (15 bits)
Raw (32): -18680 2550 -450 1300 -450 750 -500 1300 -450 750 -450 1250 -550 650 -550 650 -550 650 -550 600 -600 600 -600 600 -600 1200 -600 600 -600 1150 -650 600

Ottimo, quindi il segnale clonato funziona egregiamente.

Test 3: Spedire stesso segnale SONY in RAW con funzione sendRaw

Ora, per capire se sono capace di inviare il segnale anche in RAW, provo inviare la prima linea RAW tramite la direttiva RAW. Il primo segnale RAW è:

Raw (32): -18630 2550 -450 1350 -450 750 -450 1350 -450 750 -450 1250 -550 650 -550 600 -600 600 -600 600 -600 600 -550 650 -600 1200 -550 600 -600 1200 -600 600

Se non ho capito male, il primo numero '-18630' va cancellato in quanto è il delay iniziale dal primo segnale.
Altra nota che ho letto è che il segnale SONY è a 40kHz.
Detto questo, lo sketch che quindi ho provato ad usare per spedire lo stesso identico segnale POWER ma in RAW è il seguente.
Potete notare come prima invio il segnale in RAW, poi invio il segnale con la funziona sendSony.

#include <IRremote.h>

IRsend irsend;

unsigned int sonyPower[]       = {2550,450,1350,450,750,450,1350,450,750,450,1250,550,650,550,600,600,600,600,600,600,600,550,650,600,1200,550,600,600,1200,600,600};
  
void setup()
{
 Serial.begin(9600);
}

void loop() {

     // send variable sonyPower in length 31 at 40 Khz
     irsend.sendRaw(sonyPower,31,40);
     
     delay(3000);
     
     irsend.sendSony(0x540A, 15);
     
     delay(3000);
}

Mi aspetto di vedere sull'arduino 1 (quello di ricezione) sempre segnali SONY validi riconosciuti (Decoded SONY: 540A (15 bits)) invece il primo segnale non è MAI riconosciuto, mentre il secondo sempre.
Ecco cosa logga il ricevitore:

EE2AFAB
Unknown encoding: EE2AFAB (32 bits)
Raw (32): -18630 2750 -250 1500 -300 900 -300 1450 -350 800 -400 1250 -550 650 -550 600 -600 600 -600 600 -600 600 -550 650 -600 1200 -550 600 -600 1200 -550 600
540A
Decoded SONY: 540A (15 bits)
Raw (32): -18030 2600 -400 1400 -400 800 -400 1350 -450 750 -450 1250 -600 600 -550 650 -550 600 -600 650 -550 600 -600 600 -600 1200 -600 600 -600 1200 -600 600
EE2AFAB
Unknown encoding: EE2AFAB (32 bits)
Raw (32): -18630 2700 -300 1500 -300 900 -300 1450 -350 800 -400 1250 -550 650 -550 600 -600 600 -600 600 -600 600 -550 650 -600 1150 -600 600 -550 1200 -650 600
540A
Decoded SONY: 540A (15 bits)
Raw (32): -18030 2550 -450 1350 -400 750 -500 1300 -450 750 -500 1200 -550 650 -550 600 -600 600 -600 600 -600 600 -600 600 -600 1200 -600 600 -600 1200 -600 600
EE2AFAB
Unknown encoding: EE2AFAB (32 bits)
Raw (32): -18630 2750 -250 1500 -300 900 -300 1450 -350 850 -350 1300 -500 700 -500 600 -600 600 -600 600 -600 600 -550 650 -600 1200 -550 550 -650 1150 -650 550
540A
Decoded SONY: 540A (15 bits)
Raw (32): -18030 2550 -450 1350 -450 750 -450 1350 -500 700 -450 1250 -600 600 -600 600 -550 600 -600 600 -600 600 -600 600 -600 1200 -600 600 -600 1200 -600 600
791C87DE
Unknown encoding: 791C87DE (32 bits)
Raw (32): -18630 2700 -300 1500 -300 900 -300 1450 -350 800 -400 1300 -500 650 -550 600 -600 600 -600 600 -600 600 -550 650 -600 1200 -550 600 -600 1200 -550 600
540A
Decoded SONY: 540A (15 bits)
Raw (32): -18080 2550 -450 1350 -400 750 -500 1300 -450 750 -500 1200 -550 650 -600 600 -550 600 -600 600 -650 550 -600 600 -600 1200 -600 600 -600 1200 -600 600
EE2AFAB
Unknown encoding: EE2AFAB (32 bits)
Raw (32): -18630 2750 -250 1500 -300 900 -300 1450 -350 850 -350 1300 -500 700 -500 600 -600 600 -600 600 -600 600 -550 650 -550 1200 -600 600 -550 1200 -600 650

Cosa sbaglio?
Provando a settare la frequenza da 40 (credo dedicato SONY) a 38 (tipicamente default) il risultato con cambia.
Se riesco appunto a far funzionare correttamente il segnale sony anche in RAW, il prossimo passo sarebbe cercare di clonare il segnale del telecomando della stufa la quale indubbiamente non è un segnale gestito dalla libreria e dovrei trattarlo in RAW.
Ma visto che non riesco neanche a spedire un segnale "noto", allora mi fermo prima e cerco di capire...

Grazie a tutti del prezioso supporto!

Simone

Guarda se questa discussione ti è utile:

http://forum.arduino.cc/index.php?topic=194070.msg1433441#msg1433441

Gono:
Guarda se questa discussione ti è utile:

http://forum.arduino.cc/index.php?topic=194070.msg1433441#msg1433441

Ciao!

Grazie mille dell'indicazione. Poco dopo sono incappato nello stesso thread e mi ha aiutato molto.
Mandare tre segnali proprio come indicato:

  for (int i = 0; i <3; i++) { 
    irsend.sendRaw (XPAUSE, sizeof(XPAUSE)/sizeof(int),38); 
    delay (50);

...sembra risolvere il problema per quanto riguarda l'invio del segnale SONY in RAW.
Sono quindi "pronto" ad inviare segnali RAW, ma non mi risolve però l'invio del segnale della stufa.
Potrebbe essere che, nonostante sia in grado di leggere il segnale del telecomando, il ricevitore lavori su altre frequenze e non riesco quindi ad inviarlo nel modo corretto?
Oppure il LED infrarossi abbia delle limitaizoni?
Ho provato per la cronaca ad inviare il segnale in un ciclo con un range kHz da 30 a 71, ma senza aver alcuna risposta dalla stufa.

Idee?

Grazie molte!

Simone