Led Infrarosso (Trasmissione IR)

Andiamo a vedere ora due moduli con cui realizzeremo progetti molto interessanti con Arduino: il led infrarosso e il ricevitore di infrarossi.

I led infrarossi, a differenza dei led normali, emettono su una lunghezza d’onda diversa da quella della luce visibile, come possiamo vedere in figura:

Spettro della luce. Crediti

Abbiamo già visto come i led siano diodi. Ogni diodo ha un determinato voltage drop, che cresce al diminuire della lunghezza dell’onda che emettono.

Poiché le lunghezze d’onda dell’infrarosso sono più lunghe di quelle del rosso, ci aspettiamo un voltage drop inferiore: è infatti di circa 1.2V

Essendo l’infrarosso fuori dallo spettro del visibile, in teoria non dovremmo vedere la luce che emette. In effetti è possibile realizzare led che emettono totalmente sulle lunghezze d’onda dell’infrarosso, ma sono più costosi da produrre.

La maggior parte dei led IR che troviamo in commercio emette quindi in parte anche sulle lunghezze d’onda del rosso: per questo motivo vediamo questi led emanare un lieve bagliore rosso quando sono accesi.

Vediamo ora come utilizzare il modulo infrarosso del kit Elegoo (ma che consiste semplicemente in un supporto per un led IR). Questo led emette totalmente nell’infrarosso, quindi non preoccupatevi se non vedete bagliori rossi.

Struttura Modulo

Specifiche Tecniche

Voltage Dropcirca 1.2V
Corrente continua30 ~ 60mA (max)
Corrente di picco0.3 ~ 1A (max)
Temperatura funzionamento-25°C, +80°C
Potenza massima dissipata90mW
Tensione di Breakdown(-) 5V

Schema Collegamento

Durante il collegamento di questo modulo dobbiamo prestare particolare attenzione. Nel modulo manca infatti una resistenza limitatrice per la corrente.

Dobbiamo collegare ad uno dei due terminali del led una resistenza di almeno $latex \frac{5V-1.2V}{20mA} = 190\Omega $. Ne prendiamo una commerciale da 220Ω.

In rete si trovano molti esempi errati di collegamento. Un errore comune è quello di collegare un terminale del led al pin 13 pensando di poter sfruttare la resistenza limitatrice del led integrato.

Mentre nei primi prototipi delle schede Arduino era effettivamente così, per tutte le nuove schede in circolazione non è più vero.

Prendiamo ad esempio lo schema di Arduino Uno (v3).

Estratto schema Arduino Uno (v3)

Possiamo vedere che il led è alimentato a parte, sfruttando un amplificatore operazionale, mentre la connessione tra il pin del microcontrollore e il pin in uscita è diretta.

Poiché il seguente schema viene utilizzato anche da quasi tutti i produttori di schede non originali, possiamo essere quasi certi dell’assenza della famigerata resistenza limitatrice sul pin 13.

Quando utilizziamo il led infrarosso con Arduino, dobbiamo fare i seguenti collegamenti:

Schema collegamento

La scelta del pin 3 non è casuale, ma imposta dalla libreria che andremo ad utilizzare.

Codice

La comunicazione in infrarosso avviene accendendo e spegnendo il led seguendo delle specifiche regole.

Il problema è che non esiste uno standard, ma ogni marca di dispositivi che utilizzano l’infrarosso (TV, apparecchi audio, condizionatori, …) si è creata un proprio protocollo.

Questi protocolli hanno però almeno una cosa in comune: la frequenza con cui viene acceso e spento il led è circa 38kHz.

Queste velocità di lettura/scrittura implicano la necessità di utilizzare aspetti del codice di Arduino che ancora il lettore di questa guida potrebbe non conoscere, e che approfondiremo in futuro.

Per il momento, utilizziamo una libreria che si chiama Arduino-IRremote, che trovate qui. Per semplicità vi riporto lo zip della libreria qui sotto.

La libreria supporta i seguenti protocolli:

  • RC5
  • RC6
  • NEC
  • SONY
  • PANASONIC
  • JVC
  • SAMSUNG
  • WHYNETER
  • AIWA_RC_T501
  • LG
  • SANYO (solo ricezione)
  • MITSUBISHI (solo ricezione)
  • DISH (solo invio)
  • SHARP (solo invio)
  • DENON
  • PRONTO (solo invio)
  • LEGO POWER FUNCTION (solo invio)

Essendo molto complessa, possiamo andare a disabilitare la compilazione di alcune sezioni andando a modificare il file “IRremote.h“. Tuttavia l’impatto sulle risorse di Arduino della libreria completa è comunque limitato.

Il codice che vedremo è inteso per la comunicazione tra moduli Arduino, per cui scegliamo lo standard RC5. Caricheremo la libreria per intero, in modulo da non mettere in difficoltà i lettori meno esperti.

#include <IRremote.h>

/*
 * Defininiamo i segnali di comando,
 * che dovremo definire uguale nel modulo ricevente
 * 
 * Poiché trasmettiamo in RC5, scegliamo 12 bit per i dati (la libreria ne vuole almeno 11 in ricezione).
 * Quindi possiamo avere 2^12 = 4096 comandi diversi
 */
#define N_BITS 12
#define CMD1 1 //Possiamo anche scriverlo in esadecimale come 0x001 se ci piace di più
#define CMD2 2 //Possiamo anche scriverlo in esadecimale come 0x010 se ci piace di più
 
IRsend sender; 

void setup() {
  /*
   * Non abbiamo niente da specificare:
   * l'unico pin su cui si può connettere il led è il 3,
   * per via del Timer interno che usa la libreria e per
   * come è complilata
   */
}

/*
 * Invieremo in modo alternato 2 diversi comandi in RC5
 */
void loop() {
  //Inviamo il primo comando
  sender.sendRC5(CMD1, N_BITS);
  //Aspettiamo 5 secondi
  delay(5000);
  //Inviamo il secondo comando
  sender.sendRC5(CMD2, N_BITS);
  //Aspettiamo 5 secondi
  delay(5000);
}

Possiamo anche replicare un comando letto utilizzando il codice che vedremo nel prossimo articolo, in questo modo:

#include <IRremote.h>

/*
 * Qui sotto ci sono i dati del segnale IR generico letto
 * dal sensore del prossimo articolo
 */
int khz = 38; //Frequenza del segnale letto (di solito sempre uguale)
unsigned int rawData[25] = {2300,650, 1150,650, 550,600, 1200,600, 550,650, 1150,650, 550,600, 600,600, 550,650, 550,650, 550,600, 600,600, 1150};

IRsend sender; 

void setup() {
  /*
   * Non abbiamo niente da specificare:
   * l'unico pin su cui si può connettere il led è il 3,
   * per via del Timer interno che usa la libreria e per
   * come è compilata
   */
}

/*
 * Invieremo in modo alternato 2 diversi comandi in RC5
 */
void loop() {
  //Inviamo il segnale
  sender.sendRaw(rawData, sizeof(rawData) / sizeof(rawData[0]), khz);
  //Aspettiamo 5 secondi e replichiamo
  delay(5000);
}

Passiamo quindi subito al prossimo articolo sul ricevitore IR.