Arduino e telecomando infrarossi

Ciao a tutti,

Sto cercando di decodificare i segnali del mio telecomando SONY RM-LJ304 usato per il mio amplificatore.
A seguire il setup in uso: Breadboard con Arduino NANO, un ricevitore IR 1838T, un led IR e una resistenza da 150 Ohm, il tutto connesso così:

arduino D11 ---> 1838T PIN sinistro
arduino GND ---> 1838T PIN destro
arduino +5V ---> 1838T PIN centrale

arduino GND ---> IR LED PIN corto (-)
arduino D03 ---> 150 Ohm --> IR LED PIN lungo (+)

Utilizzo le connessioni indicate, così posso caricare lo sketch di decode e, con segnali utili, subito lo sketch per inviare e fare delle prove.

Sto usando come libreria questa: https://github.com/z3t0/Arduino-IRremote e come esempio per la decodifica questo: https://github.com/z3t0/Arduino-IRremote/blob/master/examples/IRrecvDumpV2/IRrecvDumpV2.ino

Cosa succede poi?
Beh, inizio con un segnale che funziona, il quale mi da fiducia che le connessioni siano ok. Il volume viene effettivamente riconosciuto e riesco a replicarlo con successo dall’arduino verso il decoder.
In fase di lettura, tenendo premuto il volume (+) a lungo, vedo:

Encoding  : UNKNOWN
Code      : 1C0DAFD3 (32 bits)
Timing[25]: 
     +2800, - 150     +1050, - 150     +1650, - 100     +1050, - 150
     +1050, - 150     +1600, - 200     +1000, - 150     +1000, - 200
     +1000, - 200     +1000, - 200     +1000, - 200     + 950, - 200
     +1600
unsigned int  rawData[25] = {2800,150, 1050,150, 1650,100, 1050,150, 1050,150, 1600,200, 1000,150, 1000,200, 1000,200, 1000,200, 1000,200, 950,200, 1600};  // UNKNOWN 1C0DAFD3

Encoding  : SONY
Code      : 481 (12 bits)
Timing[25]: 
     +2350, - 600     + 600, - 600     +1200, - 550     + 650, - 550
     + 700, - 500     +1250, - 550     + 650, - 500     + 650, - 550
     + 600, - 600     + 600, - 600     + 600, - 600     + 550, - 600
     +1200
unsigned int  rawData[25] = {2350,600, 600,600, 1200,550, 650,550, 700,500, 1250,550, 650,500, 650,550, 600,600, 600,600, 600,600, 550,600, 1200};  // SONY 481
unsigned int  data = 0x481;

Encoding  : SONY
Code      : 481 (12 bits)
Timing[25]: 
     +2400, - 600     + 600, - 600     +1150, - 600     + 600, - 600
     + 600, - 600     +1200, - 550     + 650, - 550     + 650, - 550
     + 600, - 600     + 600, - 600     + 550, - 600     + 600, - 600
     +1200
unsigned int  rawData[25] = {2400,600, 600,600, 1150,600, 600,600, 600,600, 1200,550, 650,550, 650,550, 600,600, 600,600, 550,600, 600,600, 1200};  // SONY 481
unsigned int  data = 0x481;

Encoding  : SONY
Code      : 481 (12 bits)
Timing[25]: 
     +2400, - 550     + 600, - 600     +1200, - 600     + 650, - 550
     + 650, - 500     +1250, - 550     + 650, - 550     + 650, - 550
     + 600, - 550     + 600, - 600     + 600, - 600     + 600, - 600
     +1200
unsigned int  rawData[25] = {2400,550, 600,600, 1200,600, 650,550, 650,500, 1250,550, 650,550, 650,550, 600,550, 600,600, 600,600, 600,600, 1200};  // SONY 481
unsigned int  data = 0x481;

Encoding  : SONY
Code      : 481 (12 bits)
Timing[25]: 
     +2350, - 600     + 600, - 600     +1200, - 600     + 650, - 500
     + 700, - 500     +1250, - 550     + 650, - 550     + 600, - 550
     + 650, - 550     + 600, - 600     + 600, - 600     + 600, - 550
     +1200
unsigned int  rawData[25] = {2350,600, 600,600, 1200,600, 650,500, 700,500, 1250,550, 650,550, 600,550, 650,550, 600,600, 600,600, 600,550, 1200};  // SONY 481
unsigned int  data = 0x481;

Encoding  : SONY
Code      : 481 (12 bits)
Timing[25]: 
     +2400, - 600     + 600, - 600     +1200, - 550     + 700, - 500
     + 600, - 600     +1250, - 500     + 650, - 550     + 600, - 600
     + 600, - 600     + 600, - 600     + 550, - 600     + 600, - 600
     +1200
unsigned int  rawData[25] = {2400,600, 600,600, 1200,550, 700,500, 600,600, 1250,500, 650,550, 600,600, 600,600, 600,600, 550,600, 600,600, 1200};  // SONY 481
unsigned int  data = 0x481;

Inizia con un segnale non noto, per poi vedere un segnale noto 0x481.

Usando tale codice, funziona alla grande:

void loop() {
        Serial.println("VOL+");
	for (int i = 0; i < 3; i++) {
		irsend.sendSony(0xa90, 12);
		delay(40);
	}
	delay(5000); //5 second delay between each signal burst
}

Fino a qui, tutto ok. Se provo però il tasto POWER, i risultati cambiano di molto e non funziona:

Encoding  : UNKNOWN
Code      : 25332375 (32 bits)
Timing[25]: 
     +2850, - 150     +1650, - 100     +1100, - 100     +1600, - 200
     +1000, - 200     +1600, - 150     +1000, - 200     +1000, - 200
     +1000, - 200     +1000, - 150     +1000, - 200     +1000, - 200
     +1600
unsigned int  rawData[25] = {2850,150, 1650,100, 1100,100, 1600,200, 1000,200, 1600,150, 1000,200, 1000,200, 1000,200, 1000,150, 1000,200, 1000,200, 1600};  // UNKNOWN 25332375

Encoding  : SONY
Code      : 324 (15 bits)
Timing[31]: 
     +2600, - 400     + 700, - 500     + 650, - 550     + 600, - 550
     + 650, - 550     + 600, - 600     +1200, - 550     +1200, - 600
     + 600, - 600     + 600, - 550     +1200, - 600     + 600, - 600
     + 550, - 600     +1200, - 600     + 600, - 600     + 550
unsigned int  rawData[31] = {2600,400, 700,500, 650,550, 600,550, 650,550, 600,600, 1200,550, 1200,600, 600,600, 600,550, 1200,600, 600,600, 550,600, 1200,600, 600,600, 550};  // SONY 324
unsigned int  data = 0x324;

(324 repeated one more time)

Encoding  : UNKNOWN
Code      : A362C734 (32 bits)
Timing[31]: 
     +2700, - 300     + 700, - 450     + 700, - 550     + 600, - 550
     + 600, - 600     + 600, - 600     +1150, - 600     +1200, - 600
     + 600, - 600     + 600, - 550     +1200, - 600     + 600, - 600
     + 550, - 600     +1200, - 600     + 600, - 600     + 550
unsigned int  rawData[31] = {2700,300, 700,450, 700,550, 600,550, 600,600, 600,600, 1150,600, 1200,600, 600,600, 600,550, 1200,600, 600,600, 550,600, 1200,600, 600,600, 550};  // UNKNOWN A362C734

Encoding  : SONY
Code      : 324 (15 bits)
Timing[31]: 
     +2600, - 350     + 700, - 500     + 650, - 550     + 600, - 600
     + 600, - 600     + 600, - 550     +1200, - 600     +1200, - 550
     + 600, - 600     + 600, - 600     +1200, - 550     + 600, - 600
     + 600, - 600     +1200, - 550     + 600, - 600     + 600
unsigned int  rawData[31] = {2600,350, 700,500, 650,550, 600,600, 600,600, 600,550, 1200,600, 1200,550, 600,600, 600,600, 1200,550, 600,600, 600,600, 1200,550, 600,600, 600};  // SONY 324
unsigned int  data = 0x324;

(324 repeated other 2 times)

Encoding  : UNKNOWN
Code      : A362C734 (32 bits)
Timing[31]: 
     +2650, - 300     + 750, - 450     + 650, - 550     + 650, - 550
     + 600, - 600     + 600, - 550     +1200, - 600     +1200, - 600
     + 550, - 600     + 600, - 600     +1200, - 600     + 550, - 600
     + 600, - 600     +1200, - 600     + 550, - 600     + 600
unsigned int  rawData[31] = {2650,300, 750,450, 650,550, 650,550, 600,600, 600,550, 1200,600, 1200,600, 550,600, 600,600, 1200,600, 550,600, 600,600, 1200,600, 550,600, 600};  // UNKNOWN A362C734

Encoding  : SONY
Code      : 324 (15 bits)

(324 repeated two times)

Dopo qualche secondo semette di registrare segnali. Se ritento una seconda volta:

Encoding  : UNKNOWN
Code      : FF3B2B52 (32 bits)
Timing[25]: 
     +2800, - 150     +1700, -  50     +1100, - 150     +1600, - 200
     +1000, - 150     +1600, - 200     +1000, - 200     +1000, - 200
     + 950, - 250     + 950, - 200     +1000, - 200     +1000, - 200
     +1600
unsigned int  rawData[25] = {2800,150, 1700,50, 1100,150, 1600,200, 1000,150, 1600,200, 1000,200, 1000,200, 950,250, 950,200, 1000,200, 1000,200, 1600};  // UNKNOWN FF3B2B52

Encoding  : SONY
Code      : 324 (15 bits)

(324 repeated 2 times)

Encoding  : UNKNOWN
Code      : A362C734 (32 bits)
Timing[31]: 
     +2650, - 300     + 750, - 450     + 650, - 550     + 600, - 600
     + 600, - 600     + 600, - 550     +1200, - 600     +1200, - 600
     + 550, - 600     + 600, - 600     +1200, - 550     + 600, - 600
     + 600, - 600     +1200, - 550     + 600, - 600     + 600
unsigned int  rawData[31] = {2650,300, 750,450, 650,550, 600,600, 600,600, 600,550, 1200,600, 1200,600, 550,600, 600,600, 1200,550, 600,600, 600,600, 1200,550, 600,600, 600};  // UNKNOWN A362C734

Encoding  : SONY
Code      : 324 (15 bits)

(0x324 repeated other 6 times)

Cosa dovrei usare o fare?
Sembra come se il segnale 0x324 sia usato come pausa / intercalare tra un comando e l’altro dato che si presenta spesso anche con altri tasti.

E’ strano quando presso POWER rapidamente. Il decoder si spegne / accende subito, ma il segnale registrato è sepre diverso :frowning:

Come fare?

Grazie a tutti!!

Simone

Non conosco quel telecomando, però ho avuto un poco a che fare con queste cose e posso dirti che quasi sempre quando ricevo segnali decodificati in maniera stranamente irregolari si tratta di un problema di frequenza della portante del segnale IR. Tu stai usando un TSOP1838 quindi stai decodificando a 38kHz.

Se il problema dovesse essere questo, se non riesci a trovare le specifiche della portante di quel telecomando specifico, prova con un ricevitore IR con frequenze differenti (dato che la frequenza della portante è identificata via hardware all'interno del ricevitore è praticamente trasparente al codice). Io feci socì a suo tempo, acquistandone 6-7 di varie frequenze (30, 33, 36, 38, 51...) per avere materiale per fare test.

Oppure devi identificare la frequenza leggendola con un sensore senza filtri di frequenza, il classico semplice fototransistor IR, ed acquistando un utilissimo software che ho acquistato anche io, AnalysIR, e che mi ha permesso di risolvere il problema (nel mio caso i codici del telecomando MySkyHD). Sono solo 20$ e se vuoi avere la piena libertà di fare progetti con gli infrarossi, sono ben spesi, ne vale la pena. Ti può dare anche già i codici per Arduino, anche in caso di codifiche RAW.

Grazie delle indicazioni e scusa della risposta tardiva. Vedrò quello che trovo :slight_smile:

Simone

Ah si, ti ho fatto qualche ricerca.
Se il tuo ampli è un STR-V333ES/444ES, da QUI vedo che il ricevitore (IC101) è un NJL63H400A (pagina 90), quel componente secondo Mouser è un ricevitore a 40 kHz di portante.

Anche se teoricamente un ricevitore a 38kHz dovrebbe riuscire a riconoscere gran parte dei segnali, non essendo comunque una cosa affidabile ti consiglio di prendere da eBay un paio di TSOP4840 (ricevitore 40kHz) per decodificarli correttamente.

Se con quello IRrecvDump non riesce comunque a darti informazioni sul protocollo usato, è probabilmente poco noto quindi dovrai per forza usare i dati RAW, cosa un poco più complicata ma fattibile (vedi ad esempio ciò che feci per il telecomando MySkyHD che ti ho linkato prima).