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