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à.

Il passatempo dell’estate 2021

Come ogni estate il tempo libero abbonda e non si sa bene come arrivare a fine giornata senza annoiarsi. Ognuno ha le sue strategie; chi può va in vacanza, ovviamente non tanto per godere del mare e della spiaggia, certo che no, lo scopo è quello di dare un senso a questo vuoto creando delle routine giornaliere che ci impongono di svolgere delle attività: in qualche modo la vacanza ci permette di rimanere in un binario in modo che seppure è chiaro che si perda tempo, tutto ciò è giustificato ed inoltre abbiamo comunque la parvenza di essere indaffarati in qualche tipo di attività.

Ma l’estate è lunga da passare, tre mesi, alla fine ci si annoierà, a meno di non porsi degli obiettivi, dei compiti da svolgere entro la fine dell’estate; ed allora ecco che c’è chi si lancia nello spazio costruendosi un razzo e sparandosi in prima persona (vedi i ricconi Richard Branson, Jeff Bezos che hanno fatto le cose per bene e sono partiti e tornati sulla Terra senza intoppi, emuli di quel Mike Hughes a cui però andò male…) c’è chi legge libri o addirittura pubblica un libro, completa il giornale dei sudoku o si dedica alla ristrutturazione della casa.

Sempre meglio di quelli che si dedicano alle cosiddette “palline clac-clac” che per fortuna non vedo più da qualche estate (ma sono sicuro che torneranno… si ritorneranno… AH-AH-AH! E tu non ci potrai fare nulla! NULLA! AH-AH-AH!

Stiamo parlando quindi di hobby (o per chi conosce meglio la lingua di Shakespeare hobbys), ovvero attività ricreative diverse da quella lavorativa, fatte a volta anche con un reale impegno, come può essere ad esempio scrivere delle amenità su un blog, in generale senza alcun fine di lucro (e in questo caso ci mancherebbe altro).

Un bel passatempo rilassante e alla portata di tutti per esempio è la realizzazione di circuiti guidati da un microcontrollori come Arduino, che possono essere facilmente programmati in linguaggio C: uno spasso insomma. Di progettini da realizzare copiando schemi e codici su blog e pagine web dedicate ce ne sono parecchi, ma è bello dare sfogo alla propria fantasia e immaginazione creando tutto da zero.

L’idea è quella di clonare il gioco del Simon: sono presenti quattro lucette di diversi colori e quattro tasti in corrispondenza. Viene eseguita una sequenza casuale di accensioni e il giocatore deve replicarla. Se ci riesce alla sequenza precedente si aggiunge un nuovo elemento casuale e così via.

Si tratta di un vecchio gioco della Hasbro, in produzione dalla fine degli anni ’70 (del XX secolo) cioè da quando l’elettronica conquistava i primi spazi nell’universo ludico. La realizzazione è semplice perché basta gestire dei diodi led, un cicalino e dei pulsanti. Il microcontrollore usato è l’Arduino nano, molto più piccolo di altri modelli di Arduino e quindi più adatto ad essere usato in dispositivi che hanno anche lo scopo di essere maneggevoli.

Per il diodo led è sufficiente collegare in serie una resistenza adeguatamente dimensionata. Per il led blu è stata usata una resistenza da 140 ohm, mentre per verde, rossa e gialla una da 220 ohm. La resistenza è dimensionata in base alla tensione che assorbe il diodo e tenendo conto che l’intensità di corrente deve rimanere entro determinati limiti, altrimenti si rischia dover buttare il led. La classica formula da applicare è la seguente:

I=\frac{V-V_{led}}{R}

La tensione V è quella in uscita dai pin digitali dell’arduino ed è +5 V, la V_f dipende dal colore, è 3 volt per il blu mentre per rosso, giallo e verde si intorno ai 2 volt; per la precisione rosso 1,8 V, giallo 1,9 V e verde 2,0 V ma poco importa perché le resistenze vanno scelte in modo da avere una corrente al di sotto dei 20 mA.

I pulsanti invece collegano direttamente la tensione con i pin corrispondenti, ma in più in serie aggiungiamo una resistenza da 10 k\Omega verso il GRD. Infine il cicalino (un buzzer passivo) viene aggiunto direttamente tra pin e GRD. Lo schema è essenzialmente questo:

I vari componenti sono abbastanza semplici da inserire nel momento che si comprende lo schema con cui le connessioni si ripetono: l’importante è non fare confusione. Il risultato finale è questo qua:

Quindi abbiamo quattro led di vari colori a cui corrispondono altri quattro pulsanti più un pulsante bianco; il buzzer è il cilindretto nero all’estrema destra. Si tratta in questo momento solo di un hardware spoglio, ovvero senza alcun software che lo gestisca. Il programma di prova che carichiamo funziona perfettamente, quindi andiamo avanti scrivendo un po’ di codice per implementare il gioco: ci serve un generatore di valori casuali che aggiunge ad ogni passo un elemento in una sequenza, visualizzi questa sequenza attraverso l’accensione dei led e controlli che la sequenza replicata dal giocatore corrisponda a quella prevista, insomma un po’ un casino, ma niente di particolare. Il file sorgente è disponibile qui: miniSimon.ino.

Il risultato è illustrato in questo video; ma con lo stesso hardware si potrebbe fare anche di più, si potrebbe immaginare un altro tipo di gioco o altre funzioni; senza cambiare nulla nei collegamenti e modificando solo il codice si può fare tutto quello che la fantasia ci suggerisce; quindi non finisce qui, l’estate è ancora lunga.

[Update]
Infatti non ho impiegato molto tempo per trasformare quest’oggetto in uno strumento musicale: ogni combinazione di tasti produce un tono (nella scala temperata a temperamento equabile, che per chi segue questo blog dovrebbe risultare familiare, altrimenti cliccate qua).

L’associazione tra tasti e note musicali è data dal seguente schema; inoltre premendo il tasto bianco si ottengono le stesse note un’ottava più in alto:

BluVerdeRossoGiallo
Do   
Do#/Reb  
Re   
Re#/Mib  
Mi   
Fa  
Fa#/Solb   
Sol  
Sol#/Lab 
La  
La#/Sib 
Si  
Do 

Il codice si può trovare su questo Pastebin; la cosa interessante di questo codice consiste nel modo con cui definisce le frequenze delle note: definito 523 MHz la frequenza del Do, frequenze delle note successive si calcolano moltiplicando più volte per 1,0594…. ovvero per la radice dodicesima di 2, mentre in molti esempi che ho visto in giro le note erano definite da una serie di direttive #define. Il motivo lo trovate nell’articolo già citato.

   frequency[0]=523;
   f=523;
   for(int i=1;i<25;i++){
      f=f*1.0594630943592952646;
      frequency[i]=(int)(f+.5);
   }

Il risultato non è eccezionale, qui un esempio:

Ma adesso spegniamo le luci e…. magia!

Koch Snowflake

Divertiamoci un po’

Koch Snowflake
Koch Snowflake

Ogni tanto vale la pena rilassarsi un po’ con questo bell’ambiente di sviluppo che si chiama Scratch e disegniamo un bel frattale, uno semplice: il fiocco di neve di Koch. Si disegna un triangolo equilatero; ogni suo lato viene trasformato in 4 segmenti in modo da formare tanti triangolini, e poi da essi ancora tanti triangolini senza mai smettere e si ottiene un disegno del genere.

Bello vero?

 

 

 

 

 

Codice sorgente

Il codice per realizzare questo disegno non è molto complicato, si tratta di ripetere iterativamente queste istruzioni (per i curiosi il codice completo si può vedere qui).

 

 

 

 

 

 

 

 

 

 
Mentre per vedere in azione il risultato della codifica premere sulla bandierina:

Premi invio, anzi no!

comandi_dos_senza_invio

Le spiegazioni di questo problema possono essere tante: incapacità di fare un’analisi, ignoranza, scarsa voglia di capire, a cui si aggiunge l’assoluta incapacità di esprimersi in maniera corretta. Non metto in dubbio che venga riscontrato un problema, ma non è possibile scrivere una cosa del genere senza capire che si rischia di fare una figura da imbecille. Inoltre sembra che solo io mi sia accorto della cosa, per cui posso pensare che oltre alla incapacità di esprimersi in maniera corretta, sia molto diffusa l’incapacità di comprendere un testo scritto.

ArthurSchopenhauer
“Un uomo intelligente costretto a vivere insieme a degli sciocchi assomiglia a colui che ha un orologio che va bene in una città le cui torri hanno tutte orologi che vanno male. Lui solo ha l’ora giusta: ma a che gli serve? Tutta la città si regola secondo gli orologi cittadini sbagliati, persino coloro i quali sanno che soltanto il suo orologio indica l’ora vera”

Arthur Schopenhauer.

Non è certo quanto io sia intelligente, può darsi che anche il mio orologio porti un po’ male, ma non solo devo prendere tristemente atto del livello delle persone che mi circondano, e di un generale appiattimento verso il basso. Ammesso anche che una persona possa prendere una cantonata e scrivere una fesseria, ma se le persone che leggono in copia non si affrettano a chiedere una precisazione vuol dire che per loro va tutto bene, tra l’altro in un ambiente che si ritiene di elevato livello professionale.
Insomma io mi trovo in mezzo a persone così, ci devo lavorare; quelli che dovrebbero esprimere dei giudizi su di me o sono così o notano nulla di strano, e non so quale è la cosa peggiore.

2038: l’anno del baco

Il 19 Gennaio 2038, alle ore 03:14:07 UTC, potrebbe essere l’ultimo secondo di vita di molte macchine su cui gira il sistema operativo Unix. Infatti i sistemi operativi Unix-like utilizzano 4 byte per conteggiare il numero di secondi trascorsi dal primo Gennaio 1970. Di questi 32 bit il primo indica il segno del numero, e i successivi 31 servono a rappresentare il numero. Esattamente 2.147.483.647 secondi dopo lo scoccare del 1° Gennaio 1970 tutti i bit di questi 4 bytes saranno a 1 tranne il primo: 01111111|11111111|11111111|11111111.
Un secondo dopo avremo 10000000|00000000|00000000|00000000, che rappresenta il numero -2.147.483.648, cioè il 13 dicembre 1901 alle ore 03:14:07 UTC, dopodiché… buona fortuna.