Air Quality Sensor


Air Quality Sensor

Lo sviluppo del sensore

La mappatura della qualità dell’aria necessita, ovviamente, di un sensore!
Qui vi presentiamo come abbiamo sviluppato il dispositivo utilizzato!

I requisiti

Che cosa ci serve esattamente? Iniziamo con una lista dei requisiti:

  • un dispositivo capace di rilevare la concentrazione di polveri sottili nell’aria;
  • collegandoli alla posizione in cui sono stati misurati;
  • che sia facilmente trasportabile, leggero, piccolo;
  • dovrà essere in grado di salvare i dati raccolti;
  • e di pubblicarli on-line per poter essere processati.

La lista dei componenti

Facciamo quindi la lista della spesa; abbiamo bisogno di:

  • Un sensore di polveri sottili portatile;
  • Un GPS;
  • Un modulo di memorizzazione dati;
  • Un modulo Wifi;
  • Una batteria per l’alimentazione;
  • Un processore, in grado di gestire tutti i moduli necessari.

La scelta dei componenti e le loro specifiche

Per questa fase vi rimandiamo agli articoli specifici pubblicati nel nostro sito!
Iniziamo con il sensore di polvere, la parte principale del nostro dispositivo, che dovrà essere: preciso, portatile, economico, a basso consumo energetico; ecco cosa abbiamo scelto!

Dust Sensor

Ora tocca al GPS, un’altra parte fondamentale del progetto! Ci permette di associare i dati raccolti con la posizione e… con l’ora! Infatti ci permette di ottenere anche l’ora attuale, in formato UTC. Ecco il nostro!

Modulo GPS

Per il salvataggio dei dati abbiamo scelto un modulo per microSD card, così possiamo salvare tutti i dati raccolti in un piccolo spazio! Here it is!

Modulo SD card

Ora tocca al sistema di condivisione dei dati: la scelta è ricaduta su un modulo wifi a 2,4Ghz, ed eccolo!

Modulo Wifi

Ed ora la parte più importante: il processore! Perché lo abbiamo scelto ed i dettagli nell’articolo!

Microcontrollore

Abbiamo poi un’ultimo componente da analizzare, che fa parte dell’estensione del nostro progetto, permettendoci di raccogliere dati anche riguardo il CO ed il CO2 presenti nell’aria!

Sensori di CO e CO2

I consumi

Il sistema è stato pensato come dispositivo portatile, questo implica che non possiamo permetterci consumi troppo elevati. Una prima versione del sistema è stata realizzata senza possibilità di escludere l’alimentazione dei singoli componenti che rimanevano online per tutto il tempo. Abbiamo così eseguito un’analisi tramite oscilloscopio della potenza assorbita ed i risultati hanno portato alla luce alcuni problemi:

Consumo base totale

Il grafico evidenzia in primis un consumo medio di 0.224 A alimentando il dispositivo con circa 4,8V (5V meno la caduta di tensione causata dalla resistenza di analisi da 1 Ohm posta sull’alimentazione); in secondo luogo si possono osservare alcuni picchi piuttosto intensi che arrivano a 450mA. Indagini più approfondite rivelano che i picchi sono generati dal modulo Wifi costantemente in cerca della disponibilità di Access Point:

Wifi attivo

Il consumo medio di quest’ultimo è di 0.071 A. Nell’immagine i picchi più larghi riguardano, in modalità AP o mista, il broadcast del nome del dispositivo. Test sugli altri componenti hanno portato ai seguenti risultati: consumo medio del GPS pari a 0.037 A, consumo medio del modulo SD pari a 0.004 A ed il consumo medio del DustSensor pari a 0.098 A. Il grafico seguente indica la ripartizione del consumo totale del dispositivo:

Ripartizione consumi

Si può osservare che il modulo WiFi ed il sensore di polvere possiedono le fette più grandi della torta ed è quindi su di loro che verrà posta maggiore attenzione durante la fase di ottimizzazione dei consumi; la voce “Residuo” presente nella legenda in questo caso raggruppa i consumi del microprocessore, del led di debug e del regolatore di tensione per il modulo wifi (escludendo la corrente assorbita dal modulo stesso). L’immagine seguente invece descrive i consumi dei vari elementi nel tempo percepibili dal grafico dei consumi totali:

Consumi e timing

Considerando che:

  • i consumi del modulo SD sono pressoché costanti e poco influenti;
  • i consumi del led utilizzato sono funzione del programma e molto contenuti;
  • i consumi del processore sono difficilmente analizzabili a causa dell’eccessivo rumore generale nel grafico;

possiamo procedere all’analisi del timing degli altri componenti in base ai consumi temporali del dispositivo. Osservando la presenza di alcune sequenze ripetitive assai appariscenti nel grafico ed analizzando le specifiche dei vari componenti è facile individuare sia il momento di maggior consumo del GPS, sia quello del DustSensor. I due moduli hanno infatti un tempo di ciclo proprio pari a 1 secondo e 2,5 secondi circa rispettivamente. L’incremento dei consumi negli intervalli evidenziati è pressoché trascurabile, per il momento, se relazionato al consumo complessivo del dispositivo.

Ottimizzazione dei consumi

Per procedere ad un’ottimizzazione del sistema elenchiamo nuovamente i moduli da cui è composto:

  1. modulo SDcard
  2. modulo GPS
  3. modulo DustSensor
  4. modulo WiFi
  5. microprocessore

Andiamo con ordine e vediamo cosa possiamo migliorare:

modulo SDcard

Il consumo di questo modulo è molto basso, attorno ai 4-5 mA sia in fase di standby che in scrittura. L’algoritmo implementato nella prima fase di prototipizzazione prevede il salvataggio di una stringa di dati ad ogni ciclo, il chè significa una stringa al secondo. Dato che la procedura di srittura di n stringhe richiede più operazioni se effettuata una alla volta rispetto al salvataggio di tutte e n le stringhe tramite un singolo accesso al file presente sulla microSD, è possibile ottenere una piccola riduzione dei consumi mantenendo in memoria nel microprocessore più stringhe per poi salvarle tutte assieme. Più stringhe si riesce ad associare maggiore è il risparmio energetico. E’ però necessario trovare un bilanciamento con la possibilità di perdere dei dati quando viene scollegata l’alimentazione: infatti spegnendo il dispositivo (oppure in caso di temporaneo scollegamento del sistema di alimentazione) le stringhe in memoria verrebbero perse tutte quante. La quantità di dati da bufferare è quindi da mettere in relazione con la quantità di dati che si è disposti a perdere in caso di mancanza di alimentazione o arresto del dispositivo.

modulo GPS

I consumi del GPS si aggirano sui 37-40 mA; purtroppo questo dispositivo all’avvio necessita diverso tempo per ottenere la posizione dai satelliti. In caso di brevi arresti, se la posizione era già stata acquisita, il tempo per tornare online è di qualche decina di secondi grazie alla presenza di una piccola batteria tampone a bordo del modulo; ma nel caso in cui non si abbia ancora il “lock” della posizione continui arresti e riavvi del modulo causano l’impossibilità di ottenere le coordinate corrette. Inoltre, visto il fine per il quale questo sistema viene realizzato e l’importanza di associare la posizione ai dati raccolti è necessario avere costantemente informazioni dal GPS. Nel caso in cui il sistema venga montato in modo statico all’interno del parco può risultare particolarmente conveniente dal punto di vista energetico, spegnere il modulo appena ne viene rilevata la posizione, in quanto questa non varia nel tempo.

modulo DustSensor

I consumi in questo caso sono attorno ai 98 mA. Considerando però che il modulo necessita di un tempo di avvio di circa 5 secondi e dell’impiego del sistema (come nel caso precedente), arrestare il sensore per poi riavviarlo causerebbe una distanza fra le misurazioni minima di 7.5 secondi, rendendo la raccolta dati molto difficile da realizzare. Supponiamo di utilizzarlo mentre andiamo tranquillamente in bicicletta a circa 20 km/h: spegnere e riaccendere il modulo con un delay nullo significa avere un dato ogni 42 metri; questa distanza di acquisizione in città può rilevarsi troppo eccessiva a causa delle forti variazioni di traffico automobilistico fra una via e l’altra. Lo spegnimento del modulo è quindi sconsigliato per lo scopo di questo progetto; può tuttavia dimostrarsi interessante per applicazioni statiche come il rilevamento delle condizioni dell’aria durante tutta la giornata nello stesso punto.

modulo Wifi

E’ su questo modulo, nel nostro caso, che l’ottimizzazione diventa interessante! Con un consumo in modalità AP (Access Point) di 71 mA è facile intuire come sia inutile mantenere questo elemento costantemente attivo. Nella tabella seguente sono riportati i consumi in base alle varie attività svolte dal dispositivo:

WifiConsumption

Possono essere applicate più tipi di ottimizzazione, a seconda dell’utilizzo che si prevede per il modulo:

  • Uso delle modalità Power save mode, utile nel caso di utilizzo continuo del telefono come punto di accesso ad internet in modalità thetering, dove il collegamento Client/AP è stabile e continuo.
  • Modalità Deep-Sleep, nel caso in cui si preveda di effettuare una connessione alla rete in modo programmato, oppure ad intervalli regolari, come nel caso di utilizzo statico in punti con copertura WiFi.
  • Power OFF mode Software o Hardware, nel caso in cui la copertura WiFi sia disponibile solo in luoghi specifici; il risveglio del modulo può essere previsto tramite timer/orologio, zona geografica (range di coordinate GPS) oppure manuale (utilizzando l’interruttore posto sul dispositivo.

La soluzione scelta per il cablaggio dei componenti prevede un Mosfet sulla linea di alimentazione del modulo (attivabile tramite GPIO) e la connessione del pulsante ad un GPIO del microcontrollore, così da rendere possibile l’utilizzo di tutte le precedenti configurazioni semplicemente agendo via modifiche software. Il Mosfet consente di agire a livello di arresto hardware; l’interruttore può essere utilizzato per comandare la sequenza di spegnimento software e la connessione diretta con il microcontrollore delle linee di comunicazione consentono l’abilitazione delle modalità di Power Save.

Microcontrollore

L’ottimizzazione di questo componente può essere rivolta sia verso la diminuzione della frequenza di clock, sia con l’utilizzo delle modalità di risparmio energetico disponibili. Tutto dipende dall’utilizzo previsto per il sistema: infatti se consideriamo il progetto attuale dove è importante avere un elevato rate di misurazioni sia della posizione che della qualità dell’aria, le modalità di risparmio energetico non sono così vantaggiose: potrebbero consentire di ottenere minori consumi sul processore per una media di 0.3 secondi ogni secondo di ciclo, ma dato che l’influenza del consumo sul totale sarebbe inferiore all’1%, questo elemento non è così essenziale da ottimizzare. Per quanto riguarda la riduzione della frequenza di funzionamento (anch’essa comunque porterebbe miglioramenti massimi inferiori al 2%) si riscontrano diversi problemi relativi alla moltitudine di dati da elaborare. Specialmente per quanto riguarda il GPS si necessita di un’elevata velocità di elaborazione in quanto bisogna assolutamente evitare che il buffer disponibile per la comunicazione seriale di 64byte vada in overflow; il tutto considerando che il processore è collegato ad altre due linee seriali che possono richiedere, tramite interrupt, l’interruzione della ricezione di comunicazioni dal GPS. La frequenza utilizzata per il microcontrollore dovrà dunque essere sufficientemente elevata da permettere di ricevere dati contemporaneamente da tre seriali (GPS, DustSensor, WiFi), inizializzate a 9600 bps. A livello pratico significa che il processore dovrà essere in grado di processare ogni bit in arrivo in meno di 1/(9600 * 3) secondi (tempo in cui deve accorgersi del cambio di stato della linea, decodificare il dato in arrivo, salvarlo nel buffer (o nella stringa nel caso del GPS)). Più avanti si potranno effettuare test specifici a differenze frequenze di clock per trovare la minima possibile. Grazie alla configurazione dei cablaggi infatti questa specifica può essere ricercata sperimentalmente in seguito alla realizzazione del sistema adattandola caso per caso; l’analisi di polveri in luoghi prefissati che non richiedono l’uso continuativo di GPS infatti consentono senza dubbio l’impiego di frequenze inferiori rispetto alla mappatura di vaste aree.

Sensori CO e CO2

Un’evoluzione del sistema realizzato prevede la sostituzione/abbinamento al sensore di polveri, di due sensori per la rilevazione delle concentrazioni di CO e CO2 presenti nell’aria. Questi sensori hanno un consumo piuttosto elevato (140 mA l’uno) a causa della necessità di portare l’elemento sensibile a temperatura. Questi valori di corrente porterebbero a pensare di poter ottimizzare il sistema spegnendo e riaccendendoli quando necessario: purtroppo però questi sensori (come descritto dettagliatamente nell’articolo relativo alla loro taratura), necessitano di svariate decine di minuti per entrare a regime completamente, rendendo impossibile l’operazione di spegnimento. Nel grafico sottostante si paragona l’avvio del sensore alla misurazione del segnale analogico in uscita, che arriva ad una prima fase di stabilizzazione dopo meno di un secondo, ma richiede molto più tempo per ottenere una misura stabile.

Stabilizzazione

In blu è visibile la tensione di alimentazione all’avvio, in rosso l’uscita analogica del sensore. L’asse delle ascisse indica il progressivo dei punti rilevati: un’unità vale 8 nanosecondi.

Lo schema elettrico

Ed ecco lo schema elettrico che indica come abbiamo scelto di collegare i nostri componenti!

SchemaElettrico

Come si può notare l’alimentazione del modulo wifi è gestita da un mosfet comandato da un GPIO del microcontrollore, ed anche sul sensore di polvere ne è stato montato uno che fa da ponte fra il pin SET ed il pin SLEEP, consentendo di portare il modulo in sleep mode con consumi minori di 10 uA. Al modulo wifi è connesso anche il regolatore di tensione per passare da 5V a 3V3 e il pin Rx è pilotato passando attraverso un partitore di tensione, sempre per adattare il Tx a 5V con l’Rx a 3V3. Non è necessario fare il contrario in quanto il valore di 3V è già riconosciuto come UP dagli ingressi digitali del microcontrollore.

L’assemblaggio

E’ tempo di unire tutti i componenti, da soli di sicuro possono fare poco!
Siamo ancora in fase di prototipazione, quindi niente PCB luccicosi per il momento, dobbiamo accontentarci delle schede millefori e un bel groviglio di fili; l’importante è che funzioni! All’estetica penseremo più avanti!

Il sistema, per motivi di compattezza, è stato sviluppato su due piani: processore, lettore microSD e modulo wifi sotto, GPS e sensore per la polvere sopra. L’assemblato raggiunge le dimensioni di un cellulare moderno, solo un po’ più spesso ed il pacco batteria può essere montato a seconda delle necessità: leggerezza e trasportabilità oppure autonomia!

Sensor-Retro

Assemblato

Il programma

Il programma caricato sul microcontrollore è sviluppato secondo il principio della macchina a stati (o finite state machine).
Questo modello di programmazione prevede che il sistema sia classificato in un numero finito di stati in cui può trovarsi; ogni stato è caratterizzato da alcune operazioni che il processore deve svolgere. In questo caso si è scelto di utilizzare un Master-State chiamato IDLE e identificato con il codice 0; questo stato dirige le operazioni ed il passaggio da uno stato all’altro del sistema.

State Machine

Gli altri stati in cui il sistema è stato suddiviso sono:

  1. Read Dust Sensor Data: durante il quale vengono lette le informazioni provenienti dal sensore di polvere;
  2. Read GPS Data: qui vengono analizzate le informazioni ricevute dal GPS;
  3. Write Data On SDcard: dove vengono salvati i dati raccolti;
  4. Send Data Over Wifi: dove si inviano i dati all’esterno, in modalità Real-Time oppure appena è disponibile un punto di accesso WiFi;
  5. Send Data Over Serial: dove i dati vengono inviati di volta in volta tramite USB e tramite le porte Tx/Rx predefinite per la condivisione dei dati ed il debug;
  6. System Check: si tratta di un particolare stato in cui vengono eseguiti particolari controlli sul corretto funzionamento del sistema, in caso di errori interviene ricaricando il programma o riavviando il microcontrollore.

Qualche approfondimento riguardo alcuni stati specifici:

Read Dust Sensor

PM10

Le operazioni effettuate in questo stato riguardano la ricerca, all’interno del buffer di memoria, di una stringa completa inviata dal sensore di polvere ed il successivo parsing per ottenere tutte le informazioni di cui abbiamo bisogno. La lunghezza di una comunicazione occupa 31 byte; in questo caso il buffer disponibile per gli interrupt della comunicazione seriale di 64 byte si dimostra sufficiente a contenere almeno una stringa completa. Dai dati ricevuti si ricavano le informazioni sulle concentrazioni di PM10, PM2,5 e PM1 rilevate dal sensore; può essere attivato lo stato di System Check se non si rilevano informazioni corrette da parte del sensore.

Read GPS Data

GPS

Molto simile al precedente caso, questa procedura riceve ed analizza i dati provenienti dal GPS, in questo caso però il buffer da 64 byte non è sufficiente (una comunicazione del modulo GPS si aggira attorno ai 500-600 byte) e richiede quindi particolare attenzione. Il problema viene risolto prima pulendo il buffer di memoria, e poi rimanendo in ascolto delle comunicazioni in arrivo fino alla ricezione di un set di dati completo che vengono costantemente copiati dal buffer e salvati in memoria per evitare l’overflow della memoria disponibile dedicata alla comunicazione seriale. L’accensione del led di debug da noi montato sulla scheda conferma l’acquisizione dei satelliti e quindi la possibilità di iniziare a muoversi per raccogliere i dati.

Write Data On SDcard

SD

 

I dati raccolti vengono di volta in volta salvati sulla SDcard. Per evitare problemi si sono prese alcune precauzioni: l’accesso all’SDcard è effettuato nel minor tempo possibile, così da evitare il più possibile problemi di corruzione dei file nel caso di spegnimenti improvvisi; ogni determinato numero di record salvati viene generato un nuovo file, sempre per evitare di perdere troppi dati in caso di errore; all’avvio del sistema viene sempre generato un file nuovo con un numero progressivo successivo all’ultimo file già in memoria, evitando così di sovrascrivere dati già presenti. Un breve lampeggio del led di debug inoltre indica che il sistema sta accedendo all’sdcard così da permettere all’operatore di evitare di spegnere il sistema durante la scrittura dei dati.

Send Data Over Wifi

WIFI

I dati raccolti possono essere inviati tramite due modalità:

La prima prevede che il dispositivo possa essere connesso costantemente alla rete, per esempio se si utilizza un telefono in modalità thetering oppure se si vuole raccogliere dei dati in una zona coperta da una rete WiFI;
La seconda è ideale se invece ci si muove molto, ed è pensata per connettersi alle reti presenti sul percorso inviando di volta in volta gli ultimi file di dati raccolti.

Per la condivisione dei dati ci si appoggia sulla piattaforma di messaggistica istantanea e gratuita Telegram; che tramite le API messe a disposizione consente l’invio di messaggi semplicemente attraverso la richiesta di collegamenti https appositamente configurati. Dettagli più precisi verranno illustrati nel progetto AirQualityDataBroadcast.

Send Data Over Serial (incluso in Write Data On SDcard)

In questo stato vengono inviati singolarmente i dati raccolti (in modo identico a come vengono salvati sulla SDcard) così da consentire di espandere il sistema con altri componenti con il quale è in grado di interagire (è prevista una futura espansione del dispositivo con l’aggiunta di un piccolo schermo) e di inviare i dati ad un computer per l’analisi immediata oppure per effettuare il debug del sistema.

System Check

Questa modalità può essere programmata per eseguire differenti test di funzionamento del sistema, come ad esempio la verifica della consistenza dei dati raccolti (valori di PM10 “possibili” e coordinate GPS realistiche che indicano velocità di movimento entro determinati limiti umanamente impossibili) per poi prendere le necessarie contromisure tra cui: tentare il ripristino di un file, mettere il sistema in pausa in attesa di dati consistenti, riavviare il sistema oppure comunicare lo stato di errore all’utente tramite l’uso del led di debug.

Forma dei dati raccolti

I dati raccolti, salvati sulla SD ed inviati tramite Telegram sono nella forma:

1#2017#2#8#15#55#41#46.06669200#11.14907700#22#27#29#

Dove i vari elementi in ordine, separati da “#”, rappresentano:

  1. La conferma di aggancio della posizione dei satelliti da parte del GPS (1 = lock on)
  2. Anno
  3. Mese
  4. Giorno
  5. Ora
  6. Minuti
  7. Secondi
  8. Coordinate di Latitudine
  9. Coordinate di Longitudine
  10. Valori di PM1
  11. Valori di PM2,5
  12. Valori di PM10

Alimentazione

Per l’alimentazione del dispositivo si sceglie di utilizzare un comunissimo batterypack (o power bank) per la ricarica dei cellulari. Queste batterie portatili sono in grado di alimentare dispositivi a 5V con correnti piuttosto elevate (su alcuni modelli si raggiungono i 3 Ampere). Il pacco da noi scelto è molto piccolo e leggero, con una capacità di 1’800 mAh:

BatteryA seguito delle ottimizzazioni realizzate, il dispositivo è in grado di operare in modalità “acquisizione continua” con un consumo di 154 mA con modulo wifi spento, arrivando ad un massimo di 220 mA in fase di trasmissione dati via WiFi con ricevitore molto distante. L’autonomia del sistema, supponendo di utilizzare l’alimentazione a batteria descritta, risulta di:

  • 1800/154 = 11 ore e mezza con modulo Wifi spento;
  • 1800/220 = 8 ore abbondanti in modalità trasmissione dati continua.

L’autonomia sarà quindi intermedia fra i due risultati indicati, proporzionalmente al tempo di utilizzo del modulo WiFi.

Imballaggio

Ora tocca all’ultima parte, ovvero l’impacchettamento del nostro sensore! Purtroppo non siamo ancora riusciti a realizzare una custodia in plastica o plexiglas come si deve, e dobbiamo arrangiarci con un po’ di bricolage!

Sistema di raffreddamento

Non di dimentichiamoci di un passaggio molto importante: il raffreddamento del nostro sistema. Nonostante le temperature raggiunte non siano per nulla preoccupanti, abbiamo deciso di sfruttare al meglio la ventola di aspirazione dell’aria del sensore di polveri sottili: affiancando il sensore al nostro circuito otteniamo un grande vantaggio! L’aria entra dal foro di aspirazione, passa davanti al sensore e viene espulsa tramite la ventola che la dirige proprio contro il microcontrollore raffreddandolo. L’immagine seguente mostra in dettaglio il percorso dell’aria.

Flusso Aria

Confezionamento

Tutto il sistema è racchiuso in una piccola scatola rigida, con alcune feritoie per l’aspirazione/espulsione dell’aria, per il cavo di alimentazione, accesso alla scheda SD, accesso all’interruttore ed al led di debug. Sulle due estremità della scatola sono stati aggiunti due elementi per evitare che l’aria venga forzata ad attraversare il sensore: la disposizione di questi elementi, anche in caso di forte vento, consente all’aria di passare tangente al sistema, lasciando la regolazione del flusso sotto il controllo della ventola interna.

Confezionamento

Feritoie aria