Reti di sensori wireless per il monitoraggio di grandezze elettriche

Scuola Politecnica e delle Scienze di Base
Corso di Laurea in Ingegneria Informatica
Elaborato finale in Misure per l’automazione e produzione industriale
Reti di sensori wireless per il
monitoraggio di grandezze elettriche
Anno Accademico 2016/2017
Candidato:
Mario Esposito
matr. N46001530
1
Alla mia famiglia che con grande
sacrificio mi ha permesso di
raggiungere questo traguardo.
Al mio amico e compagno di studi
Giuseppe che tra libri, battute e
difficoltà mi ha accompagnato in
questo percorso.
E a mia madre che
silenziosamente mi ha sempre
guidato.
2
Indice
Introduzione
4
1
Panoramica su WSN e IoT
1.1 Wireless Sensor Network . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Internet of Things . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3 Applicazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
5
7
8
2
Realizzazione del nodo sensore
2.1 Sensori e Condizionamento . .
2.1.1 ACS712T . . . . . . .
2.1.2 Circuito per la tensione
2.2 Conversione . . . . . . . . . .
2.3 Misurazione potenza . . . . .
2.4 Trasmissione . . . . . . . . .
2.4.1 USART . . . . . . . .
2.4.2 Modulo ESP8266 . . .
3
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
10
13
13
14
16
24
25
25
28
Conclusioni
29
Ringraziamenti
30
Bibliografia
31
3
Introduzione
Nell’era del progresso tecnologico l’informazione acquisisce un significato sempre più profondo grazie alla quale è possibile mettere in atto procedure logicoorganizzative finalizzate alla gestione dei più svariati processi.
Uno dei tanti modi per acquisire l’informazione è quello di piazzare un certo
numero di sensori in un’area di interesse e permettere una comunicazione senza
fili tra questi ultimi al fine di raccogliere una "informazione globale" che potrà
essere fine a sè stessa nel caso di studi statistici o potrà essere utilizzata per l’analisi e altri studi. Un sistema così organizzato è detto Rete di sensori wireless
o Wireless sensor network (WSN) e può essere applicato in diversi settori.
Questo elaborato ha come obiettivo quello di mostrare il funzionamento di
una rete di sensori per il monitoraggio dei consumi elettrici in un’abitazione.
Cercheremo, innanzitutto, di capire cos’è effettivamente una WSN e quali sono i suoi possibili utilizzi, poi vedremo brevemente cos’è l’IoT (Internet of
Things), la naturale estensione di una WSN. La maggior parte del lavoro sarà
successivamente dedicata alla realizzazione di un nodo sensore tramite la board
STM32F303 Discovery con il quale prima acquisiremo i dati e successivamente
li trasformeremo in informazioni sui consumi.
4
Capitolo 1
Panoramica su WSN e IoT
1.1
Wireless Sensor Network
Con il termine Wireless Sensor Network ci si riferisce ad una particolare tipologia di rete distrubuita composta da tanti dispositivi elettronici in grado di
prelevare informazioni dall’ambiente circostante e di comunicare tra di loro. I
dispositivi elettronici sono detti nodi sensore (o sensor node) e sono disposti
in modo tale da poter monitorare un fenomeno, una grandezza o, in generale,
un evento e scambiare le informazioni acquisite con un nodo centrale detto gateway o base station che, a sua volta, invierà i dati ad un dispositivo di controllo
per un’ulteriore elaborazione.
I nodi sensore sono dispositivi caratterizzati da costo, peso e dimensione molto
contenuti e sono dotati di un riserva energetica che permette loro di lavorare
senza alcun collegamento alla rete elettrica. L’intera struttura gestisce il flusso di dati tramite un collegamento wireless. L’assenza di cablaggio rende ogni
nodo libero di essere riposizionato a patto di mantenere determinate distanze. I
consumi di tali dispositivi sono molto ridotti, questo è dovuto anche al fatto che
le batterie che li alimentano non sono di grandi dimensioni, per questo motivo
essi devono essere in grado di lavorare e mantenere molto basso il consumo in
modo da avere un ciclo di vita più lungo.
I sensor node che costituiscono una rete possono essere centinaia o migliaia in
modo da avere un buon numero di informazioni utili, questo ci suggerisce la
presenza di un nodo speciale che coordina il trasferimento dati e gestisce tutte le informazioni tramesse dai nodi. Questo nodo speciale, come già detto,
è chiamato gateway e si occupa anche di trasferire i dati all’esterno della rete
5
rendendola, di fatto, una architettura Proxy-based. I nodi sensore sono spesso
dotati di un processore, oltre che di un dispositivo di trasmissione e ricezione,
per l’elaborazione dei dati acquisiti in modo tale da inviare al nodo gateway
dati già elaborati e non grezzi al fine di minimizzare il carico di lavoro del nodo
centrale.
Come è facile pensare, una WSN ha i suoi vantaggi e i suoi svantaggi. Tra gli
aspetti positivi possiamo enunciare:
• i costi di realizzazione della rete
• flessibilità dell’architettura semplicemente inserendo nella rete o eliminando dalla rete dei nodi sensore
• possibilità di spostare geograficamente i nodi
Tra gli aspetti negativi, invece, ci sono:
• la limitata durata delle batterie in dotazione ai nodi
• scarsa affidabilità del mezzo trasmissivo che può essere soggetto a interferenze e collisioni, a differenza di reti cablate
La comunicazione all’interno di una rete di sensori è di tipo wireless a corto
raggio, quindi, anche in reti di grandi dimensioni, le distanze tra i nodi non
devono essere eccessivamente lunghe altrimenti questi ultimi non potrebbero
comunicare tra di loro. Tuttavia, negli ultimi anni si sono sviluppate tecniche
di comunicazioni a lungo raggio che risolvono il problema delle distanze tra i
nodi arrivando a coprire anche svariati chilometri. L’area in cui tali nodi sono
distribuiti è detta area di sensing. Le informazioni sono trasmesse al nodo
centrale in maniera asincrona e in due casi: quando occorre un determinato
evento, in questo caso il nodo decide autonomamente di inviare i dati, oppure
quando il nodo centrale interroga tramite query un nodo sensore per prelevare i
dati. Una WSN può essere vista, dunque, come un grande database distribuito
in cui ogni nodo possiede parte dell’informazione totale e può essere interrogato
attraverso un linguaggio SQL-like.
Data la natura di queste reti che, come già detto, possono essere dotate anche
di migliai di nodi sensore, esse necessitano di algoritmi di comunicazione e
instradamento dei dati pensati e realizzati in maniera molto specifica.
6
1.2
Internet of Things
Nell’ambito delle telecomunicazioni il termine IoT (Internet delle cose, dall’inglese Internet of Things) viene usato per riferirsi a quella particolare estensione
di Internet grazie alla quale tutti gli oggetti concreti di utilizzo quotidiano acquisiscono una loro identità nella rete. Oggetti come radio, automobili, telecamere,
lampadine, ecc diventano dei veri e propri oggetti intelligenti in grado di scambiarsi informazioni.
Grazie a delle etichette elettroniche, dette tag, tali oggetti creano una mappa
virtuale del mondo reale e assumono quindi un ruolo attivo dal momento che
possono inviare dati su sè stessi e ricevere dati da altri dispositivi connessi,
creando così un’infrastruttura di comunicazione che rende disponibili tali dati
all’interno della rete e a dispositivi mobili, come smartphone e tablet, in modo
da poter monitorare gli oggetti di interesse e fornire informazioni all’utilizzatore. Come accennato nella parte introduttiva, l’IoT è la naturale evoluzione di
una WSN in cui gli oggetti intelligenti rappresentano proprio i nodi della rete.
Ma cos’è effettivamente un oggetto intelligente?
Per essere definito "Smart Object" un oggetto fisico deve godere di alcune
proprietà:
• self-awareness, ossia di identificazione univoca, capacità di localizzazione
e diagnosi di stato
• interazione con l’ambiente circostante, cioè la possibilità di acquisire
dati e/o di rispondere a comandi - impartiti da remoto o autogenerati - per
l’utilizzo di attuatori
• elaborazione dati, ovvero la capacità di manipolare i dati primitivi raccolti
e di analizzarli
Una delle prime teconogie utilizzate per la realizzazione di una rete di oggetti "intelligenti" fu RFID (Radio Frequency Identification) basata sulla capacità
dei tag (anche conosciuti come trasponder o chiavi elettroniche e di prossimità) di memorizzare informazioni e di rispondere alle richieste a distanza di un
altro dispositivo che può, eventualmente, anche scrivere dati sul tag. I tag RFID
sono ancora utilizzati in microchip degli animali, tessere, bagde, dispositivi antitaccheggio e in molteplici altre applicazioni ma nel corso degli anni sono nate
7
nuove tecnologie, come l’IEEE 802.15.4, che forniscono un livello di affidabilità più alto di quello delle radiofrequenze e che riescono a coprire distanze
maggiori. Oggigiorno lo standard IEEE 802.15.4 rappresenta un punto fermo
nella realizzazione dei livelli MAC e PHY (fisico) del modello ISO/OSI di una
WSN.
L’utilizzo dell’IoT previsto nei prossimi anni suggerisce un cambiamento radicale nella vita delle persone che potranno godere non solo di servizi su misura
ma anche di un notevole risparmio energetico grazie alle capacità decisionali degli oggetti intelligenti. Nonostante ciò, non mancano le critiche a questa
tecnologia sia dal punto di vista tecnico, dato che potrebbe soffrire di gravi problemi di sicurezza e di privacy dell’utilizzatore, sia da un punto di vista etico,
dovuto proprio alle capacità decisionali degli oggetti intelligenti.
1.3
Applicazioni
Esistono una varietà di sensori wireless utilizzati in un nodo ognuno dei quali in
grado di misurare diverse grandezze come temperatura, umidità, accelerazione
e inquinamento rendendosi, di fatto, utili per la realizzazione di WSN nei più
disparati settori, come ad esempio:
• militare, per il controllo dei campi di battaglia
• civile, per il monitoraggio dell’ambiente
• viabilità, per il controllo delle strade e dei veicoli
• sorveglianza, per la realizzazione di sistemi di sicurezza
• HCI (human-computer interaction), per il riconoscimento dei gesti
• etc
L’utilizzo dell’ IoT con le sue WSN intelligenti mira a migliorare e semplificare
la vita di tutti i giorni. Attualmente, secondo la società Gartner, sono più di 5
miliardi i dispositivi nel mondo connessi ad internet e sono destinati ad aumentare in maniera esponenziale nei prossimi anni. Diversi progetti utilizzano l’IoT
per fornire dei servizi, alcuni esempi sono:
8
• Smart roads: strade intelligenti in grado di comunicare con veicoli, semafori e segnaletica al fine di ottimizzare il traffico e ridurre l’inquinamento
• Streetline: progetto già in prova a Los Angeles e Indianapolis che comporta l’utilizzo di sensori sulle strisce dei posti auto per determinare la
presenza o meno di un veicolo in sosta in modo da stabilire, tramite un
centro dati, quali sono i posti disponibili e inviare le informazioni agli
automobilisti
• Smart Grid: insieme di una rete di informazione e di una rete di distribuzione elettrica il cui obbiettivo è quello di consentire la gestione di tale
rete elettrica in maniera intelligente.
Soffermandoci in particolare sul concetto di Smart Grid, essa può essere vista
come una rete composta di tante piccole reti che viaggiano tra produttori e consumatori scambiandosi informazioni per gestire con migliore efficienza i picchi
di richiesta, evitando interruzioni di elettricità e riducendo il carico dove necessario. In questo elaborato verrà realizzata una piccola parte di una Smart Grid,
ovvero quella interessata all’acquisizione dell’informazione sui consumi.
9
Capitolo 2
Realizzazione del nodo sensore
La base di partenza per costruire una rete di sensori wireless è ovviamente la
realizzazione dei nodi. Nel nostro caso, in cui vogliamo acquisire le informazioni circa i consumi di apparecchiature elettriche, avremo bisogno di prelevare
i dati sulla potenza assorbita da tali apparecchiature e, successivamente, inviare
tali dati mediante un trasmettitore. Possiamo, verosimilmente, immaginare di
inserire i nodi sensore all’interno delle prese elettriche e prelevare le grandezze
in uscita quando un carico è collegato.
Figura 2.1: Modello semplificato di una WSN
Ci occuperemo innanzitutto di raccogliere i dati sulla potenza e in un secondo
momento di inviarli su rete. Che si tratti di televisori, phon, frullatori o qualsiasi
altro elettrodomestico che fa da carico, lo schema è il seguente
10
Figura 2.2: Schema generale
Come possiamo osservare, il nostro dispositivo sarà alimentato dalla rete elettrica di casa che è in corrente alternata con un valore efficace di 230 Volt e con una
fase di 50 Herz. Molti dispositivi, pur prelevando i 230 V in forma alternata,
funzioneranno a tensioni più basse ed eventualmente continue per cui saranno
provvisti al loro interno di trasformatori e raddrizzatori che abbasseranno la tensione di esercizio e la trasformeranno in continua.
Nello schema vediamo un Wattmetro che servirà per effettuare la misurazione di
potenza. Questo dispositivo è costituito da due bipoli separati chiamati Voltmetro, che andrà disposto in parallelo al carico, e Amperometro, disposto in serie,
che misurano rispettivamente la tensione applicata e la corrente assorbita dal
carico.
Figura 2.3: Disposizione di voltmetro e amperometro
Nello specifico sarà realizzato un wattmetro numerico, ossia un dispositivo che
preleva grandezze analogiche e le converte in digitale per poi elaborarle. Entrambi i blocchi di misura (voltmetro e amperometro) saranno composti da un
elemento sensibile alla grandezza da misurare (sensore), da un blocco di condizionamento (per adattare il segnale alle esigenze del sistema di elaborazione)
e da un convertitore A-D (per l’elaborazione da parte di un microcontrollore).
11
Al termine delle misurazioni, i risultati saranno elaborati per produrre i valori
di potenza che ci interessano e successivamente trasmessi in rete.
Figura 2.4: Schema di misurazione
Per quanto riguarda il blocco di misura della corrente utilizzeremo il modulo
ACS712T, mentre per il blocco di misura della tensione è stato realizzato in
laboratorio un circuito specifico che prevede l’utilizzo di un trasformatore e di
un amplificatore operazionale, analizzeremo in seguito i due blocchi. Per la
parte di conversione A-D e trasmissione utilizzeremo la board STM32F303 Discovery. Questo dispositivo, basato sul core ARM Cortex-M4 a 32bit con una
frequenza di clock massima pari a 72MH, garantisce buone performance ed è
in grado di operare a basso consumo. Monta una memoria Flash da 256KB,
una memoria SRAM da 48KB, 4 ADC (Analog to Digital Converter) a 12 bit
con un range di conversione da 0 a 3V, 2 DAC (Digital to Analog Converter),
10 Timer, porte I/O di General Purpose, un controller DMA (Direct Memory
Access) da 12 canali, nonchè di altre periferiche come giroscopio, accelerometro e magnetometro triassiali. Per la conversione utilizzeremo gli ADC dell’F3
che, però, non possono essere sottoposti a tensioni più alte di 3.3V ed è qui che
entra in gioco il blocco di condizionamento. Inoltre, non è dotata di un trasmettitore, perciò la parte relativa alla trasmissione dei dati su rete sarà affidata ad
un modulo esterno. Tuttavia non tratteremo questo aspetto in quanto saranno
presentate nel dettaglio l’acquisizione e la manipolazione dei dati localmente
alla board e il successivo invio al modulo esterno. Naturalmente è fondamentale interfacciare il sensore con la rete altrimenti non staremmo realizzando una
WSN e il lavoro fatto per implementare il nodo sarebbe vano.
12
2.1
Sensori e Condizionamento
Come già detto, il nostro blocco di misura avrà bisogno di opportuni sensori per
prelevare le grandezze che successivamente andranno adattate al nostro sistema
di elaborazione. Dobbiamo, quindi, realizzare un blocco di condizionamento
che renda possibile la lettura delle misurazioni anche alla nostra scheda, in pratica dobbiamo rientrare nel range di valori convertibili dagli ADC. Analizzeremo
prima il modulo ACS712T e in seguito il circuito realizzato in laboratorio.
2.1.1
ACS712T
Il modulo ACS712T è un circuito integrato ad effetto Hall per misurazioni di
corrente sia continua che alternata e si presta ad applicazioni come controllo di
motori, rilevamento e gestione del carico, protezione contro i guasti di sovracorrente ecc. Questo modulo comprende sia il sensore, ovvero l’elemento di Hall,
che una parte di condizionamento. La corrente applicata in ingresso scorre in
una pista di conduzione in rame generando un campo magnetico che l’elemento
di Hall converte in un valore proporzionale di tensione.
Figura 2.5: ACS712T
Il dispositivo presenta un offset e un rapporto di conversione che dipendono in
maniera proporzionale dall’alimentazione applicata. Secondo il datasheet è richiesta un’alimentazione di 5V ma il dispositivo risulta funzionante anche con
soli 3 V di alimentazione e presenta un offset di circa 1.5 V (più basso rispetto
ai 2.5 V dell’alimentazione a 5 V). Per effettuare una conversione applichiamo
tale alimentazione sui pin 8 e 5 (VCC e GND), dopodichè mettiamo in input un
segnale di corrente sui pin 1-2 e 3-4 (IP+ e IP-) che verrà trasformato in valori
13
di tensione resi disponibili sul pin 7 di output (VOUT ).
Il segnale da mettere in input proviene da uno dei cavi di fase o neutro (L o N)
facendo in modo che l’ACS712T sia disposto in serie all’utilizzatore (fig. 2.5).
La sensibilità del dispositivo è di circa 60 mV
A con tale alimentazione, quindi per
ogni Ampere assorbito dal carico il dispositivo genererà una tensione analogica
di 60 mV (a cui verrà sommato l’offset). Questo dato è importante per il calcolo
della potenza che vedremo in seguito. Per non avere problemi in fase di misurazione a causa dei rumori del segnale, prenderemo un carico che assorba una
corrente minima di circa 100/150 mA (altrimenti non riusciremmo a distinguere
i rumori dal segnale).
Figura 2.6: Esempio di collegamento dell’ACS712T
2.1.2
Circuito per la tensione
Al fine di misurare la tensione ai capi del carico è stato utilizzato come sorta di
sensore un trasformatore nel cui secondario è indotta una tensione di 15VEFF . Il
trasformatore offre anche un isolamento elettrico che serve da garanzia contro
eventuali contatti che si rischierebbero con l’uso di un semplice partitore. Il
fattore di trasformazione è dato dal rapporto tra il numero di avvolgimenti al
primario (Np ) e il numero di avvolgimenti al secondario (Ns ). Tale tensione di
uscita però non è adatta al nostro schedino che accetta in ingresso solo tensioni
unipolari da 0V a 3V per cui c’è bisogno di un opportuno condizionamento che
abbasserà ulteriormente la tensione e aggiungerà un offset in modo tale da avere
il segnale desiderato. A tale scopo è stato utilizzato un amplificatore operazionale come differenziale la cui tensione di alimentazione è fornita dall’F3.
Ricordiamo che un amplificatore differenziale realizzato con un operazionale
14
(fig 2.7) esegue la differenza tra gli ingressi V1 e V2 e fornisce una VOUT che,
nel caso in cui R1 =R2 e R3 =R4 , è pari al prodotto tra la differenza degli ingressi
e il fattore di amplificazione/attenuazione Ad =
R3
R2 .
Figura 2.7: Amplificatore operazionale come differenziale
Nel nostro caso (fig 2.8), esso esegue la differenza tra gli ingressi A e B che
identificano il secondario del trasformatore e fornisce in uscita una tensione alternata con un VPP (Valore di picco-picco) pari a 1.5 V intorno al valore 1.5 V,
quindi con un’escursione di tensione da 0.75V a 2.25V. Il fattore di attenuazioed è stato ottenuto con una opportuna scelta dei valori delle
ne è pari a 13 VmV
EFF
resistenze, mentre il condensatore è stato dimensionato in modo da avere un
riferimento di offset stabile.
Figura 2.8: Schema del circuito per la misurazione di tensione
A questo punto abbiamo adattato i segnali di tensione e corrente al range di misura degli ADC. Una volta effettuate le conversioni è importante ricordarsi di
riportare le grandezze ai valori reali moltiplicando quelle misurate per i fattori
di conversione KI per le correnti e KV per le tensioni.
15
2.2
Conversione
Una volta adattati i nostri segnali, sarà possibile applicarli al microcontrollore
per l’acquisizione e la conversione dei valori misurati. A tal proposito è stato
realizzato un algoritmo in linguaggio C tramite l’ambiente di sviluppo IAR Embedded Workbench della IAR Systems che comprende anche un compilatore e
un debugger. Questo algoritmo prevede l’utilizzo di due ADC contemporaneamente per l’acquisizione, un timer per temporizzare il prelievo dei campioni e
di due DMA per trasferire i campioni dal registro dati degli ADC ad un vettore
di memoria in maniera indipendente dalla CPU.
Innanzitutto ricordiamo che una conversione A-D è divisa in una fase di Campionamento, in cui un segnale tempo-continuo è trasformato in un segnale
tempo-discreto raccogliendo un certo numero di campioni ad intervalli di tempo
regolari, e in una fase di Quantizzazione, in cui i campioni ad ampiezza continua vengono codificati su strighe di bit che rappresentano valori di ampiezza
discreti. Gli ADC dell’F3 sono di tipo SAR (Successive Approssimation Register) e come impostazione predefinita hanno una risoluzione di 12 bit, cioè
il numero di valori discreti (codici) che possono produrre per rappresentare un
segnale analogico è 212 = 4096. Naturalmente questi codici andranno trasformati in valori di tensione reali semplicemente moltiplicandoli per un fattore detto
Quanto. Il quanto Q di un convertitore è il rapporto tra il suo fondoscala, ovvero il massimo valore in ingresso che riesce a convertire, e il numero di codici
che riesce a produrre. Nei nostri ADC il quanto è pari a:
Q=
FS
2n
=
3V
4096
= 0, 000732421875V
L’utilizzo in contemporanea di due ADC è reso necessario dal fatto che abbiamo due segnali in ingresso all’F3: uno è l’uscita del blocco di misura della
tensione e l’altro quella del ACS712T. L’F3 permette l’utilizzo in dual mode
degli ADC 1-2 e degli ADC 3-4, in cui ADC1 e ADC3 fanno sempre da master
e gli ADC2 e ADC4 fanno sempre da slave; nel nostro codice useremo ADC1
e ADC2. Passiamo ora all’analisi nel dettaglio dell’algoritmo.
Le perifercihe interne hanno naturalmente delle connessioni per permettere la
comunicazione, tali collegamenti sono i BUS. Andiamo, dunque, ad abilitare il
16
BUS a cui sono collegati sia i due ADC che i rispettivi pin a cui saranno applicati i segnali. Consultando sia il Reference Manual che il DataSheet, vediamo
che il canale 3 dell’ADC1 è collegato al pin PA2 mentre il canale 2 dell’ADC2
è collegato al pin PA5, quindi abilitiamo sia le porte GPIOA che i due ADC; la
periferica che gestisce il reset e il clock di tutte le altre periferiche della board
è appunto l’RCC (Reset and Clock Control). ADC e GPIOA sono collegate al
bus AHB, quindi tramite l’RCC settiamo i relativi bit nel registro AHBENR
(AHB Peripheral Clock Enable Register): il bit 28 attiva entrambi gli ADC
mentre il bit 17 attiva le porte GPIOA. Successivamente dobbiamo configurare
la modalità di utilizzo di tali porte, l’F3 prevede quattro modalità:
• input mode
• general purpose output mode
• alternate function mode
• analog mode
Dal momento che dobbiamo acquisire segnali analogici, andiamo a settare nel
registro MODER della periferica GPIOA l’analog mode sulle porte 2 e 5 (PA2
e PA5).
Gli ADC dell’F3 possono lavorare a frequenze diverse dividendo quella fornita
dal bus AHB per un fattore di 1, 2 o 4, tali frequenze sono 72 MHz, 36MHz e
18MHz in accordo con i bit CKMODE[17:16] del registro comune CCR (Common Control Register); per comodità settiamo la massima frequenza.
Prima di cominciare la vera e propria configurazione dei due ADC, bisogna
ricordare che tali periferiche necessitano di una Stabilizzazione e di una Calibrazione al fine di ottenere una conversione più pulita e ridurre al minimo
gli errori di non linearità dovuti ad imperfezioni fisiche. La stabilizzazione è
fornita dal regolatore di tensione montato sulla scheda al quale deve seguire come suggerisce il Reference Manual - un’attesa di circa 10 microsecondi per
la terminazione dell’operazione. Per abilitare il regolatore bisogna eseguire una
precisa sequenza di istruzioni che prevede il passaggio dalla fase di reset, in
cui il regolatore è disabilitato, ad una fase intermedia, poi dalla fase intermedia
si passa alla fase di abilitazione; è possibile eseguire queste istruzioni settando
i bit ADVREGEN[29:28] del registro CR (Control Register) di ciascun ADC.
17
La calibrazione invece è ottenuta alzando il bit ADCAL dello stesso registro
e attendendo che esso si riabbassi. Per quanto riguarda invece l’attesa dei 10
microsecondi è possibile seguire due strade: una comporta l’utilizzo di un ciclo
for senza istruzioni in cui il tempo è fatto scorrere semplicemente incrementando la variabile condizione del costrutto di un determinato numero di volte,
l’altra soluzione (senza dubbio più elegante e precisa) comporta l’ultizzo di uno
dei Timer di cui è dotata l’F3. Dal momento che sarà necessario l’utilizzo del
timer anche in seguito, scegliamo proprio la seconda strada, quindi vediamo nel
dettaglio come si evolve questa parte di algoritmo.
L’F3 mette a disposizione tre tipi di timer:
• Advanced-Control Timers (TIM1 e TIM8): utilizzati per generare forme d’onda per controllare, ad esempio, i motori oppure per calcolare la
lunghezza d’onda di segnali in input
• General-Purpose Timers (TIM2-TIM4 e TIM15-TIM17): utilizzati per vari scopi come le misurazioni di intervalli di tempo
• Basic Timers (TIM6 e TIM7): utilizzati principalmente per controllare il
DAC
Il cuore di un timer è un contatore modulo N - dove N è il numero di bit di conteggio - che prende in ingresso un segnale di clock e ne conta gli impulsi fino
ad un massimo di 2N-1 prima di azzerarsi e ripetere il conteggio. Conoscendo
la frequenza di clock, e quindi il periodo, è possibile misurare il tempo necessario ad effettuare M conteggi semplicemente moltiplicando tale periodo per il
numero di conteggi effettuati.
1
∆ t = M·TCK = M· fCK
I timer dell’F3 possono lavorare in due modalità:
• Modalità base dei tempi: utilizzata per l’attesa di un determinato intervallo
di tempo prima di effettuare un’operazione
• Modalità contatore: utilizzata per misurare l’intervallo di tempo che intercorre tra due eventi
18
Dunque, per il nostro scopo, serve un timer di General-Purpose in modalità Base
dei tempi, possiamo scegliere tra TIM2, TIM3, TIM4, TIM15, TIM16, TIM17.
Usiamo il TIM2 che è l’unico timer a 32 bit, vale a dire che può effettuare un
numero di conteggi pari a 232-1 = 2147483648.
Come abbiamo fatto per gli ADC e le porte GPIOA, andiamo sul Reference
Manual e vediamo che il TIM2 è collegato al bus APB1, quindi settiamo il bit
TIM2EN nel registro APB1ENR (APB1 Peripheral Clock Enable Register) per
attivare il timer. Il bus APB1 lavora ad una frequenza massima di 36 MHz ma
TIM2, TIM3, TIM4, TIM6 e TIM7 possono lavorare ad una frequenza di 72
MHz e questo è importante perchè servirà per calcolare il numero di conteggi
da effettuare. Dobbiamo dire ora al TIM2 che ci serve un’attesa di 10 microsecondi, per questo motivo andiamo a scrivere nel registro ARR (Auto-Reload
Register) del TIM2 il numero di conteggi da effettuare per tale attesa. Ricaviamo il numero M di conteggi nel seguente modo:
1
∆ t = M·TCK = M· fCK
=>
M = ∆t·fCK = 10µs·72MHz = 720
Messa a punto questa parte preliminare, possiamo impostare la modalità di utilizzo dei due ADC e poi configurarli nel dettaglio.
Tra le diverse opzioni messe a disposizione dell’F3 per far lavorare insieme
più ADC, scegliamo la Dual Regular Simultaneous Mode impostando i bit
DUAL[4:0] nel registro comune CCR degli ADC 1 e 2.
Per quanto riguarda invece la configurazione degli ADC, procederemo in maniera del tutto analoga per entrambi, infatti le istruzioni sono identiche ad eccezione del nome di alcuni registri. Come già accennato, la prima cosa da fare
è stabilizzare gli ADC tramite i bit ADVREGEN, poi facciamo partire il TIM2
alzando il bit CEN (Counter Enable) del registro CR1 (Control Register 1) e
aspettiamo che conti i 10 microsecondi tramite un ciclo while in cui controlliamo quando il bit UIF (Update Interrupt Flag) del registro SR (Status Register) si
alza (questo ci dice che il registro di conteggio CNT (Counter Register) è arrivato ad ARR). Dal momento che lo stesso timer verrà utilizzato per entambi gli
ADC e dato che le configurazioni verranno effettuate in momenti diversi, reimpostiamo l’UIF, il CNT e il CEN. Passiamo poi alla fase calibrazione tramite
19
il bit ADCAL e aspettiamo la fine dell’operazione. Successivamente dobbiamo
dire alla periferica quanti e quali canali sono interessati alla conversione e qual è
il Sampling Time scelto per questi canali. Per Sampling Time si intende quella
parte del Tempo totale di convesione di un campione (l’altra parte è il TSAR ,
ovvero il tempo di conversione vero e proprio necessario per la quantizzazione
di un campione) assegnata al condensatore interno all’ADC affinchè esso si carichi al livello di tensione in input. Il Sampling Time è settabile su diversi valori
in funzione di quanto veloce e precisa vogliamo che sia la conversione.
Entrambi gli ADC avranno una sequenza composta da un solo canale (IN3 per
ADC1 e IN2 per ADC2), quindi nel registro SQR1 (Regular Sequence Register)
impostiamo a 0 i bit L[3:0] che contengono lo lunghezza della sequenza (0 vuol
dire un solo canale) e nei bit SQ1[10:6] immettiamo il valore 3 per ADC1 e
il valore 2 per ADC2. Scegliamo poi come Sampling Time il massimo valore
settabile in modo da avere una conversione più precisa anche se più lunga, settiamo quindi il valore 0b111 nei 3 bit SMPx (dove x è il canale) del registro
SMPR(Sample Time Register) del rispettivo ADC, in questo modo il tempo totale di conversione di un campione sarà all’incirca di 8,53µs.
Ora dobbiamo dare informazioni agli ADC circa l’acquisizione dei segnali, l’inizio di una sequenza di conversione può essere innescato sia da software che da
un evento esterno, come ad esempio il raggiungimento di un conteggio da parte
di un timer. È proprio questo il nostro caso, in cui vogliamo che gli ADC acquisiscano i segnali ad intervalli di tempo regolari scanditi dal TIM2. A tal proposito impostiamo nel registro CR2 (Control Register 2) del TIM2 i bit MMS
(Master Mode Selection) in modo che esso invii segnali di update agli ADC
ogni volta che raggiunge un determinato numero di conteggi. Supponiamo, ad
esempio, di voler raccogliere 100 campioni dei segnali di ingresso in 1 secondo,
questo significa che tra un campione e l’altro intercorre un tempo di 10 ms. Con
procedimento del tutto analogo al calcolo dei 10 µs, ricaviamo che il numero di
conteggi da effettuare per 10 ms è di 720000 e inseriamo questo dato nell’ARR.
Ora, per comunicare agli ADC che l’evento di trigger per iniziare una conversione è il raggiungimento dell’ARR, andiamo nel registro CFGR(Configuration
Register) e settiamo il bit EXTEN a 1 per abilitare i trigger esterni e i bit EXTSEL[9:6] a 0b1011 per impostare il TRGO2 (Trigger Output TIM2) come
20
evento di trigger.
Con questo si chiude la configurazione dei canali degli ADC ma l’algoritmo
prevede ancora diversi passaggi per essere completato, infatti ora è il momento
di configurare il DMA per il trasferimento dei campioni dal DR (Data Register)
di ciascun ADC a due diversi vettori di memoria.
Nel caso di conversioni simultanee con gli ADC, il Reference Manual ci informa che è possibile utilizzare separatamente due canali DMA (uno per il master
e uno per lo slave) oppure un unico DMA nel caso in cui l’altro fosse impegnato in una diversa operazione; in questa configurazione i dati convertiti dai
due ADC sarebbero letti dal registro CDR (Common Data Register) in cui i 16
bit più significativi conterrebbero il DR dello slave e i 16 bit meno significativi
conterrebbero invece il DR del master. Dal momento che non ci serve un DMA
per altre operazioni, possiamo utilizzarli entrambi e configurarli separatamente.
Innanzitutto consultiamo il Reference Manual e vediamo che l’ADC1 è collegato al canale 1 del DMA1, mentre l’ADC2 è collegato al canale 1 del DMA2,
quindi abilitiamo i DMA 1 e 2 che sono collegati al bus AHB come gli ADC
e la GPIOA. Andiamo di nuovo nel registro CFGR degli ADC e alziamo il bit
DMAEN in modo da specificare che sarà il DMA a raccogliere i dati non appena
essi saranno disponibli. Ora dobbiamo dare al DMA una serie di informazioni circa le locazioni di memoria e le modalità di trasferimento. Per specificare
quali sono le locazioni di memoria in cui scrivere e da cui leggere, scriviamo nel
registro CMAR (Memory Address Register) l’indirizzo del vettore in cui vogliamo inserire i dati e nel registro CPAR(Peripheral Address Register) l’indirizzo
di memoria del DR dell’ADC da cui vogliamo leggere. Successivamente, nel
registro CNDTR (Number of Data Register) di ciascun DMA scriviamo il valore 100, che è il numero di trasferimenti da effettuare. In ultimo, andiamo nel
registro CCR (Channel Configuration Register) e settiamo i seguenti bit:
• PL[13:12] a 0b11 per impostare la priorità massima per il canale
• MSIZE[11:10] e PSIZE[9:8] a 0b10 per impostare a 16 bit la dimensione
dei dati per un corretto allineamento (il DR degli ADC è a 12bit)
• MINC a 1 per abilitare l’auto-incremento della locazione di memoria,
questo perchè ogni dato deve essere scritto in una diversa posizione del
21
vettore
• PINC a 0 per disabilitare l’auto-incremento dato che l’indirizzo da cui
leggere è sempre il DR
• DIR a 0 per stabilire che la direzione del trasferimento è da periferica a
memoria
• EN a 1 per abilitare il DMA
A questo punto l’intera configurazione può dirsi conclusa, non ci resta altro da
fare che abilitare i singoli ADC dal registro CR, aspettare che il bit ADRDY
del registro ISR (Interrupt Status Register) diventi alto, far partire il TIM2 per
generare gli eventi di update e dare lo START agli ADC per iniziare le conversioni. Tutti i trasferimenti saranno terminati quando il bit TCIF1 (Transfer
Complete Interrupt Flag 1) del registro ISR di ogni DMA sarà diventato alto.
Dopo circa un secondo avremo 100 codici nel vettore delle correnti e 100 codici
nel vettore delle tensioni. Questi codici vanno convertiti in valori di tensione sul
range degli ADC, quindi li moltiplichiamo per il quanto Q (codice ·
3
4096 ).
I valori ottenuti saranno dunque indicativi della corrente assorbita e della tensione applicata, andranno successivamente riscalati con gli opportuni fattori per
ottenere le reali misurazioni.
Di seguito sono presentate alcune istantanee del codice. Si può notare che varie
impostazioni sono state raggruppate in un numero minore di istruzioni per avere
un codice più compatto
Figura 2.9: Abilitazione dei bus e configurazione TIM2
22
Figura 2.10: Settaggio dual mode e configurazione ADC1 (per l’ADC2è stata adoperata una
configurazione analoga)
Figura 2.11: Configurazione dei DMA e attesa dei trasferimenti
23
2.3
Misurazione potenza
In questa parte di algoritmo ci dedichiamo alla misurazione della potenza assorbita dal carico che è calcolata come prodotto tra la corrente che lo attraversa e la
tensione applicata. Prima di tutto, dunque, è necessario trasformare i due vettori
da 100 valori ciascuno in dati reali di corrente e tensione. Prendiamo dunque
i due vettori e moltiplichiamo i valori per il fattore KI nel caso delle correnti e
per il fattore KV nel caso delle tensioni.
A questo punto la potenza è calcolata secondo il valore efficace (o Root Mean
Square) utilizzato per confrontare la potenza di un segnale alternato con la potenza che si avrebbe se il segnale fosse in corrente continua semplificando, di
fatto, l’espressione della potenza media ed evitando di analizzare il suo andamento in ogni istante.
I valori efficaci di un segnale continuo x(t) con periodo T e di un segnale discreto di n campioni sono calcolati come:
Nel caso, invece, di segnali provenienti dalla rete elettrica che hanno dunque
un andamento sinusoidale, il valore efficace sarà pari a
√1
2
volte l’ampiezza del
segnale. Andando a moltiplicare i segnali sinusoidali v(t) = VM · sin(2πf t) e
i(t) = IM · sin(2πf t + ϕ) otteniamo la potenza attiva la cui espressione è il
seguente prodotto scalare:
PA = Vrms · Irms · cos ϕ
Dove ϕ è l’angolo di sfasamento tra il vettore tensione di valore efficace Vrms
e il vettore corrente di valore efficace Irms che dipenderà dal carico. Avendo,
però, campionato i segnali, l’espressione totale della potenza assorbita dal carico è calcolata come semplice media aritmetica delle potenze relative ai valori
campionati:
Pa =
1
n
·
Pn
i=1 vi
· ii =
1
n
·
Pn
i=1 Pi
A questo punto abbiamo la tanto attesa informazione sulla potenza assorbita dal
nostro carico che potrà essere inviata al gateway e ad uno specifico dispositivo
che elaborerà i dati sul consumo e li presenterà all’utente.
24
Figura 2.12: Calcolo potenza assorbita
2.4
Trasmissione
In questa sezione, come già annunciato, non ci preoccuperemo dell’invio effettivo dei dati su rete, bensì dell’invio dei dati ad un modulo esterno all’F3
che si occuperà di tutta la parte relativa alla trasmissione su rete e che noi tratteremo come una scatola chiusa. L’F3 mette a disposizione dell’utente diverse perifericche di trasmissione dati denominate USART (Universal Synchronous/Asynchronous Receiver/Transmitter), mentre un esempio di modulo che
poteremmo utilizzare è l’ESP8266 che descriveremo in seguito.
2.4.1
USART
L’USART è una periferica di trasmissioni dati seriale che utilizza solo due cavi
per la comunicazione. E’ una delle interfacce di comunicazione più diffusa
nell’ambito dei microcontrollori anche se ultimamente è stata surclassata da
altri tipi di comunicazioni seriali come l’USB. Esistono sostanzialmente due
modalità di trasmissione:
• Modalità asincrona (full-duplex), in cui trasmettitore e ricevente possono
inviare dati in contemporanea
• Modalità sincrona (half-duplex), in cui trasmissione e ricezione sono
sincronizzate da un clock di sistema
La modalità full duplex necessita di due canali separati per il trasferimento e
quindi ci sarà un pin dedicato alla trasmissione (TX) ed un pin dedicato alla
ricezione (RX). Nella modalità half duplex, invece, la linea dati è unica e quindi
c’è l’esigenza di un clock fornito da un master per temporizzare l’accesso al ca25
nale; anche qui abbiamo due pin: uno per i dati (DT) e uno per il clock (CK). Nel
caso specifico della nostra board, ogni trasferimento segue un preciso schema: 1
bit di start, 8 o 9 bit dati (detti word) ed uno o due bit di stop. Inoltre è fornita la
possibilità di scegliere il Baud Rate ovvero il numero di simboli trasmessi in un
secondo, da non confondere con i bps perchè un baud corrisponde ad un numero
differente di bit, quindi la velocità espressa in bit sarà un multiplo della velocità
espressa in baud, eccezion fatta per il caso in cui un baud corrisponda proprio ad
un bit. Tra i vari USART messi a disposizione dall’F3 scegliamo, ad esempio,
l’USART1 e cerchiamo nel Datasheet a quali pin è collegato. Vediamo che esso
è associato ai pin PA9 per la trasmissione (TX) e PA10 per la ricezione (RX)
nella modalità Alternate Function, quindi una della prime cose da fare è selezionare tale modalità su queste porte dopo aver abilitato USART1 (GPIOA è già
stato abilitato prima). In realtà, a noi interessa solo trasmettere i dati in uscita
sul modulo WiFi, quindi non ci sarebbe la necessità di selezionare anche la porta di ricezione. Tra le 16 Alternate Function disponibili, vediamo che l’utilizzo
dell’USART su tali porte è affidato alla AF7. Questa impostazione va settata
nel registro AFR (Alternate Function Register) che in realtà è un vettore di due
elementi: AFRL (= AFR[0], Low Register) per le porte 0-7 e AFRH (= AFR[1],
High Register) per le porte 8-15. Scegliamo dunque l’High Register e impostiamo la settima funzione settando i bit AFRH10[11:8] e AFRH9[7:4] entrambi a
0b0111. Successivamente scegliamo la lunghezza di una word tramite il bit M
nel registro CR1 (per comodità la lasceremo ad 1 byte di default). Il BaudRate a cui vogliamo inviare i dati può essere impostato nel registro BRR (Baude
Rate Register) a seconda dell’oversampling scelto. L’oversampling, come suggerisce la parola, è la scelta di una frequenza di campionamento decisamente
più alta del dovuto (frequenza di Nyquist) al fine di ridurre il rumore e l’effetto
aliasing. Possiamo scegliere, tramite il bit OVER8 del registro CR1, tra un oversampling di 8 se vogliamo un BaudRate più alto (al massimo
fCK
8 )
e uno di 16
se vogliamo una maggiore tolleranza del recivitore alle deviazioni del clock in
modo che sappia distinguere i dati dal rumore (riducendo il massimo baud rate
a
fCK
16 ).
Ritornando al BaudRate, esso è settato allo stesso valore sia per il recie-
ver che per il transmitter ed è calcolato, in base all’oversampling scelto, come:
BRO16 =
fCK
U SART DIV
BRO8 =
26
2·fCK
U SART DIV
Dove fCK di default è 36MHz e USARTDIV è il valore scritto nel BRR. Quindi,
se volessimo ad esempio un BaudRate di 9600 con un frequenza di 36MHz e
un oversampling di 16 (OVER8=0) dovremmo scegliere:
USARTDIV= 36000000
9600 = 3750 = 0xEA6 .
Nel caso in cui, invece, scegliessimo un oversampling di 8 (OVER8=1), il registro BRR sarebbe diviso in due parti (i bit 31:16 sono riservati in entrambi
i casi): i 4 bit meno significativi BRR[3:0] verrebbero shiftati di 1 a destra,
mentre i restanti bit BRR[15:4] conterrebbero il resto della codifica; il valore
sarebbe dunque:
= 7500 = 0x1D4C
USARTDIV= 2x36000000
9600
BRR[3:0] = 0xC » 1 = 0x6
BRR[31:0]= 0x1D46
Lasciamo l’oversampling al valore di default (OVER8=0, oversampling by 16)
e scegliamo tale BaudRate. Anche il numero di bit di stop lo lasceremo così
com’è, cioè ad 1 bit. A questo punto possiamo inserire il dato da trasmettere nel
TDR (Transmitter Data Register) e abilitare la porta di trasmissione e l’USART
tramite i bit TE e UE nel registro CR1. La trasmissione sarà completa quando
il bit TC del registro ISR sarà alto.
27
Con questo algoritmo abbiamo creato una sorta di driver per le periferiche
USART, la vera trasmissione riguardo i dati di potenza avviene con funzioni
di alto livello in cui vengono inviati comandi AT che il modulo WiFi dovrà
eseguire.
2.4.2
Modulo ESP8266
L’ESP8266 è un SOC (System on a Chip) ampiamente utilizzato nelle applicazioni IoT. Esistono 12 moduli appartenenti a questa famiglia: dall’ESP-01,
che mette a disposizione 4 pin digitali incluse le porte seriali Tx e Rx, fino
all’ESP-12f con i 11 pin digitali ed uno analogico. I diversi moduli sono dei
tranceiver (transmitter+reciever) WiFi compatibili con lo standard 802.11 b/g/n
a 2.4 GHz con protocollo TPC/IP e sicurezza WPA e WPA2, dotati di memoria
flash (dai 512KB a 1 MB) e di un MCU. Il modulo più diffuso è senza dubbio l’ESP-01 che opera ad una tensione di 3.3V e ha un assorbimento medio
che si aggira intorno ai 50 mA (può arrivare anche a 200 mA). Questo lo rende
perfetto per lavorare con dei microcontrollori esterni come Arduino o la nostra
board SMT32F3. Naturalmente deve essere programmato per funzionare, quindi la prima operazione da fare è avviarlo in modalità Bootloading e caricare un
firmware. In questa modalità, se lo si collega ad un pc, sarà necessario mediare
il collegamento con un convertitore logico per abbassare i 5V delle porte USB
ai 3.3 V supportati dal modulo. Nel nostro caso invece lo collegheremo direttamente all’F3 e quindi non ci sarà bisogno di alcun converitore. Utilizzeremo
la stessa comunicazione USART realizzata prima per trasferire i comandi che
il modulo dovrà eseguire per connettersi al nodo gateway e successivamente
per inviargli i dati. C’è da dire che questa famiglia di moduli è ben ottimizzata
anche per operare standalone senza necessariamente una board esterna, naturalmente le funzionalità saranno limitate ma è comunque utile nel caso in cui si
volesse realizzare una piccola rete domestica per controllare a distanza oggetti come boiler, forni o cancelli inviando semplici comandi per attivare dei relè
collegati a questi oggetti.
28
Capitolo 3
Conclusioni
Quanto finora realizzato non è che la minima parte di applicazioni ben più sofisticate e organizzate. Si potrebbe continuare la realizzazione del nodo sensore
aggiungendo le funzionalità di rete e creando diversi altri nodi da installare in
tutte le altre prese elettriche, dopodichè si dovrebbe implementare un algoritmo
di routing per gestire la trasmissione dati verso il gateway ed un algoritmo di
gestione della rete domestica; avremmo così creato una piccola Smart Grid. L’idea è quella di raccogliere un certo numero di dati ad intervalli di tempo regolari
non solo sulla potenza ma anche sulla posizione del nodo così da identificare
l’utilizzatore, inviarli al nodo centrale che si occuperebbe di trasmetterli ad un
PC che elaborerebbe le informazioni sul carico e sui consumi "decidendo" se
e quando spegnere determinati apparecchi qualora questi stessero assorbendo
troppa energia elettrica. Con lo stesso schema utilizzato in questo elaborato,
potrebbero essere raccolti dati di natura diversa. La board utilizzata in effetti
è fornita di un sensore di temperatura e potrebbe essere utilizzata per realizzare una rete di monitoraggio dell’impianto di riscaldamento/condizionamento.
Tuttavia, questo resta un progetto puramente a scopo illustrativo dal momento
che non è pensabile realizzare una WSN interamente con board F3 perchè occuperebbero troppo spazio e sarebbero costose. Sul mercato esistono numerosi
altri dispositivi con funzionalità più all’avanguardia come gli adattatori elettrici
intelligenti che sono forniti di connettività WiFi e che tramite un’app dedicata
possono essere comandati direttamente dall’utente tramite il proprio smartphone. Anche tali dispositivi sono tutt’altro che economici allo stato attuale ma dati
i molti passi in avanti compiuti negli ultimi anni è dunque auspicabile che nel
prossimo futuro si arrivi a soluzioni più economiche ed alla portata di tutti.
29
Ringraziamenti
In questo spazio desidero ringraziare la mia relatrice Prof.ssa Ing. Annalisa
Liccardo per i suggerimenti e le osservazioni, l’ Ing. Alessandro Tocchi per la
realizzazione del circuito di condizionamento grazie al quale ho potuto testare
il funzionamento del nodo.
Inoltre ringrazio tutta la mia famiglia che ha sempre appoggiato le mie scelte e
mi ha dato supporto. Ringrazio i colleghi con il quale ho condiviso anche piccole parti di questo percorso. In particolare, ringrazio il mio amico Giuseppe con
il quale ho affrontato intense giornate di studio non prive di gioie e preoccupazioni. Ringrazio tutti i miei amici, primo fra tutti Liugi, che mi sono stati vicini
e mi hanno aiutato, anche inconsapevolmente, a superare momenti difficili.
Per quanto riguarda invece questo lavoro, mi auguro che possa essere interessante per coloro che intendono approfondire meglio i vari aspetti di una rete di
sensori wireless.
30
Bibliografia
[1] J. Zheng, A. Jamalipour, "Introduction to Wireless Sensor Networks", WileyIEEE Press, 2009
[2] T. Voigt, C. Rohner, "What Is the Internet of Things: An Introduction",
IEEE Courses, 2017
[3] D. Ivanova, O. Starkova, K. Herasymenko, "Realization of the remote power management system based on the concept of Internet of Things", in
Problems of Infocommunications Science and Technology (PIC S&T)Ukraine,
2016
[4] X. Zu, Y. Bai, X. Yao, "Data-centric publish-subscribe approach for Distributed Complex Event Processing deployment in smart grid Internet of
Things", in Software Engineering and Service Science (ICSESS), China,
2016
[5] Appunti del corso di Misure per l’Automazione e Produzione Industriale,
2015
[6] Webster, J. G., Electrical measurement, signal processing, and displays,
CRC Press, Boca Raton, FL, 2004.
[7] STMicroelectronics, RM0316 Reference Manual STM32F30x, 2013
[8] STMicroelectronics, STM32F302xB STM32F302xC STM32F303xB STM32F303xC
Datasheet, 2013
[9] Allegro MicroSystems, ACS712T Datasheet, 2012
31