Problema IRRemote/Infrarosso

Ciao a tutti, volevo chiedere se qualcuno mi sa aiutare a risolvere un problema che non capisco.
Facendo vari test con lo sketch di esempio di IRRemote "IRRecord", ho provato a catturare vari codici di vari device e funzionano perfettamente.
Una volta accertato che il tutto funziona a dovere mi sono messo a scrivere un mio sketch per una videocamera che però non avevo ancora a disposizione, ora, la videocamera è arrivata e scopro che i comandi inviati non funzionano nonostante IRRecord mi faccia vedere tramite terminale che comunque dal telecomando di questa videocamera riesce a catturare una stringa per ogni tasto premuto.
Non riesco a spiegarmi il motivo, anche perchè se il led infrarosso del telecomando della videocamera lavorasse su una frequenza diversa da quello delle altre periferiche deduco che nemmeno la ricezione da parte di IRRecord dovrebbe funzionare.
Secondo voi c'è una spiegazione logica a questo comportamento? C'è qualche prova che posso fare?
Una cosa che ho notato è che il led infrarosso dei vari device che ho provato è azzurro mentre quello del telecomando della videocamera è trasparente ma ho recuperato un led trasparente da far funzionare con IRRemote ed il risultato è sempre lo stesso.
Help :slight_smile:
Grazie.
Ciao.

P.S. Spero di essermi spiegato :astonished:

Puoi postare marca e modello della telecamera, magari se c'è anche il numero del telecomando? forse ho una mezza idea..

smartgatto:
Puoi postare marca e modello della telecamera, magari se c'è anche il numero del telecomando? forse ho una mezza idea..

Panasonic HDC-SD900, mentre il telecomando riporta questa sigla: N2QAEC000024.
Altri codici non ne vedo.
Grazie.
Ciao.

Dunque..i codici del tuo telecomando non li ho trovati, ma ne ho trovato uno con un codice simile, N2QAEC000012:

# brand:             Panasonic
# model:             N2QAEC000012
# supported devices: 
#

begin remote

  name  Panasonic_N2QAEC000012
  bits           24
  flags SPACE_ENC
  eps            25
  aeps          100

  header       3553  1662
  one           486  1235
  zero          486   361
  ptrail        486
  pre_data_bits   24
  pre_data       0x40040E
  gap          74566
  toggle_bit      0


      begin codes
          OSD                      0x10EAF4
          date/time                0x10E6F8
          photo_shot               0x106678
          start/stop               0x10332D
          a.dub                    0x10908E
          vol+                     0x104658
          vol-                     0x10C6D8
          rew                      0x10405E
          play                     0x10504E
          ff                       0x10C0DE
          still_adv                0x10E0FE
          pause                    0x10607E
          stop                     0x10001E
          still_adv>               0x10F0EE
          var.search               0x90019F
          menu                     0x106A74
          enter                    0x101A04
          cursor_left              0x90CB55
          cursor_right             0x904BD5
          cursor_up                0x900B95
          cursor_down              0x908B15
      end codes

end remote

Dunque.. immagino che il tuo trend di dati sia più o meno così: 3553,1662,486,1235,486,1235, etc etc.
Tutto il treno di dati dev'essere lungo 24+24 bits, di cui i primi 24bit sono il pre_data ovvero 0x40040E e i restanti 24 bits sono i data del comando.
Mi spiego meglio: se vuoi inviare il comando PLAY, il trend di dati sarà: 0x40040 E10504E, in binario:

10000000000 010000001110 000100000101 000001001110
come vedi però questi sono 47 bits. Perchè?
Perchè bisogna aggiungere il primo bits (il bit di sincronismo, detto header) quindi in totale fanno 48 bits.
Da ricordarsi per ultimo di aggiungere un mezzo bit detto ptrail da 486 ms.

Spero di essere stato chiaro!

Tu sei stato chiarissimo, ora sta a me cercare di interpretare quello che hai scritto :smiley:
Comunque, i dati che ho acquisito sono questi:

unsigned int KeyT[]={3450, 1750, 350, 500, 400, 1300, 400, 500, 400, 450, 400, 500, 350, 500, 400, 450, 400, 500, 400, 450, 400, 500, 400, 450, 400, 500, 350, 500, 400, 1300, 400, 500, 350, 500, 400, 450, 400, 500, 400, 450, 400, 500, 350, 1350, 400, 1300, 400, 1300, 450, 450, 400, 450, 400, 500, 350, 500, 400, 1300, 400, 500, 400, 1300, 400, 500, 400, 450, 400, 450, 400, 1350, 400, 450, 400, 450, 400};
unsigned int KeyW[]={3500, 1700, 400, 450, 400, 1300, 450, 450, 400, 450, 450, 450, 400, 450, 450, 450, 400, 450, 400, 450, 450, 450, 400, 450, 400, 500, 400, 450, 400, 1300, 450, 450, 400, 450, 400, 500, 400, 450, 400, 450, 450, 450, 400, 1300, 400, 1300, 450, 1300, 400, 450, 400, 450, 450, 450, 400, 450, 400, 1300, 450, 450, 400, 1300, 400, 500, 400, 450, 400, 1300, 450, 1300, 400, 450, 400, 450, 450};
unsigned int KeyStartStop[]={ 3500, 1700, 400, 500, 350, 1350, 400, 450, 450, 450, 400, 450, 400, 500, 400, 450, 400, 450, 450, 450, 400, 450, 400, 500, 350, 500, 400, 450, 400, 1350, 350, 500, 400, 500, 350, 500, 400, 450, 400, 500, 400, 450, 400, 1300, 400, 1350, 400, 1300, 400, 450, 450, 450, 400, 450, 450, 450, 400, 1300, 400, 450, 450, 1300, 400, 450, 400, 450, 450, 450, 400, 450, 400, 1350, 350, 1350, 400};
unsigned int KeyPhoto[]={3500, 1700, 400, 450, 400, 1300, 450, 450, 400, 450, 400, 500, 400, 450, 400, 450, 450, 450, 400, 450, 400, 500, 400, 450, 400, 450, 450, 450, 400, 1300, 400, 500, 400, 450, 400, 450, 450, 450, 400, 450, 400, 500, 400, 1300, 400, 1300, 400, 1300, 450, 450, 400, 450, 400, 500, 400, 450, 400, 1300, 450, 450, 400, 1300, 400, 450, 450, 450, 400, 450, 400, 1350, 400, 1300, 400, 450, 400};

Mi sapresti dire perchè premendo ripetutamente lo stesso tasto i codici non sono mai identici ma alcuni numeri cambiano?
Questo l'ho verificato non solo nel telecomando panasonic ma anche in tutti gli altri anche se comunque poi funzionano lo stesso :drooling_face:
Grazie.
Ciao.

Dipende da quanto cambiano...se di poco è normale, ma se un bit prima era 486 1235 e dopo invece 486 361 vuol dire che c'è qualcosa che non va nella parte hardware...

per farti comprendere meglio, guarda questa immagine, rappresenta il tuo trend di dati, riferito al tasto T:

(per ottenerlo vai sul sito rc-switch raw data viewer e inserisci i dati ottenuti)

Quindi se non ho capito male, tutti quei bei numeretti non sono altro che la durata dell'onda LOW/HIGH alternate tra loro.
Se è così con un po' di digitalWrite e delay potrei costruirmi il segnale IR giusto?

Giusto...leggiti questo topic:
http://arduino.cc/forum/index.php/topic,82821.0.html

ci sono già passato io :smiley:

smartgatto:
Giusto...leggiti questo topic:
http://arduino.cc/forum/index.php/topic,82821.0.html

ci sono già passato io :smiley:

Eccomi, scusate il ritardo ma ho avuto qualche impegno.
Ho letto e riletto la discussione, però c'è una cosa che non mi è chiara, in questo tuo post: [RISOLTO] Infrarossi: ho una stringa di bit, SO COSA FARCI ora :-) - #39 by smartgatto - Generale - Arduino Forum dove dici di aver risolto, vedo che invii tramite ir una serie di valori che non
capisco da dove li hai ricavati:

pulseIR(1140);
delayMicroseconds(290);
pulseIR(130);
delayMicroseconds(90);
pulseIR(1140);
delayMicroseconds(300);
pulseIR(125);
delayMicroseconds(95);
pulseIR(310);
delayMicroseconds(1120);
pulseIR(130);
delayMicroseconds(90);
pulseIR(340);
delayMicroseconds(1140);
pulseIR(120);
delayMicroseconds(100);
pulseIR(325);
delayMicroseconds(1100);
pulseIR(125);
delayMicroseconds(95);
pulseIR(340);
delayMicroseconds(1100);
pulseIR(125);
delayMicroseconds(95);
pulseIR(325);
delayMicroseconds(1110);
pulseIR(125);
delayMicroseconds(100);
pulseIR(315);
delayMicroseconds(1120);
pulseIR(125);
delayMicroseconds(85);
pulseIR(1155);
delayMicroseconds(275);
pulseIR(140);
delayMicroseconds(95);
pulseIR(320);
delayMicroseconds(1095);
pulseIR(150);
delayMicroseconds(100);
pulseIR(320);
delayMicroseconds(1110);
pulseIR(120);
delayMicroseconds(95);
pulseIR(120);
delayMicroseconds(7770);

Puoi illuminarmi?
Grazie.
Ciao.

Leggendo e rileggendo la tua discussione che mi hai linkato, mi è venuto in mente di provare a prendere le stringhe che ho catturato e di sostituire ogni numero inferiore a 1000 con 0 e quelli superiori con 1.
Il risultato è che di tutta la stringa di 75 codici, sono solo gli ultimi 8 che sono diversi e potrebbe anche andare bene, solo che contando e ricontando i bit, tutto il ragionamento fatto sopra dei 24+24bit non riesco a farlo quadrare.
Nzomma non riesco ad uscirne :disappointed_relieved:

Altra cosa, ho provato lo sketch che hai postato (quello con la funzione pulseIR) sostituendo i tuoi codici con i miei, ma nienta da fare lo stesso :frowning:
A dire il vero non ho proprio sostituito i codici, ma ho fatto un ciclo for che mi legge dall'array 2 valori alla volte e per ogni ciclo li passa a pulseIR e delayMicroseconds che alla fine dovrebbe essere la stessa cosa.

il codice corretto non è quello che avevi riportato tu ma quello presente nella terza pagina di quella discussione...
comunque ogni telecomando ha una sua codifica a se... bisogna solo avere pazienza e studiare...

smartgatto:
il codice corretto non è quello che avevi riportato tu ma quello presente nella terza pagina di quella discussione...
comunque ogni telecomando ha una sua codifica a se... bisogna solo avere pazienza e studiare...

Si si, io ho postato solo uno stralcio ma il programma del quale stavo parlando era questo:

void setup()   {                

  pinMode(IRledPin, OUTPUT);      
  Serial.begin(9600);
}
 
void loop()                     
{
  SendVentilatore();
  SendVentilatore();
  SendVentilatore();
  SendVentilatore();  
  delay(5000);  // accendi e spegni la luce ogni 5 secondi
}
 
// This procedure sends a 38KHz pulse to the IRledPin 
// for a certain # of microseconds. We'll use this whenever we need to send codes
void pulseIR(long microsecs) {
  // we'll count down from the number of microseconds we are told to wait
 
  cli();  // this turns off any background interrupts
 
  while (microsecs > 0) {
    // 38 kHz is about 13 microseconds high and 13 microseconds low
   digitalWrite(IRledPin, HIGH);  // this takes about 3 microseconds to happen
   delayMicroseconds(10);         // hang out for 10 microseconds
   digitalWrite(IRledPin, LOW);   // this also takes about 3 microseconds
   delayMicroseconds(10);         // hang out for 10 microseconds
 
   // so 26 microseconds altogether
   microsecs -= 26;
  }
 
  sei();  // this turns them back on
}
 
void SendVentilatore() {
 
  pulseIR(1320);
  delayMicroseconds(310);
  pulseIR(1320);
  delayMicroseconds(320);
  pulseIR(500);
  delayMicroseconds(1160);
  pulseIR(500);
  delayMicroseconds(1160);
  pulseIR(500);
  delayMicroseconds(1160);
  pulseIR(500);
  delayMicroseconds(1160);
  pulseIR(500);
  delayMicroseconds(1160);
  pulseIR(500);
  delayMicroseconds(1160);
  pulseIR(1320);
  delayMicroseconds(320);
  pulseIR(500);
  delayMicroseconds(1160);
  pulseIR(500);
  delayMicroseconds(1160);
  pulseIR(500);
  delayMicroseconds(7820);
    
}

Ma tu i codici che hai inserito in questo programma come li hai ricavati?
Io uso quelli RAW ricavati dalla libreria IRRemote.
Grazie.
Ciao.

E rieccomi a chiedere un altro vostro parere :slight_smile:
Cercando di capire il problema che mi affligge, ho provato a trasformare in binario il codice ricevuto dal telecomando e quello ricevuto dal segnale che trasmette il mio LED IR.
Il treno di impulsi ricevuto dal telecomando è questo:

3450	1750	400	450	400	1300	400	500	400	450	400	500	350	500	400	500	350	500	400	450	400	500	350	500	400	500	350	500	400	1300	400	500	350	500	400	500	350	500	400	450	400	500	400	1300	400	1300	400	1300	400	500	400	450	450	450	400	450	400	1300	400	500	400	1300	400	500	400	450	400	450	450	1300	350	500	400	450	400

che tradotto in binario (1 se > 1000 e 0 se < 1000) è uguale a questo:

110001000000000000000000000001000000000000010101000000000100010000000100000

mentre il treno di impulsi che trasmette il mio LED IR collegato ad arduino è questo:

3350	1950	200	650	250	1450	300	600	250	600	300	600	250	650	250	600	250	650	300	600	200	700	200	600	300	650	200	650	250	1450	300	650	200	650	250	600	250	650	350	450	300	650	200	1500	250	1500	250	1450	350	550	250	650	250	650	300	550	250	1400	350	600	250	1450	300	650	250	600	250	600	300	1450	300	550	350	500	350

e il relativo binario è:

110001000000000000000000000001000000000000010101000000000100010000000100000

quindi identico a quello del codice inviato dal telecomando.
L'unica differenza che ho notato è un grosso cambiamento nei valori, infatti dove il telecomando invia un valore di 400, il mio LED IR invia un valore di circa 200-250, però sui valori sopra il 1000 i valori si avvicinano di più.
Può essere questo che crea il problema?
Da cosa può essere causato?
Tenete presente che con lo stesso LED IR e arduino comando televisore/fotocamera/lettore dvd/accendo e spengo la moglie :smiley: ecc. ecc. ma non riesco a fare quello che in realtà mi serve veramente..............comandare la videocamera Panasonic :frowning:
Grazie.
Ciao.