Moltissimi dispositivi presenti in casa sono dotati di un telecomando a raggi infrarossi (IR): TV, stufe, ventilatori, condizionatori, lampade, ecc. In genere non dispongono di un accessorio che consenta loro di essere controllati da remoto. Possiamo comunque far ciò in maniera relativamente semplice emulando le funzionalità del loro telecomando a infrarossi mediante un circuito realizzato con NodeMCU che, una volta collegato alla rete Wi-Fi, come descritto nelle lezioni precedenti, fornisca appunto la possibilità di controllarli. Nella lezione che vi apprestate a leggere presenteremo le nozioni base per questa tecnica. Andremo, inoltre, a copiare i codici di alcuni telecomandi per poi, in un secondo momento, riprodurne l'operatività.
Clonare i codici dei telecomandi Infrarossi
Per clonare i codici IR, o quantomeno per comprendere che tipo di protocollo di trasmissione utilizzi il nostro telecomando, è necessario acquistare dei sensori riceventi infrarossi. I sensori IR esistono in due varietà: modulanti e demodulanti. Per capire di cosa stiamo parlando bisogna fare un passo indietro. I telecomandi IR trasmettono il segnale a infrarossi con una modulazione che va dai 33 ai 56KHz, la più diffusa è sicuramente quella a 38KHz. Questo vuol dire, semplificando, che il livello logico non è costituito da un singolo impulso di una certa durata bensì da un certo numero di transizioni alto/basso che avvengono, appunto, alla frequenza della portante (38KHz nel nostro caso). Un ricevitore demodulante presenterà in uscita non il treno di pulsazioni bensì un solo livello logico costante della durata corretta per quel treno di pulsazioni. In particolare i treni di impulsi alla frequenza portante identificano la durata di un livello logico basso, mentre le "pause" tra un treno e l'altro vengono interpretate come livello logico alto. In questa immagine, presa dal datasheet di un ricevitore IR demodulante, viene rappresentato in alto il segnale così come è emesso dal telecomando e in basso il segnale demodulato.
Il motivo per cui non viene inviato un livello logico 'intero', bensì una serie di impulsi, è che in natura esistono molte sorgenti di raggi infrarossi, queste potrebbero interferire con la comunicazione ma nessuna sorgente naturale emette IR a queste frequenze. La libreria che andremo a utilizzare per i nostri esperimenti richiede un ricevitore demodulante. In commercio ne esistono tantissimi tipi ed è anche molto comune trovarli in vecchie TV. Esempi di sigle di ricevitori a infrarossi demodulanti sono: TSOP 342x, TSOP382x, TSOP384x, TSOP44x, TSOP48x (dove la x indica la frequenza in grado di ricevere, TSOP38236 = 36KHz), TL1838 (38KHz), ecc.
Le differenze tra uno e l'altro possono consistere nell'angolo di ricezione, l'eventuale immunità a luci fluorescenti, il controllo automatico di guadagno o altro. Uno dei più utilizzati è il TSOP38238 (o la versione più moderna TSOP38438, più adatta ai telecomandi dei condizionatori), questo, come molti altri ricevitori IR, è comunque in grado di ricevere anche altre frequenze nelle vicinanze (36/40KHz) nonostante siano dichiarati per una frequenza specifica. Sui datasheet della Vishay, che produce i ricevitori IR TSOP, sono indicati i modelli più adatti a determinate codifiche. Altra cosa importante è la tensione di alimentazione: è necessario che il sensore sia in grado di funzionare a 3.3V, ma in genere questo non è un problema perché la maggior parte di questi sensori opera fino a 2.5V.
I telecomandi dei condizionatori
Molti lettori di HTML.it vorranno utilizzare questa lezione per imparare a controllare da remoto il proprio condizionatore, ed è quindi bene fare delle precisazioni. I telecomandi delle TV o di altri dispositivi generalmente non danno particolari problemi perché utilizzano codifiche molto semplici dato che devono trasmettere soltanto un codice relativo al pulsante premuto e quindi pochi dati. I telecomandi dei condizionatori, invece, funzionano in maniera differente: i loro codici sono molto più complessi e di conseguenza il treno di impulsi che trasmettono è molto più lungo perché contiene moltissimi dati. Tali telecomandi, difatti, ogni volta che si preme un pulsante non trasmettono soltanto il codice relativo al tasto appena premuto bensì anche i codici relativi a tutte le altre funzioni. Lo stato del condizionatore è difatti memorizzato nel telecomando per cui, se premiamo a esempio il tasto "abbassa temperatura", il telecomando trasmetterà anche il codice della posizione dell'aletta, la velocità della ventola, lo stato dello ionizzatore (health), la modalità di funzionamento (inverno/estate/deumidificazione) e altro in base al modello di condizionatore (in alcuni modelli viene trasmesso anche l'orario). Diventa quindi molto più laborioso sia ricevere correttamente il dato trasmesso dal telecomando, sia impostare un programma che possa emulare le singole funzioni. Nel caso dei condizionatori, poi, risulta difficile anche scegliere il sensore giusto. A volte capita che pur avendo un telecomando che trasmette a 38KHz, i segnali sono ricevuti correttamente con un sensore e male con un altro pur essendo entrambi riceventi a 38KHz. Ottenere un buon risultato richiede molta pazienza e voglia di sperimentare. A meno che non si disponga di strumenti sofisticati come tool di analisi IR, diventa difficile trovare la giusta frequenza di trasmissione. A ogni modo la libreria che andremo a utilizzare è già in grado di decodificare e riprodurre i codici di una grande varietà di telecomandi e, anche se il nostro marchio non è elencato, è molto facile che utilizzi un protocollo adottato da altri brand. Utilizzando un sensore di buona qualità è facile riuscire anche a ricevere frequenze non centrate su quella dichiarata.
Ricevere i codici del telecomando
Su Arduino IDE è necessario installare la libreria IRremoteESP8266 by Warin, Szabo, Shirriff, Conran basata sulla storica libreria IRRemote di Ken Shirriff per Arduino. È molto utile, in caso di problemi o malfunzionamenti, leggere sia le FAQ sia il troubleshooting di tale libreria. Un'altra pagina da tenere a portata di mano è la lista dei dispositivi compatibili.
La libreria va installata con il metodo consueto. Da Arduino IDE selezionare Sketch->#include libreria->Gestione librerie e digitare IRremoteESP8266 nella casella di ricerca, quindi il pulsante Install nella cella con il risultato. Dopo averla installata andremo a caricare lo sketch di esempio che ci permette di ricevere i codici dei telecomandi: File->Esempi->IRremoteESP8266->IRrecvDumpV2.
In questo sketch non è necessario fare alcuna modifica, è subito funzionante. Carichiamo lo sketch sul NodeMCU, scolleghiamo il cavo USB e colleghiamo il ricevitore al NodeMCU rispettando il pinout del dispositivo in nostro possesso. Il terminale identificato sul datasheet come GND andrà su un pin GND del NodeMCU, il terminale generalmente identificato con Vs (sui datasheet Vishay), Vcc, Vdd o + andrà su uno dei pin che forniscono la 3.3V e il terminale Out (o signal out o data out) andrà sul pin D5 (GPIO14).
Colleghiamo il NodeMCU e apriamo il terminale a 115200 baud. Posizioniamoci con il telecomando di fronte al sensore, quindi premiamo un tasto. Nel migliore dei casi avremo una risposta in cui, dopo la scritta Encoding:, vedremo il nome di un marchio o di un protocollo specifico. Nel caso in cui compaia Unknown vuol dire che il protocollo ricevuto non è stato riconosciuto oppure non è supportato ma non bisogna perdersi d'animo perchè, dopo tutta la serie di valori riportati a seguire Raw Timing è presente un array con la definizione rawData. È possibile copiare nella clipboard tutta la riga per incollarla successivamente nello sketch che utilizzeremo nella tramissione dei dati da NodeMCU verso il dispositivo. Nel caso in cui, invece, compaia un nome specifico, possiamo tenere conto del codice esadecimale che leggiamo dopo la scritta Code, subito al di sotto di Encoding (e che ritroviamo anche più in basso come ultimo parametro Data, riportato in esadecimale con l'anteposizione di ox).
È importante premere più volte lo stesso tasto e confrontare i dati ricevuti. Soprattutto nel caso di codifiche Unknown diventa necessario essere sicuri che il sistema stia ricevendo in maniera corretta. Con i telecomandi dei condizionatori capita che il codice ricevuto, per lo stesso tasto, sia sempre differente e diviene invece costante utilizzando un diverso tipo di sensore ricevente. Quindi si rivela utile tentare con un diverso tipo di sensore nonché provare a spegnere neon o lampade a fluorescenza nel caso in cui queste operino nelle vicinanze e quello adoperato sia un sensore non munito di filtri appositi per questa tipologia di illuminazione.
A volte può invece capitare di ricevere, premendo lo stesso tasto, una codifica con un nome ben preciso (es. RC-6) ma nel campo Code uno zero seguito da un numero di bits tra parentesi sempre variabile, anche in questo caso proviamo con un ricevitore IR differente. Le codifiche RC-5 ed RC-6, molto diffuse, hanno la portante a 36KHz e possiedono un bit di toggle che varia ad ogni pressione quindi è normale, quando si preme lo stesso tasto su questi telecomandi, ricevere prima un codice e poi un altro diverso per poi ricominciare. In genere il dispositivo ricevitore interpreta questi codici come lo stesso a meno di funzioni particolari.
Andiamo oltre.
Osserviamo che, quando correttamente identificato dall'accoppiata sensore+sketch, il codice esadecimale si presenta molto lungo, è quindi riportato subito dopo una descrizione verbosa dei comandi appena ricevuti. La lista dei Raw Timing è lunghissima (l'immagine è stata troncata). Nella parte finale abbiamo un'array con i codici di stato. È questo array che andremo a utilizzare nello sketch di trasmissione. Chiaramente, per copiare correttamente il codice del telecomando di un condizionatore, bisogna assicurarsi che il codice restituito sia sempre lo stesso per ogni tasto. Se il codice ricevuto è sempre lo stesso ma la codifica è sconosciuta, possiamo provare ad utilizzare l'array rawData.
Ragioneremo appunto per stati, andremo a realizzare un circuito che trasmette pochi comandi, del tipo "accensione con 25°C, modalità deumidificatore, ventola al minimo, ionizzatore acceso". Come abbiamo illustrato non è possibile inviare un comando "singolo" (es.: temperatura 25°C) dato che il circuito ricevente, alla fine del dato, si aspetta anche un checksum (un controllo di errore di trasmissione) che è determinato da tutti i comandi inviati. La libreria IRremoteESP8266 a ogni modo, per alcuni modelli di telecomandi di condizionatori, permette di "costruire" il segnale da inviare aggiungendo i vari parametri.
A seguire
Nella prossima lezione, che sarà pubblicata fra una settimana, vedremo come utilizzare i codici ricevuti dal telecomando al fine di sfruttarli in uno sketch che ci consentirà, quindi, di controllare il nostro dispositivo da remoto.