Accelerometro GY-521 (MPU6050)

Per poter analizzare il super progetto che sta uscendo inerente al drone da guardia, #irondrone, è necessario prima, fare piccoli progettini con i sensori che andremo a mettere poi, tutti insieme, sul nostro irondrone.

Partiamo dall’accelerometro, ovvere il sensore che ci permetterà di capire la posizione del nostro drone rispetto al suolo terrestre, questo è utilissimo per calibrare i motori e mantenere quindi una posizione costante, oltre che a darci un’idea visiva della posizione in aria del nostro piccolo 250.
Partiamo dal presupposto che il sensore utilizzato è il : GY-521 o MPU6050

Quindi avremo bisogno del:

Installiamo i moduli necessari al funzionamento tramite:

sudo pico /etc/modules

Aggiungiamo queste linee alla fine del file e riavviamo il nostro raspi.

i2c-bcm2708
i2c-dev

Modifichiamo la blacklist:

sudo pico /etc/modprobe.d/raspi-blacklist.conf

ed aggiungiamo queste due righe con il cancelletto, semmai fossero non commentate:

#blacklist spi-bcm2708

#blacklist i2c-bcm2708

Connessione al raspberry del sensore:

Colleghiamo il sensore con questi PIN della gpio:

  • Pin 1 – 3.3V Connesso al VCC
  • Pin 3 – SDA Connesso al SDA
  • Pin 5 – SCL Conesso al SCL
  • Pin 6 – Ground Connesso al GND
Una volta effettuati i collegamenti bisogna installare il software per la comunicazione in i2c:

sudo apt-get install i2c-tools

e successivamente testarne la comunicazione con:

sudo i2cdetect -y 0 (per la prima revisione della raspberry)

oppure

sudo i2cdetect -y 1 (per le board successive alla 2, seconda compresa)

Il risultato dovrebbe essere una schermata del genere:

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
Il 68 che visualizziamo è essenziale per il proseguio del progetto, se non dovessimo vederlo, ricontrolliamo i collegamenti.
Installiamo la libreria smbus di python:

sudo apt-get install python-smbus

A questo punto possiamo realizzare il nostro piccolo programmino in python che ci dirà i gradi di oscillazione del nostro mpu6050 ovvero GY-521.
sudo nano gyro.py
ed incolliamo questo codice:
#!/usr/bin/python
import smbus
import math

# Register
power_mgmt_1 = 0x6b
power_mgmt_2 = 0x6c

def read_byte(reg):
    return bus.read_byte_data(address, reg)

def read_word(reg):
    h = bus.read_byte_data(address, reg)
    l = bus.read_byte_data(address, reg+1)
    value = (h << 8) + l
    return value

def read_word_2c(reg):
    val = read_word(reg)
    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) fuer Revision 1
address = 0x68       # via i2cdetect

# Aktivieren, um das Modul ansprechen zu koennen
bus.write_byte_data(address, power_mgmt_1, 0)
print "Gyroskop"
print "--------"

gyroskop_xout = read_word_2c(0x43)
gyroskop_yout = read_word_2c(0x45)
gyroskop_zout = read_word_2c(0x47)

print "gyroskop_xout: ", ("%5d" % gyroskop_xout), " skaliert: ", (gyroskop_xout / 131)
print "gyroskop_yout: ", ("%5d" % gyroskop_yout), " skaliert: ", (gyroskop_yout / 131)
print "gyroskop_zout: ", ("%5d" % gyroskop_zout), " skaliert: ", (gyroskop_zout / 131)

print
print "Beschleunigungssensor"
print "---------------------"

beschleunigung_xout = read_word_2c(0x3b)
beschleunigung_yout = read_word_2c(0x3d)
beschleunigung_zout = read_word_2c(0x3f)

beschleunigung_xout_skaliert = beschleunigung_xout / 16384.0
beschleunigung_yout_skaliert = beschleunigung_yout / 16384.0
beschleunigung_zout_skaliert = beschleunigung_zout / 16384.0

print "beschleunigung_xout: ", ("%6d" % beschleunigung_xout), " skaliert: ", beschleunigung_xout_skaliert
print "beschleunigung_yout: ", ("%6d" % beschleunigung_yout), " skaliert: ", beschleunigung_yout_skaliert
print "beschleunigung_zout: ", ("%6d" % beschleunigung_zout), " skaliert: ", beschleunigung_zout_skaliert

print "X Rotation: " , get_x_rotation(beschleunigung_xout_skaliert, beschleunigung_yout_skaliert, beschleunigung_zout_skaliert)
print "Y Rotation: " , get_y_rotation(beschleunigung_xout_skaliert, beschleunigung_yout_skaliert, beschleunigung_zout_skaliert)
Dovrebbe apparire questo schema:

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