Pages: [1]   Go Down
Author Topic: Aiuto con decodifica IR  (Read 1312 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 48
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti,

per il mio progetto sto cercando di carpire e replicare un comando IR di cui non conosco il protocollo.
Per farlo sto utilizzando gli sketch di ladydada di questo indirizzo http://www.ladyada.net/learn/sensors/ir.html e precisamente questo
Code:
/* 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
 
// 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");
  }
}
.

Il risultato che ottengo è questo:
Code:
Received:

OFF    ON
35824 usec, 3240 usec
2640 usec, 6080 usec
7660 usec, 3120 usec
2780 usec, 6000 usec
7720 usec, 3080 usec
2840 usec, 5940 usec
7800 usec, 3020 usec
2860 usec, 5920 usec
7840 usec, 2980 usec
2880 usec, 4360 usec
80 usec, 1480 usec
7820 usec, 2980 usec
2900 usec, 5920 usec
7820 usec, 2960 usec
2940 usec, 5900 usec
7840 usec, 2920 usec
2960 usec, 5900 usec
7820 usec, 2940 usec
2960 usec, 5880 usec
7840 usec, 2940 usec
2960 usec, 5880 usec
7840 usec, 2920 usec
2960 usec, 5900 usec
7820 usec, 2960 usec
2960 usec, 5860 usec
7840 usec, 2960 usec
2960 usec, 5860 usec
7840 usec, 2940 usec
2960 usec, 5860 usec
7860 usec, 2940 usec
2960 usec, 5860 usec
7860 usec, 2920 usec
2960 usec, 5860 usec
7880 usec, 2920 usec
2960 usec, 5860 usec
7880 usec, 2900 usec
2960 usec, 5880 usec
7860 usec, 2920 usec
2960 usec, 5880 usec
7860 usec, 2900 usec
3000 usec, 5840 usec
7880 usec, 2900 usec
2960 usec, 5880 usec
7880 usec, 2900 usec
2960 usec, 5860 usec
7880 usec, 2920 usec
2940 usec, 5900 usec
7860 usec, 2920 usec
2960 usec, 5860 usec
7860 usec, 2920 usec
2960 usec, 5880 usec
7860 usec, 2900 usec
3000 usec, 5840 usec
7880 usec, 2900 usec
2980 usec, 5860 usec
7860 usec, 2920 usec
2980 usec, 5860 usec
7860 usec, 2900 usec
2980 usec, 5860 usec
7880 usec, 2900 usec
2980 usec, 5860 usec
7860 usec, 2920 usec
2980 usec, 5840 usec
7880 usec, 2920 usec
2960 usec, 5860 usec
7860 usec, 2940 usec
2960 usec, 5860 usec
7860 usec, 2940 usec
2940 usec, 5860 usec
7860 usec, 2940 usec
2960 usec, 5860 usec
7860 usec, 2940 usec
2940 usec, 5860 usec
7860 usec, 2940 usec
2960 usec, 5860 usec
7880 usec, 2900 usec
2960 usec, 5880 usec
7880 usec, 2900 usec
2960 usec, 5880 usec
7860 usec, 2900 usec
3000 usec, 5860 usec
7860 usec, 2900 usec
2980 usec, 5860 usec
7860 usec, 2920 usec
2980 usec, 5860 usec
7860 usec, 2920 usec
2980 usec, 5860 usec
7860 usec, 2900 usec
2980 usec, 5860 usec
7860 usec, 2920 usec
2980 usec, 5860 usec
7860 usec, 2920 usec
2960 usec, 5860 usec
7860 usec, 2940 usec
2960 usec, 5860 usec
7860 usec, 2920 usec
2960 usec, 5880 usec
7860 usec, 2920 usec
2960 usec, 5860 usec
7860 usec, 2940 usec
22476 usec, 460 usec
8192 usec, 480 usec
34816 usec, 0 usec
0 usec, 0 usec
0 usec, 0 usec
0 usec, 0 usec
0 usec, 0 usec
0 usec, 0 usec
0 usec, 0 usec
0 usec, 0 usec
0 usec, 0 usec
0 usec, 0 usec
0 usec, 0 usec
0 usec, 0 usec
0 usec, 0 usec
0 usec, 0 usec
0 usec, 0 usec
0 usec, 0 usec
0 usec, 0 usec
0 usec, 50148 usec
51460 usec, 33728 usec
1316 usec, 50148 usec
33648 usec, 9856 usec
60668 usec, 30652 usec
30336 usec, 10336 usec
33848 usec, 33648 usec
65532 usec, 5176 usec
33888 usec, 1316 usec
50148 usec, 51460 usec
1316 usec, 50148 usec
51460 usec, 65492 usec
15316 usec, 9856 usec
60668 usec, 15416 usec
33888 usec, 1316 usec
50148 usec, 33648 usec
10196 usec, 100 usec
320 usec, 7740 usec
0 usec, 20000 usec
0 usec, 0 usec
0 usec, 16200 usec
17560 usec, 3940 usec
3920 usec, 3840 usec
3860 usec, 3960 usec
15440 usec, 25740 usec
20 usec, 15440 usec
25740 usec, 60436 usec
65196 usec, 1748 usec
5176 usec, 33780 usec
55256 usec, 5840 usec
7880 usec, 2920 usec
2960 usec, 5860 usec
int IRsignal[] = {
// ON, OFF (in 10's of microseconds)
   324, 264,
   608, 766,
   312, 278,
   600, 772,
   308, 284,
   594, 780,
   302, 286,
   592, 784,
   298, 288,
   436, 8,
   148, 782,
   298, 290,
   592, 782,
   296, 294,
   590, 784,
   292, 296,
   590, 782,
   294, 296,
   588, 784,
   294, 296,
   588, 784,
   292, 296,
   590, 782,
   296, 296,
   586, 784,
   296, 296,
   586, 784,
   294, 296,
   586, 786,
   294, 296,
   586, 786,
   292, 296,
   586, 788,
   292, 296,
   586, 788,
   290, 296,
   588, 786,
   292, 296,
   588, 786,
   290, 300,
   584, 788,
   290, 296,
   588, 788,
   290, 296,
   586, 788,
   292, 294,
   590, 786,
   292, 296,
   586, 786,
   292, 296,
   588, 786,
   290, 300,
   584, 788,
   290, 298,
   586, 786,
   292, 298,
   586, 786,
   290, 298,
   586, 788,
   290, 298,
   586, 786,
   292, 298,
   584, 788,
   292, 296,
   586, 786,
   294, 296,
   586, 786,
   294, 294,
   586, 786,
   294, 296,
   586, 786,
   294, 294,
   586, 786,
   294, 296,
   586, 788,
   290, 296,
   588, 788,
   290, 296,
   588, 786,
   290, 300,
   586, 786,
   290, 298,
   586, 786,
   292, 298,
   586, 786,
   292, 298,
   586, 786,
   290, 298,
   586, 786,
   292, 298,
   586, 786,
   292, 296,
   586, 786,
   294, 296,
   586, 786,
   292, 296,
   588, 786,
   292, 296,
   586, 786,
   294, 404,
   64, 2355,
   68, 5836,
   0, 0,
   0, 0,
   0, 0,
   0, 0,
   0, 0,
   0, 0,
   0, 0,
   0, 0,
   0, 0,
   0, 0,
   0, 0,
   0, 0,
   0, 0,
   0, 0,
   0, 0,
   0, 0,
   0, 0,
   4979, 190,
   4628, 2963,
   4979, 190,
   4628, 2963,
   190, 4628,
   3067, 2963,
   473, 6047,
   2979, 5146,
   6469, 1529,
   2977, 6003,
   1547, 3364,
   6553, 517,
   190, 4628,
   1029, 3,
   3364, 5533,
   2977, 5146,
   106, 118,
   774, 0,
   2000, 0,
   0, 0,
   1620, 1756,
   394, 392,
   384, 386,
   396, 1544,
   2574, 2,
   1544, 2574,
   6043, 6519,
   174, 517,
   3378, 5525,
   584, 788,
   292, 296,
   586, 0};

Quello che non mi è chiaro è che valori utilizzare quando vado a replicare il comando con le istruzioni PulseIR e Delaymicrosecond quando mi trovo una sequenza di 0 microsecondi sia in ON che in OFF
0 usec, 0 usec
0 usec, 0 usec
0 usec, 0 usec
0 usec, 0 usec
0 usec, 0 usec
0 usec, 0 usec
0 usec, 0 usec

Grazie fin da ora per l'aiuto.
« Last Edit: January 30, 2012, 04:22:37 am by edmond_dantes » Logged

Genova
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3389
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Perchè complicarsi la vita quando nella cartella esempi di arduino c'e'  IRrecvDump questo riconosce il modello sony, nec, rc5, rc6, i valori in usec del treno di impulsi e il numero di bit di trasmissione, risultato del pacchetto in  HEX o in DEC

in base ai dati ricevuti ricopi i dati nell'esempio IRsendDemo il valore in HEX.
A me ha funzionato, con 3 tv, sky, decoder dgt, condizionatori, stereo.
Facci sapere ciao
Logged

no comment

Offline Offline
Newbie
*
Karma: 1
Posts: 48
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Purtroppo ci ho già provato con la libreria di Ken Shirriff ma non mi riconosce il protocollo e non mi riceve niente. Se riuscissi almeno a scoprire il protocollo potrei integrarlo nella libreria ma non ci sono riuscito.  smiley-confuse
Logged

0
Offline Offline
Edison Member
*
Karma: 24
Posts: 2309
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao,
nel libro:
"30 Arduino Projects for the Evil Genius"
che trovi rilasciato in parte (e cmq nelle parti che ti interessano) qui:
http://www.scribd.com/doc/79607089/33/Miscellaneous-Projects
c'è proprio un progettino base per la gestione di un Infrared Remote (progetto 28), che fa quel che chiedi tu.
E non solo (vedi salvataggio su EEPROM) ...


Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 48
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie Pitusso!
Vi farò sapere se riesco a venirne a capo.
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3389
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

cosa usi come ricevitore ir? TSOP? hai messo il condensatore e resistore?
come trasmettitore? led ir?

strano che non ricevi proprio nulla,
Scusa forse non ho capito io, col telecomando originale arduino legge i valori  e quando metti un led ir arduino non legge nulla?
O arduino non legge il tuo telecomando?

Il risultato di uscita che hai postato non lo riconosco nella libreria Ken Shirriff  "results->decode_type", dovrebbe darti il modello e se non lo trova comunque stamparti UNKNOW e il numero di bit anche 0 ma qualcosa dovrebbe darti è una stringa di uscita obbligata

Prova a mettere questo sketch

Code:
#include <IRremote.h>
int RECV_PIN = 6;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void dump(decode_results *results) {
  int count = results->rawlen;
  if (results->decode_type == UNKNOWN) {
    Serial.println("Could not decode message");
  }
  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: ");
    }
    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
  }
}
« Last Edit: January 30, 2012, 06:51:51 am by pablos » Logged

no comment

Offline Offline
Newbie
*
Karma: 1
Posts: 48
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao Pablos,

il risultato che ho postato l'ho ottenuto con lo sketch di ladydada.
Con quello di Ken non mi buttava fuori niente con quel comando IR, mentre con un altro telecomando si percui dovrebbe essere a posto. La mia ipotesi era che quel protocollo fosse talmente fuori standard da non riconoscerlo proprio.
Appena mi è possibile faccio altri esperimenti.
grazie
Logged

Bologna
Offline Offline
Newbie
*
Karma: 0
Posts: 42
L'anima sta all'uomo come l'uomo sta alla macchina
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


La libreria di Shirriff è una bomba, solo va fatto un pò di tuning, soprattutto se cerchi di analizzare codici recenti, magari a 64 bit.

Per riuscire a decodificare Panasonic, per dire, ho dovuto estendere la libreria con altre funzioni/costanti pescate tra i commenti al blog di Shirrif. Per decodificare WMC invece ho dovuto seguire altre indicazioni (RC6 / 64bit) sempre reperite su quel blog.

Per prima cosa devi essere sicuro dell'hardware, della stabilità del tuo input. Prima di mettere un condensatore non sono riuscito a beccare alcun codice, causa noise in entrata che sfasava i segnali "veri" del telecomando. In elettronica sono un pivello, ma leggendo qua e là ho capito che la stabilità del sensore IR è cruciale (meno importante sembra essere la portante 32-36-38 Khz)

Ti consiglio di iniziare da un telecomando "noto", come SONY, per validare il circuito e verificare che la libreria decodifichi correttamente. Quindi di spostarti su standard IR ancora non supportati. LIRC ti può dare un grande aiuto, ma a mio modesto avviso i 300 e passa commenti al post di Shirriff hanno un valore inestimabile.

Se proprio non ne esci, allora cerca di utilizzare i codici Raw magari aiutandoti con un 'oscilloscopio dei poveri' (tipo http://ostan.cz/IR_protocol_analyzer/) per capire i timings degli impulsi IR. Con il condizionatore Samsung ho fatto così, scoprendo che l'HDR_SPACE della libreria di Shirriff non corrispondeva a quello inviato dal mio condizionatore; l'ho portato a 9000ns ed ora funziona.
Logged

twitter: @shineangelic

Offline Offline
Newbie
*
Karma: 1
Posts: 48
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho rifatto le prove con lo sketch di Pablos (che suppongo sia una derivazione dell'IRrecvdump) dove ho "sparato" l'impulso da decifrare e a seguire quello di un telecomando decodificato (NEC)
il risultato è questo:
Code:
0
Could not decode message
Raw (6): -7900 3050 -2950 4600 -150 1300

FD906F
Decoded NEC: FD906F (32 bits)
Raw (68): -6230 9250 -4350 750 -350 750 -400 750 -350 750 -400 700 -450 700 -400 750 -400 700 -450 700 -1500 700 -1550 750 -1550 700 -1550 700 -1550 700 -1550 700 -400 750 -1550 700 -1550 650 -500 650 -450 700 -1550 700 -450 700 -450 650 -450 650 -500 650 -450 650 -1600 700 -1600 650 -450 650 -1650 650 -1550 650 -1600 700 -1600 650

Credo che il raw del non codificato non sia completo.
Gli esperimenti e le ricerche continuano....
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 48
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Eureka!  smiley
Ho scoperto che il mio IR da decodificare è un panasonic*! Ora devo "solo" implementare il protocollo nella libreria di Ken..
Grazie a tutti per il supporto.

* la scoperta è avvenuta al di fuori del mondo arduino. Diciamo che la stanchezza unita ad una grande dose di fortuna assieme al fatto di avere televisore e dvd della panasonic ha fatto il resto.  smiley-cool
Logged

Bologna
Offline Offline
Newbie
*
Karma: 0
Posts: 42
L'anima sta all'uomo come l'uomo sta alla macchina
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il protocollo Panasonic è già stato implementato da un lettore del Blog di Shirriff. Lo trovi nei commenti:

http://www.arcfn.com/2009/08/multi-protocol-infrared-remote-library.html?showComment=1253216531228#c4344993120598576281
Logged

twitter: @shineangelic

Offline Offline
Newbie
*
Karma: 1
Posts: 48
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao Shine,

si l'avevo visto nei commenti e ho già scaricato la libreria di Ken con il protocollo panasonic implementato. Appena posso farò le prove con quella versione e "dovrei" venirne finalmente a capo.
grazie ancora a tutti.
Logged

Pages: [1]   Go Up
Jump to: