Ci è sempre piaciuto “giocare” con Arduino e Raspberry. Personalmente la cosa che mi attrae maggiormente di questi “micro-computer” è che si possono collegare facilmente a Internet e si possono poi utilizzare le loro porte di Input/Output per pilotare dispositivi elettrici o acquisire informazioni dall’ambiente. Al giorno d’oggi poi, tutto quello che può comunicare su Internet può essere controllato anche tramite un assistente vocale (es Alexa).

Dov’è il telecomando?

Questo è l’annoso quesito che ci si pone spesso in casa. Mi sono detto quindi: perchè non realizzare qualcosa che sostituisca in toto il telecomando della nostra TV e ci permetta di controllarla usando lo smartphone o Alexa? Qualche ricerca online per verificare la fattibilità della cosa e….si parte!

La struttura del progetto

L’idea di base era quindi quella di utilizzare il Raspberry per inviare i segnali al televisore tramite un led a infrarossi (esattamente come quello che c’è su qualsiasi telecomando). Il Raspberry poi sarebbe stato pilotato da un applicativo web che a sua volta si sarebbe interfacciato con una app per smartphone e/o Alexa per ricevere i comandi dall’utente.

In questo primo articolo parleremo solo della parte relativa al Raspberry, sia in versione “prototipo” che in versione “definitiva”. Nel prossimi articoli parleremo poi della realizzazione dell’applicazione web e dell’interfacciamento con Alexa.

Sì però non è il solito progettino che sta in piedi per miracolo!

Online si trovano alcuni progetti simili a quello che ho deciso di realizzare; la differenza sostanziale è che nella maggior parte dei casi questi progetti non sono davvero utilizzabili quotidianamente ma sono dei semplici prototipi che dimostrano la fattibilità di una ipotesi.

L’esempio più lampante che ho visto riguarda proprio la comunicazione del Raspberry su Internet. Il Raspberry ovviamente non avrà un IP pubblico fisso per cui è difficile per un applicativo web esterno comunicare puntualmente con il Raspberry. La maggior parte dei progetti che ho visto affronta questo problema usando ngrok , che genera un URL pubblico che “punta” al vostro Raspberry (previa installazione sul vostro Raspberry di un apposito tool). Il problema è che, nella versione free, l’URL generato è casuale e cambierà ad ogni avvio del tool, rendendo di fatto impossibile comunicare con il Raspberry se non aggiornando di volta in volta l’URL con cui comunicare nel vostro applicativo web. Così sono capaci tutti!

Il mio obiettivo quindi non è solo riuscire a realizzare qualcosa che funzioni, ma che possa anche essere davvero messo in salotto e, tramite un piccolo bottone possa essere acceso e possa poi funzionare senza ulteriori interventi, insomma, qualcosa di “production-ready” nel senso più ampio del termine.

Questo perché noi sviluppatori ci appassioniamo tantissimo alla mera verifica della fattibilità di un progetto (fino a quando arriviamo quindi al momento in cui vediamo funzionare per la prima volta il nostro prototipo), ma poi “snobbiamo” tutto quello che successivamente serve per rendere il progetto che abbiamo realizzato “utilizzabile” da parte di nostra nonna. Pensiamo che questa parte “residua” sia una semplice formalità che richiede poco tempo, ma la verità che è spesso richiedere più tempo della parte iniziale, nonché richiede alcune/molte modifiche al prototipo (vedi l’esempio di ngrok).

Iniziamo!

Per prima cosa ho cercato online alcuni progetti da cui prendere spunto. Ovviamente per arrivare a qualcosa di funzionante ho dovuto unire 3 o 4 progetti diversi perché fra diverse versioni di sistema operativo e piccole differenze di componentistica, c’era sempre qualcosa che non funzionava.

In definitiva, il circuito da realizzare attorno al Raspberry era composto da:

  • 1 LED IR pilotato da un transistor collegato alle porte GPIO del Raspberry
  • 1 LED collegato alle porte GPIO del Raspberry per dare un feedback sul funzionamento del Raspberry (LED di stato)
  • 1 ricevitore IR utile in fase di sviluppo per “mappare” i bottoni del telecomando (anche se online si trovano i mapping di molti televisori, ma io non sono stato fortunato). Con “mappare” intendo abbinare ad ogni bottone del telecomando la relativa sequenza IR da inviare al televisore
  • 1 On/Off Shim utile per gestire l’accensione e lo spegnimento del Raspberry (il quale altrimenti si accenderebbe non appena si collega il cavo e si spegnerebbe solo scollegando fisicamente il cavo di alimentazione)

Una volta reperiti tutti i componenti li ho assemblati su una basetta millefori a fianco del Raspberry. 

Passiamo ora alla parte software.

Fortunatamente per Linux è disponibile uno strumento chiamato LIRC che permette di ricevere, decodificare ed inviare segnali IR. Come dicevo in precedenza, online si trovano già i mapping di tanti televisori, per cui se si trova il file di mapping del proprio televisore basta scaricarlo e utilizzarlo per inviare direttamente i segnali IR al televisore attraverso il tool LIRC. Per il nostro televisore online non ho trovato nulla, per cui ho dovuto in un primo step realizzare il nostro file di mapping utilizzando il telecomando originale ed il ricevitore IR. 

Ma andiamo per step: 

  • per prima cosa ho installato il sistema operativo del Raspberry; fin qui nessun problema;
  • in secondo luogo ho installato LIRC come qualsiasi altro pacchetto;
  • ho poi configurato il PIN 22 per l’invio dei segnali IR e il PIN 23 per la ricezione dei segnali IR;
  • ho avviato il tool LIRC in modalità ricezione (usando quindi il ricevitore IR collegato al PIN 23) per realizzare il profilo del telecomando: ho premuto un tasto dopo l’altro tutti i tasti del telecomando stando di fronte al ricevitore e inserendo per ognuno l’identificativo del bottone appena premuto (es. KEY_1, VOLUME_UP, POWER, ecc);
  • terminata questa procedura ho ottenuto dal tool un file di profilo testuale contenente per ogni bottone la relativa sequenza IR;
  • a questo punto ho copiato il file nella cartella di LIRC in modo che, una volta avviato LIRC in modalità di invio dei segnali, potessimo usarlo per inviare i comandi al televisore
  • alla fine di questa procedura ho provato a lanciare da terminale il comando: 
irsend SEND_ONCE tango_remote KEY_2

dove tango_remote è il nome del profilo che abbiamo realizzato e KEY_2 è il nome del bottone che vogliamo inviare. Dopo qualche modifica qua e là….funziona! Puntando il led IR verso il televisore (da una distanza ragionevole) il televisore ha cambiato canale!

Versione definitiva “production”

Lo sviluppo è stato realizzato su un Raspberry Pi 3, per realizzare la versione “production” ho scelto di utilizzare il Raspberry Pi Zero, molto più compatto e un po’ meno performante, ma per il nostro utilizzo specifico anche le performance del Pi Zero sono più che sufficienti.

Ho acquistato una piccola basetta su misura del Pi Zero per potervi saldare sopra tutti i componenti ed un piccolo case (sempre su misura del Pi Zero) per inserire il tutto e dare un aspetto più carino. Ho anche trovato un bel bottone con led integrato per gestire sia l’accensione/spegnimento tramite l’On/Off Shim, sia il led di stato del Raspberry (che andremo a gestire tramite l’applicazione node di cui parleremo nel prossimo articolo, per ora vi basti sapere che il led si accenderà ad ogni comando ricevuto dall’applicazione web).

Dopo un po di saldature e un po di colla VINILICA a caldo…ecco il risultato finale!

Nella versione “production” non ho inserito la parte di ricezione IR in quanto il file per il mapping del telecomando basta generalo una volta sola all’inizio, per cui risultava superfluo.

Per adesso però il nostro Raspberry riesce a inviare i segnali al televisore solo collegandosi in SSH e lanciando dei comandi da terminale, nel prossimo articolo parleremo della comunicazione fra il Raspberry e l’applicazione web. Realizzeremo poi una semplice app per permettere all’utente di inserire i comandi desiderati.

One more thing!

Il dispositivo che abbiamo realizzato funziona correttamente, però il LED di stato non è molto user-friendly: durante tutta la fase di boot il LED resta spento e lampeggia solo quando il dispositivo riceve un comando dall’applicazione web. Quello che mi piacerebbe fare è:

  • Durante la fase di boot, il LED di stato lampeggia
  • Quanto il sistema operativo e la nostra app sono pronti, il LED di stato resta acceso fisso
  • Quanto il dispositivo riceve un comando dalla applicazione web, il LED lampeggia

L’approccio più semplice per pilotare un LED è quello di utilizzare le porte GPIO del raspberry, per cui ad esempio se si vuole far lampeggiare un LED basta modificare lo stato di una porta GPIO da 0 a 1 e viceversa. Potete vedere un approccio di questo tipo nello schema sopra, dove vedete che il LED di stato è pilotato direttamente dal GPIO 27.

Il problema di questo approccio è che per poter pilotare via software una porta GPIO dobbiamo aspettare che il sistema operativo e la nostra app siano pronti, questo richiede circa 40 secondi. Come possiamo quindi far lampeggiare il LED di stato durante questa fase? Dobbiamo per forza utilizzare un circuito esterno al raspberry. Una volta poi che è tutto pronto possiamo utilizzare una porta GPIO, collegata ad un transistor, per attivare/disattivare il circuito.

Per far lampeggiare un LED basta un integrato come l’NE555, ma, perché non complicarci la vita e realizzare da noi un circuito di lampeggiamento? Il circuito che dobbiamo realizzare si chiama Astable Multivibrator, ed è composto da alcune resistenze, condensatori e transistor:

Astable Multivibrator

Abbiamo quindi realizzato questo piccolo circuito e lo abbiamo poi collegato tramite un transistor ad una porta GPIO del raspberry, permettendoci quindi di avere il seguente funzionamento:

  • Se la porta GPIO è bassa (0V), il circuito di lampeggiamento è attivo e il LED di stato lampeggia. Questo è lo stato in cui si trova il raspberry durante l’avvio.
  • Se la porta GPIO è alta (3.3V), il circuito di lampeggiamento è bypassato e il LED di stato resta acceso. Quando la nostra app è pronta imposta la porta GPIO alta.
  • Quando il dispositivo riceve un comando dall’applicazione web, portiamo per un breve periodo di tempo la porta GPIO bassa, in modo da riattivare il circuito di lampeggiamento.
Circuito completo
Astable Multivibrator
Dispositivo con circuito Astable Multivibrator

E’ sempre bello “sporcarsi le mani” con questi piccoli progetti. Quello che all’inizio sembra qualcosa di molto semplice alla fine si rivela essere un progetto molto interessante, che collega Alexa alle porte GPIO di un Raspberry. Capite bene che poi cosa ci sia collegato alle porte fa poca differenza! Può essere un led IR come nel nostro caso, una lampada, oppure un motore!