Les capteurs d’accélération et de rotation sont surtout connus des smartphones. La rotation de l’appareil peut être détectée et adressée directement.
Avec le Raspberry Pi et un capteur Gyroscope / Accélérateur, il est possible de mesurer la rotation ainsi que l’accélération des 3 axes.
Dans ce tutoriel, je montre comment utiliser le MPU 6050 et comment lire les valeurs en utilisant I2C, ce qui est démontré dans une vidéo.
Composants
Pour ce tutoriel, j’ai utilisé les composants suivants :
Le module a 2 connecteurs à pin, l’un d’eux est plié. J’ai soudé les pins pliés à la carte du capteur, ce qui économise de l’espace (voir photo) :
Installation
La chose pratique à propos de I2C est que très peu de pins sont utilisés. Des huit pins du capteur, nous n’avons plus qu’à connecter le top 4 :
Raspberry Pi | MPU 6050 |
---|---|
Pin 1 (3.3V) | VCC |
Pin 3 (SDA) | SDA |
Pin 5 (SCL) | SCL |
Pin 6 (GND) | GND |
Activer I²C sur le Raspberry Pi
Tout d’abord, nous activons SPI et I2C. Si vous l’avez déjà fait dans un tutoriel précédent, vous pouvez sauter cette étape.
sudo raspi-config
Ici nous trouvons le menu d’activation des services. Sous « Advanced Options » il y a l’entrée « A7 I2C », que nous activons (Ceci peut différer dans d’autres versions Raspbian). Pour les anciennes versions de Raspbian, les entrées du fichier /etc/modprobe.d/raspi-blacklist.conf
doivent être extraits (avec #).
Nous éditons ensuite le fichier des modules:
sudo nano /etc/modules
Si les lignes suivantes ne sont pas déjà incluses, ajoutez-les et redémarrez le Pi (sudo reboot
):
1 2 |
i2c-bcm2708 i2c-dev |
Nous pouvons maintenant installer rapidement les outils nécessaires :
sudo apt-get install i2c-tools python-smbus
Commençons un petit test. Le paramètre -y 1
représente la révision 2. Si vous avez un complètement vieux Pi (avant 2013), vous devrez spécifier un 0 plutôt :
sudo i2cdetect -y 1
Si le gyroscope est correctement connecté, vous verrez cette sortie (si vous avez d’autres modules I2C connectés, leurs adresses hexadécimales devraient être affichées) :
pi@raspberrypi ~ $ sudo i2cdetect -y 1 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: -- -- -- -- -- -- -- --
Pour adresser l’appareil avec l’adresse 68 (Attention : Hexadécimal) sous le registre, entrez ce qui suit :
sudo i2cget -y 1 0x68 0x75
Lisez le module MPU-6050
La manière la plus pratique de lire le capteur d’accélération est probablement Python. Par conséquent, nous créons un fichier et collons le code suivant.
sudo nano gyro.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
#!/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) |
Sauvegardez-le avec CTRL + O et quittez l’éditeur avec CTRL + X. Vous pouvez alors exécuter le script.
sudo python gyro.py
Maintenant, vous verrez une sortie qui contient toutes les données capturées :
Gyroskop -------- gyroskop_xout: -260 skaliert: -2 gyroskop_yout: -154 skaliert: -2 gyroskop_zout: 78 skaliert: 0 Beschleunigungssensor --------------------- beschleunigung_xout: -1048 skaliert: -0.06396484375 beschleunigung_yout: -676 skaliert: -0.041259765625 beschleunigung_zout: 16644 skaliert: 1.01586914062 X Rotation: -2.32121150537 Y Rotation: 3.59994842011
Pour en savoir plus sur les accéléromètres et les gyroscopes, vous devriez lire cet article.
Enfin, un petit exemple de vidéo démontrant l’utilisation du capteur en direct :