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:
- Rasperry pi w0
- Sensore GY-521
- Cavetteria
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:
- 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
sudo apt-get install i2c-tools
e successivamente testarne la comunicazione con:
sudo i2cdetect -y 0 (per la prima revisione della raspberry)
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: -- -- -- -- -- -- -- --
sudo apt-get install python-smbus
sudo nano gyro.py
#!/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 "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