Problème de lecture d'un LSM9DS1 en I2C

Des infos, des conseils sur les bus DSI,CSI, I2C, SPI... du Raspberry Pi

Modérateur : Francois

Répondre
Pinhapple
Raspinaute
Messages : 125
Enregistré le : jeu. 23 févr. 2017 15:53
Localisation : Rouen

Problème de lecture d'un LSM9DS1 en I2C

Message par Pinhapple » ven. 24 févr. 2017 08:54

Bonjour,

Dans le cadre d'un projet, je souhaite obtenir les valeurs d'accélération et de vitesse angulaire sur 3 axes d'une plate-forme rotative. J'utilise un shield Sense HAT sur un Rapsberry Pi 3, mais n'utilise pas la bibliothèque Sense HAT qui limite le nombre d'enregistrements par seconde (environ 60 e/s dans mon cas). Au lieu de cela, je souhaite utiliser I2C pour augmenter le nombre de mesures par seconde.

Le problème, c'est que je n'arrive pas à obtenir des valeurs brutes cohérentes avec mon code... (code que je n'arrive pas à afficher ici, faute de BBCodes activés...)

Le gyroscope/accéléromètre/magnétomètre est un LSM9DS1, dont la datasheet est ici : http://www.st.com/resource/en/datasheet/lsm9ds1.pdf .

Dans un premier temps, je tente d'obtenir les valeurs de vitesse angulaire du gyroscope sur les 3 axes, les grandes lignes de mon code : j'importe la bibliothèque smbus ; je déclare un smbus avec bus = smbus.SMBus(1) (le 1 étant obtenu grâce à la commande i2cdetect -y 1 sur le terminal de Raspbian) ; je "démarre" le gyroscope avec bus.write_byte_data(0x6a, 0x10, 0b10100000) (0x6a adresse du gyroscope, 0x10 registre CTRL_REG1_G du gyroscope, 0b10100000 ODR à 476 Hz et cutoff à 21 Hz, gamme du gyroscope à +/- 245 dps) ; et enfin, lecture des données brutes du gyro avec bus.read_byte_data(0x6a, 0x18/).

Le souci, c'est que mes valeurs brutes lues ne sont pas cohérentes du tout : lorsque le Sense HAT est immobile, je devrais obtenir des valeurs brutes proches de 0, or j'obtiens des valeurs X, Y, Z valant respectivement environ 900, 100, 90...

Je ne pense pas rencontrer de soucis avec la conversion des données brutes vers des valeurs réelles, mais je pense tout simplement que c'est mon I2C qui n'est pas correctement réglé.

Pourriez-vous m'aider à configurer mon LSM9DS1 de manière à obtenir des valeurs cohérentes ?

Merci d'avance !

guillaume9344
Raspinaute
Messages : 629
Enregistré le : mar. 6 janv. 2015 19:44
Localisation : finistere

Re: Problème de lecture d'un LSM9DS1 en I2C

Message par guillaume9344 » ven. 24 févr. 2017 12:15

Si les valeurs brut obtenues sont fixes, cela provient peut etre d un problème de calibration.
rpi b+ ,osmc, motioneyes
rpi 2 raspbian , server minecraft 24h/24 , utilisation gpio
orange pi pc debian ,utilisation gpio, motion cam

Pinhapple
Raspinaute
Messages : 125
Enregistré le : jeu. 23 févr. 2017 15:53
Localisation : Rouen

Re: Problème de lecture d'un LSM9DS1 en I2C

Message par Pinhapple » lun. 27 févr. 2017 14:31

La plupart du temps, elles ne le sont pas.

J'obtiens de bonnes valeurs brutes (en radians/second) en utilisant la méthode get_gyroscope_raw() dans une boucle while, mais je suis toujours limité en nombre de lecture par seconde à environ 70 lectures par seconde.

J'ai beau analyser la bibliothèque ( https://github.com/RPi-Distro/python-se ... u/RTIMU.py ), je galère toujours à comprendre comment faire la même chose en I2C.

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: Problème de lecture d'un LSM9DS1 en I2C

Message par Bud Spencer » lun. 27 févr. 2017 16:09

Forcement, tu cumules les tares, donc faut pas espérer de miracle. Si tu veux faire de l'acquisition rapide et fiable, laisse tomber python, l'I2C et surtout le cumul des 2.

La première chose que tu peux essayer, c'est de dialoguer avec ta carte en c++ en utilisant l'extension I2C d'une lib comme WiringPi ou BCM2835. Si les résultats sont encore trop limités pour tes besoins ou que la consommation de ressource reste trop élevée, laisse tomber l'I2C et passe sur une liaison SPI.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

guillaume9344
Raspinaute
Messages : 629
Enregistré le : mar. 6 janv. 2015 19:44
Localisation : finistere

Re: Problème de lecture d'un LSM9DS1 en I2C

Message par guillaume9344 » lun. 27 févr. 2017 19:56

pour savoir si votre i2c fonctionne correctement , vous pouvez commencer par lire un registre du lsm9ds1 qui a un contenu connu, par exemple le registre 0x0F qui doit retourner la valeur:0x68, (page 38 du data sheet) puis vous pouvez essayez de modifier un autre registre (configuration?) puis de la lire pour voir si la modification a été prise en compte.
Cela devrais deja confirmer si le hardware et la lib pyton fonctionnent bien.
@+
rpi b+ ,osmc, motioneyes
rpi 2 raspbian , server minecraft 24h/24 , utilisation gpio
orange pi pc debian ,utilisation gpio, motion cam

Pinhapple
Raspinaute
Messages : 125
Enregistré le : jeu. 23 févr. 2017 15:53
Localisation : Rouen

Re: Problème de lecture d'un LSM9DS1 en I2C

Message par Pinhapple » mar. 28 févr. 2017 09:28

Bud Spencer : merci pour le conseil, je verrai plus tard si je ne m'en sors pas avec Python et I2C ;)

guillaume9344 : je fais un petit bus.read_byte_data(0x6a, 0xf)), ce qui me renvoie une valeur décimale de 104, soit 68 en hexadécimal, donc conforme à la doc ! De plus, si je tente de modifier un registre (échelle de valeurs du gyroscope), les modifications sont bien prises en compte.

guillaume9344
Raspinaute
Messages : 629
Enregistré le : mar. 6 janv. 2015 19:44
Localisation : finistere

Re: Problème de lecture d'un LSM9DS1 en I2C

Message par guillaume9344 » mar. 28 févr. 2017 12:46

Donc l I2c fonctionne comme il faut. Si vous n avez pas les bonnes valeurs en gyros, il y peut etre un problème de configuration des registres du circuit. Il faut bien etudier le datasheet pour maîtriser la config. Vous pouvez essayer, aussi, de trouver des exemples d utilisation avec d autre librairie ou langage.
Et comme le dit Bud, essayez aussi avec une boucle plus longue, une fois que vous aurez des valeurs correctes, voys pour diminuer le temps entre chasues lectures.
rpi b+ ,osmc, motioneyes
rpi 2 raspbian , server minecraft 24h/24 , utilisation gpio
orange pi pc debian ,utilisation gpio, motion cam

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: Problème de lecture d'un LSM9DS1 en I2C

Message par Bud Spencer » mar. 28 févr. 2017 22:53

Pinhapple a écrit :Bud Spencer : merci pour le conseil, je verrai plus tard si je ne m'en sors pas avec Python et I2C ;)
C'est a toi de voir suivant tes besoins.

Juste pour te donner une idée, comme j'avais câblé un MCP3208 (8 x 12 bit adc SPI) pour le tuto nodejs ( viewtopic.php?f=44&t=3033 ), j'ai décidé de faire un petit test.

Combien de temps il faut pour faire 10000 (10 milles) 'mesures/conversion de valeur en volt/affichage console' en c++ ?

PI3 raspbian PIXEL, gcc 4.9.2, wiringpi 2.25

après une dizaine de test dans chaque config voila les temps moyens
SPI à 1 MHz : < 490 ms
SPI à 2 Mhz : < 350 ms

Pour confirmer la mesure, je me suis fait 1000000 (1 millions) mesures avec la config à 2Mhz et j'arrive a ~33 sec.
En supprimant la conversion en volt je gagne ~2 sec (gain minim, c++ compte très vite ...)
Et en supprimant l'affichage des valeurs dans la console (juste recup du résultat dans une var) : 20sec.

Je te laisse faire le calcul du nombre de mesures par seconde ;)

Je précise que j'ai fait ca en programmant a l'arrache en gui sous Geany et qu'en plus c'est câblé comme un gros cochonet, donc pas sur d'être optimum à 1Mhz et encore moins à 2.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Pinhapple
Raspinaute
Messages : 125
Enregistré le : jeu. 23 févr. 2017 15:53
Localisation : Rouen

Re: Problème de lecture d'un LSM9DS1 en I2C

Message par Pinhapple » mer. 1 mars 2017 08:32

guillaume9344 a écrit :Il faut bien etudier le datasheet pour maîtriser la config.
C'est un peu ça le souci en fait : dans la datasheet, je vois quelles registres utiliser pour lires des valeurs de rotation et d'accélération, mais c'est tout le reste de la configuration qui ne me parle pas du tout (cutoff, output data rate, bandwidth, etc.), je n'ai aucune idée de quoi utiliser et comment !
En attendant, je regarde des exemples dans d'autres langages, c'était une bonne idée, merci ! ;)
Bud Spencer a écrit :C'est a toi de voir suivant tes besoins.
Idéalement, il me faudrait dans les 4 000 enregistrements par seconde, donc ton exemple est intéressant, en effet ! :D
J'insiste encore un peu aujourd'hui, et si je ne m'en sors pas je tenterai SPI.

Merci pour vos remarques et vos conseils ! :)
  • RPi 3 + LibreELEC / RPi 3 + RetroPie / RPi B+ + Sense HAT ou Framboisedorf ou module caméra
  • Arduino Mega, Uno, Nano
  • Freescale FRDM KL25Z

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: Problème de lecture d'un LSM9DS1 en I2C

Message par Bud Spencer » mer. 1 mars 2017 11:20

4000 enregistrements/seconde :lol:
Insiste encore si tu veux, mais je peux t'affirmer que tu peux oublier aussi bien l’I2C que Python, tu n’as aucune chance d’y arriver avec ces trucs-là. En charognant sur la config de l’I2C, tu pourrais peut être le passer en Fast-Mode (horloge à 400Khz), mais cela ne suffirait toujours pas et il y a de grandes chances que la sense hat ne l’accepte pas quand à python, c’est vraiment le dernier des langages à utiliser pour ce genre de cas d’application.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Répondre

Retourner vers « Les BUS interfaces »