Decodificheremo i segnali provenienti da un telecomando qualsiasi che trasmetta con frequenza di 38 kHz e utilizzeremo gli stessi segnali per comandare Arduino a distanza per accendere e spegnere un LED.
Utilizzeremo la libreria IR.remote.h ed un TL1838, che è un componente elettronico economico che rileva segnali a raggi infrarossi (IR).
In figura, i 3 pin del ricevitore IR, sono collegati, nell’ordine da destra verso sinistra rispettivamente ai 5 V, al GND ed alla porta A0 di Arduino.
Decodifica dei segnali provenienti dal telecomando
Utilizziamo questo sketch:
#include <IRremote.h> // carica la libreria per ricezione di dati IR
IRrecv ricevitore(A0); // Crea un oggetto ricevente da noi battezzato “ricevitore”: impostiamo il pin A0 per la ricezione dei dati
decode_results codice_tasto; // ed il segnale che decodificherà lo dovrà salvare nella variabile codice_tasto
void setup()
{
Serial.begin(9600);
ricevitore.enableIRIn(); // Attiva la ricezione
}
void loop() {
if (ricevitore.decode(&codice_tasto)) {
/* Tenta di ricevere un segnale IR.Restituisce vero se un segnale è stato ricevuto, falso altrimenti. Quando un segnale è stato ricevuto, immagazzina l'informazioneall'interno della variabile "codice_tasto". */ Serial.println(codice_tasto.value, HEX);
ricevitore.resume(); /* Va eseguita dopo il comando di ricezione per resettare il ricevitore e prepararlo a ricevere il segnale successivo */
}
}
Primo passo
Carichiamo lo schizzo ed apriamo il monitor seriale;
Secondo passo
Premiamo un pulsante del telecomando e leggiamo il valore che appare sulla finestra del monitor seriale.
Per utilizzare i valori scritti nel serial monitor basta aggiungere 0x prima della sigla del valore nello sketch.
Accensione del LED 13
#include <IRremote.h>
IRrecv ricevitore(A0);
decode_results codice_tasto;
void setup()
{
pinMode(13,OUTPUT);
Serial.begin(9600);
ricevitore.enableIRIn(); // attiva la ricezione
}
void loop() {
if (ricevitore.decode(&codice_tasto)) {
Serial.println(codice_tasto.value, HEX);
ricevitore.resume();
if ( codice_tasto.value == 0x804E58A7){ //tasto 1 sul telecomando
digitalWrite(13, HIGH); // accende il LED
}
if ( codice_tasto.value == 0x804EF807){ //tasto 2 sul telecomando
digitalWrite(13, LOW); // spegne il LED
}
}
}
Analisi del codice
linea 1:
#include <IRremote.h>
includo la libreria IRemote nel mio sketch.
linea 2:
IRrecv ricevitore(A0);
inizializzo la libreria Iremote; dichiaro che il pin A0 è il “receiver” ovvero il pin da cui la libreria leggerà il segnale dal sensore,
il pin A0 viene collegato al piedino OUT del sensore:
linea 3:decode_results codice_tasto;
decodifico il risultato che Arduino riceve dal sensore per ottenere un valore numerico utilizzabile nel confronto.
Costruisco la funzione setup()
- attivo la comunicazione seriale per vedere i valori letti dal sensore sulla Serial Monitor di Arduino quando premo un tasto sul telecomando
- utilizzo il metodo
ricevitore.enableIRIn();
della libreria IRemote perchè legga i valori provenienti dal sensore - imposto, mediante il comando
pinMode(13, OUTPUT);
l’utilizzo del pin 13 di Arduino come output per pilotare il led
Costruisco la funzione loop()
- quando il sensore riceve un segnale proveniente dal mio telecomando scrive sul monitor seriale il valore rilevato
Serial.println(results.value, HEX);
e prosegue mettendo il sensore nuovamente in modalità di ascolto:ricevitore.resume();
- se viene premuto il tasto 1, per cui il valore letto dal sensore sarà uguale a 804E58A7 , porta l’uscita del pin 13 ad HIGH ( 1 ) ed il LED si accenderà
- se viene premuto il tasto 2 , per cui il valore letto dal sensore sarà uguale a 804EF807, porta l’uscita del pin 9 a LOW ( 0 ) ed il LED si spegnerà
I codici dei tasti vanno aggiornati con quelli ottenuti con il telecomando in nostro possesso.