Go Down

Topic: decifrare e rilanciare un segnale IR (Read 102 times) previous topic - next topic

Taotao

Buongiorno e buona domenica a tutti!  :D

Stavo provando a realizzare quanto descritto in questo tutorial: https://learn.adafruit.com/ir-sensor/using-an-ir-sensor

So che questo è un tutorial provato da molti qui, per questo spero che qualcuno mi possa aiutare  :)

Diciamo comunque che è un sistema per decifrare un codice IR dato da un telecomando e replicarlo.
Lo sto provando per la mia macchina fotografica, per realizzare qualcosa di simile a quanto descritto nelle pagine seguenti del link che vi ho indicato.

Purtroppo, non so perchè, ma le letture del telecomando risultano sempre diverse e provando lo sketch per trasmettere gli impulsi tramite diodo IR ... non funziona  :'(

Non so se possa dipendere dal sensore IR che uso o da cos'altro... mi servirebbe un aiuto per far funzionare il tutto o, magari, se qualcuno ha già i codici IR per una canon 5d mkII (ma andrebbero bene anche i codici per far scattare un flash 580 exII) , potrei provare con quelli  :smiley-wink: 

intanto allego uno screenshot delle diverse  letture ottenute tramite il pulsante del telecomando e lo sketch da me modificato nei valori per dare gli impulsi

... poi, scusate la domanda... ma come mai si da per scontato che tutto funzioni a 38 KHz? (ho Arduino da meno di un mese... abbiate pietà per il mio livello tecnico/pratico)

Grazie infinite a quanti vorranno aiutarmi   ;D



Code: [Select]
// This sketch will send out a Nikon D50 trigger signal (probably works with most Nikons)
// See the full tutorial at http://www.ladyada.net/learn/sensors/ir.html
// this code is public domain, please enjoy!
 
int IRledPin =  13;    // LED connected to digital pin 13
 
// The setup() method runs once, when the sketch starts
 
void setup()   {               
  // initialize the IR digital pin as an output:
  pinMode(IRledPin, OUTPUT);     
 
  Serial.begin(9600);
}
 
void loop()                     
{
  Serial.println("Sending IR signal");
 
  SendNikonCode();
 
  delay(60*1000);  // wait one minute (60 seconds * 1000 milliseconds)
}
 
// 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, you can also change this to 9 if its not working
   digitalWrite(IRledPin, LOW);   // this also takes about 3 microseconds
   delayMicroseconds(10);         // hang out for 10 microseconds, you can also change this to 9 if its not working
 
   // so 26 microseconds altogether
   microsecs -= 26;
  }
 
  sei();  // this turns them back on
}
 
void SendNikonCode() {
  // This is the code for my particular Nikon, for others use the tutorial
  // to 'grab' the proper code from the remote
 
  pulseIR(560);
  delayMicroseconds(7000);
  pulseIR(540);
 
}/code]

Taotao

scusate ma non mi allegava l'immagine

Taotao

Mi sorge un dubbio... può essere che a me non funziona perchè uso una scheda UNO mentre nel tutorial viene usata una Duemilanove?   :D

leo72

Tra Uno e 2009 cambia poco, piuttosto sarebbe da cominciare a vedere lo schema dei collegamenti, ed una foto del circuitino.

Quote
poi, scusate la domanda... ma come mai si da per scontato che tutto funzioni a 38 KHz?
I sensori più comuni lavorano a questa frequenza.

Taotao

Ciao Leo, grazie per la risposta!  :)

Lo sketch l'ho copiato pari pari ed è questo: (per decodificare il segnale IR)

Code: [Select]
/* 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};");
}/code]

La cosa che ho notato subito è che, ad ogni decodifica, i valori dello stesso pulsante premuto cambiano  :smiley-eek-blue:

poi, provando a prendere comunque i valori  e inserendoli in quest'altro sketch, non scatta nulla (volevo far scattare la macchina fotografica)

[code]

Taotao

... mi ha incollato parte del post nello sketch   :smiley-eek:  ... dicevo...

La cosa che ho notato subito è che, ad ogni decodifica, i valori dello stesso pulsante premuto cambiano  :smiley-eek-blue:

poi, provando a prendere comunque i valori  e inserendoli nello sketch di apertura del post, non scatta nulla (volevo far scattare la macchina fotografica)

Il circuito è lo stesso dell'immagine allegata: se voglio decodificare carico uno sketch, se voglio inviare carico l'altro....



nid69ita

#6
Nov 25, 2014, 02:25 pm Last Edit: Nov 25, 2014, 02:25 pm by nid69ita
Probabilmente non c'entra.
Quando premi di continuo lo stesso tasto alcuni telecomandi inviano sempre lo stesso codice, altri invece, la prima volta il codice del tasto e poi un codice univoco (di solito FFFFFF) che stà ad indicare ripetizione.
Io però ho sempre usato la libreria IRRemote.
my name is IGOR, not AIGOR

Taotao

Ciao Igor, grazie per la dritta... mi potresti spiegare un attimo meglio la libreria IRRemote?

cioè, nel mio caso, potrei usarla con successo per decifrare il codice o per "rilanciarlo"?  dove la trovo?

Per le letture che ha fatto il sensore, più che codice univoco, mi sembra che sparasse a caso... ho allegato uno screenshot di alcune letture più sopra... mi sembra anche abbastanza cortino come codice, se lo faccio dal telecomando della tv mi vien fuori una striscia infinita, qui son 2 righe...

nid69ita

#8
Nov 25, 2014, 04:50 pm Last Edit: Nov 25, 2014, 04:53 pm by nid69ita
La IRRemote in teoria è già dentro all'IDE 1.5.x sotto Robot... qualcosa.
Io preferisco cancellarla e mettere quella "ufficiale" ed aggiornata di shirriff:
https://github.com/shirriff/Arduino-IRremote

C'e' lo sketch IRrecvDump.ino per sapere se la libreria riconosce il telecomando come standard (es. panasonic, toshiba, etc.), oppure devi andare di Raw data.
Con i dati raw  poi si usa la SendRaw()  e se cerchi nel forum o su internet ci sono info. A volte NON è facile capire come passare i dati Raw letti da sketch IRrecvDump alla SendRaw().

Qui il sito di Ken Shirriff:  http://www.righto.com/2009/08/multi-protocol-infrared-remote-library.html
my name is IGOR, not AIGOR

Taotao

Ah ... interessante!

Grazie mille! adesso mi cerco e mi studio tutto!  ;)

Taotao

Ho trovato tutto, con un po' di fatica ho (forse) capito tutto.... usando un mac non so se ho installato correttamente le librerie, sta di fatto che quando verifico IRrecevDump mi viene restituita questa serie di errori:

Code: [Select]

In file included from IRrecvDump.ino:11:
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:13: error: stray '\302' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:13: error: stray '\267' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:13: error: stray '\302' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:13: error: stray '\267' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:544: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:548: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:651: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:655: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:659: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:663: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:667: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:671: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:675: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:679: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:683: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:687: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:691: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:695: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:699: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:712: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:839: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:843: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:847: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:851: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:855: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:974: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:978: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:995: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:1004: error: stray '#' in program
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:5: error: expected unqualified-id before '<' token

... ecco, questo non l'ho proprio capito e non so come risolverlo  :smiley-cry:

Go Up