Nell'ultima lezione si è parlato di allarmi, si è visto come utilizzare una fotoresistenza e un laser per creare una vera e propria barriera antintrusione. È arrivato il momento di parlare di un altro tipo di ricevitore che tutti conosciamo: il ricevitore a infrarossi, anche conosciuto come ricevitore IR. Vedremo come costruire un semplice circuito che decodificherà i codici da un telecomando a infrarossi (è possibile utilizzare qualsiasi tipo di telecomando a patto che utilizzi la tecnologia IR), e una volta memorizzati, come accendere un led. Con un minimo di creatività sarà facilissimo utilizzare queste conoscenze per impartire comandi al nostro allarme. Presentiamo quindi un caso esplicativo con una finalità didattica generale.
Come funziona?
La tecnologia a infrarossi si basa su un fascio luminoso (non visibile a occhio nudo) ad alta frequenza che, puntato su un ricevitore, codifica una sequenza binaria (0 e 1) inviando un comando che causerà un'azione come, ad esempio, l'accensione del dispositivo.
Per creare il circuito sarà adoperato un sensore IR TSOP1738 per la recezione del segnale poi decodificato in esadecimale da Arduino. E' possibile utilizzare un sensore TSOP qualsiasi a patto che le ultime due cifre nel codice siano 38, ad esempio il 2238, questo perché le ultime due cifre rappresentano la frequenza in kHz. Dato che lo standard dei telecomandi è di 38 kHz è consigliabile utilizzare un ricevitore compatibile.
In questa lezione saranno utilizzati due codici differenti: il primo servirà a ricevere il segnale e lo decodificherà in esadecimale, il secondo farà accendere il led alla pressione del tasto. Per fare ciò abbiamo prima bisogno di conoscere il valore esadecimale da utilizzare.
Assemblare il circuito
Assemblare questo circuito è davvero semplice, bastano davvero pochi collegamenti.
Si parte, come sempre, dal materiale necessario.
Lista dei componenti:
- Arduino a scelta (UNO, Nano, cloni, ecc.);
- Breadboard;
- Sensore IR TSOP1738 (o TSOP analogo XX38);
- 1 Led;
- 1 Resistenza da 100 ohm;
- Cavetti Jumper (ma vanno bene anche dei normali cavetti elettrici).
A seguire trovate lo schema del sensore TSOP1738, come è possibile notare uno dei 3 pin è distanziato dagli altri due per segnalare il pin "DATA" ("OUT" nell'immagine).
Una volta recuperati tutti i componenti è sufficiente collegarli come nello sketch sottostante:
va collegato | |
---|---|
GND | al pin all'estrema sinistra del ricevitore TSOP |
5V | al pin centrale del ricevitore TSOP |
D12 | tra il polo della fotoresistenza e la resistenza da 100 ohm |
GND | al polo negativo del led |
D2 | al polo positivo del led |
Se non disponete di una resistenza da 100 ohm è possibile utilizzarne una più grande, attenzione però a non esagerare perché ciò può limitare notevolmente l'intensità di luce emessa dal led. Una volta cablati tutti i collegamenti è arrivato il momento di passare al codice.
Parte Software
Come anticipato avremo due differenti codici: uno per la ricezione e decodifica del segnale e l'altro che permetterà di ricevere il segnale del telecomando e far accendere un led alla pressione di un tasto. Per farlo utilizzeremo la libreria iRemote che potete scaricare su Github a questo link.
Una volta ottenuto il file .rar sarà sufficiente estrarlo e copiare la cartella estratta all'interno della cartella libraries di Arduino (ad esempio in Windows solitamente C:\Programmi\Arduino\libraries), fatto ciò la libreria risulterà correttamente installata.
Errore molto comune che si può riscontare durante l'installazione della libreria è il "TKD2 was not declared in this scope", per risolverlo basta andare nella cartella libraries ed eliminare la cartella "RobotIrRemote" mantenendo quella appena scaricata.
Se la libreria è installata correttamente possiamo passare al codice del ricevitore.
#include <IRremote.h>
int tsop_receiver = 12; // collegamento al pin "data" dello TSOP1738
IRrecv irrecv (tsop_receiver) ; //crea un istanza di "irrecv"
decode_results results; //crea un istanza di "decode_results"
void setup ()
{
Serial.begin(9600); //imposta il baud rate a 9600
irrecv.enableIRIn (); //fa partire il ricevitore
}
void loop () {
if (irrecv.decode(&results)) { //decodifica il segnale del tasto premuto
Serial.println(results.value,HEX); //stampa la codifica del tasto in esadecimale
irrecv.resume(); // in attesa di ricevere il successivo
}
}
Lanciato il codice su Arduino basta premere la combinazione di tasti Ctrl+Shift+M per far apparire il monitor seriale, oppure possiamo invocarlo anche al seguente percorso: Strumenti–Monitor Seriale. Premete poi un tasto a scelta del telecomando e puntatelo verso il ricevitore, se tutto è andato a buon fine dovreste vedere uno o più valori in esadecimale sul monitor come nell'esempio sottostante:
Appuntatevi il valore esadecimale perché bisognerà utilizzarlo nel secondo spezzone di codice per fare in modo che venga riconosciuto da Arduino. Passiamo al secondo codice.
#include <IRremote.h>
int tsop_receiver = 12; ; // collegamento al pin "data" dello TSOP1738
int led = 2; // collegamento al polo positivo del led
IRrecv irrecv(tsop_receiver); //crea un istanza di "irrecv"
decode_results results; //crea un istanza di "decode_results"
void setup()
{
Serial.begin(9600);//imposta il baud rate a 9600
irrecv.enableIRIn(); //fa partire il ricevitore
pinMode(led, OUTPUT);
}
void loop()
{
if (irrecv.decode(&results)) //il loop parte solo se viene ricevuto un segnale
{
translateIR();
irrecv.resume(); //si mette in attesa di ricevere
delay(200); //attende 200 millisecondi
}
}
void translateIR() //azione in base al valore ricevuto
{
int sensorValue=0;
sensorValue = digitalRead(led);
Serial.println(sensorValue);
switch(results.value)
{
case 0xF82C9598: //sostituire il valore dopo "0x" con il valore ir ricevuto
if (sensorValue==0){
digitalWrite(led, HIGH); //accende il led
break;
}
if (sensorValue==1){
digitalWrite(led, LOW); //spegne il led
break;
}
}
}
Come anticipato sopra bisogna sostituire il valore del comando case con il valore esadecimale appuntato prima, senza omettere la parte "0x". Una volta fatto ciò Arduino accenderà il led alla pressione del tasto codificato.