Accendere e spegnere un LED con un telecomando

 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.

Accendere e spegnere un LED con un telecomando html 14020de9472199d9

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.