Home / Cosmic Rays / Raspberry Pi Logger

Raspberry Pi Logger

Introduzione

E’ arrivato il momento di utilizzare il Raspberry Pi ! Non spendiamo parole per descrivere questo computer in formato “carta di credito” : in internet si trovano centinaia di ottimi siti / informazioni su questa scheda, per cui rimandiamo alla documentazione che facilmente si trova online.
In questo post ci concentriamo invece su di una applicazione del Raspberry Pi in ambito scientifico : il datalogger.
Un datalogger è un registratore di dati, acquisiti solitamente da uno o più sensori e memorizzati in una memoria interna. Si tratta di una applicazione perfetta per il Raspberry Pi : con il suo basso costo, la piccola potenza richiesta per funzionare, le dimensioni fisiche contenute e la ricca dotazione software open source, questo apparato è meravigliosamente adatto per essere utilizzato come punto di raccolta dati.
Nel nostro caso abbiamo raccolto i dati attraverso interfaccia seriale. I dati vengono raccolti da un chip PSoC 5lp e vengono inviati al Raspi attraverso interfaccia seriale. Nel nostro caso i dati sono costituiti dal conteggio dei raggi cosmici che vengono catturati da un sensore a scintillazione, questo sensore è stato descritto nel post : Rilevatore a Scintillazione di Muoni Cosmici. La medesima configurazione HW e SW del Raspberry può comunque essere utilizzata per qualsiasi tipo di dati.
L’immagine sotto mostra lo schema logico dei collegamenti.

Configurazione HW

Per utilizzare l’interfaccia seriale del Raspberry bisogna tenere conto del fatto che il Raspi lavora a 3.3V. Utilizzare livelli di tensione diversi, ad esempio i classici 5V, potrebbe portare a mal funzionamenti oppure causare danni permanenti al processore.
Il microcontrollore PSoC che acquisisce i dati lavora invece a 5V, per questo motivo abbiamo deciso di utilizzare un traslatore di livello, tra il Raspi ed il PSoC, in modo da rendere compatibili le rispettive linee seriali.
L’immagine sotto mostra i pin utilizzati sulla morsettiera del nostro Raspberry.

Il traslatore di livello è un semplice circuito, spesso su breakboard, che si occupa di modificare il voltaggio dei livelli logici sulle linee utilizzate per la trasmissione di dati binari. Al traslatore di livello vengono fornite le rispettive tensioni di lavoro nelle due linee, nel nostro caso i 3.3V dal Raspberry ed i 5V dal PSoC. I collegamenti sono mostratoi nella figura sotto.

Configurazione SW

Partiamo da un Raspberry Pi 3 Modello B+ con sistema operativo Linux caricato da SD card in configurazione basica. E’ necessario fare qualche modifica alla configurazione per abilitare (e far funzionare) la porta seriale.
Nel file /etc/modules verificare la presenza, o aggiungere, le seguenti linee :

i2c-dev
i2c-bcm2708
spi-bcm2708
spidev
w1-gpio
w1-therm

Nel file /boot/confix.txt è necessario aggiungere le seguenti linee :

dtoverlay=pi3-disable-bt 
enable_uart=1
core_freq=250

La prima linea disabilita il Bluetooth, la seconda linea abilita la comunicazione seriale, la terza linea fissa la frequenza di clock del processore a 250MHz. Dato che il baudrate della seriale è collegato al clock di sistema vogliamo che quest’ultimo resti costante, altrimenti la comunicazione seriale non può funzionare correttamente. Con le configurazioni sopra descritte la porta seriale sarà disponibile su /dev/serial0.

Codice di Esempio

Dopo la preparazione hardware e le configurazioni software di Linux si può iniziare ad utilizzare la seriale scrivendo un opportuno programma in python. Le righe di codice python riportate sotto mostrano le istruzioni base per l’utilizzo della linea seriale. Evidenziamo l’istruzione di definizione della porta nella quale sono specificati il punto di mount nel file system “/dev/serial0” e la velocità di trasmissione, baudrate, che deve corrispondere alla velocità della seriale sul PSoC, 115000, nel nostro caso.
Il dato sulla seriale viene letto con l’istruzione readline() che legge la riga intera fino ai caratteri di terminazione. Il dato viene convertito in formato float ed inserito in un array di dati.

import serial
import numpy as np
ser = serial.Serial('/dev/serial0', 115200)
ser.flushInput()
CPM = np.float32(ser.readline())   # converts the CPM string to a float
DataArray[nDataPoints] = CPM
nDataPoints = nDataPoints +1

A titolo di esempio riportiamo sotto la parte di codice PSoC nel quale viene scritto su seriale il valore del conteggio di eventi per minuto (CPM : counts per minute). Il valore numerico del conteggio, minuteMuonCount, viene preceduto dal prefisso CP, e seguito dai caratteri di terminazione “\r\n

 /* Send out the data in the serial channel */
char TransmitBuffer[TRANSMIT_BUFFER_SIZE];
sprintf(TransmitBuffer,"CP%u",minuteMuonCount);
strcat(TransmitBuffer,"\r\n");
/* Send out the data with prefix CP */
UART_PutString(TransmitBuffer);

Download del software python per la acquisizione da porta seriale dei conteggi dei raggi cosmici : CosmicPI_1.1. Basato su Aurora-Monitor.

Elaborazione dei Dati Raccolti

I dati che vengono acquisiti via collegamento seriale dal Raspberry Pi possono essere semplicemente memorizzati su file per essere elaborati successivamente, oppure possono venire visualizzati in “tempo reale” mentre sono acquisiti. Le modalità di memorizzazione, elaborazione e visualizzazione dei dati dipendono principalmente dal tipo specifico di applicazione e soprattutto dall’intervallo temporale di raccolta dati. Per tempi brevi (minuti) si può utilizzare la visualizzazione in tempo reale; per tempi lunghi (ore o giorni) può essere più opportuno memorizzare i dati su file ed elaborarli successivamente.
Python si presta alla elaborazione e visualizzazione dei dati raccolti. Le librerie numpy, matplotlib e scipy contengono tutte le funzioni necessarie; il pacchetto obspy può essere convenientemente utilizzato per la memorizzazione ed elaborazione di dati in formato miniseed (formato pensato inizialmente per dati geofisici).

I grafici sotto mostrano il tasso di conteggio dei raggi cosmici (eventi per minuto) registrato durante due giornate.

Check Also

Trinitite

Un pò di storia : cos’è la Trinitite ? La trinitite (conosciuta anche come vetro di Alamogordo o atomite) è …