In questa guida vedremo come utilizzare un ricevitore e trasmettitore (LED) ad infrarossi per utilizzarlo nei nostri progetti con Arduino e schede varie. Gli infrarossi consentono ai nostri progetti di interfacciarsi con condizionatori, tv, led e tutto ciò che li sfrutta per comunicare oltre che utilizzarli per controllare eventuali robot creati da noi! Vediamo come.
Materiale hardware
Arduino Uno
Cavi Dupont
KY-005
KY-022
Breadboard
Materiale Software
Procedura
Per prima cosa colleghiamo il ricevitore e trasmettitore alla board come da immagine:
Colleghiamo l’Arduino al computer e procediamo con l’installazione della libreria necessaria: IRremote.
Per farlo apriamo l’IDE di Arduino dirigiamoci su Sketch -> #Include liberia -> Gestione librerie, da qui cerchiamo la parola chiave IRremote, fra i risultati cerchiamo IRremote by shirrif, z3t0 e clicchiamo su installa.
Leggere i comandi IR:
Utilizzando questo sketch sarà possibile visualizzare tramite monitor seriale i comandi inviati al ricevitore infrarossi da un telecomando o altro dispositivo, i dati che verranno stampati sono:
- Valore: valore esadecimale (comando inviato dal telecomando)
- BIT: numero di bit utilizzati (n. bit utilizzati dal protocollo)
- Codifica: codifica rilevata (verrà visualizzata la codifica utilizzata dal telecomando, utile in seguito per la replica dei comandi)
#include <IRremote.h> const int RECV_PIN = 7; //PIN a cui è collegato il ricevitore IRrecv irrecv(RECV_PIN); decode_results results; void setup(){ Serial.begin(9600); irrecv.enableIRIn(); irrecv.blink13(true); } void loop(){ if (irrecv.decode(&results)){ //Decodifica i dati ricevuti e if(results.bits > 0){ //Controlla che i valori ricevuti abbiano un contenuto Serial.println("======== VALORI RICEVUTI ======="); Serial.print("Valore: "); Serial.println(results.value, HEX); Serial.print("BIT: "); Serial.println(results.bits); Serial.print("CODIFICA: "); switch (results.decode_type){ case NEC: Serial.println("NEC"); break ; case SONY: Serial.println("SONY"); break ; case RC5: Serial.println("RC5"); break ; case RC6: Serial.println("RC6"); break ; case DISH: Serial.println("DISH"); break ; case SHARP: Serial.println("SHARP"); break ; case JVC: Serial.println("JVC"); break ; case SANYO: Serial.println("SANYO"); break ; case SAMSUNG: Serial.println("SAMSUNG"); break ; case LG: Serial.println("LG"); break ; case WHYNTER: Serial.println("WHYNTER"); break ; case PANASONIC: Serial.println("PANASONIC"); break ; case DENON: Serial.println("DENON"); break ; default: case UNKNOWN: Serial.println("UNKNOWN"); break ; } } irrecv.resume(); } }
All’interno dello sketch possiamo configurare la variabile costante RECV_PIN con un altro PIN in caso il ricevitore fosse collegato su un altro dei PIN disponibili.
Per evitare errori di lettura è stata inserita la condizione if(results.bits > 0) che controlla che i bit inviati siano effettivamente più di 0. (Anche se nonostante questa condizione, se il trasmettitore è lontano o davanti ostacoli i dati letti potrebbero essere errati)
Una volta caricato lo sketch, apriamo il monitor seriale e puntiamo il nostro telecomando all’Arduino premendo un tasto su di esso per visualizzare i dati tramite monitor seriale.
Azione sul comando ricevuto
Vediamo ora come effettuare un’azione in base al comando ricevuto, in questo sketch verrà spento e acceso il led presente sull’Arduino in base al tasto premuto sul mio telecomando (Telecomando led RGB)
#include <IRremote.h> const int RECV_PIN = 7; //PIN a cui è collegato il ricevitore IRrecv irrecv(RECV_PIN); decode_results results; //Variabile che conterrà i valori ricevuti decodificati String value; void setup(){ Serial.begin(9600); irrecv.enableIRIn(); pinMode(13,OUTPUT); } void loop(){ if (irrecv.decode(&results)){ //Decodifica i dati ricevuti e salva i dati in results if(results.bits > 0){ //Controlla che i valori ricevuti abbiano un contenuto Serial.println("======== COMANDO RICEVUTO ======="); Serial.print("Valore: "); Serial.println(results.value, HEX); switch (results.value){ //Comando registrato con 0x come prefisso, utilizzare una case per ogni comando. case 0xFF02FD: Serial.println("Accendo LED"); digitalWrite(13,HIGH); break ; case 0xFFA25D: Serial.println("Spengo LED"); digitalWrite(13,LOW); break ; default: case UNKNOWN: Serial.println("=== Comando non riconosciuto ==="); break; } } irrecv.resume(); } }
Nello sketch è utilizzata una switch case con una condizione per ogni comando/azione che vogliamo eseguire, in questo caso accendere e spegnere il led presente sulla scheda.
Inviare comandi infrarossi:
In quest’ultimo sketch utilizzeremo il comando irsend della libreria per inviare il comando di accensione spegnimento, utilizzerò come esempio una striscia led RGB.
#include <IRremote.h> IRsend irsend; //Di default il PIN per il trasmettitore ir è il digitale 3 void setup() { } void loop() { irsend.sendNEC(0xFF02FD, 32); //Il codice'FF02FD' è quello letto nello sketch di lettura delay(2000); irsend.sendNEC(0xFF02FD, 32); delay(2000); }
Nello sketch è stato utilizzato il comando irsend.sendNEC(COMANDO, NBIT) poiché è la codifica utilizzata dal mio telecomando (rilevata prima nello sketch di lettura), se dovesse essere un’altra codifica adeguare la stringa di invio del comando ad esempio: irsend.sendNomecodifica o irsend.sendSONY per codifica Sony. Allo stesso modo adeguare anche il numero di Bit.
Al momento della scrittura dell’articolo i protocolli disponibili e sfruttabili dalla libreria sono: Aiwa, BoseWave, Denon, Dish, JVC, Lego, LG, MagiQuest, NEC, Panasonic, RC5, RC6, Samsung, Sanyo, Sharp, Sony, Whynter, (Pronto).
È possibile avere una lista aggiornata sulle funzioni, wiki e ulteriori informazioni al Github della libreria.
Conclusione
In conclusione, gli infrarossi possono essere utilizzati per automatizzare l’accensione di un condizionatore in base alla temperatura, inviare comandi da remoto tramite internet ed i più svariati scopi.
Per l’utilizzo degli infrarossi su schede ESP8266 è presente un’altra libreria con molti più protocolli supportati qui o scaricabile dal gestore librerie.