Dernière mise à jour : 27 août 2019

Retour à l'index

Raspberry : branchement gyroscope

L'idée est de connecter et utiliser un gyroscope via mon vieux Raspberry 2. Pas d'application visée, juste de l'apprentissage.

Totalement noob, j'ai acheté un peu de matériel de base pour pouvoir prétendre à cet exploit. Dans ce kit je vais juste utiliser le breadboard et les fils.

1566122871205

Composant MPU 9250/6500

Spécification du composant : format PDF

Adresses registres et description : format PDF

1566060728248

Connecter le gyroscope

https://pi4j.com/1.2/images/j8header-2b-large.png

 

Le composant MPU 9250/6500 est un gyroscope utilisant le bus i2c, il faut donc installer ce qu'il faut :

sudo apt-get install python-smbus i2c-tools

Ensuite il faut démarrer l'interface i2c via sudo raspi-config menu interfaces

Niveau câblage, 4 branchements Raspberry / MPU :

RaspberryPinMPU
3.3V1VCC
Ground14GND
GPIO 9 (SCL1 i2c)5SCL
GPIO 8 (SDA1 i2c)3SDA

Spécification pour mon Raspberry 2 B ( source site Raspberry )

1566118220242

Démarré SSH et NVC sur le Raspberry via sudo raspi-config menu interfaces.

Connexions faites, on allume, rien n'explose. 👍

Désolé pour la poussière, il est vieux Mr Raspberry...

1566120854186

1566120970597

Admirons ces magnifiques soudures, merci Rémy !

Accès ssh depuis mon PC ok, on essaye?...

sudo i2cdetect -y 1

Youpi, il semble que le gyroscope est détecté. 68!... 😄

1566120418331

Il s'agit désormais de récupérer les données.

Lire les données

Le composant a l'adresse 0x68 sur le bus i2c, ensuite chaque data a son adresse. Les données intéressantes sont aux adresses suivantes :

1566147444446

Commande i2cget pour lire ces données. Mettons qu'on souhaite lire 2 octets à l'adresse 0x43 ( GYRO_X_OUT) : ic2get -y 1 0x68 0x43 w

-y pour ne pas avoir a confirmer suite aux différents warnings

1 : numéro du bus

0x68 adresse du composant

0x43 adresse de lecture

w pour word = 2 bytes = 2 octets = 16 bits

Automatiser

Un moyen simple de lire ces données : python. J'ai adapté un script pour un MPU-6000 pour lire les données. Je lis GYRO_XOUT, GYRO_YOUT et GYRO_ZOUT, ainsi que la température.

1566199788175

Sortie :

1566199129990

Tout cela est satisfaisant d'un point de vue de noob, tout semble fonctionner. Au niveau des résultats il reste des choses à creuser :

 

Trouvé une librairie Python pour le MP9250 : FaBo9Axis

Installée via :

pip install FaBo9Axis_MPU9250

Pour vérifier les librairies installée on peut utiliser :

pip list

Finalement impossible de m'en sortir avec les librairies, je décide de reprendre le code de la librairie + le code applicatif dans un seul et même fichier. Moche mais ça marche.

Ajout d'un composant sur le bus I2C

1566820307036

Bernard m'a prêté un autre composant : le BME280 (temp, pression, altimètre). J'ai eu du mal à voir les 2 connectés. Ce n'est pas faute d'avoir vérifié les branchements, assez sûr de mon coup, mais rien.

Au final le Raspberry ne fonctionnait plus. Plus de réseau, plus de démarrage. Je démonte tout. Je rebranche le MPU seul, ça marche. Je branche l'autre seul, ça marche. Je rebranche le tout en série... ça marche. Va comprendre Charles.

J'ai donc le MPU9250 en 0x68 et le BME280 en 0x76

1566754013202

1566754280920

 

Mauvaise nouvelle, en fouillant les internets je tombe sur un commentaire qui suggère que nous ne sommes pas en possession d'un chip BME280 mais d'un BMP260. Id lu à 0xD0 = 0x56 et non 0x60. Pas vérifié pour l'instant mais on le garde à l'esprit.

J'essaye de déchiffrer cette lib c++ pour Arduino.

Lecture de 3 bytes en BME280_TEMPERATURE_MSB_REG

1566827724354

Les données seraient donc là.

1566827844409

Le problème c'est que rien ne bouge. Toujours les mêmes data. Je pense à la lecture de la doc qu'il faut changer le mode. Le composant dort sûrement (mode SLEEP), vais essayer d'utiliser le mode FORCE : on force une mise à jour des registres, puis on les lit. Il y un 3eme mode NORMAL qui met à jour en permanence mais ça consomme plus et nous on est trop du genre à sauver la planète à la moindre occaze.

En repartant sur le script du MPU, je démarre doucement : test avec lecture de l'ID du composant, on devrait récupérer 0x58 (88 en décimal)

1566837192223

 > I am 88

Ça marche. Oui bon, on va pas tirer un 🎆

Vim c'est sympa, et puis ça fait pro, mais comme je ne suis pas un pro je perds beaucoup de temps. Faut que je puisse utiliser mes outils, je vais monter un disque sur mon PC pointant sur le répertoire de mes scripts sur le Raspberry ( ~/Documents/cod = /home/pi/Documents/cod). On installe sshfs et on monte le disque :

sudo apt install sshfs

sshfs pi@192.168.0.29:/home/pi/Documents/cod ~/Documents/myRasp

Et voilà !

1566837972131

On y accède désormais comme un répertoire local.

1566838141253

Je peux dès lors utiliser mes outils locaux, notamment mon éditeur de code.

1566838545737

Ouf.

Note : j'ai eu besoin de transférer un script, j'apprends la commande scp, quelle merveille Linux :) (source)

 

Je coupe court après quelques investigations supplémentaires car je n'ai plus le composant en ma possession.

J'ai pu avancer un peu dans la lecture et l'écriture de registres afin de faire un reset ou changer le mode du composant, mais pas pu aller jusqu'à une exploitation des résultats. Mes quelques lignes de python :

 

Bilan

Bilan mitigé.

C'est toujours satisfaisant d'apprendre des choses et d'avoir des petites victoires. Je pratique Linux, au final le gyroscope semble fonctionner, mais pas de résultats probants pour l'heure côté BME.

C'était sympa de faire un peu de bidouille mais si j'y reviens j'essaierai probablement d'utiliser des bibliothèques ou logiciels qui s'occupent du "bas niveau", ce qui, je le précise pour nos amis électroniciens, n'est évidemment pas un jugement de valeur 😉

Notes

Commande pour lecture globale des registres :

sudo i2cdump -y 1 ADRESSE_COMPOSANT

i2ctools man pages https://manpages.debian.org/testing/i2c-tools/index.html