Go Down

Topic: [RISOLTO] Infrarossi: ho una stringa di bit, SO COSA FARCI ora :-) (Read 2954 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