Ciao ragazzi, benvenuti in un nuovo tutorial!
Come ormai ben saprete, da inizio anno ho
dato il via a questa serie di video dedicati
a piccoli progettini da realizzare con i dispositivi
in mio possesso; progettini proposti sia da
me (tramite brevi sondaggi ad inizio di ogni
tutorial) e sia da voi nei commenti, cosa
di cui vi ringrazio tantissimo. Continua sempre
a sorprendermi la vostra grande partecipazione
a questa iniziativa! Grazie davvero!
Nel precedente tutorial che, se ancora non
aveste visto, trovate linkato in descrizione
e nelle schede di questo video, vi avevo proposto
(come ormai mio solito) due alternative per
il video di oggi più la possibilità di proporre
altro nei commenti, e la vostra parola in
merito non è mancata. Devo dire che avete
trovato interessanti le opzioni, tanto che
le percentuali di voto si sono suddisive quasi
equamente tra le due proposte. Per questo
motivo ho deciso di dar precedenza a entrambi
i focus e rimandare direttamente alla prossima
volta la scelta per i tutorial successivi.
Inoltre, poiché ho avuto qualche problemino
con il display LCD in mio possesso (che è
una delle componenti base per la costruzione
di una simil Nintendo Switch), devo dare precedenza
alla seconda classificata. Ma sono sicuro
che non sarà un problema per voi, visto comunque
il grande interesse in merito.
Bando alle ciance: in questo tutorial vi mostrerò
come rendere SMART le prese di casa.
L'idea che c'è alla base di questo progetto
è quella di poter controllare le prese elettriche
tramite un interruttore esterno, sia fisico
che virtuale. Mi spiego meglio con un esempio:
i lampadari siamo abituati ad accenderli o
spegnerli tramite un interruttore da parete.
Anche molte altre prese, a volte, sono controllabili
da interruttori (penso ai boiler per scaldare
l'acqua, etc), ma in generale tali interruttori
sono posizionati in un punto ben preciso di
casa e, affinché possano essere attivati
o disattivati, è necessaria la nostra vicinanza
ad essi.
Per rendere un po' più SMART quelle prese,
è possibile acquistare dei dispositivi che
vanno a collegarsi alla specifica presa, ma
che possono essere radiocomandati con
un telecomandino. Mi piace definire
questa soluzione come una versione
1.5 rispetto alla basilare
dell'interruttore da parete; perché
-fondamentalmente- ci permette
di accendere e spegnere la presa specifica
tramite quel telecomando che funziona su determinate
frequenze radio, e che invia i segnali di
ON ed OFF da una distanza sufficientemente
lontana. In questo modo possiamo attivare
o disattivare prese posizionate -chessò-
in punti scomodi da raggiungere, oppure possiamo
controllare elettrodomestici connessi a tali
prese anche quando ci troviamo in altre stanze
della casa, e così via...
Ma questa soluzione non è sufficientemente
SMART per noi, giusto? E che cosa c'è di
più evoluto? Controllare le prese da remoto,
quindi anche quando siamo fuori casa, oppure
poterle temporizzare e fare in modo che esse
si accendano e spengano in determinati momenti
della giornata, etc etc... Come al solito
l'unico limite è la nostra immaginazione.
Esistono due approcci, ovviamente, per risolvere
questo problema: il primo, il più semplice,
è quello di acquistare dei dispositivi che
facciano esattamente ciò, cioè che siano
programmabili per accendersi o spegnersi tramite
un'app o un sistema sviluppato dallo specifico
produttore; oppure, cosa molto più divertente,
crearci noi il nostro sistema di controllo remoto.
Ed è proprio questo lo scopo del tutorial
odierno: aggiornare ad una "versione 2.0"
le prese di casa utilizzando dei dispositivi
radiocomandabili (ad esempio questi di Aukey),
un raspberry pi zero wireless (ma va bene
anche un qualsiasi altro modello)
un chip ricevitore
per sniffare i segnali che il telecomando
invia alle prese, un chip trasmettitore per
poter inviare noi quei segnali in precedenza
catturati, ed un po' di cavetti ed una breadboard
per alimentare i due chip ed leggere e inviare
dati tramite i pin GPIO del pi. Ovviamente
sarà necessario scrivere qualche riga di
codice in python per eseguire tali operazioni,
e codice HTML/PHP/JavaScript per consertici
di richiamare il tutto da remoto. Per collegare
un pi 0 ad un breadboard dovrete avere delle
testate maschio o femmina da inserire nel
GPIO, e se utilizzate la testata maschio oppure
utilizzate un pi 3 o 2 o altri modelli che hanno
già la testata maschio allora vi potrà tornare
comodo un extender per il GPIO. Se invece
utilizzate la testata femmina allora le connessioni
via cavetti potranno essere fatte direttamente
tra raspberry pi e breadboard.
Nell'articolo che ho pubblicato sul mio blog
abbinato a questo tutorial (e che trovate
linkato in descrizione e qui tra le schede
di questo video), troverete la "lista della
spesa" dettagliata con tutte le componenti
necessarie, nonché tutti i sorgenti dei codici
python, HTML, PHP e JavaScript per realizzare
il progettino, e i semplicissimi schemi su
come e dove collegare i cavi sui PIN GPIO
e sulla breadboard.
In ogni caso, la maggior parte delle componenti
che vedrete può essere acquistata su Amazon
per pochi € (ad eccezione delle prese Aukey
o di altre marche che vengono vendute in blocchi
da 3 o 5 e si aggirano tra i 20 ed i 30€).
I chip per ricevere e inviare segnali sulla
frequenza 433MHz che, ATTENZIONE, deve essere
la stessa utilizzata anche dalle prese, possono
essere anche aquistati da vari store di elettronica
per pochi spiccioli, come ad esempio il sito
ICstation.com che vedete qui a video, che
ringrazio tantissimo 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.
Bene: i passaggi da completare per portare
a termine i nostri scopi sono 6, ora ve li
elenco tutti e così di primo acchito potrebbero
sembrare astrusi, ma vi saranno più chiari
man mano che andremo avanti con il tutorial.
- I. dovrete scaricare script e materiale
come indicato sul blog, installare un server Apache +
PHP e copiare nelle cartelle indicate i vari files
- II. dovrete collegare il chip ricevitore
sulla breadboard e, tramite cavi, su tre PIN
del raspberry pi; a quel punto lanciare il
primo codice python che sniffa i segnali inviati
sulla frequenza 433MHz dal telecomandino
- III. dovrete decifrare i segnali inviati
dal vostro telecomando, codificandoli in binario;
nonché calcolare i tempi di intervallo tra
un bit e l'altro, e tra una ripetizione e
l'altra del segnale
- IV. dovrete collegare il chip trasmettitore
sulla breadboard e sempre su tre PIN del raspberry pi;
aggiornare lo script per la trasmissione
dei segnali con i valori che avete calcolato
nel precedente punto; e fare un rapido
test di funzionamento
- V. dovrete ripetere il punto III per tutte le prese che vorrete
- VI. potrete testare da remoto il software
scritto in HTML/PHP e JavaScript che
permette di controllare le prese via
smartphone, tablet o PC.
Allora: per prima cosa guardate sull'articolo
abbinato a questo video
per scaricate gli script e tutto il
materiale necessario, salvandolo
nelle cartelle indicate. Nella guida si fa
inoltre riferimento a come installare un server
Apache+PHP e alle librerie python necessarie
per il progettino
Fatto ciò, vi anticipo che è possibile collegare
contemporaneamente i due chip 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.
Questo chip 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; 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 sia al blog ma soprattutto
al fantastico sito pinout.xyz sul quale è
raffiguato l'header GPIO di tutti i raspberry
pi, con tanto di indicazioni dettagliate per
ognuno di essi.
Dateci un'occhiata per qualsiasi chiarimento.
Una volta connessi i cavi affinché chiudano
il circuito, saremo pronti a lanciare il primo
dei due script python, il receive.py. 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.
Con il comando sudo python receive.py, lanciato
dalla cartella in cui avete salvato gli script,
avvierete lo sniffing dei segnali: non appena
apparirà a video la scritta "premere uno
dei tasti del telecomando", beh fatelo per
almeno un secondo.
Dopo 5 secondi la cattura sarà automaticamente
bloccata e verrà avviato un software che
permette di visualizzare graficamente su di
un piano cartesiano i dati catturati. Con
molta probabilità troverete rappresentato
un blocco contiguo in blu, sui cui dovrete
zoomare fino a che non riuscirete ad
identificare una serie che rappresenta
il segnale inviato dal telecomando.
E ora inizia la parte divertente, e quella più
importante di tutto il progettino: codificare
in binario il segnale. Se notate, il grafico
è composto da picchi che raggiungono il valore
1 ed altri che invece stanno fermi sullo 0.
Occorre decidere una codifica per rappresentare
questi stati: nel dettaglio, la linea che 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 un 0 il primo caso, e
con un 1 il secondo. In tutto ci sono 25 occorrenze,
e in questo caso la codifica binaria corrispondente
a questo segnale è: 0011100011000111011010001.
Una volta ottenuta questa stringa occorre
anche capire quanto sono lunghi questi intervalli:
zoomando ancora potrete vedere le lunghezze
approssimative dei vari stati, che sono comunque
costanti: di solito l'intervallo lungo è
circa il doppio o il triplo di quello corto.
E' fondamentale calcolare tali durate, e farlo
in secondi.
Inoltre, il telecomando (e quindi anche noi
di conseguenza) invia più volte lo stesso
blocco di 25 occorrenze, probabilmente per
essere sicuro che esso non venga perso, e
c'è un tempo di sincronizzazione tra un invio
e l'altro. Occorre calcolare anche questo
intervallo.
Perfetto, una volta ottenuta la codifica binaria
del segnale, ed i tempi di intervallo corto,
lungo e tra una serie e l'altra, possiamo
provare ad accendere la nostra presa. Se ancora
non lo aveste collegato, è tempo di collegare
il chip trasmettitore al raspberry pi. Un
appunto banale, ma che va fatto: 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.
Il chip trasmettitore 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 utilizzerete; 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 ed i loro usi.
A questo punto possiamo fare la nostra prova
di accensione della presa: anche in questo
caso dovrete modificare il contenuto dello
script transmit.py indicando il PIN del pi
a cui avete collegato il PIN DATA del chip
trasmettitore (se diverso da quello che ho
usato io), e soprattutto inserire le stringhe
binarie ed i tempi calcolati nel punto III.
Il comando da lanciare sarà sudo python transmit.py
seguito dal nome di una 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ù) 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ì vià... Anche qui per
maggiori dettagli rimando al blog e soprattutto
al codice sorgente degli script che ho cercato
di tenere il più chiaro possibile.
Lanciando finalmente 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.
E voilà la presa sarà accesa.
A questo punto potrete sniffare tutti e 8
(o più a seconda del vostro kit) i valori
presenti sul telecomando, trasformandoli in
stringhe binarie con la convezione descritta
nel punto III, o quella che vorrete basta
che essa sia coerente per tutte le stringhe
e mappata poi correttamente sul codice python.
Ad esempio ora ho calcolato la stringa
di spegnimento per la 4 presa, l'ho mappata...
quindi con il comando sudo python
transmit.py d_off... voilà la presa sarà spenta.
Ora che siamo in grado di controllare le nostre
prese, possiamo renderle veramente SMART tramite
una piccola applicazione web che ho realizzato
e il cui codice lo trovate, come sempre, nell'articolo
sul blog abbinato a questo tutorial.
In realtà quello è soltanto uno degli usi:
potreste ad esempio crearvi un cron che a
determinati intervalli lanci il comando di
accesione o spegnimento di una specifica presa,
oppure altri scenari che possono esservi comodi.
Ad esempio, potreste collegare una stufetta
o lo scaldabagno ad una presa, e creare un
cron che vada ad accendere quella presa
1 ora prima che suoni la vostra sveglia;
oppure potreste potenziare il progettino
con un sensore di movimento o una
videocamera ed accendere o spegnere
le luci in una stanza quando c'è qualcuno
al suo interno o quando esce da lì.
Insomma: avete capito che le possibilità
sono praticamente infinite.
Per gli scopi di questo tutorial, comunque,
l'idea è quella di creare un telecomandino
remoto che vi permetta di comandare le prese
magari dal vostro cellulare oppure, se esponete
il 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 vi parlavo
della creazione di un server LAMP
con il raspberry pi 3.
Nel passo I, dopo aver installato il vostro
serverino Apache+PHP, avrete anche posizionato
tutti i codici nella cartella /var/www/html
sul vostro raspberry pi, il che significa
che conoscendo l'indirizzo IP a lui assegnato
potrete accedere ad esso da remoto da qualsiasi
browser del PC, smartphone o tablet. Anche
in questo caso rimando al tutorial su come
creare un server LAMP con il raspberry pi
3 per maggiori dettagli.
Nel mio caso, l'indirizzo IP assegnato al
raspberry pi zero wireless è 192.168.1.4
e dallo smartphone collegato
alla stessa rete Wi-Fi accedendo all'indirizzo
suddetto seguito da /smartplugs, che è il
nome dell'applicazione che ho creato, ecco
apparire la UI remota per controllare le prese.
Premendo sul bottone di accensione o spegnimento
relativo alla presa di mio interesse, posso
controllarne da qui lo stato.
OK!
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ì non supera i 2 mt di distanza
e l'idea è quella di collegargli una piccola
antennina nell'apposito forellino, così da
potenziarne il segnale.
Inoltre, tutto il materiale che vi ho fornito
non è pensato per essere sicuro e funzionante
al top: se pensate di esporre su internet
il tutto, verificate di aver messo in sicurezza
i vostri dati, etc... inoltre potrebbe essere
necessario smanettare con il codice per perfezionarne
il funzionamento caso per caso.
In ogni caso è tutto a codice aperto
quindi potete farne ciò che volete.
Per gli script python, aggiungo, che essi
sono basati su di una guida che trovate
linkata in descrizione.
Spero abbiate trovato questo tutorial utile
ed interessante, in caso fatemelo sapere con
un bel like. Come sempre, suggerite nei commenti
nuove idee per future guide; e per restare
aggiornati su tutti i prossimi video in arrivo,
compreso il prossimo tutorial, iscrivetevi
al canale attivando le notifiche! Per qualsiasi
domanda, commento o altro, vi aspetto qui
sotto al video, sul blog e su tutti i canali
social!
Ci sentiamo presto.
Ciao!!
