Infrarossi SendRaw

Salve a tutti!
Volevo provare ad usare Arduino come un telecomando per accendere/spengere tv e/o radio.
Ho dissaldato un led infrarosso da un vecchio telecomando tv.
L'ho collegato come segue:

  • L'anodo ai 5v (tramite resistenza da 47 ohm)
  • Il catodo al collettore di un transistor NPN
  • L'emettitore a massa
  • La base al pin 3 (tramite resistenza da 220 ohm)

Ho fatto un primo tentativo con il codice nell'esempio per accendere/spengere una tv sony:

#include <IRremote.h>

IRsend irsend;

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

void loop() {
    for (int i = 0; i < 3; i++) {
      irsend.sendSony(0xa90, 12); // Sony TV power code
      delay(40);
  }
}

Con il codice sovrastante il televisore si accende e si spenge :slight_smile:
A questo punto ho voluto provare con altri dispositivi non sony (sennò è troppo semplice :P)
Ho ricercato su google e ho trovato il metodo: irsend.sendRaw
Quindi attraverso lo sketch IRrecvDump ho ottenuto il codice Raw di un pulsante!
E ho utilizzato lo sketch sottostante:

#include <IRremote.h>

IRsend irsend;
unsigned int xPause[] = {-8214, 3450, -1700, 450, -450, 450, -1250, 450, -450, 400, -450, 450, -400, 450, -400, 450, -450, 450, -400, 450, -400, 450, -450, 400, -450, 450, -400, 450, -400, 450, -1300, 450, -400, 450, -450, 400, -450, 450, -400, 450, -450, 400, -450, 450, -400, 450, -1300, 400, -450, 450, -1300, 500, -350, 450, -400, 450, -1300, 450, -1250, 450, -1300, 450, -400, 450, -450, 400, -450, 450, -1250, 450, -450, 400, -1300, 450, -1300, 450, -1250, 450, -1300, 450, -400, 450, -450, 400, -1300, 450, -400, 450, -450, 450, -400, 450, -400, 450, -450, 450, -400, 450, -1300, 400};
void setup()
{
  Serial.begin(9600);
}

void loop() {
  for (int i = 0; i < 3; i++) {
     irsend.sendRaw(xPause,100,38);
     delay(50);
    
  }
  delay(10);
}

Ho provato anche con il codice Raw del televisore sony e di altri dispositivi ma non c'è verso di farlo funzionare!

#include <IRremote.h> 

IRsend irsend; 

unsigned int XPAUSE[] = { 3450, -1700, 450, -450, 450, -1250, 450, -450, 400, -450, 450, -400, 450, -400, 450, -450, 450, -400, 450, -400, 450, -450, 400, -450, 450, -400, 450, -400, 450, -1300, 450, -400, 450, -450, 400, -450, 450, -400, 450, -450, 400, -450, 450, -400, 450, -1300, 400, -450, 450, -1300, 500, -350, 450, -400, 450, -1300, 450, -1250, 450, -1300, 450, -400, 450, -450, 400, -450, 450, -1250, 450, -450, 400, -1300, 450, -1300, 450, -1250, 450, -1300, 450, -400, 450, -450, 400, -1300, 450, -400, 450, -450, 450, -400, 450, -400, 450, -450, 450, -400, 450, -1300, 400}; 

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

void loop () { 
  for (int i = 0; i <3; i++) { 
    irsend.sendRaw (XPAUSE, sizeof(XPAUSE)/sizeof(int),38); 
    delay (50); 

  } 
  delay (10000); 
}

x iscrizione

Grazie mille della risposta!
Ma non ho ben capito cosa devo fare:

  • devo aggiungere "sizeof(XPAUSE)/sizeof(int)"
  • devo togliere dall'array il primo valore
  • devo cambiare i tempi del delay()

Giusto?
Però nonostante ciò non mi funziona =(

Guardando sulla documentazione:

Handling raw codes
The library provides support for sending and receiving raw durations. This is intended mainly for debugging, but can also be used for protocols the library doesn't implement, or to provide universal remote functionality.
The raw data for received IR measures the duration of successive spaces and marks in 50us ticks. The first measurement is the gap, the space before the transmission starts. The last measurement is the final mark.

The raw data for sending IR holds the duration of successive marks and spaces in microseconds. The first value is the first mark, and the last value is the last mark.

There are two differences between the raw buffers for sending and for receiving. The send buffer values are in microseconds, while the receive buffer values are in 50 microsecond ticks. The send buffer starts with the duration of the first mark, while the receive buffer starts with the duration of the gap space before the first mark. The formats are different because I considered it useful for the library to measure gaps between transmissions, but not useful for the library to provide these gaps when transmitting. For receiving, 50us granularity is sufficient for decoding and avoids overflow of the gaps, while for transmitting, 50us granularity is more than 10% error so 1us granularity seemed better.

.. non ho mai provato ad usare la libreria, ma sembrerebbe che non si possa usare i valori della dump direttamente in input alla sendraw ....

#define RAWBUF 100 ====>200? ....255...?? 256+??

Ho visto che nell'array ci sono valori negativi, ha senso allora che sia definito come "unsigned int" ?

I have see on array some values are negative, so it is normal to defined array as "unsigned int" ?

sorry...(first value must be Mark/+/High)

unsigned int XPAUSE[] = { 3450, 1700, 450, 450, 450, 1250, 450, 450, 400, 450, 450, 400, 450, 400, 450, 450, 450, 400, 450, 400, 450, 450, 400, 450, 450, 400, 450, 400, 450, 1300, 450, 400, 450, 450, 400, 450, 450, 400, 450, 450, 400, 450, 450, 400, 450, 1300, 400, 450, 450, 1300, 500, 350, 450, 400, 450, 1300, 450, 1250, 450, 1300, 450, 400, 450, 450, 400, 450, 450, 1250, 450, 450, 400, 1300, 450, 1300, 450, 1250, 450, 1300, 450, 400, 450, 450, 400, 1300, 450, 400, 450, 450, 450, 400, 450, 400, 450, 450, 450, 400, 450, 1300, 400};

you will also need to increase RAWBUF size in IRRemote Library.

Ciao,

tra gli esempi della libreria c'è IRrecord che salva un codice UNKNOWN in un array e lo ritrasmette quando si preme un pulsante.

Potresti provare innanzitutto quello sketch per verificare la corretta ritrasmissione di un codice memorizzato e poi eventualmente modificarlo in base alle tue esigenze.

Ciao.
V.

Incredibile funziona! (Incredible, it's works!)
Ecco lo sketch: (This is the sketch:)

#include <IRremote.h>
IRsend irsend;

unsigned int prova[] = {3450,1750,400,400,450,1300,450,400,450,400,450,450,400,450,450,400,450,400,450,450,450,400,450,400,450,450,400,450,450,1250,450,450,450,400,450,400,450,400,450,450,450,400,450,400,450,450,400,450,450,1250,450,450,450,400,450,400,450,450,400,450,450,400,450,400,450,450,400,1300,450,400,450,1300,450,1250,450,1300,450,1300,400,450,450,400,450,1300,400,450,450,1300,400,1300,450,1300,450,1250,450,400,450,1350,400};
void setup()
{
  Serial.begin(9600);
}

void loop() {
  for (int i = 0; i < 3; i++) {
     irsend.sendRaw(prova,sizeof(prova)/sizeof(int),38);
     delay(50);
    
  }
  delay(2000);
}

Se a qualcuno dovesse servire ...

  1. Ho ottenuto il codice RAW grezzo dallo sketch IRrecvDump
  2. Con il blocco note gedit (trova e sostituisci) ho tolto gli spazi e messo le virgole
  3. Sempre con il blocco note gedit ho tolto tutti i meno "-"
  4. Ho eliminato il primo valore dell'array

if to someone was helpful...

  1. I got the crude RAW code by the sketch of IRrecvDump
  2. With notepad gedit (find and replace) I deleted the spaces and I put the commas
  3. With notepad gedit I deleted the minus "-"
  4. I deleted the first value of the array
    (Sorry for the bad English)

Prova a trasmettere il codice di un telecomando samsung, io ci ho provato un po' di volte con questo modo, ma non riesco...
P.S ho fatto un programmino in VB per togliere gli spazi e i "-" e inserire le virgole.

alex27riva:
Prova a trasmettere il codice di un telecomando samsung, io ci ho provato un po' di volte con questo modo, ma non riesco...
P.S ho fatto un programmino in VB per togliere gli spazi e i "-" e inserire le virgole.

Vedi per caso qualche lucina muoversi o lampeggiare?
Io ho provato anche con un telecomando samsung e funziona!

Vedi per caso qualche lucina muoversi o lampeggiare?

che lucina intendi? sulla tv?
Ma quando faccio il dumpIR ricevo codici raw sempre diversi ogni volta, è normale?

Si, dicevo sulla tv!
Ho notato anche io che i RAW sono quasi tutti diversi:
pigia ripetutamente il pulsante e/o tienilo premuto in modo da ricevere molti valori (10-20).
Noterai che un valore viene ripetuto più volte ed è quello giusto!

Ok, ma se riceve valori diversi, è come una specie di rolling code?
Comunque sulla tv il led non lampeggiava...

ah e poi perchè devo eliminare il primo valore dell'array?

Cel ho fatta! funziona!
Ma volevo collegare più led ir ad un pin di Arduino, come posso collegarli? tutti in parallelo usando un transistor 2n3904?

alex27riva:
ah e poi perchè devo eliminare il primo valore dell'array?

Il motivo non lo sò magari qualcuno con più esperienza ce lo può spiegare!

Ho scritto un articolo sul mio blog, a qualcuno può tornare utile: Alessandro Riva elettronica: Trasmettere comando infrarossi con funzione sendRaw libreria IrRemote

Ti volevo correggere 2 cosucce riguardo all'articolo:

  1. nello sketch non hai messo un delay di almeno 1-2 secondi (se non di più), rischi di far impazzire il dispositivo XD
  2. Nello schema hai collegato il led al pin con una resistenza di 100ohm!!
    Così fai passare 50mA che potrebbero danneggiare il pin di arduino!
    O metti un transistor o aumenti la resistenza ad un valore di circa 220ohm (questo dipende soprattutto dal tipo di led, per esempio il mio consumava anche più di 100mA! Pertanto ho preferito usare un transistor)

Gono:
Ti volevo correggere 2 cosucce riguardo all'articolo:

  1. nello sketch non hai messo un delay di almeno 1-2 secondi (se non di più), rischi di far impazzire il dispositivo XD
  2. Nello schema hai collegato il led al pin con una resistenza di 100ohm!!
    Così fai passare 50mA che potrebbero danneggiare il pin di arduino!
    O metti un transistor o aumenti la resistenza ad un valore di circa 220ohm (questo dipende soprattutto dal tipo di led, per esempio il mio consumava anche più di 100mA! Pertanto ho preferito usare un transistor)

Per il delay l'ho messo così basso solo per provare, per quanto riguarda la resistenza 100ohm secondo me vanno bene, con la resistenza da 220ohm la portata del led infrarosso si dimezza...