
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