Go Down

Topic: [RISOLTO] Infrarossi: ho una stringa di bit, SO COSA FARCI ora :-) (Read 3722 times) previous topic - next topic

Tobo

#30
Dec 13, 2011, 06:10 pm Last Edit: Dec 13, 2011, 06:26 pm by Tobo Reason: 1
la funzione pulseIR prova a farla impostando un interrupt del timer interno di arduino che duri i microsecondi che interessano a te, in quel tempo continui a far oscillare il segnale...

http://wiki.mediazone.co.nz/Arduino+Timer+Interrupts

questo può aiutarti :)
Mom: Can he lead a normal life?
Doctor: NO! he'll be an engineer!

Tobo

Invece di invertire lo stato con il digitalWrite, utilizza il pwm :)
Il problema di tutto questo è fare i conti per i tempi e le frequenze :)

Credo che se analizzi il segnale mandato col tuo codice, come hai analizzato il segnale del telecomando, troverai parecchie differenze :)
Mom: Can he lead a normal life?
Doctor: NO! he'll be an engineer!

Tobo

Mom: Can he lead a normal life?
Doctor: NO! he'll be an engineer!

smartgatto

#33
Dec 27, 2011, 04:46 pm Last Edit: Dec 27, 2011, 07:30 pm by smartgatto Reason: 1
Niente Tobo...non ci sono riuscito....

EDIT:

Wow! non ci posso credere! mentre stavo iniziando a lavorare sul modulo wifi mi è venuta un'intuizione sull'IR...
ci ho lavorato sopra e ora finalmente ho decodificato il segnale!!!!!!    $) $) $)

Allora, semplicemente..
metto la stringa di dati che ricevo dall'arduino:

Code: [Select]
-8000 1400
-300 1350
-350 500
-1050 650
-1000 700
-1100 600
-1100 600
-1100 600
-1000 1550
-300 550
-1100 550
-1000 700


ai valori della seconda colonna do 1 se superiore a 1000 e 0 se inferiore e mi esce questa stringa di bit 110000001000
che separandoli a dovere esce 110-00-0001000
che guardacaso, guardando nel datasheet del SM5021 (il chip decoder del telecomando IR) mi indica proprio che per il tasto che ho premuto dovrebbero partire 12 bit:
-il primo blocco di tre bit sono sempre 110 (indicano la partenza -start word-)
-il secondo blocco di due bit è il Custom Code (che nel mio caso è 00)
-il terzo blocco di 7 bit è il Trasmission Code (che in questo caso corrisponde al tasto K4 ovvero il tasto che ho premuto!!).

In effetti facendo la stessa prova con altri tasti il risultato è corretto!!
Sono troppo contento! :-)

Ora viene la seconda parte, ovvero inviare il segnale IR verso il ricevitore e vedere se riesco ad accendere/spegnere la luce...

Se provo a caricare lo sketch di esempio IrSendDemo e lo modifico così non mi funziona:

Code: [Select]
#include <IRremote.h>

IRsend irsend;

void setup()
{
  Serial.begin(9600);
}

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


qualche suggerimento?

Tobo

// le segg righe generano 38KHz sul pin 11
  OCR2A = 208;
  TCCR2A = 0b01000011;
  TCCR2B = 0b00001001;

Se setti il pin 11 come input, non esce il segnale a 38khz, se lo setti ad output invece sì, potresti alternare input e output con un delayMicroseconds :)


p.s. ma tutti i numeri prima dell'8000?
Mom: Can he lead a normal life?
Doctor: NO! he'll be an engineer!

smartgatto


// le segg righe generano 38KHz sul pin 11
  OCR2A = 208;
  TCCR2A = 0b01000011;
  TCCR2B = 0b00001001;

Se setti il pin 11 come input, non esce il segnale a 38khz, se lo setti ad output invece sì, potresti alternare input e output con un delayMicroseconds :)


ti offendi se ti dico per l'ennesima volta che non ho capito?   :smiley-mr-green:

Quote

p.s. ma tutti i numeri prima dell'8000?


ho cambiato il ricevitore IR (scardinando un vecchio videoregistratore non più funzionante) e con questo riesco a leggere bene i dati IR inviati dal telecomando del lampadario...

comunque, su un altro sito ho recuperato questo sketch che domani adatterò al mio caso:
Code: [Select]
* IRremote: IRsendDemo - demonstrates sending IR codes with IRsend
* An IR LED must be connected to Arduino PWM pin 3.
* Version 0.1 July, 2009
* Copyright 2009 Ken Shirriff
* http://arcfn.com
* http://luckylarry.co.uk/arduino-projects/arduino-redefining-the-tv-remote/
*/

#include

IRsend irsend;

// just added my own array for the raw signal
unsigned int powerOn[68] = {4450,4500,550,1700,500,1750,500,1750,500,600,550,600,500,600,550,600,500,600,550,1700,550,1700,550,1700,500,600,550,600,500,600,550,600,500,650,500,600,550,1700,500,650,500,600,550,600,500,600,550,600,500,600,550,1700,550,600,500,1700,550,1700,550,1700,550,1700,500,1750,500,1750,500}; // sostituire la stringa dei dati con quelli del telecomando togliendo il meno

void setup()
{
  Serial.begin(9600);
}

void loop() {

      // altered the code just to send/test my raw code
      irsend.sendRaw(powerOn,68,38);
      delay(100);

}


dovrebbe essere la soluzione al mio dilemma, in modo da inviare i dati in raw direttamente...vedremo! ora non posso perchè sono sul posto di lavoro...

Tobo

Azz...lavori fino a tardi!

fammi sapere se con IR send funziona :)
Mom: Can he lead a normal life?
Doctor: NO! he'll be an engineer!

smartgatto

#37
Dec 28, 2011, 04:40 pm Last Edit: Dec 28, 2011, 06:57 pm by smartgatto Reason: 1
Niente da fare..ho adattato lo sketch con il mio codice:
Code: [Select]


#include <IRremote.h>

IRsend irsend;

// just added my own array for the raw signal
unsigned int powerOn[24] = {1350,350,1350,350,500,1000,700,1100,600,1100,550,1150,600,1100,600,1100,1400,350,500,1150,550,1100,600};

void setup()
{
 Serial.begin(9600);
}

void loop() {

     // altered the code just to send/test my raw code
     irsend.sendRaw(powerOn,24,38);
     delay(100);

}


ma non funziona...
allora ho provato a caricarci su il RAW del telecomando della tv (samsung) e questo funziona... GRRRR....

perchèèèè!!! sto diventando matto!

smartgatto

Ci sono riuscitooo!!! :-DDD
Alla fine sono tornato alle origini...ho lasciato perdere la IRremote e sono tornato ai dati inviati puri tramite la funzione creata "pulseIR".
Ecco il codice:

Code: [Select]


int IRledPin =  13;    // LED connected to digital pin 13

void setup()   {               

  pinMode(IRledPin, OUTPUT);     
  Serial.begin(9600);
}

void loop()                     
{
  SendVentilatore();
  SendVentilatore();
  SendVentilatore();
  SendVentilatore(); 
  delay(5000);  // accendi e spegni la luce ogni 5 secondi
}

// 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
   digitalWrite(IRledPin, LOW);   // this also takes about 3 microseconds
   delayMicroseconds(10);         // hang out for 10 microseconds

   // so 26 microseconds altogether
   microsecs -= 26;
  }

  sei();  // this turns them back on
}

void SendVentilatore() {

  pulseIR(1320);
  delayMicroseconds(310);
  pulseIR(1320);
  delayMicroseconds(320);
  pulseIR(500);
  delayMicroseconds(1160);
  pulseIR(500);
  delayMicroseconds(1160);
  pulseIR(500);
  delayMicroseconds(1160);
  pulseIR(500);
  delayMicroseconds(1160);
  pulseIR(500);
  delayMicroseconds(1160);
  pulseIR(500);
  delayMicroseconds(1160);
  pulseIR(1320);
  delayMicroseconds(320);
  pulseIR(500);
  delayMicroseconds(1160);
  pulseIR(500);
  delayMicroseconds(1160);
  pulseIR(500);
  delayMicroseconds(7820);
   
}


E con questo codice funziona!
Ora posso proseguire con il mio studio... :-)

Tobo

io ho fatto in maniera ancora diversa :)
Intanto ho usato la libreria di shirriff per vedere i tempi, li ho salvati in un array di int e questo è il risultato:

Code: [Select]
int times[67] = {4400,700,400,700,1550,700,1550,700,1550,650,500,650,1550,700,1550,700,400,700,1550,700,450,700,400,700,450,700,1550,700,400,700,450,700,1550,650,450,700,1550,700,450,650,450,650,450,700,450,650,450,700,450,650,1550,700,450,700,1550,700,1550,700,1550,700,1550,650,1600,650,1600,650,40100};
#define IR_PIN (11)
int modePin = INPUT;

void setup()
{
  // le segg righe generano 38KHz sul pin 11
  OCR2A = 208;
  TCCR2A = 0b01000011;
  TCCR2B = 0b00001001;
 
  pinMode(IR_PIN, modePin);
}

void loop()
{
  delay(3000);
  pinMode(IR_PIN, OUTPUT); 
  for (int i = 0; i <67; i++)
  {
    delayMicroseconds(times[i]-5);
    modePin = !modePin;
    pinMode(IR_PIN, modePin);
  }
}


e funge :)
Mom: Can he lead a normal life?
Doctor: NO! he'll be an engineer!

Stefanoxjx

#40
Mar 14, 2012, 03:37 pm Last Edit: Mar 14, 2012, 03:39 pm by Stefanoxjx Reason: 1
@Tobo:
Scusa una domanda, ma c'è una cosa che non capisco nel tuo sketch, come mai usi pinMode
Code: [Select]

 delayMicroseconds(times[i]-5);
   modePin = !modePin;
   pinMode(IR_PIN, modePin);


e non digitalWrite?

Grazie.
Ciao.
www.multiwii.it
www.sdmodel.it

Tobo

Perchè il segnale  a 38khz sul pin 11 che genero all'inizio, è attivo solo se il pin è configurato come output, se lo configuro come input disattivo il segnale pwm  :)

Mom: Can he lead a normal life?
Doctor: NO! he'll be an engineer!

Stefanoxjx


Perchè il segnale  a 38khz sul pin 11 che genero all'inizio, è attivo solo se il pin è configurato come output, se lo configuro come input disattivo il segnale pwm  :)




Ora è chiaro, grazie della risposta :)
www.multiwii.it
www.sdmodel.it

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy