Comunicazione ottica, tra nodi, in una WLAN domestica e/o aziendale
Questo progetto vede la realizzazione, tramite Arduino, di una piccola rete LAN (domestica o aziendale) che permette di far comunicare, attraverso un terminale PC (o qualsiasi altro device connesso alla rete), i nodi della rete; quest’ultimi collegati tra loro attraverso un collegamento ottico(infrarossi).
Abbiamo presvisto un terminale PC, un Nodo Master e due nodi, schematizzati in questa maniera (classifichiamo questa rete come P2P:
Nodo2(Stessa cosa del nodo precedente)
N.B: Lo storage delle informazioni su un DB, ci serve per cotrollare lo stato della rete, anche da smartphone o tablet, in remoto (Internetworking: il router fungerà da gateway).
Il Nodo Master può essere, a sua volta, provvisto di attuatori e sensori.
Il problema della scheda ESP-12E è la scarsità di PIN disponibili: nel nostro caso è sato possibile collegare un solo attuatore/relè a tale nodo a differenza dei due collegati sugli altri nodi.
La comunicazione otttica tra i nodi è di tipo punto-punto mentre quella LAN (WLAN) è di tipo broadcast).
La comunicazione fra i nodi e il terminale avviene in questa maniera:
N.B: Se non dovesse esserci instradamento in uscita(connessione internet) sulla rete LAN, la connessione tra i nodi non ne risentirebbe e continuerebbe ad operare. Il database verrà aggiornato appena sarà presente una connessione in uscita.
Per verificare lo stato di ogni nodo, si è pensato di collegare un Display LCD o OLED. Su questo display compariranno le azioni che sta eseguendo tale nodo. Esempio: Nodo1 - Display (Sto comunicando…) -> Nodo2 - Display (Sto ricevendo…)
Come possiamo vedere dall’immagine, abbiamo un PC che funziona da terminale:collegato alla rete WI-FI, invia e riceve informazioni attraverso il Nodo Master.
Il Nodo Master, collegato alla rete, instrada le richieste e le informazioni, mandate dal terminale e dagli altri nodi, nella giusta direzione.
Per l’installazione e la gestione delle librerie clicca QUI
Potete vedere la connessione Wi-Fi della shield cliccando QUI.
N.B:La pagina HTML ha tutte le funzionalità! Ma di queste solo l’accensione del relè e dell’attuatore sul Nodo Master funziona! Il resto verrà implementato man mano…
Ecco i collegamenti:
Su Fritzing non è presente l’ESP-12E compreso di basetta per i collegamenti e USB incorporata, ma una semplice ESP-12E.
Con un pò di fantasia immaginiamo che questa scheda sia quella che stiamo utilizzando noi(la scheda con 30 pin), per facilitarne la spiegazione.
I due collegamenti che vanno ai led sono i pin D1 e D2.
N.B: Nella seconda fase lasceremo solo un led che rappresenterà un solo relè/attuatore, perchè abbiamo poca disponibilità di piedini nella ESP-12E. In questo caso il led sarà collegato al piedino D4; i piedini D1 e D2 saranno riservati al display lcd I2C.
Ecco una foto dei collegamenti su breadbord:
Purtroppo la shield Wi-Fi ha una larghezza che va ha coprire tutta la breadbord e per facilitare i collegamneti abbiamo utilizzato dei jumper.
Dalla foto risulta acceso il led 2, questo perchè abbiamo attivato, attraverso la pagina HTML visualizzata dal PC, l’accensione del led 2(Che rappresenta un semplice relè).
Fatto questo possiamo passare ad aggiungere una coppia di LED infrarossi-Ricevitore IR, per la comunicazione ottica con il Nodo 1.
N.B: Possiamo anche non utilizzare i resistori, perchè la tensione di uscita sui pin non supera i 3volt.
Per questa fase, avremo la comunicazione fra due nodi, quindi dividiamola, per semplicità, in due sotto-fasi.
Lo schema che andremo a realizzare sarà il seguente:
Tale schema dovrà essere incorporato con lo schema della prima fase; così facendo avremmo il nostro Nodo Master completo!
I collegamenti sono i seguenti:
DISPLAY | LED | EMETTITORE IR | RICEVITORE IR | |
ESP8266 | D1, D2 | D4 | D0 | D3 |
Così facendo occuperemo tutti i pin disponibili.
Purtroppo ESP-12E non ha tanti pin da poter essere utilizzati, perchè gli altri sono tutti gestiti dalla scheda stessa.
Per connettere la scheda al display LCD, vi rimando a questa pagina.
N.B: Possiamo anche non utilizzare i resistori, perchè la tensione di uscita sui pin non supera i 3volt. Se dovessimo usare resistenze alte la luce risulterebbe più fievole, comportando un possibile ostacolo alla comunicazione
Durante i collegamneti e i test abbiamo riscontrato un problema! Non sappiamo a cosa sia dovuto, ma se dovessimo alimentare il sensore IR con i 5v della shield Wi-Fi, i dati risulterebbero molto corrotti! Utilizzando l’alimentazione di Arduino i risultati sono migliori… comunque abbiamo dei piccoli problemi, dovuti a disturbi e alla scarsa schermatura, nel rilevare il valore dal sensore. Spiegheremo questo più avanti…
Da aggiungere all’occorrente software, per la realizzazione del Nodo Master, è la libreria per la gestione dei segnali infrarossi per la shield ESP8266 (purtroppo non può essere utilizzata la stessa libreria di arduino!).
Possiamo scaricarla da qui, dove è presente una piccola guida per l’installazione.
N.B:Può essere usato, tranquillamente, Arduino UNO! Arduino Nano è esattamente uguale(tranne nella dimensione) ad Arduino UNO! Noi per le prove abbiamo utilizzato Arduino UNO per comodità…
Connessioni:
Arduino UNO/NANO | |
PIN 2 | Relè |
PIN 3 | Emettitore LED IR |
PIN 4 | Attuatore |
PIN 8 | Ricevitore IR |
PIN A4 | Display SDA |
PIN A5 | Display SCL |
5v | Breadboard |
GND | Breadboard |
Il collegamento dell’emettitore IR è obbligatorio farlo sul PIN3! Perchè la libreria di Arduino sull’invio del segnare infrarosso utilizza quel piedino per default. Se volessimo cambiare piedino dovremmo andare ad agire sulla libreria.
Per le prime prove, si è installato, sui due nodi, un emettitore(sul Nodo Master) e un sensore infrarossi(sul Nodo 1), per un semplice test di comunicazione.
Si è inviato un piccolo dato, sottoforma di codifica NEC, dal Nodo Master al Nodo 1. Si hanno a disposizione tanti tipi di codifica: NEC, Sony, Sharp e tante altre…
Nel nostro caso, ogni nodo avrà almeno una coppia led-sensore per l’invio e ricezione infrarossi, quindi il procedimento è più complesso.
Il punto che va a favore è che si conosce il dato che potrebbe arrivare, questo perchè possono verificarsi solo queste situazioni:
Quindi i segnali che possono essere inoltrati dall’emettitore IR(sul Nodo Master) sono essenzialmente 4; a questi c’è da aggiungere un solo segnale di ritorno(Nodo 1, Nodo 2) che verifica la corretta ricezione del dato.
Procediamo per gradi…
Tutto questo dovrà essere implementato con un elegante e bell’algoritmo.
Questo è l’algoritmo che dovrà eseguire il Nodo Master una volta inviato il dato.
Il Nodo 1 dovrè elaborare il dato inviato e mandargli la conferma.
N.B: Se dovesse passare un certo lasso di tempo(es. 10 secondi) la comunicazione si interrompe!
Una volta eseguiti tutti i collegamenti, possiamo eseguire gli sketch dei due nodi:
N.B: Questi due programmi sono per la comunicazione fra Nodo Master e Nodo 1. Se dovessimo collegare un altro nodo(come faremo più in la) i due programmi cambieranno(cambierà solo il programma del Nodo 1).
Con il lancio di questi due programmi otteniamo il risultato voluto:
Il compito del Nodo Master è quello di un server web e di un “Ponte di comunicazione” tra il terminale e gli altri nodi.
N.B: Potrebbe capitare che:
PS:
Durante la fase di ascolto del Nodo Master, il Nodo 1 manda un ACK per circa 10 secondi; nei dieci secondi di ascolto, da parte del Nodo Master, vengono prelevati valori random non inviati dal Nodo 1.
Fortunatamente, nell’arco dei 10 secondi di ascolto, il dato, inviato dal Nodo 1, viene letto dal Nodo Master ricevendo l’ok di avvenuta ricezione.
Come dicevamo in precedenza: il terzo arduino serve solo per alimentare il ricevitore del Nodo Master e in secondo a prelevare i valori del sensore, solamente per essere testati.
Il ricevitore IR, del Nodo Master, ci ha dato parecchi problemi:
Si è utilizzata, prima di tutto, un’alimentazione esterna, presa da un altro Arduino UNO (l’alimentazione può essere presa anche da una pila esterna), risolvendo in parte i problemi di lettura del sensore; in questo modo parte del primo problema è stata risolta, ma tuttavia continua, in modo random, a ricevere valori casuali.
Non si è venuto a capo di questo!!!
Si è cercato di risolvere la cosa nel migliore dei modi: Potrebbe essere un problema della scheda, un problema del sensore, un problema di alimentazione… Potrebbe essere tutto o niente…
N.B: potrebbe capitare che il dato inviato dal Nodo 1 non venga letto del sensore del Nodo Master, ma su 100 prove non è mai successo! Il dato prima o poi verrà letto!
Per questa terza fase implementiamo due prototipi:il primo avrà una semplice comunicazione senza risposta del Nodo 2(cioè senza verificare la ricezione del dato), mentre il secondo sarà quello più completo e strutturato in cui anche il Nodo 2 interagisce attraverso l’architettura “Connected Oriented” sfruttata già dagli altri due nodi.
Si è semplicemente aggiunto un altro diodo led infrarossi per inviare il segnale al Nodo 2.
In questo caso abbiamo il LED IR aggiuntivo collegato allo stesso piedino del primo LED IR(in modo da sfruttare la libreria per l’invio del segnale IR, questo perchè, come dicevamo, la libreria IRremote utilizza, per default, il PIN3 di arduino).
Il codice sorgente è leggermente diverso rispetto al primo.
Lo sketch lo trovate qui.
Si sono aggiunti due pulsanti per controllare, in modo analogico, lo stato dei sispositivi collegati al Nodo 1.
Una volta avvenuto il cambiamento viene comunicato lo stato al Nodo Master.
I collegamenti:
Arduino NANO | |
PIN 2 | LED(Relay) |
PIN 4 | LED(Attuatore) |
PIN 8 | Ricevitore IR |
PIN A4 | Display SDA |
PIN A5 | Display SCL |
Lo sketch da far eseguire a questa scheda è il seguente
La disposizione dei tre nodi è il seguente:
Da destra verso sinistra: Nodo Master(con modulo ESP8266), Nodo 1(con Arduino UNO), Nodo 2(con Arduino UNO).
N.B: In questo caso la comunicazione, per attivare attuatori e relè sul Nodo 2 è del tipo semplice… cioè senza ack. Non si è ancora implementata una Connected Oriented tra Nodo 1 e Nodo 2.
Video | Link |
Promo | https://youtu.be/ombGCsYmXGk |
Completo | https://youtu.be/g6Z9CRAygbg |
Per il secondo prototipo si devono apportare delle piccole modifiche:
Per il primo prototipo non era richiesta la risposta dell’avvenuta ricezione del dato da parte del Nodo 2, mentre in questo prototipo vogliamo instaurare un “dialogo” tra Nodo 1 e Nodo 2, così come quello che avviene tra gli altri due nodi.
Per far ciò dobbiamo collegare un altro sensore infrarosso, questa volta rivolto verso il Nodo 2, in modo da captare le frequenze infrarosse di quest’ultimo.
Questo purtroppo non è possibile! Arduino non riesce a gestire due sensori IR perchè nella parte di programmazione non è possibile creare due oggetti(o istanze) di due diversi sensori con la stessa classe!
Questo descritto è un problema in ambito di programmazione ma si è pensato a delle possibili soluzioni:
Cos’è la “triangolazione”?
Con triangolazione intendiamo la disposizione dei nodi a formare un triangolo.
Come in questa figura:
Così facendo i nodi sono disposti in modo tale da poter inviare al Nodo 1 i segnali infrarossi.
Logicamente è una disposizione corretta da realizzare, ma facendo alcune prove e test si è verificato che questa comunicazione non può avvenire!
Il sensore del Nodo 1 è soggetto a troppe informazione e non riesce a captare nel modo corretto il segnale di ritorno del Nodo 2.
Si è pensato ad un altro tipo di soluzione, da aggiungere alle altre elencate poco fa:
N.B: Questo potrebbe essere realizzato anche con un semplice relè! Basta collegare uno dei due sensori all’ingresso “Normalemente chiuso” e lìaltro al “Normalmente aperto” del relè… In modo che solo uno dei due sensori è in funzione!
Si potrebbe progettare un “Secondo prototipo” con tutti i metodi risolutivi elencati e constatare quanti e quali di questi metodi funzionino…
In questo caso realizzeremo l’ultimo metodo risolutivo:
Per quanto questo metodo possa essere logicamente corretto purtroppo non può essere realizzato!
Perchè non è possibile collegare, allo stesso pin di Arduino, i due pin dei sensori che trasportano il segnale… Quando uno dei due sensori è interdetto l’altro sensore non percepisce nessun dato… Come se il circuito fosse aperto!
Per questo tipo di risoluzione non abbiamo utilizzato un sensore sferico, ma ne abbiamo utilizzati due direzionali:
uno rivolto verso il Nodo Master e l’altro verso il Nodo 2.
In questo modo si ha una copertura totale della ricezione dei segnali provenienti da entrambe le direzioni.
Ecco i tre nodi completi:
Connessioni:
ESP8266 | |
PIN D4 | Relè |
PIN D0 | Emettitore LED IR |
PIN D3 | Ricevitore IR |
PIN D1 | Display SDA |
PIN D2 | Display SCL |
Connessioni:
Arduino UNO/NANO | |
PIN 2 | Relè |
PIN 3 | Emettitore LED IR/LED IR2 |
PIN 4 | Attuatore |
PIN 8 | Ricevitore IR/Ricev. IR2 |
PIN A4 | Display SDA |
PIN A5 | Display SCL |
PIN 10 | Pulsante Relay |
PIN 11 | Pulsante Attuatore |
5v | Breadboard |
GND | Breadboard |
Connessioni:
Arduino UNO/NANO | |
PIN 2 | Relè |
PIN 3 | Emettitore LED IR |
PIN 4 | Attuatore |
PIN 8 | Ricevitore IR |
PIN A4 | Display SDA |
PIN A5 | Display SCL |
PIN 10 | Pulsante Relay |
PIN 11 | Pulsante Attuatore |
5v | Breadboard |
GND | Breadboard |
La differenza, rispetto al primo prototipo, non è solo nello schema fisico, ma anche nella parte di codice per il controllo di ogni singolo nodo.
Infatti gli sketch presentano forti variazioni ripetto agli sketch precedenti.
Ecco lo schema definitivo:
Attraverso questi collegamenti e gli sketch da inserire all’interno di ogni scheda sarà possibile realizzare una comunicazione “Domanda-Risposta” per la comunicazione dei dati.
Infatti:
Il Nodo 1 elaborerà il dato inviato:
In questo caso la comunicazione tra Nodo 1 - Nodo 2 avviene allo stesso e identico modo della comunicazione tra Nodo Master - Nodo 1:
N.B: Per prevenire l’accavallarsi dei dati, inviati da entrambi i nodi, al Nodo 1 si è pensato di far mandare al Nodo Master il dato un tantum… In questo modo ci saranno dei buchi in cui il Nodo 1 percepirà solo il segnale inviato dal Nodo 2!
Video | Link |
Completo | https://www.youtube.com/watch?v=MiBDAAoGOk4&t=38s |
Adesso non ci resta che implementare un database dove salvare i nostri dati, che saranno visibili in remoto attraverso un’app Android.
Il database che si è utilizzato per questo progetto è Firebase (database NoSQL).
Firebase è semplice ed intuitivo da utilizzare.
La struttura che utilizza non è una struttura tabellare ma ad albero.
Una volta implementato il DB dobbiamo effettuare la connessione a Firebase grazie ad una librearia per l’ESP8266 che è presente nell’occorrente software elencato a inizio pagina.
Abbiamo bisogno, per il collegamento, dell’HOSTNAME e dell’autorizzazione:
N.B:Nello sketch postato su GitHub, non è presente ne SSID, Password, FIREBASE_HOST, FIREBASE_AUTH, perchè sono dati sensibili!
Dovrete inserire al posto dei “**“ le vostre credenziali.
Elenchiamo quello che succede nello sketch da eseguire sul Nodo Master(gli altri sketch, delle altre schede poste sugli altri nodi, rimangono invariati):
In remoto sarà presente uno smartphone o tablet android con un’app per il controllo dello stato.
Dalla semplice app, realizzata con AppInventor, sarà possibile monitorare lo stato della rete e di tutti i nodi.
In futuro potrebbe essere implementato anche un controllo, in remoto, dell’intera rete.
Come dicevamo, l’app è stata realizzata attraverso un software open source online della Google: App Inventor.
Tale software è molto semplice ed intuitivo.
in futuro verrà fatta una guida su come utilizzarlo.
L’app presenta una schermata principale in cui ci sono due grossi bottoni:
Per il momento il controllo della modifica dei nodi non può essere effettuato (verrà implementato in un secondo momento)
Cliccando sull’occhio abbiamo l’apertura della pagina “Controllo stato”, in cui sarà presente lo stato di ogni nodo.
Tale stato sarà prelevato da Firebase.
Potete scaricare il file APK da QUI oppure accedere alla cartella “Android APP” sulla pagina principale della reposity di GitHub.
In questa parte verranno riportati tutti i problemi rilevati durante la realizzazione del progetto; questi problemi sono già riportati nella relazione, questa sezione è solo un resoconto di tutti i problemi e le loro risoluzioni.
L’interruzione della comunicazione può avvenire in due modi:
Per entrambi i casi si è previsto un javascript con un WARNING.
Per la comunicazione “Connected Oriented” tra Nodo 1 e Nodo 2 si è pensato a una serie di soluzioni che potrebbero risolvere il problema:
I costi dei vari moduli, schede, cavi, breadboard, led e altro si aggira intorno a questo range: 30€ - 70€.
il tutto dipende da dove compriate il materiale.
Il consiglio che vi diamo è quello di comprare tutto su e-Bay… è un sito molto sicuro e trovate tutto quello di cui avete bisogno.
Vi allego il link del venditore dove abbiamo reperito tutto il materiale:
http://www.ebay.it/usr/nouteclab?_trksid=p2047675.l2559
Riportiamo le conclusioni con un elenco puntato:
Miglioramento capacità tecniche e pratiche in:
Miglioramento rapporti di coesione e lavoro di squadra
Rendere più performante la comunicazione ottica sostituendola con quella a onde radio