Se
desiderare sapere, tramite una pagina HTML ed in tempo reale, se
qualche
malintenzionato ha aperto una tapparella di casa vostra, questo mio
lavoro
fa per voi. Il sistema che presento e' costituito da un Arduino Mega,
da una scheda Ethernet shield, da quattro schede Arduino Nano, da
quattro sensori magnetici con switch incorporato, da un cavo tipo cat 5, da un router
e ovviamente da un client sul quale visualizzare la pagina HTML
(computer, tablet, smartphone...).
Il principio di funzionamento del sistema e' il seguente.
Una
volta immesso l'indirizzo IP pubblico (da un computer remoto) o
l'indirizzo IP locale di Arduino Mega (da un computer locale) nella
barra degli indirizzi di un browser, appare una pagina con dei
rettangoli colorati con dentro scritto il nome del sensore al quale
fanno riferimento, ognuno di essi puo' assumere tre colori:
colore
verde = sensore chiuso, tutto a posto, nessuno ha aperto la tapparella.
colore
rosso = attenzione! Qualcuno ha aperto la tapparella.
colore
giallo = La scheda Arduino Nano e' assente.
Nelle seguente figura sono rappresentate le tre situazioni:
In
essa il primo e' rosso, questo significa che qualcuno ha aperto la
tapparella controllata dal sensore 01. Il secondo ed il terzo
rettangolo sono verdi, questo indica che i sensori 02 e 03 sono chiusi
e le tapparelle da essi controllati sono, quindi, anch'esse chiuse. Il
terzo rettangolo e' di colore giallo, questo significa che la scheda
Arduino Nano che gestisce il sensore 04 e' assente (non sempre
occorrono tutte e quattro le schede con i relativi sensori magari
perche' si hanno poche tapparelle in casa oppure perche' un unico
Arduino Nano ne puo' controllare piu' di una se esse sono tra loro
vicine.).
Arduino Mega si occupa di gestire tutta la
parte della rete lan (risposta alla chiamata del browser, invio della
pagina HTML) e di comunicare con i quattro
Arduino Nano tramite seriale. Ogni Arduino Nano gestisce il sensore ad
esso collegato, il primo Arduino Nano riceve un byte da Arduino Mega,
dopo averci aggiunte alcune informazioni lo invia all'Arduino
Nano successivo che opera nella stessa maniera, l'ultimo Arduino Nano
della catena spedisce il byte, ora ricco di tutte le informazioni
necessarie, ad Arduino Mega, in poche parole i cinque Arduino sono
collegati in cascata a catena chiusa.
Lo schema a blocchi dell'insieme e' raffigurato nella figura seguente:
La
pagina HTML e' autoaggiornante con una frequenza di 1 secondo, quindi
deve passare al massimo quel lasso di tempo affinche' essa visualizzi
eventuali variazioni dello stato dei sensori (aperti con tapparella
aperta, chiusi con tapparella chiusa).
Per conoscere lo stato dei
sensori Arduino Mega trasmette sulla seriale TX1 un byte di valore
binario '00000000' e, oltre ad occuparsi di rispondere al browser che
richiede l'aggiornamento della pagina ogni secondo, si mette in ascolto
sulla porta RX1 delle risposte degli Arduini Nano, in particolare
dell'ultimo della catena (SENSORE 04). Il byte inviato e'
concettualmente diviso in due nibble (4 bit), il nibble piu' basso
indica lo stato dei sensori (0 = chiuso, 1 = aperto),
mentre quello piu' alto indica l'indirizzo della scheda Arduino Nano.
In particolare i dati sottostanti visualizzano tutte le possibilita':
ARDUINO NANO SENSORE 01 CHIUSO =
'00010000'ARDUINO NANO SENSORE 01 APERTO =
'00010001'ARDUINO NANO SENSORE 02 CHIUSO =
'00100000'ARDUINO NANO SENSORE 02 APERTO =
'00100010'ARDUINO NANO SENSORE 03 CHIUSO =
'01000000'ARDUINO NANO SENSORE 03 APERTO =
'01000100'ARDUINO NANO SENSORE 04 CHIUSO =
'10000000'ARDUINO NANO SENSORE 04 APERTO =
'10001000'Il primo Arduino Nano Sensore 01 ricevuto da Arduino Mega il byte
'00000000'
ne setta il bit 0 a zero se il sensore e' chiuso oppure a uno se il
sensore e' aperto ed, in entrambi i casi, setta a uno il bit del suo
indirizzo (bit 4) poi spedisce il byte cosi modificato ad Arduino Nano
sensore 02 che effettua le stesse operazioni relativamente ai bit che
gli competono e spedisce il byte all'Arduino successivo e cosi via.
L'ultimo
Arduino Nano spedisce il byte modificato da tutti gli altri e da se
stesso ad Arduino Mega che puo' cosi sapere lo stato dei i
sensori e quali schede sono presenti.
Ad esempio se il sensore 01 e'
aperto (tapparella tirata su), il secondo ed il terzo sono chiusi ed il
quarto non esiste perche' non c'e' la scheda, il codice ricevuto da
Arduino Mega e' il seguente:
'
01110001'Come
si nota il controllo e' del tipo posizionale, una volta letto tale
byte, alla prossima richiesta da parte del browser, Arduino Mega
spedisce la pagina HTML aggiornata con i colori dei rettangoli che in
questo esempio sono:
SENSORE 01 =
rossoSENSORE 02 e SENSORE 03 =
verdeSENSORE 04 =
gialloI
programmi da caricare nei singoli Arduino Nano differiscono solo per i
valori binari suddetti, per agevolarvi vi fornisco tutti e
quattro gli scratch.
Invece nel programma da caricare in Arduino
Mega dovete effettuare alcune modifiche; in primo luogo inserire
nell'array ip[] (riga 4) l'indirizzo IP locale del vostro Arduino
Mega, questo indirizzo IP deve essere univoco e non utilizzato da altre
utenze collegate in rete, per conoscere quali IP locali sono
disponibili usate questo semplice
programma che non richiede
installazione. In secondo luogo dovete inserire l'indirizzo nella
riga 99 dopo "http://" che serve per l'auto aggiornamento della
pagina, in questo caso, pero', l'indirizzo IP deve essere locale se
usate un client locale per controllare lo stato dei sensori o un IP
pubblico nel caso cui usate un client remoto.
In
quest'ultimo caso dovrete per prima cosa conoscere il vostro IP
pubblico tramite un qualsiasi sito che lo fornisce tipo
questo, poi
dovete creare un canale nel router, chiamato DMZ host, che permette di
accedere all'indirizzo locale di Arduino Mega tramite l'IP pubblico.
Tenete conto che l'indirizzo pubblico ci viene cambiato dal nostro
provider ogni qualvolta che spegniamo e riaccendiamo il computer, per
questo motivo una volta collegatoci alla rete per poter mantenere
l'IP per tutto il periodo che siamo fuori casa e vogliamo controllare
lo stato dei sensori ovunque ci troviamo, dobbiamo lasciare
acceso il router. Il computer si puo' anche spegnere, esso serve solo
per farci conoscere l'IP pubblico prima che usciamo da casa.
I collegamenti tra le schede sono rappresentati nella figura seguente:
Per
il collegamento ho usato un cavo tipo cat 5 lungo 50 metri, per
scegliere quale fossero i fili da usare, tra gli otto disponibili, per
il TX e l'RX al fine di ottenere la
minore distorsione del segnale in transito, ho fatto diversi
tentativi anche estranei allo standard usato per questo tipo di
collegamenti. Il risultato che ho ottenuto e' raffigurato nella figura
sopra ovvero i migliori risultati si ottengono usando una coppia
intrecciata per i dati trasmessi e per quelli ricevuti il che va contro
alla logica che consiglierebbe di usare sia per il TX che per l'RX fili
intrecciati con la massa. Ho fatto anche questa prova ma il risultato
non mi ha soddisfatto; il segnale era smussato su entrambi i fronti.
Invece
con il sistema che ho deciso di usare i fronti dei dati sono ripidi e
il leggero spike che era presente e' stato facilmente eliminato
mettendo in parallelo ai pin dell'alimentazione di ogni Arduino Nano un
condensatore ceramico da 100nF.
Nella prima figura seguente sono
visualizzati i dati in partenza da Arduino Mega, nella successiva i
dati in arrivo ad Arduino Nano sensore 01 e nella terza i dati di
ritorno ad Arduino Mega (Quando e' stata scattata la foto
all'oscilloscopio ancora non avevo montato i condensatori).
Dato
che ogni Arduino Nano rigenera il segnale in arrivo posso affermare
che, in base alla lunghezza del cavo che ho usato, complessivamente la
distanza tra Arduino Mega ed Arduino Nano sensore 04 potrebbe
essere pari a 200 metri, ma non si puo' escludere che questa
possa essere anche maggiore, purtroppo avevo solo 50 metri di cavo in
laboratorio.
Nelle figure seguenti il cavo e i suoi fili interni.
Per
ultimo notate che sia per il 5V sia per la gnd ho usato una
coppia di fili per rendere minima la caduta sul filo, inoltre lo
schermo del cavo deve essere collegato solo alla gnd di Arduino Mega e
non alle gnd degli Arduino Nano.
file sorgenteFabio