Problemi con le librerie IR di Ken Shirriff

Salve a tutti, scusate se mi presento in questo post di aiuto, ma non avendo trovato un post dove presentarmi non ne volevo aprire 2.

Volevo porre a questa comunità un mio problema e chiedere il vostro aiuto, in quanto ho sempre trovato soluzioni ai miei problemi in rete e su questo forum, ma questa volta non ci riesco proprio a saltarci fuori.

Come da titolo ho la necessità di usare le librerie IR di Ken Shirriff, lo scopo e di registrare alcuni pulsanti di vari telecomani in una centralina implementa con arduino per poi controllare i vari dispositivi attraverso una pagina web. Il sistema funziona correttamente dal punto di visa web e della lettura dei segnali infrasorri, ma non riesco a riprodurli.

Naturalmente ho provato tutti i tutorial della libreria e non ho nessun problema nella registrazione dei segnali, ma ho gravissimi problemi nella riproduzione, in quanto i segnali o non partono o se partono arrivano troncati e non vengono riconosciuti.

Es: avviando l'esempio IRrecod mi viene riconosiuto il segnale del telecomando della sony con relativo codice, ma quando lo riproduco con la centralina e lo provo a far leggere ad un'altra scheda arduni che implementa lo stesso circuito di riconoscimento ( con il sensore IR) il segnale o non arriva o arriva non completo e mi viene riconosciuto un segnake di unknow.

Inutile dire che ho implementato correttamente il circuito del led IR sul pin 3 e con relativa resistenza(ho provato a cambaire anche i valori della resistenza per togliermi ogni dubbio ma niente). Ho provato diversi LED IR per verificare che il primo non fosse rotto e a implementare i consigli sul blog di Ken Shirriff, ma nada.

I miei strunmenti sono: -Arduino mega 2560; -Ardunio mega con ATmega 1280; -LED IR classico che si compra in ogni negozio.

Se qualcuno potesse aiutarmi gli sarei davvero grato. Ringrazio anticipatamente chiunque si dedicherà a dami una risposta!

prego codice. Ciao Uwe

Il codice è quello dell’esempio, volevo sapere da qualcuno se ha avuto lo stesso problema o se ci sono problemi della libreria con l’arduino mega o con i LED IR…cmq eccolo:

/*
 * IRrecord: record and play back IR signals as a minimal 
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * An IR LED must be connected to the output PWM pin 3.
 * A button must be connected to the input BUTTON_PIN; this is the
 * send button.
 * A visible LED can be connected to STATUS_PIN to provide status.
 *
 * The logic is:
 * If the button is pressed, send the IR code.
 * If an IR code is received, record it.
 *
 * Version 0.11 September, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */

#include <IRremote.h>

int RECV_PIN = 11;
int BUTTON_PIN = 12;
int STATUS_PIN = 13;

IRrecv irrecv(RECV_PIN);
IRsend irsend;

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  pinMode(BUTTON_PIN, INPUT);
  pinMode(STATUS_PIN, OUTPUT);
}

// Storage for the recorded code
int codeType = -1; // The type of code
unsigned long codeValue; // The code value if not raw
unsigned int rawCodes[RAWBUF]; // The durations if raw
int codeLen; // The length of the code
int toggle = 0; // The RC5/6 toggle state

// Stores the code for later playback
// Most of this code is just logging
void storeCode(decode_results *results) {
  codeType = results->decode_type;
  int count = results->rawlen;
  if (codeType == UNKNOWN) {
    Serial.println("Received unknown code, saving as raw");
    codeLen = results->rawlen - 1;
    // To store raw codes:
    // Drop first value (gap)
    // Convert from ticks to microseconds
    // Tweak marks shorter, and spaces longer to cancel out IR receiver distortion
    for (int i = 1; i <= codeLen; i++) {
      if (i % 2) {
        // Mark
        rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK - MARK_EXCESS;
        Serial.print(" m");
      } 
      else {
        // Space
        rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK + MARK_EXCESS;
        Serial.print(" s");
      }
      Serial.print(rawCodes[i - 1], DEC);
    }
    Serial.println("");
  }
  else {
    if (codeType == NEC) {
      Serial.print("Received NEC: ");
      if (results->value == REPEAT) {
        // Don't record a NEC repeat value as that's useless.
        Serial.println("repeat; ignoring.");
        return;
      }
    } 
    else if (codeType == SONY) {
      Serial.print("Received SONY: ");
    } 
    else if (codeType == RC5) {
      Serial.print("Received RC5: ");
    } 
    else if (codeType == RC6) {
      Serial.print("Received RC6: ");
    } 
    else {
      Serial.print("Unexpected codeType ");
      Serial.print(codeType, DEC);
      Serial.println("");
    }
    Serial.println(results->value, HEX);
    codeValue = results->value;
    codeLen = results->bits;
  }
}

void sendCode(int repeat) {
  if (codeType == NEC) {
    if (repeat) {
      irsend.sendNEC(REPEAT, codeLen);
      Serial.println("Sent NEC repeat");
    } 
    else {
      irsend.sendNEC(codeValue, codeLen);
      Serial.print("Sent NEC ");
      Serial.println(codeValue, HEX);
    }
  } 
  else if (codeType == SONY) {
    irsend.sendSony(codeValue, codeLen);
    Serial.print("Sent Sony ");
    Serial.println(codeValue, HEX);
  } 
  else if (codeType == RC5 || codeType == RC6) {
    if (!repeat) {
      // Flip the toggle bit for a new button press
      toggle = 1 - toggle;
    }
    // Put the toggle bit into the code to send
    codeValue = codeValue & ~(1 << (codeLen - 1));
    codeValue = codeValue | (toggle << (codeLen - 1));
    if (codeType == RC5) {
      Serial.print("Sent RC5 ");
      Serial.println(codeValue, HEX);
      irsend.sendRC5(codeValue, codeLen);
    } 
    else {
      irsend.sendRC6(codeValue, codeLen);
      Serial.print("Sent RC6 ");
      Serial.println(codeValue, HEX);
    }
  } 
  else if (codeType == UNKNOWN /* i.e. raw */) {
    // Assume 38 KHz
    irsend.sendRaw(rawCodes, codeLen, 38);
    Serial.println("Sent raw");
  }
}

int lastButtonState;

void loop() {
  // If button pressed, send the code.
  int buttonState = digitalRead(BUTTON_PIN);
  if (lastButtonState == HIGH && buttonState == LOW) {
    Serial.println("Released");
    irrecv.enableIRIn(); // Re-enable receiver
  }

  if (buttonState) {
    Serial.println("Pressed, sending");
    digitalWrite(STATUS_PIN, HIGH);
    sendCode(lastButtonState == buttonState);
    digitalWrite(STATUS_PIN, LOW);
    delay(50); // Wait a bit between retransmissions
  } 
  else if (irrecv.decode(&results)) {
    digitalWrite(STATUS_PIN, HIGH);
    storeCode(&results);
    irrecv.resume(); // resume receiver
    digitalWrite(STATUS_PIN, LOW);
  }
  lastButtonState = buttonState;
}

Ciao, che IDE stai utilizzando? Tempo fa avevo lavorato con quelle librerie, e avevo riscontrato problemi con alcune versioni dell'IDE (non ho approfondito la questione, anche se anomala): http://arduino.cc/forum/index.php/topic,84513.msg633983.html#msg633983

Uso l'ultima versione dell'IDE dell'arduino...ho già fatto anche la sostituizione del nome del file nella libreria Wprogram.h con Arduino.h che dice nel blog...il problema non è solo nella parte di invio del segnale la lettura funziona correttamente..... :fearful:

scusate l'intromissione anche l'off topic,ma parlando di problemi con la libreria, io ne ho trovato uno, questa libreria va in conflitto con quella di leo (cioe quella del tempo) perche utilizzano lo stesso timer a quanto ho capito, e al povero leo gli ho rotto le scatole fin troppo e non sn riuscito a sistemare!

Ma quello che mi da da fare è il fatto che questo è uno degli sketch di esempio e quindi dovrebbe andare per forza...quello che mi veniva in mente è se per caso usando l'arduino mega andasse cambiato qualche parametro nella frequenza di invio del LED IR...perche tutti i montaggi che ho visto li fanno sull'arduino UNO....

non va assolutamente bene la ide 1.0, molte volte le librerie esterne non funzionano...perciò usa la 0023 e vedrai che ti funzionerà ;)

Ciao a tutti! Anche io ho riscontrato un problema con queste librerie, ma non riguarda l' IDE, piuttosto quando carico lo sketch IRrecvDemo e apro il serial monitor per controllare i codici inviati dal telecomando, mi vengono letti 1 volta ogni tanto... sinceramente non capisco perchè mi funziona così ad intermittenza!! :~ Il telecomando che uso è uno di quelli dell' HP in dotazione qualche anno fa con i notebook che risulta essere un RC6 (c' è scritto dietro), quindi dovrebbe essere riconosciuto senza problemi dalla libreria ed infatti i codici vengono rilevati, ma riuscire ad accendere una luce dopo 20 secondi e anche più di pressione sui tasti non è molto piacevole! Qualcuno sa cosa potrebbe essere? Grazie a tutti per il supporto!

Volevo intanto ringraziare tutti delle risposte purtroppo sono stato un po impegnato con l'università e non ho potuto provare i vostri consigli prima di oggi....Cmq fallimento totale, non riesco ancora ad inviare i segnali, la lettura da telecomando a me funziona bene con qualsiasi versione dell'IDE quindi non saprei come aiutare cig84.... :~

Io comincio a pensare di darci a mucchio anche perchè veramente non riesco a capire che cosa possa essere....Se qualcun'altro avesse qualche altra idea sul problema gliene sarei grato....se ci fosse qualcuno che ha già utilizzato questa libreria mi potrebbe dire che tipo di arduino ha usato? Io ho 2 versioni della mega e nessuna dei 2 funge...