23 marzo 2017

tutorial: come rendere smart le prese di casa con il raspberry pi zero (wireless)


Benvenuti!
Questo tutorial vi aiuterà a rendere "2.0" le prese di casa con l'ausilio di un raspberry pi zero o zero wireless (qui trovate tutti i miei focus su questi dispositivi).

Nota: il presente articolo contiene una infarinatura generale, gli schemi per i circuiti, i codici richiesti per il funzionamento ed un esempio d'uso ben preciso. Gli utilizzi, però, possono spaziare tra tantissime alternative, l'unico limite è la nostra immaginazione! Se avete proposte al riguardo o volete approfondire, non esitate a lasciare un commento o a contattarmi sui canali social.

Prima di addentrarci, vi riporto il video di supporto a questa guida che ho pubblicato sul mio canale YouTube:


Inoltre vi segnalo che nella pagina dedicata troverete tutti i tutorial da me pubblicati.


1. l'attrezzatura minima per iniziare


Per rendere SMART le prese di casa occorrono:
  1. un raspberry pi zero wireless (o un qualsiasi altro raspberry pi) + una microSD + un alimentatore (da almeno 2A) + un cavo HDMI a mini-HDMI (per il pi zero, altrimenti HDMI ad HDMI per gli altri pi) + un adattatore da USB a Micro-USB + hub USB (per collegare mouse e tastiera al pi)
  2. un PC o smartphone o tablet
  3. Raspbian OS
  4. una connessione ad internet + un router (se utilizzerete il pi zero vi sarà necessario anche un dongle Wi-Fi o adattatore LAN per la connessione alla rete)
  5. una o più prese radio-comandabili con telecomando remoto, che operano sulle frequenze 433MHz
  6. una breadboard, almeno 3 cavetti (meglio se colorati) e la coppia di chip ricetrasmittenti che operano sulla stessa frequenza della/e presa/e
  7. se utilizzate un pi zero vi occorrerà una testata da inserire sul GPIO (meglio se femmina) oppure con gli altri raspberry pi (o utilizzando una testata maschio sul pi zero) un GPIO-extender può facilitarvi il lavoro di connessione dei cavi con la breadboard

Per quanto riguarda il primo punto non occorre altro: anche se collegherete il raspberry pi zero ad un monitor esterno per determinate operazioni preliminari (per le quali è necessario operare con mouse e tastiera), a progettino terminato il controllo avverrà sempre da remoto, quindi non sarà necessario utilizzare alcuna periferica collegate al pi. Sarà invece indispensabile avere un alimentatore che eroghi in uscita almeno 2A.
Il secondo punto è direttamente collegato con il primo: con il PC accederemo al sistema da remoto per le fasi iniziali di sviluppo e test, ma per l'utilizzo finale probabilmente potrà essere più comodo usare lo smartphone o un tablet.
Poiché utilizzeremo la testata GPIO + alcune librerie di elaborazione ed implementeremo un server Apache, potenzialmente può andar bene qualsiasi distribuzione Linux. Raspbian ha out-of-the-box gran parte di ciò che è necessario, quindi conviene puntare direttamente su questa distribuzione.
Serve commentare il quarto punto (=D)? Mentre gli ultimi tre punti saranno dettagliati nel corso della guida.



2. la configurazione iniziale del raspberry pi e delle prese


Utilizzando Raspbian OS (con P.I.X.E.L., scaricabile dal sito ufficiale della fondazione raspberry pi) avrete già disponibile gran parte delle librerie e software indispensabile per completare questo progettino. Le uniche cose da aggiungere all'installazione base saranno Apache2 + PHP ed una libreria grafica matematica per python. Una volta collegati con il vostro PC in SSH all'indirizzo IP assegnato al raspberry pi (utente pi e password raspberry, a meno che non le abbiate cambiate):
  • dalla riga di comando digitate sudo apt-get install apache2 libapache2-mod-php5 per installare il server Apache, il linguaggio PHP ed il suo supporto per Apache
  • sempre dalla riga di comando digitate sudo apt-get install python-matplotlib per aggiungere la libreria grafica matematica da utilizzare in una delle fasi successive
Completati questi due passaggi, dovrete clonare il software che ho preparato (vedi qui) all'interno della cartella /var/www/html/smartplugs. Per far ciò seguite i seguenti passi:
  • cd /var/www/html
  • sudo git clone https://github.com/geekonerd/smartplugs.git
  • sudo chown -R pi:pi smartplugs
  • cd smartplugs
  • chmod 666 data/data.json

Il contenuto della cartella smartplugs comprende: i codici python per la cattura ed invio dei segnali per controllare le prese radio-comandabili, nonché la web-app che vi permetterà di inviare i comandi di accensione e spegnimento dal vostro PC/smartphone/tablet non appena sarete riusciti a completare tutto il tutorial.


La maggior parte delle componenti elencate in precedenza può essere acquistata su Amazon per pochi euro (le prese Aukey che ho utilizzato io, ma anche quelle di altre marche, vengono vendute a blocchi da 3 o 5 con un prezzo che si aggira attorno ai 30€). I chip ricetrasmittenti (che lavorano sulla frequenza 433MHz che è la stessa utilizzata anche dalle prese) possono essere acquistati anche da tanti altri store di elettronica per pochi spiccioli: ad esempio si trovano sul sito icstation.com che ringrazio per avermi spedito in prova i due chip suddetti. Sul loro sito potete trovare anche tantissime altre componenti per arduino, raspberry pi, etc, e anzi se ci fate un giro e trovate qualcosa di interessante segnalatemelo perché potrebbe diventare oggetto di miei futuri tutorial. I tempi di spedizione purtroppo non sono rapidissimi, ma i prezzi delle componenti sono veramente veramente bassi e il costo per la spedizione è sempre compreso.

Lo store mi ha fornito un codice sconto (Geeics) del 15%, utilizzabile per qualsiasi prodotto in vendita, massimo una volta per utente e fino a 300 utenti.


3. le fasi


Bene: i passaggi da completare per portare a termine i nostri scopi sono 6 (che diverranno più chiari man mano che andremo avanti con il tutorial):
  1. il primo passaggio lo avete già completato, e corrisponde alla copia dei codici da me forniti nell'apposita cartella
  2. il secondo passaggio consiste nel collegare il chip ricevitore sulla breadboard e, tramite cavi, su tre pin del raspberry pi; a quel punto va lanciato il primo codice python che sniffa i segnali inviati sulla frequenza 433MHz dal telecomandino
  3. il terzo passaggio consiste nel decifrare i segnali inviati dal telecomando e la creazione di una loro codifica in binario; nonché si devono calcolare i tempi di intervallo tra un bit e l'altro, e tra una ripetizione e l'altra del segnale
  4. il quarto passaggio consiste nel collegare il chip trasmettitore sulla breadboard e sempre su tre pin del raspberry pi; a quel punto va modificato lo script per la trasmissione dei segnali da me fornito con i valori che voi avete calcolato al punto 3; quindi fare un rapido test di funzionamento
  5. il quinto passaggio prevede la ripetizione del punto 3 per tutte le prese che vorrete configurare
  6. il sesto passaggio consiste nel testare da remoto il software scritto in HTML + PHP + JavaScript che vi ho fornito e che permette di controllare le prese da remoto via smartphone, tablet o PC


FASE 1 -» vedi la configurazione iniziale


FASE 2
Si possono collegare contemporaneamente sia il chip di ricezione che trasmissione sulla breadboard e sul raspberry pi poiché non li utilizzeremo in contemporanea e, comunque, non interferiscono tra loro. In ogni caso va sicuramente collegato per primo il chip ricevitore. Se avete soltanto 3 cavi invece che 6, beh allora sarete obbligati ad alternare i chip.
In generale il chip ricevitore servirà solo per la cattura dei segnali, i quali resteranno immutati nel tempo e quindi, una volta sniffati tutti, il chip ricevitore non sarà più impiegato.


Questo chip ha 4 pin, ma a noi ne serviranno soltanto 3: il primo, quello più a sinistra, deve essere collegato alla corrente da 3.3V (occhio a non sbagliare PIN sul GPIO del raspberry pi); il secondo, che è anche il numero 2 sul chip, è quello da cui leggeremo i dati che verranno sniffati e va collegato ad un qualsiasi PIN programmabile del raspberry pi; infine il terzo, che corrisponde all'ultimo pin del chip (quindi ne va saltato uno), è il ground (la terra) e va collegato -chiaramente- ad un PIN ground del pi.

Per avere un'idea precisa di quali siano i PIN presenti sul raspberry pi e quali funzioni abbiano, rimando al fantastico sito pinout.xyz sul quale è raffigurato l'header GPIO di tutti i raspberry pi con tanto di indicazioni dettagliate per ognuno di essi. Dateci un'occhiata per qualsiasi chiarimento.

In ogni caso lo schema del pi zero wireless (e di tutti gli altri pi più recenti) è il seguente:


Seguendo lo standard BCM, io ho connesso il chip ricevitore ai seguenti PIN: Ground (pin 6 e cavo nero) per la terra, BCM 23 (pin 16 e cavo giallo) per il trasferimento dati, 3v3 Power (pin 17 e cavo bianco) per la corrente.

Una volta connessi i cavi, cosicché chiudano il circuito, saremo pronti a lanciare il primo dei due script python, il receive.py che si trova nella cartella /var/www/html/data.

Nota: se avete collegato i vostri cavi su PIN del raspberry pi differenti da quelli che ho utilizzato io, beh allora dovrete modificare lo script indicando il PIN esatto su cui avete collegato il DATA cioè il secondo PIN del ricevitore (ground e corrente sono invece indifferenti). E questo è il punto del codice da modificare (potete utilizzare vim.tiny o nano o qualsiasi altro editor che preferite):

'''Pin da utilizzare per leggere i dati catturati dal chip ricevitore'''
PIN_DATA_DI_CATTURA = 23 «- qui va indicato il BCM PIN utilizzato


Questo primo script va lanciato direttamente dal raspberry pi collegato ad un monitor dalla cartella su specificata con il comando sudo python receive.py: avvierete lo sniffing dei segnali e non appena sul terminale apparirà la scritta «premere un tasto del telecomando», beh fatelo per almeno un secondo. Dopo 5 secondi, la cattura sarà automaticamente bloccata e verrà avviato un software che permetterà di visualizzare graficamente su di un piano cartesiano i dati catturati.

Nota: questo software grafico apparirà sul monitor collegato al raspberry pi e sarà l'unica fase di tutta la guida che necessiterà l'uso di tale monitor. Finita la fase di sniffing iniziale, infatti, esso non sarà più necessario (così come mouse, tastiera, hub USB e adattatore OTG da USB a Micro-USB). In alternativa, potreste collegarvi con un desktop remoto al raspberry pi con tool specifici come descritto ad esempio qui, cosa che potrà farvi anche evitare di acquistare l'adattatore OTG, l'hub e le altre periferiche per usare direttamente il pi zero (a meno che non le abbiate già in casa: a voi la scelta che preferite!).


Con molta probabilità il risultato della cattura sarà rappresentato come un blocco contiguo in blu. Su di esso dovrete zoomare finché non riuscirete ad identificare una serie che rappresenti il segnale inviato dal telecomando.

risultato della cattura e zoom sul blocco contiguo

zoom sulle serie e su di una in particolare


FASE 3
Ed ora inizia la parte divertente e più importante di tutto il progettino: codificare in binario il segnale sniffato.

Il grafico cartesiano è composto da picchi che raggiungono il valore 1 ed altri che invece restano fermi sullo 0. Occorre decidere una codifica per rappresentare questi stati: nel dettaglio, la linea sale ad 1 e ci rimane per un certo intervallo, poi torna a 0 e lì rimane per un altro intervallo.
Esistono due possibilità: abbiamo un 1 per un tempo "lungo" ed uno 0 per uno "corto", ed il contrario, un 1 per un tempo "corto" ed uno 0 per un tempo "lungo":


La codifica che ho utilizzato io è quella di rappresentare con uno 0 il primo caso (cioè un 1 "lungo" seguito da uno 0 "corto") e con un 1 il secondo (cioè un 1 "corto" seguito da uno 0 "lungo").
In tutto ci sono 25 occorrenze, e nell'esempio su riportato la codifica binaria corrispondente al segnale catturato è: 0011100011000111011010001.


Una volta ottenuta questa stringa dovrete capire quanto siano lunghi i suddetti intervalli "lungo" e "corto": zoomando ancora potrete vedere le lunghezze approssimative dei vari stati, che sono comunque costanti per tutta la serie. Solitamente l'intervallo "lungo" è circa il doppio o il triplo di quello "corto". Ed è fondamentale calcolare tali durate, e farlo in secondi: con molta probabilità verranno fuori risultati del tipo "intervallo lungo = 0.00096 secondi" ed "intervallo corto = 0.00030 secondi".
Inoltre, il telecomando (e quindi anche noi di conseguenza) invia più volte lo stesso blocco di 25 occorrenze, probabilmente per avere la certezza che il segnale non venga perso, e c'è un tempo di sincronizzazione tra un invio e l'altro. Dovrete calcolare anche questo intervallo che probabilmente è circa dieci volte più lungo dell'intervallo "lungo", qualcosa come "intervallo tra ripetizioni = 0.0113 secondi".
I valori degli intervalli sono identici per tutte le prese e tutti i segnali inviati, il che significa che calcolati una volta andranno bene per tutto il kit di prese in vostro possesso, e le uniche cose che saranno differenti sono le stringhe binarie corrispondenti ai segnali di accensione e spegnimento per ogni presa.


FASE 4
Una volta ottenuta la codifica binaria del segnale ed i tempi di intervallo "corto", "lungo" e tra una serie e l'altra, potrete provare ad accendere la vostra presa!
Se ancora non lo aveste fatto, è tempo di collegare il chip trasmettitore al raspberry pi.

Un appunto banale, ma che va detto: operate con fili e quant'altro sempre con il raspberry pi spento, così da evitare possibili problemi sia a voi che a tutta la componentistica!


Questo chip ha soltanto 3 PIN che useremo al completo: il primo per l'alimentazione (questa volta da 5V, quindi anche in questo caso occhio al PIN che userete); il secondo per inviare dal pi al trasmettitore i dati, e va collegato ad un qualsiasi PIN programmabile del raspberry pi; ed infine il terzo, il ground (la terra) da collegare -ovviamente- ad un PIN ground del pi.

Anche in questo caso rimando al blog o al sito pinout.xyz per maggiori dettagli sui PIN e i loro usi.

Seguendo lo standard BCM, io ho connesso il chip trasmettitore ai seguenti PIN: Ground (pin 39 e cavo blu) per la terra, BCM 16 (pin 36 e cavo arancio) per il trasferimento dati, 5v Power (pin 2 e cavo rosso) per la corrente.

A questo punto potrete fare la prova di accensione della presa (supponendo abbiate sniffato quel segnale, oppure di spegnimento in caso abbiate sniffato l'altro).

Nota: anche questa volta dovrete modificare il contenuto dello script transmit.py che si trova nella cartella /var/www/html/data indicando il PIN del pi (se diverso da quello che ho usato io) a cui avete collegato il PIN DATA del chip trasmettitore (ground e corrente sono invece indifferenti). E questo è il punto del codice da modificare (potete utilizzare vim.tiny o nano o qualsiasi altro editor che preferite):

'''PIN da utilizzare per inviare i dati verso il chip trasmettitore'''
PIN_DATA_DI_INVIO = 16 «- qui va indicato il BCM PIN utilizzato


Ma soprattutto dovrete inserire le stringhe binarie ed i tempi calcolati nella fase 3:

'''Stringhe binarie ON e OFF per le prese 1,2,3,4 mappate come a,b,c,d'''
a_on = '' «- presa 1 ON
a_off = '' «- presa 1 OFF
b_on = '' «- presa 2 ON
b_off = '' «- presa 2 OFF
c_on = '' «- presa 3 ON
c_off = '' «- presa 3 OFF
d_on = '0011100011000111011010001' «- presa 4 ON
d_off = '0011100011000111011010011' «- presa 4 OFF

'''intervalli brevi/lunghi nel segnale e tra le ripetizioni (in secondi)'''
intervallo_breve = 0.00030 «- tempo "corto"
intervallo_lungo = 0.00096 «- tempo "lungo"
intervallo_tra_tentativi = 0.0113 «- intervallo tra le ripetizioni
NUMERO_DI_TENTATIVI = 15 «- numero di ripetizioni della serie


Il comando da lanciare potrà essere fatto sia via SSH o direttamente sul raspberry pi (questa volta è del tutto indifferente) e sarà sudo python transmit.py dalla cartella indicata in precedenza e seguito dal nome di una o più delle otto (o più) stringhe che avete calcolato. Ad esempio: se volessimo attivare la 4 presa, dovremo utilizzare il valore d_on.
L'idea è quella di mappare le 4 (o più oppure meno, a seconda del vostro kit) possibili prese con le lettere in ordine alfabetico a, b, c, d (etc) ed i rispettivi valori "accendi" e "spegni" con on ed off, ottenendo quindi a_on, a_off, b_on, b_off, e così via...

Lanciando lo script, esso non farà altro che attivare o disattivare il PIN desiderato sul GPIO inviando corrente per i tempi indicati dalla stringa e nelle modalità "lunga" o "corta" indicate con i tempi di intervallo che abbiamo calcolato. Inoltre rieseguirà questa operazione per 15 volte, intervallate sempre con il valore di tempo da noi indicato in secondi.

Et voilà la presa sarà accesa/spenta!


FASE 5
A questo punto potrete sniffare tutti e 8 (o più oppure meno, a seconda del vostro kit) i valori presenti sul telecomando, trasformandoli in stringhe binarie con la convezione descritta nella fase 3, o quella che vorrete: l'importante è che essa sia coerente per tutte le stringhe e mappata poi correttamente sul codice python.


FASE 6
Visto che siete ora in grado di controllare le vostre prese con il codice python, potrete renderle veramente SMART tramite una piccola applicazione web che ho realizzato e il cui codice lo avrete già scaricato nella cartella /var/www/html nella fase 1.

In realtà questo è soltanto uno degli usi: potreste ad esempio crearvi un cron che a determinati intervalli avvii il comando di accensione o spegnimento di una specifica presa, oppure altri scenari che possono esservi comodi: potreste collegare una stufetta o lo scaldabagno ad una presa e creare un temporizzatore che vada ad accendere la presa un'ora prima che suoni la vostra sveglia; oppure potreste potenziare il progettino aggiungendo sensori di movimento o videocamere, ed accendere o spegnere le luci in una stanza quando c'è qualcuno al suo interno o quando non c'è nessuno. Insomma: avete capito che le possibilità sono praticamente infinite!



Per gli scopi di questo tutorial, l'idea è quella di creare un telecomandino remoto che vi permetta di comandare le prese magari dal vostro cellulare oppure, se esponete tutto su internet, di farlo anche quando non siete in casa. Per dettagli relativi all'esporre su internet il raspberry pi, rimando al primo tutorial che ho pubblicato nel quale ho trattato la creazione di un server LAMP con il raspberry pi 3.

Nota: la web-app realizzata ha la necessità di avviare lo script python di trasmissione con i permessi di root. Per questo motivo occorrerà inserire l'utente con il quale Apache esegue il codice della web-app tra i sudoers. Un metodo rapido (ma non altrettanto sicuro) per velocizzare questa procedura è eseguire i seguenti passi (da remoto in SSH o direttamente sul raspberry pi):
  • sudo cp /etc/sudoers.d/010_pi-nopasswd /etc/sudoers.d/011_wwwdata-nopasswd
  • sudo vim.tiny /etc/sudoers.d/011_wwwdata-nopasswd
  • modificare l'utente "pi" con "www-data"
  • riavviare Raspbian OS

Finalmente, conoscendo l'indirizzo IP assegnato al pi (che poi è lo stesso che avrete utilizzato per collegarvi a lui in SSH), potrete accedere da remoto e da qualsiasi browser su PC, smartphone o tablet alla web-app che vi ho fornito. L'applicazione risponde digitando ad esempio http://192.168.1.4/smartplugs (se 192.168.1.4 è l'indirizzo IP del vostro pi).

Premendo sul bottone di accensione o spegnimento relativo alla presa di vostro interesse, dovreste essere in grado di controllarne lo stato!


4. conclusioni e ultime note


Qualche ultima considerazione: i chip non hanno una grande portata, il che significa che lo sniffing dei segnali inviati dal telecomando deve essere fatto tenendo quest'ultimo molto vicino al ricevitore. E allo stesso modo il chip trasmettitore non ha una portata immensa: utilizzato così com'è non raggiunge grandi distanze, e l'idea è quella di collegargli una piccola antennina nell'apposito forellino, così da potenziarne il segnale.

Tutto il materiale che vi ho fornito non è pensato per essere "sicuro" e "funzionante al top in ogni condizione": se pensate di esporlo su internet, verificate di aver messo in sicurezza i vostri dati, e soprattutto sistemato i permessi di accesso ai file e di esecuzione degli script... In più, potrebbe essere necessario smanettare con i vari codici python, JavaScript e PHP per perfezionarne il funzionamento.
In ogni caso avete tutti i sorgenti del codice, quindi potrete farne ciò che volete. Per gli script python, aggiungo che essi sono basati su di una guida pubblicata su instructables.com che accenna a molte delle parti riportate in questo tutorial.



Bene: come indicato ad inizio guida, alcuni aspetti sono stati appositamente lasciati in secondo piano, ma se siete interessati ad approfondirli non esitate a contattarmi nei commenti di questo tutorial o del video ad esso correlato, oppure sui canali social!

Spero che la guida vi sia stata utile. Al prossimo tutorial!

Nessun commento:

Posta un commento