Sensore IR 38Khz

Ragazzi ho comparto un sensore IR che riceve un segnale modulato di 38Khz...adesso devo cercare di far lampeggiare il mio led infrarosso a 38Khz per poter far si che il sensore riconosca il segnale... Esiste una funzione sull'arduino o qualcosa del genere che mi possa generare un treno di impulsi a 38Khz... altrimenti cosa posso fare?

GRAZIE

Si, se guardi nel playground ci sono molti esempi per generare un treno di impulsi a 38Khz. Io ed Enkel (un altro frequentatore del forum) abbiamo usato questo: http://tthheessiiss.wordpress.com/2009/08/05/dirt-cheap-wireless/ C'è già anche lo sketch e siamo riusciti da un arduino all'altro a far passare intere stringhe. Facci sapere.

grande nathanvi, come al solito... oggi provo pure io a fare qualcosa del genere!

//dirt cheap wireless TX
//generates 38kHz carrier wave on pin 9 and 10
//sends data via TX every 500ms
void setup()
{
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);

  // Clear Timer on Compare Match (CTC) Mode
  bitWrite(TCCR1A, WGM10, 0);
  bitWrite(TCCR1A, WGM11, 0);
  bitWrite(TCCR1B, WGM12, 1);
  bitWrite(TCCR1B, WGM13, 0);

  // Toggle OC1A and OC1B on Compare Match.
  bitWrite(TCCR1A, COM1A0, 1);
  bitWrite(TCCR1A, COM1A1, 0);
  bitWrite(TCCR1A, COM1B0, 1);
  bitWrite(TCCR1A, COM1B1, 0);

  // No prescaling
  bitWrite(TCCR1B, CS10, 1);
  bitWrite(TCCR1B, CS11, 0);
  bitWrite(TCCR1B, CS12, 0);

  OCR1A = 210;
  OCR1B = 210;

  Serial.begin(2400);
}

void loop()
{
  Serial.println("testing testing testing");
  delay(500);
}

non capisco quale sia l’uscita :smiley:

ma al posto di TX e RX posso usare altri pin visto che cmq devo mettere piu di un sensore!

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1176098434 ho trovato questo

che poi la funzione da implementare per far lampeggiare il led con una frequenza di 38Khz è:

// this will write an oscillation at 38KHz for a certain time in useconds
void oscillationWrite(int pin, int time) {
for(int i = 0; i <= time/26; i++) {
digitalWrite(pin, HIGH);
delayMicroseconds(13);
digitalWrite(pin, LOW);
delayMicroseconds(13);
}
}

questa l’ho trovata dove mi hai detto tu Calamaro!

io avevo trovato anche questo:

http://www.arcfn.com/2009_08_01_archive.html

puo andar bene se devo far funzioanre il sensore come rilevatore di ostacoli?

bravo… ottimo… ora rimane da trovare il modo di misurare la il delta t :smiley:

ma di quale stai parlando?

#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(){

trasmetti();
ricevi();

}

void ricevi() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
}

void trasmetti() {
  if (Serial.read() != -1) {
    for (int i = 0; i < 3; i++) {
      irsend.sendSony(0xa90, 12); // Sony TV power code
      delay(100);
    }
  }
}

pensavo a una roba del genere… o servono per forza 2 arduini?

boh a me non mi funziona il send sul pwm 3 boh

io appena lo provo ti faccio sapere..purtroppo oggi non ho tempo...

non funzionerà te lo dico da subito... non si può ricevere e trasmettere contemporaneamente... l'ho scoperto poco fa

e quella funzione che ho postato prima può andar bene? oopure vedi ho trovato questo:

http://www.arduino.cc/playground/Code/Timer1

dacci un occhiata se puoi!

ora come ora non saprei, comunque penso sia utile...

dovremmo verificare se cambiando il valore del prescaler si va a dare noia alla libreria IR remote.

perchè sennò si potrebbe cambiare il prescaler in modo che il pwm sia sui 38kHz, poi ci sarebbe da vedere come funziona lo standard dell'IR per capire come far capire un segnale al ricevitore.

però le mie conoscenze informatiche sono molto limitate :-/

#define IR_CLOCK_RATE    36000L// se cambi questo cambi la frequenza
#define pwmPin 3   // IR Carrier 


void setup()  {
  // set the data rate for the Serial port
  Serial.begin(2400);
  
  // toggle on compare, clk/1
  TCCR2A = _BV(WGM21) | _BV(COM2A0);
  TCCR2B = _BV(CS20);
  // 36kHz carrier/timer
  OCR2A = (F_CPU/(IR_CLOCK_RATE*2L)-1);
  pinMode(pwmPin, OUTPUT);
  
}

void loop() 
{
  char i;
  for(i='A'; i<='Z'; i++)
  {
    Serial.print(i);
  }
  delay(40);
}

questo codice dovrebbe funzionare per la trasmissione di una portante a 36kHz :smiley:

e quindi se al posto di 36000L ci metto 38000 dovrebbe andare bene? :D quali librerie hai usato?

ah boh sinceramente non lo so. non l'ho fatto io :D

TCCR2A TCCR2B OCR2A questi sono 3 registri del microcontrollore, nma non ricordo cosa fanno...so solo che uno è il prescaler e gli altri 2 servono per il duty :D

poi boh il serial print non so a cosa serva di preciso... ora mi guardo per benino come risponde l'arduino e misuro la frequenza con l'oscilloscopio :D

però boh non avevo mai visto sta roba non ti assicuro nulla... speriamo che la libreria IRremote.h funzioni :S

Calamaro scusa ma perche' scomodare il softwae quando lopuoi fare tranquillamente via hardware. il primo circuito di questa pagina http://www.tkk.fi/Misc/Electronics/circuits/ir_send.html e' un generatore di segnale IR a 40 Khz ( facilmentemodificabile in 38 Khz ) che viene controllato da una tensione +5 per attivarsi. E' basato su un NE555 che trovi dappertutto ;) in modo da lasciare al software ed a arduino solo l'attivazione del trasmettitore e la ricezione del segnale.