decifrare e rilanciare un segnale IR

Buongiorno e buona domenica a tutti! :smiley:

Stavo provando a realizzare quanto descritto in questo tutorial: Using an IR Sensor | IR Sensor | Adafruit Learning System

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

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 :cry:

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 :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

// 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]

scusate ma non mi allegava l'immagine

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

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

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.

Ciao Leo, grazie per la risposta! :slight_smile:

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

/* 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  :fearful:

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

[code]

... mi ha incollato parte del post nello sketch :astonished: ... dicevo...

La cosa che ho notato subito è che, ad ogni decodifica, i valori dello stesso pulsante premuto cambiano :fearful:

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....

Schema collegamenti IR.png

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.

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...

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:

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: A Multi-Protocol Infrared Remote Library for the Arduino

Ah ... interessante!

Grazie mille! adesso mi cerco e mi studio tutto! :wink:

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:

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 :sob:

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 ....

... hai sicuramente aperto e salvato la libreria usando "TextEdit" che NON è un editor di testo puro, ma un RTF e ti ha infilato codici RTF nella libreria, codici che naturalmente NON vedi.

La devi riscaricare ex-novo (... trovare le porcherie dentro quella che ora hai è praticamente impossibile) ed usare un VERO editor di testo che NON lavori in RTF. Gratuito ti puoi scaricare da AppStore "TextWrangler".

Guglielmo

Ciao Guglielmo,

Sinceramente ho scaricato i files.h e quello .cpp e li ho messi in una cartella con lo stesso nome del file senza neanche aprirli... ho seguito le istruzioni che si trovano qui sul sito....

Proverò a cancellarle e a rifare l'operazione dopo aver installato il programma che mi hai consigliato perchè in effetti son proprio le librerie che non girano...

Grazie! :wink:

Mmm ... l'hai scaricata da GitHub, scompattato lo zip è solo copiata al posto giusto ? ? ?

Perché mi sembra strano che su GitHub abbiano un qualche cosa con caratteri sporchi dentro ('\302', '\267', ...) ...

Riprova e facci sapere :wink:

Guglielmo

P.S. : Ed in ogni caso, su Mac, quando usi file di testo ... non usare "TextEdit" o rischi sempre che te li trasforma in RTF :wink:

.... purtroppo errori su errori... ho provato a fare parecchi tentativi in modi diversi ma nulla... proverò a procurarmi un pc windows, anche se non credo sia quello il problema, nel frattempo farò un po' di esperienza... grazie comunque a tutti, vi farò sapere se su windows gira :slight_smile:

Se magari spieghi esattamente cosa fai, metti il sorgente tuo programma, spieghi dove hai messo le librerie e da dove le hai prese, ecc. ecc. dandoci tutti i dettagli ... magari possiamo aiutarti. :roll_eyes:

Io lavoro e sviluppo normalmente su OS X senza problemi ... quindi ...

Guglielmo

Oh, bene, sapere che usi anche tu un mac mi rincuora :slight_smile:

allora... scarico lo zip dal link consigliatomi da Igor: GitHub - Arduino-IRremote/Arduino-IRremote: Infrared remote library for Arduino: send and receive infrared signals with multiple protocols

scaricato lo decomprimo in una cartella qualsiasi, poi prendo i files con estensione .cpp e .h , creo una nuova cartella col nome del file senza estensione e ce li metto dentro (es. cartella IRremote dentro la quale si trovano IRremote.ccp e IRremote.h); a questo punto prendo le cartelle appena create con dentro le librerie e le copio dove ho capito che la Ide va a pescare ovvero: /users/tony/Documents/Arduino/libraries/ ... e in effetti, fra gli errori che restituiva, la "stringa" era corretta, quindi andava a pescarla proprio li: ( es.
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:974: error: stray '#' in program )

quindi, per quel poco che ne capisco, letto il comando che inserisce la libreria, la Ide trova errori nella libreria stessa... o no? ... la mia versione dell'Ide è l'ultima, e vedo che anche le librerie sono piuttosto aggiornate.... non so cosa pensare

Taotao:
/users/tony/Documents/Arduino/libraries/IRremote/IRremote.h:974: error: stray '#' in program )

Quel 974 vuol dire errore in riga 974, ma, puoi controllare anche su github, il file IRremote.h ha solo 128 righe.
La libreria poi ha anche il file IRremoteInt.h

Non conosco Mac, non è che usi un WinZip "strano" ?

Non mi hai detto che versione di IDE stai usando ... do per scontato che tu stia lavorando con la 1.0.6 ...

  1. Apri l'IDE, menu Arduino -> Preferenze e guarda quale è la tua cartella "Sketchbook" (la prima voce in alto) ... dentro quella cartella dovrà esistere una cartella di nome "libraries".

Es. nella mia macchina la cartella specificata nelle "Preferenze" è : "/Users/gpb01/Documents/Arduino" quindi, dovrà esistere una cartella "/Users/gpb01/Documents/Arduino/libraries/".

RICHIUDI l'IDE ... il resto va fatto ad IDE chiuso ...

  1. Vai sul link indicato, QUESTO e scarichi lo zip con l'apposito bottone a destra

  2. scompatti lo zip ed ottieni una cartella di nome "Arduino-IRremote-master".

  3. rinomini questa cartella con il nome "IRremote" e non tocchi altro

  4. butti via tutte le porcherie che hai copiato nella tua cartella "libraries" e ci copi la cartella così come è. Quindi avrai "/Users/gpb01/Documents/Arduino/libraries/IRremote/" (ovviamente NON con gpb01, ma con tony).

Riavvii l'IDE e ... miracolo, troverai nel menu File -> Esempi -> IRremote che conterrà esempi d'uso della IRremote da provare a compilare (NON devono dare errori).

A quel punto prendi spunto da quegli esempi ... e facci sapere.

Guglielmo

Ce l'ho fatta!!! :slight_smile: :slight_smile: :slight_smile:

in pratica dovevo mettere tutto sotto un' unica cartella, invece per IRremotelnt.h avevo fatto una cartella apposta.... avevo visto che aveva un nome diverso.... :stuck_out_tongue:

... adesso però ho un nuovo problema.... ovvero: il telecomando della tv viene letto e decifrato... quello della macchina fotografica (mio vero obiettivo) ... per niente.... :frowning: ... vabbè, almeno ho fatto un passettino in avanti :wink: