Pages: 1 2 [3]   Go Down
Author Topic: [RISOLTO] Infrarossi: ho una stringa di bit, SO COSA FARCI ora :-)  (Read 2431 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
« Last Edit: December 13, 2011, 12:26:05 pm by Tobo » Logged

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

Offline Offline
Full Member
***
Karma: 0
Posts: 166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Credo che se analizzi il segnale mandato col tuo codice, come hai analizzato il segnale del telecomando, troverai parecchie differenze smiley
Logged

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

Offline Offline
Full Member
***
Karma: 0
Posts: 166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Up!

Ci sono news?
Logged

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

0
Offline Offline
Full Member
***
Karma: 0
Posts: 144
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!!!!!!    smiley-money smiley-money smiley-money

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

Code:
-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:
#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?
« Last Edit: December 27, 2011, 01:30:30 pm by smartgatto » Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

// 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 smiley


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

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

0
Offline Offline
Full Member
***
Karma: 0
Posts: 144
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

// 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 smiley

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:
* 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...
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Azz...lavori fino a tardi!

fammi sapere se con IR send funziona smiley
Logged

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

0
Offline Offline
Full Member
***
Karma: 0
Posts: 144
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Niente da fare..ho adattato lo sketch con il mio codice:
Code:

#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!
« Last Edit: December 28, 2011, 12:57:50 pm by smartgatto » Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 144
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

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... :-)
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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 smiley
Logged

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

0
Offline Offline
Sr. Member
****
Karma: 1
Posts: 443
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@Tobo:
Scusa una domanda, ma c'è una cosa che non capisco nel tuo sketch, come mai usi pinMode
Code:
 delayMicroseconds(times[i]-5);
    modePin = !modePin;
    pinMode(IR_PIN, modePin);

e non digitalWrite?

Grazie.
Ciao.
« Last Edit: March 14, 2012, 09:39:21 am by Stefanoxjx » Logged


Offline Offline
Full Member
***
Karma: 0
Posts: 166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley

Logged

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

0
Offline Offline
Sr. Member
****
Karma: 1
Posts: 443
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley



Ora è chiaro, grazie della risposta smiley
Logged


Pages: 1 2 [3]   Go Up
Jump to: