Trasmettere e Ricevere contemporaneamente con IR.

Questo è il codice: (Utilizza la famosissima librearia per comandare gli IR).

#include <IRremote.h>
IRsend irsend;
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

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

void loop() {
  if (Serial.read() != -1) {
   while(!irrecv.decode(&results)) { irsend.sendSony(0xa90, 12); Serial.println("Speditoo");}
   Serial.println("Ricevuto"); 
   Serial.println(results.value, HEX);
   irrecv.resume(); // Receive the next value   
}

}

Il led IR trasmette correttamente perchè riesco a spegnere a comandare il mio Lettore DVD Portatile. Il Ricevitore pure perchè riesco a leggere i comandi del relativo telecomando sempre del lettore DVD. Ora per un test personale volevo trasmettere e ricevere allo stesso tempo sullo stesso Arduino.

Ma lanciando questo codice Arduino vedo che continua a spedire all’infinito perchè la condizione di ricezione non si verifica mai. Avete qualche idea?

Grazie Ragazzi :slight_smile:

hai già fatto questa domanda http://arduino.cc/forum/index.php/topic,106027.0.html se i segnali non sono troppo veloci.

nel setup hai irrecv.enableIRIn(); // Start the receiver mi sorge spontaneo chiedere se abiliti la receved perchè non c'e' anche un send.enable? prova a separare la ricezione e la trasmissione in 2 void differenti e richiamalrli dando un po' di respiro :), lo stesso segnale IR rigirato su se stesso non credo proprio riuscirai a farlo funzionare.

ciao

pablos:
hai già fatto questa domanda http://arduino.cc/forum/index.php/topic,106027.0.html se i segnali non sono troppo veloci.

nel setup hai
irrecv.enableIRIn(); // Start the receiver
mi sorge spontaneo chiedere se abiliti la receved perchè non c’e’ anche un send.enable?
prova a separare la ricezione e la trasmissione in 2 void differenti e richiamalrli dando un po’ di respiro :), lo stesso segnale IR rigirato su se stesso non credo proprio riuscirai a farlo funzionare.

ciao

Grazie per la risposta.

Il Send non lo abitilo perchè viene automaticamente abilitato appena vado con Send();

void IRsend::sendSony(unsigned long data, int nbits) {
  enableIROut(40);
  mark(SONY_HDR_MARK);
  space(SONY_HDR_SPACE);
  data = data << (32 - nbits);
  for (int i = 0; i < nbits; i++) {
    if (data & TOPBIT) {
      mark(SONY_ONE_MARK);
      space(SONY_HDR_SPACE);
    } 
    else {
      mark(SONY_ZERO_MARK);
      space(SONY_HDR_SPACE);
    }
    data <<= 1;
  }
}

Non capisco cosa intendo con "lo stesso segnale rigirato su se stesso. E mmm…ora provo dandogli un po’ di respiro!

Non capisco cosa intendi con "lo stesso segnale rigirato su se stesso.

Nel senso che non puoi con lo stesso arduino montare un trasmettitore IR su una porta e un ricevitore su un'altra e aspettarti che riceva il segnale appena emesso

...... In pratica tu usi un telecomando e vuoi che appena letto il codice te lo rispedisca? così si è fattibile. Specifica cosa vuoi fare... cosa intendi per contemporaneamente visto che qualsiasi programma di CPU o MCU eseguono istruzioni sequenziali.

ciao

Provato con questo codice ma non va ancora.

#include <IRremote.h>
IRsend irsend;
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

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

void loop() {
  if (Serial.read() != -1) {

    irsend.sendSony(0xa90, 12);
   Serial.println("Spedito"); //Sony TV power code     
   }
   delay(1000);
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }

}

Il codice di gestione degli interrupt è questo:

ISR(TIMER2_OVF_vect)
{
  RESET_TIMER2;

  uint8_t irdata = (uint8_t)digitalRead(irparams.recvpin);

  irparams.timer++; // One more 50us tick
  if (irparams.rawlen >= RAWBUF) {
    // Buffer overflow
    irparams.rcvstate = STATE_STOP;
  }
  switch(irparams.rcvstate) {
  case STATE_IDLE: // In the middle of a gap
    if (irdata == MARK) {
      if (irparams.timer < GAP_TICKS) {
        // Not big enough to be a gap.
        irparams.timer = 0;
      } 
      else {
        // gap just ended, record duration and start recording transmission
        irparams.rawlen = 0;
        irparams.rawbuf[irparams.rawlen++] = irparams.timer;
        irparams.timer = 0;
        irparams.rcvstate = STATE_MARK;
      }
    }
    break;
  case STATE_MARK: // timing MARK
    if (irdata == SPACE) {   // MARK ended, record time
      irparams.rawbuf[irparams.rawlen++] = irparams.timer;
      irparams.timer = 0;
      irparams.rcvstate = STATE_SPACE;
    }
    break;
  case STATE_SPACE: // timing SPACE
    if (irdata == MARK) { // SPACE just ended, record it
      irparams.rawbuf[irparams.rawlen++] = irparams.timer;
      irparams.timer = 0;
      irparams.rcvstate = STATE_MARK;
    } 
    else { // SPACE
      if (irparams.timer > GAP_TICKS) {
        // big SPACE, indicates gap between codes
        // Mark current code as ready for processing
        // Switch to STOP
        // Don't reset timer; keep counting space width
        irparams.rcvstate = STATE_STOP;
      } 
    }
    break;
  case STATE_STOP: // waiting, measuring gap
    if (irdata == MARK) { // reset gap timer
      irparams.timer = 0;
    }
    break;
  }

  if (irparams.blinkflag) {
    if (irdata == MARK) {
      PORTB |= B00100000;  // turn pin 13 LED on
    } 
    else {
      PORTB &= B11011111;  // turn pin 13 LED off
    }
  }

Non penso proprio andrà mai, perchè appena viene eseguito il Led smette di trasmettere perchè il controllo passa all’interrupt se non ho capito male. Quindi non rileva niente…

Mi tocca comprare un’altra piattaforma Arduino per separare ricezione e trasmissione. Ragazzi mi consigliate cosa comprare?.

La cosa migliore sarebbe comprare solamente l’Atmega328 e una Minibreadboard o no?..Dove posso comprarle entrambe a prezzi umani possibilmente dallo stesso negozio per pagare una sola spedizione?..Ho bisogno di altri componenti? penso di si

Mi sa che seguirò questo tutorial: