banner

In questa lezione, vedremo come vengono usati in Arduino i segnali infrarossi. Chi di noi non ha un telecomando in casa, come ad esempio quello per accendere e spegnere la TV ? Bene oggi capiremo come il nostro TV è in grado di stabilire il tasto premuto dal nostro telecomando.

I supporti hardare richiesti per questi programmi sono davvero pochi. Infatti oltre allo stesso Arduino, dovremo procurarci su Ebay un ricevente IR, con il relativo telecomando e un LED ad infrarossi, in grado di inviare i segnali. Ecco una lista di possibili prodotti, acquistabili su ebay:

 

 

 

Il costo di questi dispositivi è davvero poco e si aggira intorno ai 5 Euro.

Dal punto di vista software è necessario scaricare la libreria ufficiale per Arduino, da questo link:

 

Come funziona una trasmissione ad infrarossi ? 

Il meccanismo di funzionamento di una trasmissione ad infrarossi è abbastanza “semplice”; un fascio luminoso, ad elevata frequenza 38 KHz (per i telecomandi tipici per la TV) viene proiettato contro un ricevente. Questo fascio luminoso non è altro che una sequenza di bit (0 e 1) che vengono codificati dal ricevente, attraverso la polarizzazione di photo-transistor. Facciamo questo semplice caso; nel nostro telecomando, vengono codificati i vari pulsati con varie sequenze bit e per esempio il tasto on/off vale:

010101001110

Il ricevente avrà un segnale in ricezione molto simile, se non uguale a quello inviato e in base alla corrispondenza che ha il memoria, sarà in grado di svolgere la richiesta effettiva, come ad esempio accendere la TV ! Il fascio luminoso che viene inviato dal telecomando, non è possibile vederlo ad occhio nudo perché ha una frequenza troppo veloce per noi !

Tuttavia, ci sono diversi codifiche; tipicamente ogni produttore di dispositivi tecnologici, ha una propria codifica, come ad esempio Sony, NEC, Samsung etc..

Tuttavia, è possibile stabilire la sequenza di bit di qualsiasi segnale ad infrarosso, calcolando il tempo in cui il segnale è alto e il tempo in cui il segnale è basso. Questo tipo di codifica si chiama RAW.

Passiamo ai codici per Arduino

Come per ogni libreria nuova in Arduino, dobbiamo installarla, copiandola semplicemente nella cartella Libraries, che tipicamente si trova nei propri documenti.

Qualora utilizzassimo il dispositivo TSOP1738, il collegamento è davvero semplice; basterà alimentare il segnale con i 5 V di Arduino, collegarlo a massa e collegare il pin di output al pin 11.

 

TSOP1738 Datasheet

Per quanto riguardo altri dispositivi presenti su Ebay, basterà collegare il pin di output sempre al pin 11 di Arduino.

1° Programma decodifichiamo un generico segnale

Nome programma Decode_generic_IR

12

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

/* 

* Modified by Chris Targett

* Now includes more protocols

* Novemeber 2011

 

* IRremote: IRrecvDump – dump details of IR codes with IRrecv

* An IR detector/demodulator must be connected to the input RECV_PIN.

* Version 0.1 July, 2009

* Copyright 2009 Ken Shirriff

* http://arcfn.com

*

* Modified by Chris Targett to speed up the process of collecting

* IR (HEX and DEC) codes from a remote (to put into and .h file)

*

*/

 

#include <IRremote.h>

 

intRECV_PIN = 11;

 

IRrecv irrecv(RECV_PIN);

 

decode_results results;

 

voidsetup()

{

Serial.begin(9600);

irrecv.enableIRIn(); // Start the receiver

}

 

// Dumps out the decode_results structure.

// Call this after IRrecv::decode()

// void * to work around compiler issue

//void dump(void *v) {

//  decode_results *results = (decode_results *)v

voiddump(decode_results *results) {

intcount = results->rawlen;

if(results->decode_type == UNKNOWN) {

Serial.print(“Unknown encoding: “);

}

elseif(results->decode_type == NEC) {

Serial.print(“Decoded NEC: “);

}

elseif(results->decode_type == SONY) {

Serial.print(“Decoded SONY: “);

}

elseif(results->decode_type == RC5) {

Serial.print(“Decoded RC5: “);

}

elseif(results->decode_type == RC6) {

Serial.print(“Decoded RC6: “);

}

elseif(results->decode_type == SAMSUNG) {

Serial.print(“Decoded SAMSUNG: “);

}

elseif(results->decode_type == JVC) {

Serial.print(“Decoded JVC: “);

}

elseif(results->decode_type == PANASONIC) {

Serial.print(“Decoded Panasonic: “);

}

Serial.print(results->value, HEX);

Serial.print(“(“);

Serial.print(results->bits, DEC);

Serial.println(” bits)”);

Serial.print(“#define Something_DEC “);

Serial.println(results->value, DEC);

Serial.print(“#define Something_HEX “);

Serial.println(results->value, HEX);

Serial.print(“Raw (“);

Serial.print(count, DEC);

Serial.print(“): “);

for(inti = 0; i < count; i++) {

if((i % 2) == 1) {

Serial.print(results->rawbuf[i]*USECPERTICK, DEC);

}

else{

Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);

}

Serial.print(” “);

}

Serial.println(“”);

}

 

voidloop() {

if(irrecv.decode(&results)) {

dump(&results);

irrecv.resume(); // Receive the next value

}

}

 

Il programma qui presente mostra sul seriale la codifica del segnale ad infrarosso che viene ricevuto dal ricevitore, collegato al pin 11 di Arduino. Il meccanismo è davvero abbastanza chiara, grazie ai commenti presenti nel codice, tratto dalla libreria ufficiale.

2° Programma per Arduino: Accendiamo una lampada con qualsiasi segnale ad Infrarosso 

12

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

/**Questo programme permette di accendere una lampada, attraverso

un relay, con un

telecomando ad infrarossi. Questa versione non permette di modificare

il codice

a run time

Autore Giacomo Bellazzi

*/

 

#include <IRremote.h>

 

intRECV_PIN = 11;

intRELAY_PIN = 13;

intcodice = 16738455; // codice dec del telecomando

 

IRrecv irrecv(RECV_PIN);

decode_results results;

 

voidsetup()

{

pinMode(RELAY_PIN, OUTPUT);

 

Serial.begin(9600);

irrecv.enableIRIn(); // Start the receiver

}

 

inton= 0;

unsigned longlast = millis();

 

voidloop() {

 

if(irrecv.decode(&results)){

// If it’s been at least 1/4 second since the last

// IR received, toggle the relay

if(millis() – last > 250 && results.value==codice ) {

on= !on;

digitalWrite(RELAY_PIN, on? HIGH : LOW);

//dump(&results);

}

last = millis();

irrecv.resume(); // Receive the next value

}

}

Questo codice permette di accendere una lampada connessa ad un relè, premendo un telecomando ad infrarossi. La codifica del telecomando che si vuole usare, può essere ottenuta con il codice del primo programma e inserita all’inizio di questo codice. Tuttavia, il codice non è modificabile a run time.

3° Programma: Accendiamo una lampada con un qualsiasi telecomando

12

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

/* Questo progetto permette di utilizzare Arduno e un telecomando IR,per accendere un carico collegato al Relay sul PIN 13.

Inoltre è possibile modificare il code del telecomando, attraverso il

pushbutton di RESET

AUTHOR: Giacomo Bellazzi

VERSION: 1.0

*/

 

#include <IRremote.h>

 

intRECV_PIN = 11;

intRELAY_PIN = 13;

intpushButton = 3;

unsigned longcode;

IRrecv irrecv(RECV_PIN);

decode_results results;

 

voidsetup()

{

pinMode(RELAY_PIN, OUTPUT);

pinMode(pushButton,INPUT);

irrecv.enableIRIn();

Serial.begin(9600);

}

 

inton= 0;

unsigned longlast = millis();

 

voidloop() {

intbuttonState = digitalRead(pushButton);

delay(100);

if( buttonState == HIGH) {

Serial.println(“Settings…”);

if(irrecv.decode(&results) && millis() – last > 250){

code = results.value;

Serial.println(“New code setting…”);

Serial.println(code);

Serial.println(results.value);

last = millis();

irrecv.resume();

}

}

if(irrecv.decode(&results)){

if(millis() – last > 250 && results.value==code ) {

on= !on;

digitalWrite(RELAY_PIN, on? HIGH : LOW);

}

last = millis();

irrecv.resume();

}

}

Questo programma, a differenza di quello precedente, permette di modificare il codice IR che permette di azionare un relè, anche in fase di run time, impostandolo attraverso un push button collegato ad Arduino. L’operazione è davvero semplice ed è mostrata nel video:


4° Programma: accendiamo la TV Samsung di casa con Arduino

Questo programma permette di accendere una TV Samsung con il nostro piccolo Arduino. Il primo passaggio è quello di usare di ricavarsi il codice RAW del segnale emesso dal nostro telecomando, attraverso il programma che è stato precedentemente discusso precedentemente.

Ora dobbiamo prendere il codice RAW, cancellare il primo valore, convertire i segni – con degli spazi e mettere le virgole tra i vari valori.

30498,4450,4400,600,1650,600,1600,600,1650,600,500,600,550,550,550,600,500,600,550,550,1600,650,1600,600,1650,600,550,550,550,550,550,600,550,550,550,600,500,600,1600,600,550,600,550,550,550,550,550,600,500,600,550,600,1600,600,550,550,1650,600,1600,600,1650,600,1600,600,1650,600,1600,600,

Il codice per Arduino che serve per inviare il segnale alla TV è il seguente:

12

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

#include “IRremote.h” 

IRsend irsend;

 

voidsetup()

{

Serial.begin(9600);

}

 

unsigned intON[68]={4450,4400,600,1650,600,1600,600,1650,600,500,600

,550,550,550,

600,500,600,550,550,1600,650,1600,600,1650,600,550,550,550,550,550,

600,550,550,550,600,500,600,1600,600,550,600,550,550,550,550,550,600,

500,600,550,600,1600,600,550,550,1650,600,1600,600,1650,600,1600,600,

1650,600,1600,600,};

 

voidloop() {

irsend.sendRaw(ON,68,38);

Serial.println(“Accendo la TV Samsung”);

delay(10000);

}

Il LED ad infrarossi va collegato al pin 3, con una resistenza di almeno 100 Ohm in serie. Il valore della resistenza è proporzionale al raggio d’azione del telecomando di Arduino.