Iot prototype ( Arduino+electret microphone+esp-01) which analyses and distingueshes sounds. Useful to study and monitor data about noise pollution and road traffic.
2. OBIETTIVI
La possibilità di captare,
elaborare e discriminare i
rumori ambientali con un
hardware a basso costo e
di piccole dimensioni
L'utilità dello strumento
per le amministrazioni
pubbliche, cercando
di convincerle a investire
nel suo sviluppo
Dimostrare
2/16
Studio e monitoraggio
inquinamento acustico e
traffico stradale
3. INQUINAMENTO ACUSTICO E TRAFFICO
STRADALE
3/16
• Un’esposizione continuata ad alti livelli di rumore può
causare disturbi e patologie
• La prima causa di inquinamento acustico è il
traffico stradale
• 100 milioni di europei sono esposti a livelli di rumore
causato dal traffico stradale al di sopra di 55 dB Lden
• 32 milioni di questi sono esposti a livelli superiori ai
65 dB Lden
4. INQUINAMENTO ACUSTICO
4/16
L'UE prende provvedimenti con l'Environmental Noise
Directive (2002) e il 7th Environment Action Programme
(2014):
• Obbligo di produrre mappe acustiche strategiche e piani d'azione
ogni 5 anni
• Definizione di indicatori di rumore:
o 55 db Lden
o 50 dB Lnight
• Terzo richiamo per l'Italia
5. MOBILITÁ INSOSTENIBILE IN ITALIA
5/16
Ecosistema urbano - rapporto sulle performance ambientali delle città
2017, Legambiente, 2017
•Le grandi città sono grandi garage
•Mezzi pubblici sempre più in sofferenza
•Il tempo perso nel traffico
6. SMART CITY E L'IMPORTANZA DEI DATI
6/16
• Smart City (320 milioni di euro, +40%)
• Il 48% dei comuni italiani negli ultimi 3 anni e tre su
quattro hanno in programma nel 2018 nuove azioni
• Principali barriere:
o Mancanza di risorse economiche (71%)
o Mancanza di competenze (61%)
o Problema della governance
o Mancanza di collaborazione fra attori pubblici e
privati
• Utilizzo e distribuzione dei dati
o Migliorare qualità e quantità dei servizi forniti
o Fornire i dati a pagamento
8. I COMPONENTI DEL PROTOTIPO
8/16
Arduino
• Microcontrollore
• Interactive
Development
Environment (IDE)
• ATmega328
Microfono electret
• Conversione
suono/impulso elettrico
• Amplificatore
Scheda ESP-01
• Chip ESP8266
• RX,TX,CH-PD
• Comandi AT
9. CALCOLO DELLA TRASFORMATA DI
FOURIER
9/16
• Segnale --> Insieme frequenze/ampiezze
• Libreria Fast Fourier Transform (FFT) per
Arduino
• Trovare le frequenze che caratterizzano
un suono e la frequenza dominante
10. LA FIRMA
10/16
• Firma = spettro rappresentativo della situazione da rilevare
• Calcolare la Root Mean Square Deviation (distanza) tra firma e campione
𝑅𝑀𝑆𝐷(ϴ) = 𝑀𝑆𝐷 𝜃 = 𝐷 𝜃 − 𝜃 2
11. PROGRAMMA FINALE: INVIO RISULTATI
11/16
1°
• Connessione WiFi: libreria atlib
2°
• Invio dei dati tramite HTTP POST
3°
• Possibilità di visualizzare, studiare e lavorare sui
dati
12. PROGRAMMA FINALE: UN ESEMPIO
THINGSPEAK E L'INGORGO
1°
• Livellamento della distanza
2°
• Canale su ThingSpeak
3°
• Visualizzare, scaricare, monitorare ed
elaborare dati
12/16
13. PROGRAMMA FINALE: UN ESEMPIO
THINGSPEAK E L'INGORGO
13/16
1°
• Dati in ingresso su ThingSpeak
2°
• Valutazione dati con la React
3°
• Invio Tweet con ThingTweet
14. TARGET: AMMINISTRAZIONI
PUBBLICHE
• Problemi di traffico stradale e/o inquinamento acustico
• Vantaggi:
o Benessere cittadini
o Rientrare nei limiti UE
o Prestigio come città
o Costi e dimensioni contenuti
14/16
15. MODELLO DI BUSINESS
15/16
Value
Added
Customer
Journey
Value Proposition
Strategic Embedding
Monitoraggio e mantenimento
preventivo delle conformità rispetto a
norme e direttive e database sempre
aggiornato
Newsletter e mailing list,
social network, sito web,
meeting
Costi e vantaggi (benessere cittadini,
rientrare nei limiti UE, prestigio città)
Mission Statement e
obiettivi a breve/medio
termine
16. CONCLUSIONI
Sono stati dimostrati:
• Risultati che possono essere ottenuti con un dispositivo semplice
• Le modalità di promozione da mettere in atto
Possibili sviluppi
• Brevettare il prototipo
• Ottenere finanziamenti
• Creare un prodotto finito e utilizzabile
• Connessione Wi-Fi e un server
• Alimentazione e manutenzione
• Pubblicazione risultati a livello internazionale
16/16
18. MARKETING B2B VS MARKETING B2C
• È più razionale
• Si rivolge a una nicchia specifica e ben delineata
• I clienti B2B non sono utilizzatori finali del prodotto
• Il rapporto personale è importante
19. IDE DI ARDUINO
• IDE = Integrated Development Environment
• Sketch, in un linguaggio semplice modellato sul linguaggio Processing
• Sketch passa al compilatore avr-gcc, un software open source per traduzione nel
linguaggio comprensibile al microcontrollore
• Viene caricato su Arduino tramite l’IDE
20. DESCRIZIONE ARDUINO ( PARTE
1/2)
• Connettore USB (num. 1)
• Connettore alimentazione da 7 a 12V
( num. 2 )
• ATmega168: programma utente e configura
zione di base (num. 3)
• Chip per la comunicazione seriale (num. 4)
• Clock/cristallo a 16 MHz (num. 5 )
• Bottone di reset (num. 6)
• Led di accensione (On) (num. 7)
• Led di ricezione (RX) e trasmissione (TX) in
corso (num. 8)
• L-Led, che può essere programmato tramite
lo sketch (num. 9)
• ICSP per Atmega328, per programmare il
microcontrollore (num. 15)
• ICSP per l’interfaccia USB (num. 16)
•
21. DESCRIZIONE ARDUINO (
PARTE 2/2)
• Pin di alimentazione : uscita corrente a 5V,
3.3V, massa (GND) e Vin (num. 10)
• 6 pin analogici In (pins 0-5): Prendono valori analogici (
es. letture del voltaggio prese da un sensore) e
li convertono in numeri compresi tra 0 e 1023 ( num. 11)
• 14 pin digitali IO (pins 0–13): Possono essere di input o
di output (num.12-13). Percepiscono la presenza o meno
di corrente, restituendo HIGH o LOW, e possono essere
programmati per generare corrente in output.
o I pin 0 e 1 sono detti RX e TX (num. 12) per
la lettura e l’invio dei dati: Arduino può colloquiare
con ogni dispositivo avente una porta seriale.
o I pin 3,5,6,9,10,11 ( ~
) possono essere riprogrammati per
output analogici e sono detti PWM.
• Pin per la terra(GND) e AREF, che regola il voltaggio di
massima risolusione degli input analogici (num.14)
22. ESP-01
• Il modulo seriale WiFi ESP8266 si basa sul
chip ESP8266, un microcontrollore
programmabile
• Fornisce connettività WiFi a schede come
Arduino attraverso i pin Tx e Rx
• Come modulo è possibile gestirlo tramite
comandi detti AT, attraverso i quali
interagisce con lo sketch.
• L'architettura a risparmio energetico offre tre
modalità di funzionamento: modalità attiva,
modalità sospensione e modalità
sospensione profonda
Pin Nome Descrizione
1 GND GROUND
2 GPIO2 General Purpose I/O 2
3 GPIO0 General Purpose I/O 0
4 RXD Ricevitore
5 TXD Trasmettitore
6 CH-PD Abilitatore del chip
7 RESET Segnale di reset esterno
8 VCC Potenza in input +3.3 V
23. COMANDI AT
• Comandi di base: controllare il funzionamento del dispositivo di rete, senza
riferimento all’operazione di rete. Ad esempio, funzione di reset, il controllo
UART, il risparmio energetico, il controllo dei pin GPIO, l’ispezione del
dispositivo
• Comandi WiFi: eseguire operazioni a livello di accesso alla rete. Associazione
ad un AP, controllo funzione DHCP, per impostare e controllare gli indirizzi IP e
MAC.
• Comandi TCP/IP: sono usati per gestire Client/Server TCP e UDP e anche
recuperare data e ora dai server SNTP, per controllare server DNS e generare
ping ICMP.
Seguono tutti il pattern query/response e iniziano con AT+string, seguito dal
nome della funzione e un numero variabile di caratteri per interruttori e
parametri.
Restituiscono linee di testo separate da una combinazione /r/n, con l'ultima riga
chiusa da un OK in caso di terminazione avvenuta con successo del comando.
Altrimenti, la linea termina con un ERRORE o stringa FAIL.
24. IL TIMER
9/16
Utile, per stabilire il momento in cui leggere i valori.
Quando il timer scade genera un'interruzione:
• Interrupt handler collegata all'interruzione
• Campionamento dopo l'azione dell'handler
25. IL CLOCK E IL TIMER (PARTE 1/4)
Un oscillatore si muove avanti e indietro generando
onde di vario tipo. Gli oscillatori sono utilizzati, tra le
altre cose, anche per generare segnali di clock in modo
da mantenere la velocità dei processori digitali
o L’oscillatore clock/cristallo di Arduino è un circuito che
genera onde quadre che controllano quanto un
processore gira veloce
o Con il clock Arduino può gestire problemi di tempo e
calcolarlo
o Frequenza: 16 milioni di cicli al secondo
o Impulso: ogni 63 ns
26. IL CLOCK E IL TIMER (PARTE 2/4)
Timer Freq Base Output Compare Pin Arduino Freq. Default
TCCR0 62500Hz OC0 OC0A
OC0B
6 976Hz
62500Hz 5 976Hz
TCCR1 31250Hz OC1 OC1A
OC0B
9 488Hz
31250Hz 10 488Hz
TCCR2 31250Hz OC2 OC1A
OC2B
11 488Hz
31250Hz 3 488Hz
• Il clock viene utilizzato per
incrementare tre timer distinti di
Arduino: Timer0, Timer1 e
Timer2 e gestiti dall’ATmega168
• A ciascun timer sono collegati
due comparatori, Output
Compare (OC), definiti OCxA e
OCxB, in cui x vale 0,1 e 2 e
ciascun numero corrisponde a
uno dei tre timer
• Ad ogni comparatore è collegato
un pin PWM (3,5,6,9,10,11)
• I tre timer hanno la dicitura TCCRx, dove x ha di nuovo valore 0,1 e 2 e lunghezza
limitata ( 8 o 16 bit).
• Alla frequenza di 16 MHz fanno un giro in:
o 16µsec, i Timer0 e il Timer2
o 4msec, il Timer1
27. IL CLOCK E IL TIMER (PARTE 3/4)
Pre-scaling = dividere il clock per avere ritmi di conteggio più lenti.
Prescaler = quantità per cui si può dividere la frequenza del clock (1 ,8, 64, 256, 1024)
Controllando uno dei timer possiamo farlo contare a un ritmo inferiore (pre-scaling). Arrivato a
un valore predeterminato, genera un’interruzione e si azzera. In questo modo, si può produrre
un’interruzione a intervalli predeterminati.
Modificando il prescaler di un timer, si può variare la frequenza dei pin collegati a esso.
Ciascun timer viene controllato con registri interni del processore. A essi corrisponde una
variabile predefinita.
Per il Timer1:
•TCCR1A/B - I registri che controllano le funzionalità del timer
•OCR1A - La soglia di azzeramento del timer
•TCNT - Il valore iniziale del contatore
•TIMSK1 - Abilita o maschera le interruzioni
28. IL CLOCK E IL TIMER (PARTE 4/4)
7 6 5 4 3 2 1 0
ICNC1 ICES1 WGM13 WGM12 CS12 CS11 CS10
CS12 CS11 CS10 pre-scaling
0
0
0
1
1
0
1
1
0
0
1
0
1
0
1
1
8
64
256
1024
I bit 4 e 3 controllano le modalità di funzionamento e settando il bit 3 ottengo la funzionalità di
conteggio/interruzione/azzeramento (CTC).
I valori da 001 a 101 per 1 bit CS indicano rispettivamente prescaling di 1 ,8 ,64 ,256 ,1024.
I due registri denominati A e B ( TCCR1A e TCCR1B) definiscono le modalità di funzionamento e
altri parametri del timer. In particolare, il registro B ha anche il compito di impostare
il prescaler. Per quanto riguarda i bit del TCCR1B, infatti, troviamo:
Il timer è utile per stabilire il momento in cui leggere i valori. Quando il timer scade genera
un’interruzione alla quale collego un programma, detto interrupt handler (gestore
dell’interruzione), che esegue un’azione semplice. Il programma, non appena osserva l’azione
dell’handler, campiona.
29. RMSD ( ROOT-MEAN-SQUARE-
DEVIATION)
La root-mean-square deviation (RMSD) = radice quadrata della media degli errori al quadrato.
Viene utilizzata per misurare la differenza tra valori predetti da un modello o uno stimatore e i
valori osservati. L’effetto di ciascun errore sulla RMSD è proporzionale alla dimensione
dell’errore quadratico. Quindi, errori troppo grandi hanno un effetto sproporzionatamente grande
sul risultato.
In riferimento alla slide 10, il calcolo dell’RMSD è stato effettuato nell’ambiente di EXCEL :
• Nelle prime due colonne valori di frequenza e ampiezza di un campione che potrebbe
essere ipoteticamente la firma e nelle due colonne successive i valori di frequenza e
ampiezza di un altro campione.
• Nella quinta colonna, denominata delta, vengono calcolate le differenze tra le ampiezze
della firma e quelle del campione tra loro corrispondenti ( i.e. =B2-D2)
• Nella sesta colonna, denominata sqr, vengono calcolati i quadrati di ogni differenza ( i.e.
=E2^2)
• In fondo alle colonne viene calcolata la RMSD effettuando la radice quadrata della
somma dell’intera colonna denominata sqr, ovvero quella dei quadrati ( i.e.
30. PROGRAMMI COMMENTATI
#define BMAX 128 // definizione buffer con grandezza 128
#define FREQ 6250L //definizione frequenza di campionamento
#include <arduinoFFT.h> //includi libreria FFT
arduinoFFT FFT = arduinoFFT(); // creazione oggetto FFT
void setup() {
Serial.begin(57600);
pinMode(13, OUTPUT);
noInterrupts(); // Inibisce le interruzioni
TCCR1A = 0; // Registro di controllo funz.timer
TCCR1B = 0; // Registro di controllo funz. timer
TCNT1 = 0; // Azzera il contatore
OCR1A = 1000000 / (FREQ * 16); // Soglia per l'azzeramento del timer, valida con prescaler a 256
Serial.println(OCR1A);
TCCR1B |= (1 << WGM12); // Abilita conteggio/interruzione/azzeramento
TCCR1B |= (1 << CS12); // Imposta il prescaler a 256 ( CS12=1)
TIMSK1 |= (1 << OCIE2A); // Genera l'interruzione
interrupts();
}
int n = 0; // inizializzazione variabile n
double R[BMAX]; // parte reale
double I[BMAX]; // parte immaginaria
ISR(TIMER1_COMPA_vect) { // Costante ISR, parametro vettore di interruzione
if (n < BMAX) { // Se il buffer non è ancora pieno, quindi n non ha raggiunto 128
R[n] = analogRead(A0); // All’indice n dell’array R, si assegna il valore del pin A0 (il segnale)
I[n] = 0; // All’indice n dell’array I, si assegna valore 0
n++; // Incremento l’indice di n di 1
}
}
void loop() {
if (n == BMAX) { // se il valore di n è uguale a quello di BMAX, cioè 128
FFT.Windowing(R, BMAX, FFT_WIN_TYP_HAMMING, FFT_FORWARD); // Hamming window
FFT.Compute(R, I, BMAX, FFT_FORWARD); // Calcolo della FFT
FFT.ComplexToMagnitude(R, I, BMAX); // Generazione dello spettro
double x = FFT.MajorPeak(R, BMAX, FREQ); // Frequenza di picco
double k = FREQ / BMAX; // Conversione indice -> frequenza
Serial.println("================");
Serial.println("Freq.tAmpiezza");
Serial.println("================");
for (int i = 0; i < BMAX / 2; i++) {
Serial.print(i * k, 0); Serial.print("t"); Serial.println(R[i]);
}
Serial.println("================");
Serial.print("Freq. di picco: "); Serial.println(x, 2);
Serial.println("================");
delay(1000);
n = 0;
}
}
31. PROGRAMMI COMMENTATI
#include <secret.h>
#define BMAX 128
#define FREQ 6250L
#include <math.h>
#include <arduinoFFT.h>
#include <avr/pgmspace.h>
#include <atlib.h>
arduinoFFT FFT = arduinoFFT();
ESP esp1 (5,7,19200,6)
boolean pup() { true;}
void setup() {
esp1.powerUp(30, pup);
Serial.begin(57600);
noInterrupts(); // Inibisce le interruzioni
TCCR1A = 0; // Registro di controllo funz.timer
TCCR1B = 0; // Registro di controllo funz. timer
TCNT1 = 0; // Azzera il contatore
OCR1A = 1000000 / (FREQ * 16); // Soglia per l'azzeramento del timer, valida con prescaler a 256
Serial.println(OCR1A);
TCCR1B |= (1 << WGM12); // Abilita conteggio/interruzione/azzeramento
TCCR1B |= (1 << CS12); // Imposta il prescaler a 256 ( CS12=1)
TIMSK1 |= (1 << OCIE2A); // Genera l'interruzione
interrupts();
}
int n = 0;
double R[BMAX];
double I[BMAX];
float differenzavalori = 0; // per la differenza tra ampiezza firma e ampiezza campione
float quadratovalori = 0; // per il quadrato della differenza
float somma = 0; // per la somma dei quadrati delle differenze
float devstand; // radice quadrata, che risulta nell’RMSD
float k = 16;
float ewma_old = 8000;
float ewma_new;
ISR(TIMER1_COMPA_vect) {
if (n < BMAX) {
R[n] = analogRead(A0);
I[n] = 0;
n++;
}
}
void loop() {
char body[100];
char header[100];
if (n == BMAX) { // se il valore di n è uguale a quello di BMAX, cioè 128
const static double campione[] PROGMEM = {}; // inserire la firma
FFT.Windowing(R, BMAX, FFT_WIN_TYP_HAMMING, FFT_FORWARD); // Hamming window
FFT.Compute(R, I, BMAX, FFT_FORWARD); // Calcolo della FFT
FFT.ComplexToMagnitude(R, I, BMAX); // Generazione dello spettro
double x = FFT.MajorPeak(R, BMAX, FREQ); // Frequenza di picco
double k = FREQ / BMAX; // Conversione indice -> frequenza
for (int i = 0; i < BMAX / 2; i++) {
if (i > 1) {
differenzavalori = pgm_read_float(&campione[i]) - R[i];
quadratovalori = pow(differenzavalori, 2);
somma = somma + quadratovalori;
}
}
devstand = sqrt(somma);
ewma_new = devstand / k + ((k - 1) / k) * ewma_old;
esp1.atcmd("AT+CIPSTART="TCP","api.thingspeak.com",80", 5);
sprintf(body, "api_key=%s&field1=%urn", CHANNEL_KEY, int(ewma_new));
sprintf(header, "POST /update HTTP/1.1n"
"Host: api.thingspeak.comn"
"Content-Length: %dnn", strlen(body));
esp1.sendline(header, 5);
esp1.sendline(body, 5);
if ( esp1.parsehttp(body, 5) ) {
Serial.print("POST successful!nBody content is: ");
Serial.println(body);
} else {
Serial.println("nPOST failed");
}
esp1.readline("CLOSED", 5);
delay(30000);
n = 0;
differenzavalori = 0;
quadratovalori = 0;
somma = 0;
devstand = 0;
ewma_old = ewma_new;
ewma_new = 0;
}
}
Notes de l'éditeur
CH-PD = abilita il chip
La trasformata di Fourier permette di decomporre un segnale in un insieme di frequenze e relative ampiezze
Inserendo nel programma la libreria di una versione semplificata, la FFT, è stato possibile trovare per ogni campione le frequenze…
Per trovare la firma, ovvero uno spettro rappresentativo della situazione desiderata ( passaggio auto o ingorgo )
Distanza più equa rispetto ai campioni
RMSD = radice quadrata del quadrato della differenza
Un ingorgo è rilevante solo se duraturo nel tempo, quindi è utile che i valori della distanza ( tra firma e campioni in input) decrescano in maniera graduale verso la soglia che segnala la presenza di un ingorgo. Abbiamo fatto in modo di livellare questi valori perché non si arrivi al di sotto della soglia che segnala l’ingorgo appena questo si forma, ma dopo un periodo di tempo.
Obiettivi breve/medio termine = + amministrazioni e espandersi nel tempo