• Non ci sono risultati.

Programmazione: acquisizione e gestione dei dati

Studiare i terremoti con un sismografo didattico

2. Realizzazione dello strumento

2.5 Programmazione: acquisizione e gestione dei dati

uno slave, rappresentato dal convertitore ADS1115.

2.5 Programmazione: acquisizione e gestione dei dati

Damiano Biagini e Filippo Menchini hanno elaborato gli script sulla base di alcuni modelli creati da Clovis Parker­Jervis [2015] per il British Geological Survey necessari per il data management relativo ai dati acquisiti dal sismometro (https://www.bgs.ac.uk/discoveringGeology/hazards/

earthquakes/schoolSeismology/seismometers/raspberryPi.html).

Gli strumenti

Raspberry Pi 3 Plus: un single­board computer a basso costo (Fig. 11) sviluppato nel Regno Unito dalla Raspberry Pi Foundation. Utilizza sistemi operativi con kernel Linux o RISC.

Scheda micro SD 32GB: una scheda che Raspberry Pi3 utilizza come memoria di massa per l’installazione del sistema operativo e per il salvataggio dei dati.

Computer generico: un pc di supporto da utilizzare per installare il sistema operativo Raspbian sulla scheda SD e/o visualizzare i dati inviati dal Raspberry Pi3.

Figura 11 Circuito stampato di condizionamento del segnale (in alto) e circuito di conversione analogico­digitale (in basso).

Sistema operativo: Raspberry Pi3 utilizza il sistema operativo Raspbian, un equivalente di Debian della famiglia Linux (https://www.raspberrypi.org/downloads/raspbian/).

Librerie e Risorse: per lo sviluppo degli script che vengono utilizzati nel progetto si utilizza il linguaggio di programmazione Python nella versione 2.7 con l’implementazione di apposite librerie:

ADS1x15 (https://github.com/adafruit/Adafruit_Python_ADS1x15) per interfacciarsi con

il convertitore analogico­digitale ADS1115;

Obspy (https://github.com/obspy/obspy/) [Beyreuther et al. 2010, Megies et al., 2011,

Krischer et al., 2015], un applicativo Python per la sismologia.

Gli script

Gli script Python realizzati e utilizzati sono 3 e hanno diverse funzioni a seconda delle esigenze dell’utente.

continous.py

Script che permette di acquisire e visualizzare il valore dei dati in ingresso sulla porta seriale di Raspberry Pi3. È utilizzato principalmente in fase di testing per verificare la consistenza e la correttezza dei valori acquisiti (esempio di output in Fig. 12).

I passaggi fondamentali sono i seguenti:

Creazione di un’istanza tramite la libreria Adafruit per controllare il convertitore 1.

import Adafruit_ADS1x15

adc = Adafruit_ADS1x15.ADS1115()

Dichiarazione delle variabili che definiscono le caratteristiche del flusso di corrente 2.

GAIN = 2/3 #valore corrispondente a un fondo scala di +/-6,144V

multiplier = 0.1875 #moltiplicatore con valore di default per la stampa dei risultati

All’interno di un ciclo infinito, l’acquisizione avviene tramite un metodo dell’istanza 3.

precedentemente creata

value = Adafruit_ADS1x15.ADS1115().get_last_result()

Il ciclo di acquisizione dei valori viene interrotto con il seguente metodo 4.

Adafruit_ADS1x15.ADS1115().stop_adc()

seis_trace.py

Script che realizza un grafico con i dati raccolti in un breve intervallo di tempo È utilizzato principalmente come test per verificare l’acquisizione dei dati tramite una visualizzazione grafica, che può essere esportata come immagine (Fig. 13).

I passaggi fondamentali sono i seguenti:

Importazione delle librerie necessarie 1.

import numpy

from obspy.core import Trace,Stream,UTCDateTime import Adafruit_ADS1x15

Creazione di un’istanza per controllare il convertitore tramite la libreria Adafruit 2.

adc = Adafruit_ADS1x15.ADS1115()

Dichiarazione delle variabili e degli array 3.

GAIN = 2/3 #valore corrispondente a un fondo scala di +/-6,144V sps = 250 #sample rate del convertitore

time = 10 #durata del campionamento in secondi datapoints = 2500 #numero di sample acquisiti

sampling = 1/(time/float(datapoints)) #sample rate dei valori sul grafico

MISCELLANEA ING V

n.

58

data=numpy.zeros([datapoints],dtype=numpy.int16) #array contenente i dati starttime=UTCDateTime() #tempo di inizio dell’acquisizione

Inizio della conversione ADC 4.

adc.start_adc_difference(0,gain=GAIN,data_rate=sps)

I sample vengono acquisiti tramite il seguente metodo 5.

sample = adc.get_last_result()

Al termine della conversione, la stessa viene interrotta con il metodo stop_adc 6.

adc.stop_adc()

Il salvataggio e il plot dei dati viene eseguito tramite la definizione di diversi parametri, 7.

tra cui i dati, le informazioni relative alla stazione e il formato del file finale

stats= {‘network’: ‘LU’, ‘station’: ‘ITIS’, ‘location’: ‘01’, ‘channel’: ‘BHZ’, ‘npts’: datapoints,

‘sampling_rate’: sampling, ‘mseed’ : {‘dataquality’ : ‘D’}, ‘starttime’: starttime}

stream =Stream([Trace(data=data, header=stats)])

stream.write(‘test.mseed’,format=’MSEED’,encoding=’INT16’,reclen=512) stream.plot()

Figura 12 Esecuzione dello script continous.py.

leggi_dati_coda.py

Script che effettua la lettura dei dati, scrivendoli su file giornalieri in formato mseed (standard per la sismologia). Lasciando il sismometro in acquisizione e lo script in esecuzione, quest’ultimo provvede a formare un archivio costantemente aggiornato relativo ai dati giornalieri acquisiti dallo strumento (Fig. 14).

I passaggi fondamentali sono i seguenti:

Importazione delle librerie necessarie 1.

import numpy

from obspy.core import read,Trace,Stream,UTCDateTime import Queue

from threading import Thread import os.path

import subprocess import Adafruit_ADS1x15

Creazione di un’istanza per controllare il convertitore tramite la libreria Adafruit 2.

adc = Adafruit_ADS1x15.ADS1115()

Dichiarazione di variabili e funzioni 3.

block_length = int(time1*frequency)

mseed_directory = ‘/home/pi/scripts/mseed/’

queue = Queue.Queue()

adc.start_adc_difference(0,gain=GAIN,data_rate=sps)

Definizione della funzione read_data() per la lettura dei dati 4.

def read_data():

startTime=UTCDateTime() #sincronizzazione tramite protocollo NTP t1=startTime

Figura 13 Plot di un segnale acquisito dal sismometro. L’acquisizione dello strumento era ancora in fase preliminare, pertanto si può notare un sottosmorzamento dello stesso e disturbi ad alta frequenza dovuti al setup sperimentale.

packet.append(t1) queue.put(packet)

while ((t2-t1) <= period):

t2=UTCDateTime() t1+=period

Definizione della funzione save_data() per il salvataggio dei dati in file mseed. Le seguenti 5.

righe di codice illustrano un’architettura di salvataggio strutturata organizzata con file giornalieri in formato mseed che contengono i dati.

def save_data(): samplingrate = frequency stats = {‘network’: ‘LU’ print (mseed_directory + str(sample_stream[0].stats. starttime.date) + ‘.mseed’

File = mseed_directory + str(sample_stream[0]. stats.starttime.date) + ‘.mseed’

temp_file = mseed_directory + “.temp.tmp”

if os.path.isfile(File):

sample_stream.write(temp_file,format=’MSEED’, reclen=512)

subprocess.call(“cat “+temp_file+” >> “+

File,shell=True)

subprocess.call([“rm”,temp_file]) else:

sample_stream.write(File,format=’MSEED’, reclen=512)

Avvio delle funzioni con sistema multi­thread che permette di eseguire come flusso 6.

indipendente le operazioni di salvataggio dei dati.

worker_sample = Thread(target=save_data) worker_sample.start()

read_data()

Invio dei dati

Modalità

Una volta completato il progetto sarà possibile inviare i dati acquisiti per essere salvati su un database (gestito per esempio da INGV) tramite una comunicazione client/server realizzata attraverso alcuni script in linguaggio Python. Tale comunicazione utilizza una logica di aggiornamento costante dei dati all’interno del file giornaliero corrente, il quale, al cambiare della data, smette di essere aggiornato in favore di un nuovo file giornaliero. Questo sistema contribuirà a formare un archivio con file divisi per giorno. Pur avendo realizzato lo script per questa operazione il collegamento non è stato messo in essere a causa della mancata installazione del sismometro.

Lettura

I file vengono letti e analizzati continuamente uno per volta, quindi uno per giorno, con programmi specifici per la lettura dei file in formato miniseed.

3. Formazione

La seconda fase del progetto è articolata in dieci incontri di formazione per approfondire gli aspetti teorici del terremoto e svolgere esercitazioni pratiche di analisi dei dati. Per questo è stato predisposto un mini corso di programmazione in linguaggio Python, con particolare attenzione all’uso della libreria Obspy specifica per l’analisi dei segnali sismici.

Tutte le attività sono state svolte utilizzando software e hardware open source per l’acquisizione, visualizzazione ed analisi dei dati: questo aspetto è importante per garantire longevità al progetto non essendo vincolato al rinnovo di canoni di licenza onerosi per l’istituzione scolastica.

A questa seconda fase hanno partecipato tutti gli alunni della classe IV del Liceo Scientifico.

MISCELLANEA ING V

n.

58

Figura 14 Esecuzione dello script leggi_dati_coda.py.

Le lezioni, della durata di 2 ore, si sono svolte presso la scuola con cadenza settimanale in orario pomeridiano. Gli incontri sono iniziati nel mese di febbraio e sono terminati agli inizi di maggio.

Metà delle lezioni hanno avuto un approccio teorico e l’altra metà pratico. Gli argomenti delle lezioni sono sinteticamente descritti nella prossima sezione.