Il telecomando e i suoi codici “segreti”

SPOILER: Quest’articolo potrebbe essere utile anche a chi vuole clonare il telecomando a infrarossi di un qualunque elettrodomestico, soprattutto nel caso in cui non funzioni con il classico telecomando universale o non sia presente nella lista dei telecomandi delle classiche applicazioni per smartphone!

I comuni telecomandi che utilizziamo per cambiare i canali della TV, spegnere e accendere l’aria condizionata gestire le lucine LED inviano dei segnali al dispositivo che comandano attraverso i raggi infrarossi, sono cioè dotati di un LED (una specie di lampadina) in grado di emettere una luce non visibile dall’occhio umano ma che può essere percepita da particolari sensori.

I segnali vengono codificati attraverso una sequenza di accensioni e spegnimenti, il modo con cui questi segnali sono inviati dipende dal protocollo scelto dal produttore dell’apparecchio da comandare. Infatti di protocolli ve ne sono diversi, ma sembra che il più comune sia il protocollo denominato NEC, che è quello che è stato usato in questo caso.

Con un semplice sensore IR collegato al nostro Arduino e con poche righe di codice è possibile visualizzare attraverso il monitor seriale dell’IDE di Arduino i dati inviati dal telecomando.

#include <IRremoteInt.h>
#include <IRremote.h>
int receiver = 2;
IRrecv irrecv(receiver);
decode_results results;
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();
}
void loop()
{
  if (irrecv.decode(&results))
  {
    Serial.print(results.decode_type);    Serial.print("|");
    Serial.print(results.value, HEX);    Serial.print("|");
    Serial.println(results.value, BIN); 
    irrecv.resume();
  }
}

Una volta puntato il telecomando verso il sensore, premendo un tasto qualunque si visualizzano una serie di numeri, come in quest’esempio:

3|FB009A65|11111011000000001001101001100101

La prima cifra chiarisce il tipo di protocollo usato: il 3 sta per protocollo NEC, il 7 invece vale per i telecomandi Samsung e così via. La decodifica completa la trovate nell’header IRremote.h, ed è definita da quest’enum:

typedef enum {
    UNKNOWN = -1,
    UNUSED = 0,
    RC5,
    RC6,
    NEC,
    SONY,
    PANASONIC,
    JVC,
    SAMSUNG,
    WHYNTER,
    AIWA_RC_T501,
    LG,
    SANYO,
    MITSUBISHI,
    DISH,
    SHARP,
    SHARP_ALT,
    DENON,
    LEGO_PF,
    BOSEWAVE,
    MAGIQUEST,
} decode_type_t;

Questi dati sono da interpretare quindi nella codifica NEC. Il protocollo usa una serie di segnali di acceso e spento per codificare le cifre binarie 0 e 1, in un modo che somiglia al codice morse: viene inviato un segnale seguito da una pausa corta (0) o lunga (1).

Vengono quindi inviati due codici, il primo identifica il dispositivo, quindi permette di non inviare all’apparecchio sbagliato il comando. Corrisponde alla prima parte del messaggio ovvero le prime quattro cifre in formato esadecimale (FB00) o le prime 16 se guardiamo al formato binario (1111101100000000) nell’esempio che è stato riportato sopra. Attenzione però questo codice va letto al contrario, cioè 0000000011011111, che trasformato in esadecimale è 00DF (vedi big endian e little endian). Qualunque tasto premiamo sul telecomando questo primo blocco si ripete e quindi solo il dispositivo che lo riconosce esegue il comando inviato nel seguito del messaggio.

I successivi 16 bit equivalgono in realtà ad un messaggio di 8 bit ripetuto due volte, la prima con la codifica binaria usuale, la seconda con i bit invertiti, ovvero con gli 0 al posto di 1 e viceversa, questo si fa evidentemente per intercettare eventuali errori di trasmissione. Quindi la sequenza 1001101001100101 si deve vedere come la coppia di byte 10011010-01100101, che si ottiene invertendo i bit l’una dell’altra, quindi basta considerare solo il primo byte 10011010. Quest’ultimo va letto al contrario, ovvero 01011001, che corrisponde all’esadecimale 59 (l’uso di numeri esadecimali al posto dei decimali in questo contesto è sicuramente più comodo).

A questo punto tutto è pronto, si schiacciano i tasti del telecomando e si prende nota dei codici che vengono mostrati, e in ordine si mettono in un foglio LibreOffice (se volete usate MS Excel, io uso LibreOffice), dove inserisco le formule per codificare il messaggio grezzo: facciamo la prova con il telecomando del vecchio decoder del digitale terrestre 1byOne, cioè di questo:

Premo i tasti uno alla volta in ordine dall’alto verso il basso e da sinistra verso destra e ottengo sul monitor seriale tutti i dati che mi servono; ci saranno anche dati sporchi che vanno cancellati e si popolano le colonne A, B e C questo sheet: questi sono i dati grezzi; nelle colonne E e F vanno spacchettati applicando delle formule:

Nella colonna E infatti inserisco questo:

=STRINGA.ESTRAI(C1;1;16)

E nella colonna F

=STRINGA.ESTRAI(C1;17;8)

A questo punto la conversione tra big e little endian con le tre formule rispettivamente nelle colonne H, I e J: non fanno altro che invertire l’ordine dei bit

=STRINGA.ESTRAI(E1;16;1)&STRINGA.ESTRAI(E1;15;1)&STRINGA.ESTRAI(E1;14;1)&STRINGA.ESTRAI(E1;13;1)&STRINGA.ESTRAI(E1;12;1)&STRINGA.ESTRAI(E1;11;1)&STRINGA.ESTRAI(E1;10;1)&STRINGA.ESTRAI(E1;9;1)
=STRINGA.ESTRAI(E1;8;1)&STRINGA.ESTRAI(E1;7;1)&STRINGA.ESTRAI(E1;6;1)&STRINGA.ESTRAI(E1;5;1)&STRINGA.ESTRAI(E1;4;1)&STRINGA.ESTRAI(E1;3;1)&STRINGA.ESTRAI(E1;2;1)&STRINGA.ESTRAI(E1;1;1)
=STRINGA.ESTRAI(F1;8;1)&STRINGA.ESTRAI(F1;7;1)&STRINGA.ESTRAI(F1;6;1)&STRINGA.ESTRAI(F1;5;1)&STRINGA.ESTRAI(F1;4;1)&STRINGA.ESTRAI(F1;3;1)&STRINGA.ESTRAI(F1;2;1)&STRINGA.ESTRAI(F1;1;1)

Infine la conversione in esadecimale nelle colonne L e M:

=BINARIO.HEX(H1)&BINARIO.HEX(I1)
=BINARIO.HEX(J1)

Siamo pronti, abbiamo tutto, dobbiamo solo trovare il modo di sparare i codici, e su questo ci viene incontro una semplice applicazione per Android che su dispositivi compatibili, ovvero i dispositivi che sono dotati di trasmettitore IR, permette di creare un telecomando completamente personalizzabile. L’applicazione è IR Remote Creator e della keuwlsoft che permette di disegnare in maniera completamente libera il telecomando; l’app si presenta così:

Si possono aggiungere o togliere pulsanti cambiare forma e colore di tutto, insomma è un programma completo, e in più ad ogni tasto è possibile associare i codici da inviare via infrarossi, quindi basta copiare i valori calcolati dal foglio LibreOffice:

Con un po’ di pazienza avremo un telecomando perfettamente equivalente a quello di partenza, molto utile nel caso in cui si teme possa rompersi/scomparire misteriosamente il telecomando originale; molti apparecchi come appunto questo 1byOne non presentano alcun tasto sul dispositivo che ne possa permettere l’utilizzo in mancanza del telecomando e trovare il modo di far funzionare un telecomando universale equivale a tentare la fortuna. Invece ecco qua il nostro apparecchio funzionante!

Ciò che abbiamo ottenuto è valido per quest’apparecchio ma l’ho sperimentato anche su altri dispositivi, e sembra funzionare, ma ogni caso è a se, potrebbe cambiare il protocollo o la dimensione del messaggio potrebbe essere a 8 bit piuttosto che a 16 come nel caso che è stato mostrato. Da questo punto di vista l’app è molto flessibile e permette solo di usare gli standard più comuni ma consente di creare pacchetti di messaggi in formati completamente custom,e ciò significa che veramente non ci sono limiti purché ci si armi di pazienza e buona volontà.