gy521
Python,  Raspberry PI

Grioscopio GY-521

Raspberry e Python

In questa pagina verrà illustrato come collegare ad una Raspberry un sensore triassiale giroscopico e accellerometrico GY521 con chip MPU-60500 e leggerne i dati. Il sensore in oggetto è contiene un accelerometro MEMS e un giroscopio MEMS in un singolo chip; la sua alimentazione deve essere compresa tra i 3 ed i 5.5V; e comunica tramite protocollo I2C.

Per il collegamento ad ua RASPBERRY saranno necessari soltanto quattro cavetti di collegamento, uno per l’alimentazione Vcc, uno per la Massa GND, e due per i bus dati SDA ed SCL, non deve essere posta nessuna resistenza in nessun pin del dispositivo.

Materiale necessario:

  • una Raspberry
  • una piastra sperimentale (si può anche cablare in aria o su millefori)
  • cavetti
  • Modulo GY-521 MPU-6050 Giroscopio + Accelerometro 3 assi

Configurazione hardware/software

Iniziamo dichiarando i driver, aprire il file:

sudo nano /etc/modules

ed aggiungere le seguenti righe:

GIROSCOPIO
i2c-bcm2708
i2c-dev

Riavviare il sistema e controllare che non vi siano blocchi sulla blacklist. Potrebbe essere vuota, o in caso preporre il simbolo # alle seguenti righe:

sudo nano /etc/modprobe.d/raspi-blacklist.conf
blacklist spi-bcm2708
blacklist i2c-bcm2708

Ora connettere il sensore ed installare I2C-tools:

sudo apt-get install i2c-tools

successivamente eseguire la scansione delle periferiche sul bus I2C, a seconda della versione della scheda:

sudo i2cdetect -y 0 (modelli più vecchi)
sudo i2cdetect -y 1 (modelli più recenti, il mio caso)

su schermo dovrebbe comparire una mappa degli indirizzi, il dispositivo in questione dovrebbe stare in posizione 68.

Infine, bisognerà installare il modulo SMBUS:

sudo apt-get install python-smbus 

Codice in PYTHON

#!/usr/bin/python

import smbus  
import math

# Power management registers
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))

def get_y_rotation(x,y,z):
      radians = math.atan2(x, dist(y,z))
      return -math.degrees(radians)

def get_x_rotation(x,y,z):
      radians = math.atan2(y, dist(x,z))
      return math.degrees(radians)

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)

print "gyro data"
print "---------"

gyro_xout = read_word_2c(0x43)
gyro_yout = read_word_2c(0x45)
gyro_zout = read_word_2c(0x47)

print "gyro_xout: ", gyro_xout, " scaled: ", (gyro_xout / 131)
print "gyro_yout: ", gyro_yout, " scaled: ", (gyro_yout / 131)
print "gyro_zout: ", gyro_zout, " scaled: ", (gyro_zout / 131)

print
print "accelerometer data"  print "------------------"

accel_xout = read_word_2c(0x3b)  accel_yout = read_word_2c(0x3d)
accel_zout = read_word_2c(0x3f)
accel_xout_scaled = accel_xout / 16384.0
accel_yout_scaled = accel_yout / 16384.0
accel_zout_scaled = accel_zout / 16384.0

print "accel_xout: ", accel_xout, " scaled: ", accel_xout_scaled
print "accel_yout: ", accel_yout, " scaled: ", accel_yout_scaled
print "accel_zout: ", accel_zout, " scaled: ", accel_zout_scaled
print "x rotation: " , get_x_rotation(accel_xout_scaled, accel_yout_scaled, accel_zout_scaled)
print "y rotation: " , get_y_rotation(accel_xout_scaled, accel_yout_scaled, accel_zout_scaled)

In uscita avremo delle stringhe simili a queste:

gyro data
------------------
gyro_xout: -92 scaled: -1
gyro_yout: 294 scaled: 2
gyro_zout: -104 scaled: -1

accelerometer data
------------------
accel_xout: -3772 scaled: -0.230224609375
accel_yout: -52 scaled: -0.003173828125
accel_zout: 15408 scaled: 0.9404296875
x rotation: -13.7558411667
y rotation: -0.187818934829

Ovviamente è possibile mettere la routine in loop ed avere la lettura dei valori ogni tot secondi. Muovendo il sensore vedremo i valori cambiare.

Siti di riferimento e fonti

Questo pagina è stata tradotta dal sito: http://blog.bitify.co.uk/2013/11/interfacing-raspberry-pi-and-mpu-6050.html

Un commento

  • Anonimo

    Buonasera,
    grazie per le informazioni illustrate nell’articolo. Le ho seguite fedelmente e riesco ad avere una risposta dal sensore. Purtroppo però tutti i valori che ottengo sono 0. Avete qualche idea su cosa possa essere che non va? Forse il sensore è diffettoso?
    Grazie

Lascia una risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *