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

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 » dim. 12 mars 2017 14:25

guillaume9344 a écrit :Mais au fait, pourquoi avoir besoin d autant d échantillons par secondes ?
J'avoues que je me suis aussi posé la question. 4000 mesures d'accélération /seconde sur 3 axes, ca fait beaucoup. Peut être des mesures vibratoires ?
Pinhapple a écrit :La bibliothèque dont j'ai parlé précédemment me permet d'obtenir ces valeurs traitées (donc perte de temps dans la boucle le temps de traiter les valeurs brutes) en 28 secondes pour 10 000 itérations, soit environ 357 (* 6) valeurs/seconde.
Bien sur, skipper la conversion te fera gagner du temps sur tes cycles mais à mon avis cela ne te portera pas beaucoup plus loin. Juste une question, tes valeurs, tu les enregistres directement dans un fichier ou tu bufférises et le fait uniquement en fin de boucle ?
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

spourre
Raspinaute
Messages : 735
Enregistré le : lun. 22 déc. 2014 16:50
Localisation : 67380 LINGOLSHEIM

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

Message par spourre » dim. 12 mars 2017 18:52

Bud Spencer a écrit :
guillaume9344 a écrit :Mais au fait, pourquoi avoir besoin d autant d échantillons par secondes ?
J'avoues que je me suis aussi posé la question. 4000 mesures d'accélération /seconde sur 3 axes, ca fait beaucoup. Peut être des mesures vibratoires ?
...
Bien sur, skipper la conversion te fera gagner du temps sur tes cycles mais à mon avis cela ne te portera pas beaucoup plus loin. Juste une question, tes valeurs, tu les enregistres directement dans un fichier ou tu bufférises et le fait uniquement en fin de boucle ?
C'est un projet secret sur un missile de croisière :twisted:

Je pense qu'avec tout ce que nous lui avons indiqué sur l'usure des cartes SD en écritures fréquentes, il va adopter, s'il a vraiment besoin de sauvegarder les échantillons, une stratégie à plusieurs niveaux pour éviter ces accès à la carte SD (qui sont, de plus, pénalisants en temps d'accès).

que penses-tu d'une approche du style:

1) un tampon circulaire en RAM (malloc ?)
2) Une écriture en tmpf
3) Une sauvegarde sur la carte SD

Sylvain

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 » dim. 12 mars 2017 20:44

Le double buffer et l’allocation dynamique est ce qu’il y a de plus efficace mais n’a de sens que si la quantité de données à ingurgiter est inconnue ou trop importante pour la mémoire à disposition. Cela permet entre autre de limiter la conso mémoire en se débarrassant des données d’un buffer (fichier, gui, transmission …) pendant que l’on remplit l’autre et vice versa. Si son idée est de faire un nombre de lecture définie, il aura tout intérêt à commencer par passer par un tableau statique qui sera beaucoup plus simple à mettre en œuvre tout en pouvant s’affranchir de pointeurs et de multithread complexe. En fin de boucle il lui suffirait d’ouvrir un fichier et d’y transférer l’intégralité du contenu en une seule fois.

Après, je n’en sais pas plus que vous sur ce projet et c’est finalement bien cela qui imposera les méthodes à employer. Quantité totale de données et destination, c’est ça le plus important à connaître (si on traite moins vite que l’on ne récupère, forcément, ça risque de coincer et c’est qui est souvent le cas avec par exemple des sortie gui mal contrôlées)

Je vous soumets quand même un point de réflexion tellement banale que nous l’avons oublié. La question est simple : Sans parler de vitesse d’acquisition ou de traitement de données, est-ce que le composant utilisé est capable d’échantillonner 4000 valeurs/seconde individuellement sur le giro et les axes de l’acc. Pour moi, c’est non ! Je n’affirme rien, mais c’est ce que j’ai relevé d’une lecture sommaire de la datasheet qui est un roman à elle toute seule.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

spourre
Raspinaute
Messages : 735
Enregistré le : lun. 22 déc. 2014 16:50
Localisation : 67380 LINGOLSHEIM

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

Message par spourre » lun. 13 mars 2017 00:30

Bud Spencer a écrit : ....
Je vous soumets quand même un point de réflexion tellement banale que nous l’avons oublié. La question est simple : Sans parler de vitesse d’acquisition ou de traitement de données, est-ce que le composant utilisé est capable d’échantillonner 4000 valeurs/seconde individuellement sur le giro et les axes de l’acc. Pour moi, c’est non ! Je n’affirme rien, mais c’est ce que j’ai relevé d’une lecture sommaire de la datasheet qui est un roman à elle toute seule.
J'ai, dès mes premières réponses, insisté sur ce point car rien ne prouve que le LSM9DS1 en soit capable:
spourre a écrit : ....
Il faut revenir au datasheet du circuit intégré et regarder sur combien de bits il code le résultat. Le bus SPI (comme l'I2C) est un bus série et le signal est codé en binaire (0, 1). donc si vous voulez lire 4000 échantillons codé sur 14 bits, il faudra pouvoir lire 14 * 4000 bits par seconde (pour un axe).
2 facteurs peuvent limiter le débit max:

1) De mémoire, le CI peut fonctionner en mode direct ou en mode FIFO (bufferisé).
2) Le nombre de mesures peut (est certainement) être limité par le circuit lui-même ou son horloge.

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. 13 mars 2017 08:24

Bud Spencer a écrit :
guillaume9344 a écrit :Mais au fait, pourquoi avoir besoin d autant d échantillons par secondes ?
J'avoues que je me suis aussi posé la question. 4000 mesures d'accélération /seconde sur 3 axes, ca fait beaucoup. Peut être des mesures vibratoires ?
spourre a écrit :C'est un projet secret sur un missile de croisière :twisted:
Mais non ! :D Un système envoyant et recevant un signal en continu, le tout en rotation, ça vous parle ? ;)
Bud Spencer a écrit :Juste une question, tes valeurs, tu les enregistres directement dans un fichier ou tu bufférises et le fait uniquement en fin de boucle ?
A chaque lecture d'une valeur, je l'ajoute à une liste. J'ai autant de listes que de DOF à mesurer, donc 9 dans mon cas : vitesse angulaire, angle, accélération, le tout sur 3 axes. Tous les calculs sur ces valeurs (conversion, écriture dans un CSV, etc.) sont faits une fois les enregistrements terminés.
spourre a écrit :nombre de lecture max = débit I2C / (taille échantillon x nombre échantillon).
Je tente le calcul, qu'on m'arrête si je me trompe : avec un débit de 100 kbit/s = 100 000 bits/s ; la taille d'un échantillon vaut 16 bits (2 * 8 bits si je comprends bien la datasheet) ; il me faut 9 échantillons.
=> 100 000 / (9 * 16) = 100 000 / 144 ≈ 694 échantillons/s. J'ai bon ? Honnêtement, 500 échantillons/s ça m'irait bien :D
  • RPi 3 + LibreELEC / RPi 3 + RetroPie / RPi B+ + Sense HAT ou Framboisedorf ou module caméra
  • Arduino Mega, Uno, Nano
  • Freescale FRDM KL25Z

spourre
Raspinaute
Messages : 735
Enregistré le : lun. 22 déc. 2014 16:50
Localisation : 67380 LINGOLSHEIM

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

Message par spourre » lun. 13 mars 2017 10:56

Pinhapple a écrit : ...
Mais non ! :D Un système envoyant et recevant un signal en continu, le tout en rotation, ça vous parle ? ;)
....
A chaque lecture d'une valeur, je l'ajoute à une liste. J'ai autant de listes que de DOF à mesurer, donc 9 dans mon cas : vitesse angulaire, angle, accélération, le tout sur 3 axes. Tous les calculs sur ces valeurs (conversion, écriture dans un CSV, etc.) sont faits une fois les enregistrements terminés.
spourre a écrit :nombre de lecture max = débit I2C / (taille échantillon x nombre échantillon).
Je tente le calcul, qu'on m'arrête si je me trompe : avec un débit de 100 kbit/s = 100 000 bits/s ; la taille d'un échantillon vaut 16 bits (2 * 8 bits si je comprends bien la datasheet) ; il me faut 9 échantillons.
=> 100 000 / (9 * 16) = 100 000 / 144 ≈ 694 échantillons/s. J'ai bon ? Honnêtement, 500 échantillons/s ça m'irait bien :D
Un derviche tourneur ?
(j'ai bien une autre idée mais je la garde pour respecter la neutralité politique de ce forum :twisted: )
La lecture en différé est une nouvelle information qui a son importance. Cela implique un programme de lecture assez rapide.
Par contre, quel est la période de mesure ? ça peut générer une forte volumétrie et c'est dimensionnant pour la taille du "tampon" en RAM, avant d'écrire sur la carte SD.

Encore une fois, mon approximation ne donne qu'une estimation à la louche mais c'est un point de départ.
N'oubliez pas de vérifier toutes les restrictions déjà émises:
- Si le LSM peut échantillonner à cette vitesse.
- Si l'I2C le permet (en tenant compte de la stabilité minimum des signaux )
- Si le Raspberry n'est pas surchargé par des services inutiles

Vous devez éplucher finement la data-sheet pour trouver ces informations. Comme l'a mentionné Bud, c'est un vrai roman. Je l'avais parcouru en diagonale pour répondre utilement à vos premières questions mais là, il faut aller dans le détail (le diable se niche dans les détails).

Sylvain

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. 13 mars 2017 13:39

spourre a écrit :[J'ai, dès mes premières réponses, insisté sur ce point car rien ne prouve que le LSM9DS1 en soit capable:
Effectivement, c'était écrit. Toute mes excuses Mr Spourre, c'est moi qui avait lu en diagonale :)

Je n'ai jamais utilisé ce capteur, mais son nom me disait quelque chose, et pour cause : http://www.framboise314.fr/evaluation-d ... e-liberte/
Dans cet article, l'auteur avait aussi des soucis de nombre de lecture bien moins bon que prévu. J'avais d'ailleurs précisé dans les commentaires la nécessité de buffériser pour s'affranchir des temps d'écriture à chaque boucle ;)
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 » lun. 13 mars 2017 13:53

spourre a écrit :Un derviche tourneur ?
Je m'y attendais pas à ça, merci pour le fou rire ! :lol:
spourre a écrit :Par contre, quel est la période de mesure ? ça peut générer une forte volumétrie et c'est dimensionnant pour la taille du "tampon" en RAM, avant d'écrire sur la carte SD.
Elle peut varier. En ce moment, je fais mes tests sur 2 minutes.

Et je me suis trompé : il ne me faut pas 9 mais 6 DOF à mesurer, puisque le capteur ne mesure pas l'angle mais la vitesse angulaire, ce sera donc à moi d'intégrer la vitesse angulaire au fil du temps pour avoir l'angle.
  • RPi 3 + LibreELEC / RPi 3 + RetroPie / RPi B+ + Sense HAT ou Framboisedorf ou module caméra
  • Arduino Mega, Uno, Nano
  • Freescale FRDM KL25Z

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. 13 mars 2017 13:58

Bud Spencer a écrit :J'avais d'ailleurs précisé dans les commentaires la nécessité de buffériser pour s'affranchir des temps d'écriture à chaque boucle ;)
Je viens de voir ton commentaire, c'est une bonne idée de "vider" le tableau dans ton fichier avec un thread !
Et du coup ça m'amène à une question : je ne peux pas utiliser 6 threads, chacun occupé à lire une valeur (accélération X, Y, Z, et rotation X, Y, Z) ?

EDIT : en modifiant le baudrate dans /boot/config.txt (ajout d'une ligne dtparam=i2c_baudrate=1200000), je passe à environ 1100 récupérations de 6 valeurs brutes par seconde, le tout avec mon programme en C et un MPU-6050. Du coup je vais retester avec le LSM9DS1 du Sense HAT pour voir ce que ça donne !
  • RPi 3 + LibreELEC / RPi 3 + RetroPie / RPi B+ + Sense HAT ou Framboisedorf ou module caméra
  • Arduino Mega, Uno, Nano
  • Freescale FRDM KL25Z

spourre
Raspinaute
Messages : 735
Enregistré le : lun. 22 déc. 2014 16:50
Localisation : 67380 LINGOLSHEIM

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

Message par spourre » lun. 13 mars 2017 19:55

Bud Spencer a écrit :
spourre a écrit :[J'ai, dès mes premières réponses, insisté sur ce point car rien ne prouve que le LSM9DS1 en soit capable:
Effectivement, c'était écrit. Toute mes excuses Mr Spourre, c'est moi qui avait lu en diagonale :)

Je n'ai jamais utilisé ce capteur, mais son nom me disait quelque chose, et pour cause : http://www.framboise314.fr/evaluation-d ... e-liberte/
Dans cet article, l'auteur avait aussi des soucis de nombre de lecture bien moins bon que prévu. J'avais d'ailleurs précisé dans les commentaires la nécessité de buffériser pour s'affranchir des temps d'écriture à chaque boucle ;)
Point besoin d'excuses entre nous ;-)
Je voulais juste souligner le fait que cette info était disponible très rapidement pour notre ami.
Cette discussion est techniquement assez dense et commence à prendre de l'ampleur mais il lui appartient de faire le tri et la synthèse. Étudiant, normalement, il doit disposer de la méthodologie pour ce faire.

Sylvain

Répondre

Retourner vers « Les BUS interfaces »