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

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 » mer. 1 mars 2017 20:00

Bud Spencer a écrit :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.
+1000 !
Je n'ose même plus faire ce genre de remarques depuis qu'un intervenant "éclairé" m'a expliqué que Python est très efficace puisque les bibliothèques, elles, sont compilées ;-)

Plus on s'éloigne du hardware et que l'on introduit un niveau élevé d'abstraction, plus on pédale dans la choucroute.
L'i2C n'a pas été conçu pour de tels débits.
La libwiringPi est un remarquable effort pour rendre l’accès aux GPIOs presqu'aussi facile que sur une autre plateforme.
Plus près du matériel mais nettement moins sexy, il y a la BCM2835:
http://www.airspayce.com/mikem/bcm2835/index.html
Ce n'est pas la panacée, elle s'éxecute en user land et ne gère pas les interruptions.

En dernier ressort, il reste la gestion "à la main" des périphériques du SOC:
http://www.pieter-jan.com/node/15

De mémoire de mes lectures Internet, le bus SPI du Raspi plafonne à une trentaines de Mhz.
Bonne lecture et bon courage.

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 23:31

spourre a écrit : Je n'ose même plus faire ce genre de remarques depuis qu'un intervenant "éclairé" m'a expliqué que Python est très efficace puisque les bibliothèques, elles, sont compilées ;-)
Et pourtant il faut le faire remarquer. Tous les langages interprétés utilisent des lib compilées mais ca reste des appel interprétés (entre autre sources de lenteur). Pour certain cas d'application, ca ne pose pas de réel problème mais ca se ressent très vite dès que l'on à traiter ce genre de truc. Je viens de faire le test que j'avais fait hiers en c++ mais avec la dernière version de wiringpi et pour voir, j'ai fais le même en python3. Voila ce qu'il en ressort

100000 lectures sur dac0 d'un mcp3208 avec retour de valeurs numérique en console(spi à 1Mhz). moyenne de 10 tests de chaque

cpp : 3.986 secondes
python3 : 6.528 secondes

La même chose sans sortie des valeurs en console
cpp : 3.2 seconde
python3 : 4.6 seconde

On pourrait dire que c'est peut mais il suffit de regarder les code pour ce dire que c'est énorme. Les 2 codes sont identiques (exception syntaxique du langage près) et utilisent exactement la même lib wiringpi toute fraichement compilée (2.42) .

code cpp

Code : Tout sélectionner

unsigned char c[3];
wiringPiSPISetup(0,1000000);
for (int i = 0; i < 100000; i++)
{
	c[0] = 6; c[1] = 0; c[2] = 0;
	wiringPiSPIDataRW(0,c,3);
	std::cout << ((c[1]<<8) + c[2] << std::endl;
}
code python

Code : Tout sélectionner

wiringPiSPISetup(0,1000000);
for i in range(0,100000)
	c = bytes[(0x06,0x00,0x00)]
	wiringPiSPIDataRW(0,c)
	print ((c[1]<<8) + c[2])
Difficile de faire plus proche et pourtant juste la dessus, python3 est déjà minimum 30 à 40% plus lent que du cpp non optimisé. Imaginons ce que cela pourrait donner si l'on rajoutai du traitement en temps réel sur les valeurs, genre conversion et ou enregistrement.

Pour la lib bcm2835, c'est celle que j'utilise le plus souvent. Elle permet des accès plus bas niveau que wiringPI et pratiquement tous les tests que j'avais fait la plaçait devant wiringPi. Maintenant mes versions datent un peu et il est possible que la tendance soit inversée.

J'ai lu aussi quelque part que la liaison spi du pi3 permettait d'atteindre 125 Mhz mais commençait résonner à l'approche des 40MHz (c'est ce que j'ai dans mes notes). Après, même a 40 MHz il faut trouver les composants (généralement en boitier qfn) et ca commence à demander des circuits imprimés difficile à bricoler a la maison :? . Pour ce qui est du mcp3208, c'est 2MHz maxi à 5v, mais ca reste un dip16 pas cher et facile à utiliser.
Modifié en dernier par Bud Spencer le dim. 5 mars 2017 19:43, modifié 1 fois.
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 » jeu. 2 mars 2017 12:51

Bud Spencer a écrit : ...
Pour la lib bcm2835, c'est celle que j'utilise le plus souvent. Elle permet des accès plus bas niveau que wiringPI et pratiquement tous les tests que j'avais fait la plaçait devant wiringPi. Maintenant mes versions datent un peu et il est possible que la tendance soit inversée.

J'ai lu aussi quelque part que la liaison spi du pi3 permettait d'atteindre 125 Mhz mais commençait résonner à l'approche des 40MHz (c'est ce que j'ai dans mes notes). Après, même a 40 MHz il faut trouver les composants (généralement en boitier qfn) et ca commence à demander des circuits imprimés difficile à bricoler a la maison :? . Pour ce qui est du mcp3208, c'est 2MHz maxi à 5v, mais ca reste un dip16 pas cher et facile à utiliser.
Je pense respecter le fil du PO puisque ses contraintes vont certainement le conduire à utiliser le SPI et un langage compilé mais, s'il considère que l'on s'éloigne trop de son sujet, on pourra poursuivre, à sa demande, sur programmation par exemple.

Je ne souhaite pas compiler nativement sur mon "pauvre" Raspi B+.
J'ai installé, dans une VM, un compilateur croisé à l'aide de crosstool-ng. Pour le moment, ça fonctionne en ligne de commandes et les programmes tournent bien sur le raspi. Un passage vers Eclipse est envisagé.
comme il n'y a pas de paquet deb pour libcm, j'ai tenté de cross-compiler (v1.50). Le ./configure prend bien en compte mes arguments et trouve tous les outils (crosscompilo, lib, includes..). Je n'ai aucun message d'erreur et, à la fin du make install, j'obtiens bien libcm2835 et son header mais en .a (archive statique) et non .so (bibliothèque partagée).
As-tu le même résultat ? sur quelle machine compiles-tu ?

Pour le spi, j'ai le même souvenir de mes lectures. l'horloge se dégrade très rapidement en charge et il ne faut pas espérer dépasser les 30 MHz. Évidement, à cette fréquence, il faut un minimum de précautions dans le câblage et le circuit imprimé. Il faut mieux éviter la breadboard et ses fils trop long ;-)

Cordialement

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 » jeu. 2 mars 2017 21:23

spourre a écrit : Je pense respecter le fil du PO puisque ses contraintes vont certainement le conduire à utiliser le SPI et un langage compilé mais, s'il considère que l'on s'éloigne trop de son sujet, on pourra poursuivre, à sa demande, sur programmation par exemple.
Idem pour moi, mais je pense qu'en proposant du c++ pour un projet qui en aura obligatoirement besoin, nous ne somme pas trop hors sujet.

Pour les petits dev en cpp, les petits exemples comme ci dessus et la compil des lib, je fais directement sur le pi. Depuis le B+, l'Edition et la compil passe bien avec codeblock pour des trucs pas trop usine a gaz. Par contre pour les projets plus 'conséquent', je crosscompil tout mes dev linux depuis visual studio (Windows) y compris le spécifique pour le PI. A l'occase, je ferais peut être l'essais de compiler cette lib avec mes méthodes pour voir.

ps : je viens de voir que la bcm2835 est passé en 1.52. Cette version n'as pas trop d'intérêt, par contre la 1.51 semble apporté un plus technique.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

destroyedlolo
Raspinaute
Messages : 1585
Enregistré le : dim. 10 mai 2015 18:44
Localisation : Dans la campagne à côté d'Annecy
Contact :

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

Message par destroyedlolo » ven. 3 mars 2017 00:08

Salut,
spourre a écrit :Je ne souhaite pas compiler nativement sur mon "pauvre" Raspi B+.
J'ai installé, dans une VM, un compilateur croisé à l'aide de crosstool-ng. Pour le moment, ça fonctionne en ligne de commandes et les programmes tournent bien sur le raspi.
Est-ce pour des pb de perfs ? Dans ce cas, nos SBC ont largement la puissance et les ressources nécessaires. A titre d'exemple tous mes SBC tournent sous Gentoo/Linux (qui est une distrib "source" où donc tout se compile en local) sans le moindre problème. Pour les trucs les plus gros (genre ... PHP), DistCC permet de partager les compilations entre mes SBC et mes PC plus puissants. Ce qui fait que même la compilation d'un kernel ne prend que quelques minutes de plus que lorsque je le fais pour mon I7.
  • BananaPI : Gentoo, disque SATA de 2 To
  • Domotique : 1-wire, TéléInfo, Tablette passée sous Gentoo, ESP8266
  • Multimedia par DNLA
  • Et pleins d'idées ... et bien sûr, pas assez de temps.
Un descriptif de ma domotique 100% fait maison.

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 » ven. 3 mars 2017 00:32

destroyedlolo a écrit :Salut,
...
Est-ce pour des pb de perfs ? Dans ce cas, nos SBC ont largement la puissance et les ressources nécessaires. A titre d'exemple tous mes SBC tournent sous Gentoo/Linux (qui est une distrib "source" où donc tout se compile en local) sans le moindre problème. Pour les trucs les plus gros (genre ... PHP), DistCC permet de partager les compilations entre mes SBC et mes PC plus puissants. Ce qui fait que même la compilation d'un kernel ne prend que quelques minutes de plus que lorsque je le fais pour mon I7.
Salut,

C'est à la fois pour des raisons pratiques et philosophiques:

- Je n'ai qu'un B+ nono cœur.
- il n'a pas de disque dur (ou alors sur USB donc très mauvaises performances)
- la carte SD n'aime pas du tout les multiples écritures (une compile génère plein de fichiers).
- Il rame sous Pixel + chrome (100 % de CPU) donc pas de recherche Internet en // de la compile, pas de copier/coller pour des commandes

Pour moi, l'intérêt du Raspberry, c'est son GPIO et certainement pas de faire tourner un économiseur d'écran ;-(
La plupart de mes projets pourront se contenter d'une IHM simplifiée (LCD 2 lignes + petit clavier) et n'auront pas besoin de serveur X.
Sur de l'embarqué, il est contre-productif de vouloir développer dessus. Quand on a sous la main la puissance d'un I5 ou d'un I7, il est plus rationnel de s'en servir.
Ceci n'est que mon avis perso mais j'ai tendance à le partager entièrement ;-)))

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 » ven. 3 mars 2017 09:21

En insistant un peu en Python 3 avec I2C, avec code à priori optimisé : 192 enregistrements par seconde.

Là j'aimerais tenter en C++ avec SPI, avez-vous des bibliothèques à me conseiller ? Sachant que ma seule expérience avec le C++ est le Hello World que je viens de rédiger et de compiler avec succès, et que je n'ai jamais utilisé SPI...

Pour l'instant je regarde la doc et et les exemples de WiringPi !

EDIT : Je trouve beaucoup d'exemples tout faits, mais pas de "pas à pas", et la documentation n'est d'aucun secours, donc si quelqu'un a un bon tuto sous le coude, même en anglais, je suis preneur !
  • RPi 3 + LibreELEC / RPi 3 + RetroPie / RPi B+ + Sense HAT ou Framboisedorf ou module caméra
  • Arduino Mega, Uno, Nano
  • Freescale FRDM KL25Z

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. 3 mars 2017 10:46

Pinhapple a écrit :En insistant un peu en Python 3 avec I2C, avec code à priori optimisé : 192 enregistrements par seconde.
!
Cqfd !!
Pour les bibliothèques, celles du dessus vont très bien.
Et de mémoire elles ont toutes les deux des exemples assez concrets qui peuvent etre adaptés.
Procedez comme pour python, essayez d avoir une communication fiable avec une lecture ecriture de registre, et après optimiser les lectures.
Si ca peut aider, j utilise code::blocks pour du cpp sur le pi.
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 » ven. 3 mars 2017 11:01

Je n'avais pas du tout pensé à Code::Blocks que j'utilise pourtant de temps en temps pour faire du C ! J'ai installé Qt Creator, mais c'est la croix et la bannière pour créer un projet (il me demande des "kits", mais il n'y en a aucun), donc je code avec Leafpad et je compile avec le terminal, pour l'instant ça fonctionne bien, mais je passerai sur Code::Blocks si je galère, merci pour la suggestion :)

En fait le souci c'est qu'en Python avec I2C je voyais bien ce que je faisais (déclarer un SMBus, "allumer" le gyroscope, lire la valeur, etc.) ligne par ligne, tandis qu'avec les exemples que je vois de WiringPi, je ne comprends pas grand chose : la première fonction de la doc est wiringPiSPISetup(int channel, int speed), mais rien n'indique quelles valeurs prendre, comment connaître le channel du capteur à utiliser (dans mon cas, toujours le LSM9DS1 du Sense HAT, dont je connaissais l'adresse en I2C avec i2cdetect -y 1), etc.

La biblio m'a l'air d'être très pratique et puissante, mais là je ne sais même pas comment me lancer ! :(

Je vous rassure : je cherche de mon côté en parallèle de vos réponses ;)

EDIT : J'ai trouvé cette liste des fonctions de WiringPi, ce qui m'avance déjà un peu plus !
  • RPi 3 + LibreELEC / RPi 3 + RetroPie / RPi B+ + Sense HAT ou Framboisedorf ou module caméra
  • Arduino Mega, Uno, Nano
  • Freescale FRDM KL25Z

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. 3 mars 2017 12:26

Hé oui, comme pour un circuit, pour une librairie il y a une doc.
Pour le canal spi, il dépend de la broche de " chip selec" utilisée, sur le pi il y en a deux: spi_ce0 et spi_ce1, ce qui donne donc deux canaux.
rpi b+ ,osmc, motioneyes
rpi 2 raspbian , server minecraft 24h/24 , utilisation gpio
orange pi pc debian ,utilisation gpio, motion cam

Répondre

Retourner vers « Les BUS interfaces »