Quando si verifica un sisma le onde si propagano su tutta la Terra e vengono registrate da strumenti detti sismografi. Un sismografo è formato da una massa con un pennino, oscillante in una direzione, che scrive su un rullo di carta rotante solidale con il suolo, lasciando una traccia detta sismogramma. Poiché le onde possono arrivare da diverse direzioni, occorrono almeno tre sismografi in grado di registrare le oscillazioni secondo le tre direzioni dello spazio.
Attraverso il sismogramma possiamo ricavare parecchie notizie utili riguardo al terremoto.
In questo articolo vedremo come collegare al Raspberry un GY521 con chip MPU-60500 e leggerne i dati su un grafico che si aggiorna in tempo reale. Sulle porte dati SDA ed SCL, non deve essere posta nessuna resistenza in nessun pin del dispositivo.
Cosa è il GY521
Il sensore GY-521 è sviluppato dalla società InvenSense e contiene al suo interno accelerometri e giroscopi MEMS (Micro Electro-Mechanical System). Inoltre contiene anche un convertitore analogico digitale a 16 bit per ogni canale.
Per tal motivo rileva contemporaneamente l’inerzia sugli assi x,y e z. Per interfacciarsi con Arduino il sensore utilizza una connessione I2C-bus.
I sensori IMU sono composti da due o più componenti. Tra questi vi è l’accelerometro, il giroscopio, il magnetometro ed l’altimetro.
Il sensore GY-521 è in grado di fornire ben 6 valori come output. Tre di questi saranno ricavati dall’accelerometro e 3 dal giroscopio. Accelerometro e giroscopio, sono entrambi contenuti all’interno di un singolo chip.
Cosa è un’accelerometro e un giroscopio? Per non appesantire troppo l’articolo per chi fosse interessato vi rimando a un mio vecchio articolo : Arduino: come funziona il modulo GY-521
Se non hai tanta voglia di leggere l’articolo puoi sempre vedere il video presente sul nostro canale youtube:
Materiale da utilizzare:
Diagramma di collegamento:
Configurazione hardware/software
Configurazione Gy521
Dichiariamo i driver, aprire il file:
1 |
sudo nano /etc/modules |
1 2 |
i2c-bcm2708 i2c-dev |
Riavviare il sistema.
Controllare che non vi siano problemi (per esempio sia vuota) o blocchi sulla blacklist.
1 2 3 |
sudo nano /etc/modprobe.d/raspi-blacklist.conf blacklist spi-bcm2708 blacklist i2c-bcm2708 |
Installare I2C-tools:
1 |
sudo apt-get install i2c-tools |
successivamente eseguire la scansione delle periferiche sul bus I2C, a seconda della versione della scheda:
sudo i2cdetect -y 1
su schermo comparirà la mappa degli indirizzi, il dispositivo in questione dovrebbe stare in posizione 68.
Installare il modulo SMBUS:
Codice
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
#importiamo le varielibrerie from itertools import count import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation import smbus import math import time plt.style.use('fivethirtyeight') x_values = [] y_values = [] power_mgmt_1 = 0x6b power_mgmt_2 = 0x6c def read_byte(adr): return bus.read_byte_data(address, adr) def read_word(adr): high = bus.read_byte_data(address, adr) low = bus.read_byte_data(address, adr+1) val = (high << 8) + low return val def read_word_2c(adr): val = read_word(adr) if (val >= 0x8000): return -((65535 - val) + 1) else: return val def dist(a,b): return math.sqrt((a*a)+(b*b)) bus = smbus.SMBus(1) #bus = smbus.SMBus(0) #A SECONDA DELLA SCHEDA address = 0x68 # A seconda dell'indirizzo trovato precedentamente # Avviamo il chip MPU6050, in questo punto si può avviare un loop bus.write_byte_data(address, power_mgmt_1, 0) index = count() #utilizzata per i valori ascissa def animate(i): accel_yout = read_word_2c(0x3d) accel_yout_scaled = accel_yout / 16384.0 #calcoliamo la variazione sull asse y, il valore sarà scalato x_values.append(next(index))#andremo avanti col grafico y_values.append(accel_yout_scaled) #il valore di y comparirà sull asse delle ordinate plt.cla() plt.plot(x_values, y_values) #disegniamo il grafico ani = FuncAnimation(plt.gcf(), animate, 1000) plt.tight_layout() plt.show() |
Avviamo il codice e vediamo come funziona il nostro piccolo sismografo diy
Ecco i risultati del nostro sismografo
Link utili