INTERNET DELLE COSE CON ARDUINO

Con questo sistema potrete attivare o disattivare  utenze domestiche (luci, caldaie, termoventilatori...) della vostra casa da un computer, smartphone o tablet  sia da locale che da remoto.

Nelle pagini precedenti abbiamo affrontato diversi argomenti riguardanti la scheda Arduino collegata in rete, in particolare abbiamo imparato a comandarlo,  sia da  locale che da remoto, tramite dei tasti presenti in una pagina HTML i quali, ad ogni pressione, mandavano alto o basso un pin corrispondente di Arduino. Qualsiasi utenza che avremmo voluto collegare a quei pin per poterla  attivare o disattivare (magari tramite dei rele') avrebbe  dovuto pero' essere nei pressi della scheda o comunque poco distanze da essa per evitare di passare fili elettrici troppo lunghi  e un po' dappertutto. Con questo progetto non serve, le utenze possono  essere distribuite in un appartamento a discreta distanza da Arduino perche' non occorre che siano collegate ad esso con dei cavi in rame, infatti in questo progetto ho usato le onde radio. Nel disegno seguente e' raffigurato uno schema a blocchi che rappresenta  il  funzionamento del sistema.

Quando nella barra degli indirizzi di un browser si immette l'indirizzo pubblico fornitoci dal nostro provider (nel caso in cui il browser risieda su un computer remoto) o privato della nostra Ethernet shield (nel caso in cui il browser risieda su un computer locale), Arduino Mega (che funge da server) rilascia una pagina HTML con dei pulsanti (memorizzata al suo interno) che viene caricata dal browser suddetto. Il programma usato da Arduino Mega e' molto simile a quello utilizzato dal sistema "ARDUINO ETHERNET COMANDATO DA LOCALE" le varianti  servono per farlo lavorare con i moduli RX TX, se siete interessati all'intimo funzionamento del software visitate la suddetta pagina, qui descrivero' solo le modifiche apportate.
La figura seguente mostra tale pagina rilasciata da Arduino Mega:

Da questa pagina si possono comandare fino a 20 utenze (io ne ho usate solo tre in questo lavoro), per ogni utenza va implementato un blocco composto da un modulo RX, un Arduino Nano ed un rele'. Nella figura sottostante i dettagli del blocco:

Per il modulo ricevitore un'antenna costituita da uno spezzone di filo lungo 17 cm e' sufficiente, consiglio di usare un filo di rame rigido di quelli che si trovano un po' in tutti i ferramenta per mantenere una polarizzazione stabile (verticale o orizzontale) in accordo con quella del trasmettitore per avere la massima efficienza nel collegamento.
Viene ora qui di seguito descritto il programma caricato in Arduino Nano. Prima di iniziare,.pero', vorrei far luce su un problema al quale molto probabilmente andrete in contro programmando, tramite l'IDE, il vostro Arduino Nano. Se l'IDE, una volta che avrete settato la scheda sotto "Strumenti",  non vi dara' la possibilita' si cambiare la porta (scritta grigia non cliccabile) significa che il vostro computer non ha installato il driver giusto per la scheda in vostro possesso che molto probabilmente e' un clone. In questo caso provate ad  installate questo driver prima di impazzire per cercare in tutto il mondo come risolvere il problema, (se il driver non dovesse andare bene avrete da me il benestare per impazzire :-), una volta scaricato il file cliccate su "setup" nella cartella "CH341SER".
Analizziamo il primo stralcio del programma dalla riga1 alla riga 16:


Alla prima riga troviamo l'inclusione della libreria "VirtualWire.h"  per i due moduli RX e TX.
Alla seconda troviamo la dichiarazione della costante "receive_pin" che indica il numero di pin dove e' collegata l'uscita dati del modulo RX,  potete cambiare questo pin  a vostro piacimento; 
Alla terza riga troviamo la dichiarazione della costante "LED13"  indicante il pin dove e' collegato il led di bordo di Arduino Nano.
Alla quarta riga troviamo la dichiarazione della costante "RELE" indicante il pin dove e' collegato il comando (attivo alto) del rele', potete cambiare questo pin a vostro piacimento.
Alla quinta riga troviamo la dichiarazione di tipo char "INDIRIZZO" che indica l'indirizzo della scheda Arduino Nano, ogni pulsante sulla pagina HTML corrisponde ad una lettera dell'alfabeto (Utenza 01 -> 'a', Utenza 02 -> 'b' e cosi' via) quindi per poter indirizzare tutte e 20 le schede Arduino Nano occorrono le lettere dell'alfabeto da 'a' a 'v', questi indirizzi sono univoci per ogni scheda, e' bene quindi non duplicarli per errore pena attivazione o disattivazioni contemporaneamente di due o piu' schede con lo stesso indirizzo. Vi conviene, ogni volta che programmate un Arduino Nano, segnarvi su di un foglio l'indirizzo appena usato e segnarlo anche su di un pezzettino di carta nastro da attaccare sulla scheda programmata con quell'indirizzo.
Siamo ora giunti alla funzione "void setup()".
Alla ottava e nona riga troviamo due istruzioni per settare il pin 13 (LED_13) e il pin 5 (RELE) come uscite e porle a basso livello con le due istruzioni successive alle righe 10 e 11.
Alla riga 12 e' presente l'istruzione "delay(1000)" per ritardare di un secondo l'avanzare del  programma, questo da il tempo al modulo RX di stabilizzarsi.
L'istruzione alla 13 riga "vw_set_rx_pin(receive_pin)" setta il pin (receive_pin) per la lettura dei dati provenienti dal modulo RX.
L'istruzione alla riga 14 "vw_setup(2000)" setta la velocita' dei dati (bit/sec).
L'istruzione alla riga 15 "vw_rx_start()" attiva il processo di ricezione.
Prima di proseguire e' opportuno dare una spiegazione orientativa sul funzionamento del sistema. Abbiamo detto che ogni scheda ha un indirizzo univoco (un byte di tipo char), questo viene spedito da Arduino Mega tramite il modulo TX alla pressione del tasto corrispondente sulla pagina HTML assieme ad un altro byte (sempre di tipo char come l'indirizzo) che indica lo stato che deve avere il rele' ('1' = rele' attivato, '0' = disattivato) che e' in accordo con il colore del tasto premuto (tasto rosso = '1',  tasto bianco = '0').
Adesso possiamo proseguire.


Alla riga 19 c'e' la dichiarazione di un array a due elementi,  nel primo elemento (buf[0]) verra' memorizzato il  byte dell'indirizzo mentre nel secondo elemento (buf[1]) il byte dello stato entrambi spediti, come abbiamo detto, da Arduino Mega.
Nella riga 20 c'e' la dichiarazione di una variabile che contiene il numero dei byte che dovranno essere ricevuti, ovviamente e' pari a due.
Alla riga 21 il programma si interrompe e rimane in attesa dell'arrivo dei dati, appena questi sono disponibili tramite la istruzione alla riga 22 "vw_get_message(buf, &buflen)", che conosce, tramite "&buflen", di quanti byte sono composti,  vengono letti e memorizzati nell'array visto sopra.
Alla riga 23 se l'indirizzo letto non corrisponde a quello della scheda in questione non viene eseguito il corpo della "if"e il programma torna al void loop() per rimettersi  in attesa del prossimo dato.
Se invece l'indirizzo e' quello giusto allora il corpo viene eseguito, all'interno di esso il programma esegue un'altra istruzione condizionale, se nell'array "buf[1]" (elemento 1) e' presente un '1' il programma accende il led e alimenta il rele', in caso contrario, tramite "l'else", esegue la seconda istruzione condizionale che controlla se ci sia un '0' sempre nell'elemento 1 dell'array, in caso affermativo spegne il led e disalimenta rele'.
L'immagine seguente visualizza il sistema ricevente reale ed in funzione.



Passiamo ora ad analizzare il sistema trasmittente composto da un Arduino Mega con shield Ethernet e da un modulo TX come nella figura seguente:



Per il trasmettitore, dato che potrebbe andare in posti meno angusti  di dove potrebbe invece andare  il ricevitore (magari posto dentro una scatoletta di derivazione o di una presa), per aumentare l'energia irradiata ho usato un dipolo con braccia lunghe 17 cm, esso offre alla sorgente una impedenza di circa 73 ohm e quindi molto vicina a quella di uscita del finale di potenza del trasmettitore, se poi si chiudono le braccia per formare tra loro un angolo di 120 gradi la sua impedenza presentata scende a 50 ohm rendendo migliore l'efficienza di emissione con l'unico inconveniente che l'antenna diventa direttiva nel verso in cui le braccia formano i 120 gradi.
Ora descrivero' il programma per Arduino Mega limitatamente alle solo modifiche apportate al programma originale come avevo anticipato all'inizio di questa pagina.



Alla riga 3, come per il ricevitore, e' presente l'inclusione della libreria "VirtualWire.h" che serve per la comunicazione radio.


Alla riga 9 c'e' la dichiarazione della costante "trasmit_pin" nella quale e' contenuto in numero del pin dove usciranno i dati per pilotare il modulo TX, potete cambiare questo pin a vostro piacimento.
Alla riga 10 c'e' la dichiarazione della costante "trasmit_en_pin" nella quale e' contenuto in numero del pin per il PTT nel caso usasse un trasmettitore con l'abilitazione a trasmettere, potete cambiare questo pin a vostro piacimento.



Alla riga 11 e' presente la dichiarazione dell'array a due elementi dove verra' memorizzato il byte indirizzo e il byte stato da spedire ad Arduino Nano.



Dalla riga 12 alla riga 31 ci sono le dichiarazioni di variabili di tipo char che servono per memorizzare gli stati dei venti Arduino Nano, sono inizializzate con il carattere '0' affiche' all'accensione del sistema i rele' siano tutti diseccitati.


Alla riga 32 c'e' il prototipo della funzione che serve per trasmettere i dati ad Arduino Nano qui sotto riportata.


La funzione prende i due argomenti e li memorizza nell'array "msg[]", nella locazione 1 ci mette l'indirizzo e nella locazione 2 lo stato, poi trasmette ad Arduino Nano entrambi i dati tramite la funzione alla riga 611 (che tramite "strlen(msg)" sa quanti byte deve trasmettere)  e attende la fine della trasmissione con l'istruzione "vw_wait_tx()".


Dalla riga 94 alla riga 113 in void loop(), il programma trasmette ripetutamente  l'indirizzo  e lo stato a tutti i 20 Arduino Nano.
Seguito ora con un esempio per descrivere il resto del programma. Apriamo il nostro browser e clicchiamo nella barra di indirizzi  l'indirizzo locale di Arduino (se stiamo lavorando con un computer in rete) o quello fornitoci dal nostro Internet Provider (se stiamo lavorando con un computer in qualsiasi parte del mondo). Al comando Arduino Mega rilascia la pagina HTML con i tasti che per il adesso sono tutti bianchi dal momento che ancora non ne abbiamo premuto alcuno. In  queste condizioni Arduino Mega trasmette a tutti gli Arduini Nano, in maniera continuativa,  lo stato '0' ed i rele' corrispondenti rimangono diseccitati.
Premiamo ora ,ad esempio, il pulsante "Utenza 01".



Alla pressione del pulsante verra' inviato ad Arduino Mega la seguente stringa di caratteri "indirizzo IP/utenza1" dove indirizzo IP e' quello pubblico o locale a seconda di dove stiamo eseguendo il comando, la "if" del pezzo di programma sopra eseguira' il suo corpo. Se il tasto nel momento in cui lo premiamo e' di colore bianco, ovvero il rele' ad esso corrispondente e' diseccitato, verra' eseguito il corpo della seconda "if" che carichera' nella variabile "stato_a" il carattere '1' e cambiera' colore al tasto in rosso. Se invece il tasto nel momento in cui lo premiamo e' rosso, ovvero il rele' corrispondente e' eccitato, verra' eseguito il corpo della "else" che carichera' nella variabile "stato_a" il carattere '0' e cambiera' il colore del tasto in bianco.
Finita questa procedura verra' spedita la pagina HTML con i colore del tasto aggiornato al browser ed il programma tornera' a "void loop(). Verranno quindi spediti  a tutti gli indirizzi gli stati aggiornati, solo in questo momento il rele' cambiera' di stato, ovviamente ci sono 20 gruppi simili a quelli visualizzati tra la riga 131 alla riga 145, uno per utenza.
Prima di completare la nostra indagine sul programma ci tengo dire che la pagina HTML deve essere auto aggiornate, infatti se non fosse così  non potremmo sapere, con un semplice sguardo allo schermo del computer, se un tasto e' stato premuto oppure no da qualche altro host (smartphone, tablet...).
Il pezzo di codice HTML che fa questa operazione e' il seguente:


Ho impostato l'autoaggiornamento ogni 5 sec, se volete potete cambiare questo valore, inoltre dovete sostituire l'indirizzo "http://fabio-elettronico.ddns.net" con il vostro numero IP.

Per finire devo ricordarvi che dovrete scegliere un numero IP locale per Arduino Mega non utilizzato da qualche altra utenza collegata alla vostra rete, esiste un programma chiamato ipscan, che dopo una veloce scansione vi indica quali indirizzi IP sono liberi e quali sono occupati dal sistema.
Per ultimo, per far si che con il vostro  indirizzo pubblico, che potete conosce da qui, sia possibile indirizzare Arduino Mega dovrete creare un canale DMZ Host nel vostro router come ho spiegato qui.

File sorgenti
Fabio
    HOME