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 : 611
Enregistré le : lun. 15 août 2016 21:38

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

Message par Bud Spencer » dim. 5 mars 2017 09:19

spourre a écrit :J'ai survolé rapidement le lien que tu donnes et les captures d'écrans m'ont fait penser à une compilation répartie (voire entièrement sur le pi):
Bien sûr que c’est partagé (gdb). L’intérêt de cette méthode c’est justement de ne dédié à l’hôte (le pi) que les taches liées à son system propre en le déchargeant de tout le reste, y compris du lourd support d’un environnement de dev locale. Par défaut les sorties sont générées sur le pi, mais rien n’empêche de les rediriger ailleurs (idéalement sur la machine de dev). Finalement c’est le principe même de la philosophie linux. Soit tu utilises des programmes spécifiquement compilés pour ton system ou alors tu compiles toi-même les sources in-situ.

La cross-compilation intégrale, c’est (c'était) bien, mais effectivement ça n’a rien de trivial et jamais de garantie que tes compilations fonctionneront sur le system finale, surtout à la vitesse ou vont les changements de version soft et hard. Si au moins on pouvait s’appuyer sur des émulations parfaitement conformes et à jour, cela irait, mais c’est rarement le cas. En plus coté débogage c’est l’enfer des que l’on porte sur du spécifique. Pour moi, ces méthodes sont d’une même époque que le dev en cli. Autrefois, on n’avait pas le choix et il faut bien avouer que c’était une belle galère. Pour moi, avec les outils dispo aujourd’hui, utiliser ces vielles méthodes relève au mieux de la nostalgie et au pire du sadomasochisme. Ceci dit, j’ai aussi ce côté maso, je développe encore mes pic en assembleur avec nodepad. A moins que ce soit de la nostalgie, va savoir :lol:

Eclipse te permet aussi de faire du debug et de la cross-compil gdb et ca va plutôt pas mal (bien que je n'ai jamais essayé pour le pi)
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. 5 mars 2017 10:04

Bud Spencer a écrit :
Eclipse te permet aussi de faire du debug et de la cross-compil gdb et ca va plutôt pas mal (bien que je n'ai jamais essayé pour le pi)
Merci pour ta réponse détaillée qui, je l'espère, aidera le PO à se faire une idée des avantages/inconvénients des différentes approches.
Le gros problème de la cross-compil, comme tu le soulignes à juste titre, est l'évolution rapide des logiciels et matériels. Il y a intérêt à choisir une solution "active". Dans ce domaine, un an représente une éternité.

Une des grosses difficultés de maintenir une chaîne de cross-compil pour une plateforme, est de rester "à jour" pour les libs, le kernel ...
On peu, certes, tout cross-compiler sur l'hôte mais ça peut être très très galère à réussir (entre les ./cngig, les cmake, les ...).
Pour ma part j'ai résolu ce défi en dédiant une carte SD au développement. Je la tiens à jour et avant chaque séance de cross-compil, je synchronise (rsync) avec les libs et includes de la machines hôte.
Évidemment, ces répertoires sont distincts de ceux natifs, qui ne servent à rien dans ce cas précis. Ceci explique les longs chemins de ma ligne de commande donnée en exemple.
Après, par un scp, je dépose le résultat sur le Raspberry pour test ou débogage . En prod, tout le superflu sera viré (les bibli, les includes, les daemons ...)
L'ideal serait même de virer systemd et d'avoir un init classique "à l'ancienne".
Eclipse me semble être un compromis raisonnable pour du développement "amateur". On peut y pré-renseigner de nombreux paramètres (dons les libs) et il gère le versionnage et permet le debugg "in situ" .
Mais, comme nous l'avons déjà souligné, il faut une chaîne GNU fonctionnelle et je maintiens que ce n'est pas trivial à installer.

Hier, j'ai testé très rapidement et avec succès, une autre approche. Au lieu de virtualiser l'OS, on "virtualise le matériel. Je veux parler de qemu.
C'est beaucoup plus rapide à mettre en oeuvre car Qemu est bien supporté par de nombreuses distributions et tout l'aspect bibliothèque, binaires, headers, kernel .... est pris dans l'image de la distribution (raspbian pour moi).
un chroot permet de bien isoler du reste du PC et les chemins sont courts et standards.
C'set donc du vrai natif arm, même si les performances sont moindre que dans la virtualisation, ça reste beaucoup plus rapide que mon B+.
Après updgrade et démontage de l'image, celle-ci peut être gravée sur une carte SD.

Ça m'a pris une 1/2 journée pour me documenter et obtenir un fonctionnement satisfaisant (il me reste encore le GUI à tester).
Le revers de la médaille, c'est que les périphériques (i2c, spi, tty...) ne sont pas émulés, il faut donc les copier (scp) à la main sur le Raspberry pour les tester.
Mes 2 petits programme de test i2c d'un PCF 8574 ont immédiatement fonctionné.

BTW, ta bcm2835, c'est une bibliothèque statique ou dynamique ? parce que, même en natif dans qemu, j'obtiens encore un bcm2835.a.

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

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

Message par Bud Spencer » dim. 5 mars 2017 14:17

J’avais pensé à QEmu. La solution est élégante et permet de se faire ses petite SD sans utiliser le PI. Le problème, c’est que tout ce que je fais sur le pi gravite autour des GPIO et quand tu as gouté aux possibilités de faire du débogage tout en pouvant interagir sur le hard en temps reel, tout le reste te semble très fade.

Eclipse est un très bon outil, mais attention, c’est aussi une véritable usine à gaz (comme tous les outils puissant). Je me suis toujours posé la question de savoir si le problème d’Eclipse était Java ou si le problème de Java était Eclipse :lol:

Vu que tu m’obliges à essayer, j’en profite pour passer sur la 1.52 de bcm2835 j’obtiens bien un objet .o

Je repense soudains a Pinhapple qui voulait juste connecter son LSM9DS1 en I2C et qui se retrouve avec une thèse sur ‘la cross-compilation génratrice de librairie fâcheuse en environement c++ hostile:lol: . Ca a au moins le mérite de présenter la diversité des méthodes utilisées par chacun.
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. 5 mars 2017 14:43

Bud Spencer a écrit :J’avais pensé à QEmu. La solution est élégante et permet de se faire ses petite SD sans utiliser le PI. Le problème, c’est que tout ce que je fais sur le pi gravite autour des GPIO et quand tu as gouté aux possibilités de faire du débogage tout en pouvant interagir sur le hard en temps reel, tout le reste te semble très fade.

Eclipse est un très bon outil, mais attention, c’est aussi une véritable usine à gaz (comme tous les outils puissant). Je me suis toujours posé la question de savoir si le problème d’Eclipse était Java ou si le problème de Java était Eclipse :lol:

Vu que tu m’obliges à essayer, j’en profite pour passer sur la 1.52 de bcm2835 j’obtiens bien un objet .o

Je repense soudains a Pinhapple qui voulait juste connecter son LSM9DS1 en I2C et qui se retrouve avec une thèse sur ‘la cross-compilation génratrice de librairie fâcheuse en environement c++ hostile:lol: . Ca a au moins le mérite de présenter la diversité des méthodes utilisées par chacun.
Si tu veux debugger "in situ" à la dure, il reste jtag. C'est peu documenté mais c'est bien présent sur le GPIO du Raspberry ;-)))))
On l'a fait avec l'accord du PO donc on a pas pourri son fil et on lui a donné une vue assez globale de la problématique, tout en évitant les guerres de religion .

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

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

Message par Bud Spencer » dim. 5 mars 2017 15:06

jtag, connais pas, mais je vais regarder :D

ps : par curiosité, j'ai refais la compil de la bcm2835 direct sur le pi en détaillant les traces et finalement j'ai été voir dans l'usr/local/lib et j'ai effectivement libbcm2835.a et pas de libbcm2835.so dans usr/lib. Je n'avais jamais prêté attention à ca mais finalement ton problème n'en est peut être pas un.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

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

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

Message par Bud Spencer » dim. 5 mars 2017 19:04

Comme le mcp3208 était encore sur la plaque à trous et que le temps maussade ne m’encourageait pas trop à sortir, j’ai pris 5 minutes pour ajouter un test à mes petits ‘bench’ du dessus. Pour celui-là, fini les langages de barbare, la crosscompil compliquée et la ligne de commande. Passons à une belle appli GUI (mais si qu’elle est belle mon appli :mrgreen: ) et un langage moderne pour changer un peu. Le truc est dessiné à la souris en 20 seconde, codé et compilé exclusivement sous windows avec visual studio. Ensuite, je n’ai fait que copier le .exe et la dll sur le pi et lancer l’appli avec mono. Le langage utilisé est du c# et la ddl ne fait que wrapper la même lib wiringPi utilisée pour les autres bench.

Le code
cs_3208pi.png
cs_3208pi.png (52.03 Kio) Vu 1225 fois
Le résultat
cs_3208pi2.png
cs_3208pi2.png (112 Kio) Vu 1225 fois
Je vous laisse juger et comparer avec les résultats obtenu en c++ et en python3 qui n’était que des sorties console ;)

ps : petite erreur dans le message de résultat ou j'ai écrit mcp3204 au lieu de mcp3208, mais vous ne m'en voudrez pas pour si peu :? :lol:
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 » mar. 7 mars 2017 08:13

Bud Spencer a écrit :Je repense soudains a Pinhapple qui voulait juste connecter son LSM9DS1 en I2C et qui se retrouve avec une thèse sur ‘la cross-compilation génratrice de librairie fâcheuse en environement c++ hostile:lol: . Ca a au moins le mérite de présenter la diversité des méthodes utilisées par chacun.
Je suis plié en deux depuis hier à voir vos réponses dont le niveau est bien au-delà de mon Hello World ! en C++ ! :lol:

Mais effectivement, il y a visiblement beaucoup de méthodes différentes, et chacun de vous a l'air de savoir de quoi il parle :)
Donc merci pour les retours et les conseils, ça me fait de la lecture pour progresser ! ;)
  • 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 » mar. 7 mars 2017 11:33

Pinhapple a écrit : ...
Je suis plié en deux depuis hier à voir vos réponses dont le niveau est bien au-delà de mon Hello World ! en C++ ! :lol:

Mais effectivement, il y a visiblement beaucoup de méthodes différentes, et chacun de vous a l'air de savoir de quoi il parle :)
Donc merci pour les retours et les conseils, ça me fait de la lecture pour progresser ! ;)
Je ne peux,évidemment, parler qu'en mon nom mais je ne serais pas surpris que Bud plussoie mes propos.
-) Vous avez montré de l’intérêt et posé des questions pertinentes.
-) Vous vous retroussez les manches et cherchez des réponses ailleurs, sans attendre que "ça tombe tout cuit".
-) Votre utilisation du Raspberry et de son GPIO me semble plus dans l'esprit hacker qu'une nième question pour lire des vidéos ou installer un économiseur d'écran de la mort :twisted:

Je peux vous rassurer, ni Bud ni moi (à un niveau plus modeste), n'avons atteint ce niveau du jour au lendemain. On est toujours le "newby" de quelqu'un et on a toujours à apprendre
A votre tour, vous pourrez transmettre un peu de vos connaissances à des "bleus".

A+

Sylvain

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

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

Message par Bud Spencer » mer. 8 mars 2017 12:00

spourre a écrit :Je ne peux,évidemment, parler qu'en mon nom mais je ne serais pas surpris que Bud plussoie mes propos.
Tout a fait d'accord avec toi en tous points.

Tu as vu ? moi aussi j'arrive à faire des réponses courtes (mais c'est très difficile) :lol:
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 » jeu. 9 mars 2017 09:49

Bud Spencer a écrit :Tout a fait d'accord avec toi en tous points.
Merci ! :)

Toujours dans mon souci de lecture, je laisse tomber le Python pour le C++ avec WiringPi, et j'ai trouvé cette bibliothèque pour utiliser le LSM9DS1 avec un RPi (apparemment un portage d'une bibilo SparkFun pour Arduino), qui fonctionne avec I2C, que je vais garder dans un premier temps.

Je télécharge et installe la biblio, et me lance dans un premier exemple, le même que sur GitHub, mais pas à pas.

Tous les include fonctionnent, mais j'ai une erreur dès la première ligne d'initialisation : LSM9DS1 imu(IMU_MODE_I2C, 0x6a, 0x1c); (j'ai changé les adresses du gyro/accéléro et du magnéto pour les miennes) me renvoie l'erreur suivante lorsque je tente de compiler :

Code : Tout sélectionner

/tmp/cc0SlzTP.o: dans la fonction « main »:
ProgD.cpp:(.text+0x28): référence indéfinie vers « LSM9DS1::LSM9DS1(interface_mode, unsigned char, unsigned char) »
collect2: error: ld returned 1 exit status
Le code C++ étant :

Code : Tout sélectionner

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <time.h>
#include <sys/time.h>
#include <unistd.h>
#include "LSM9DS1_Types.h"
#include "LSM9DS1.h"

int main(int argc, char *argv[])
{

	LSM9DS1 imu(IMU_MODE_I2C, 0x6a, 0x1c);
	
	return 0;
	
}
Avez-vous une idée de ce qui ne va pas ?
Je soupçonne un peu l'installation de la biblio, que j'ai téléchargée en ZIP avant de l'installer "à la main" avec le terminal sur mon RPi.

Sinon, je suis un peu perplexe à cause du message d'erreur : unsigned char ? Alors qu'on est censé passer un nombre ? :?
Modifié en dernier par Pinhapple le jeu. 9 mars 2017 09:59, modifié 1 fois.
  • RPi 3 + LibreELEC / RPi 3 + RetroPie / RPi B+ + Sense HAT ou Framboisedorf ou module caméra
  • Arduino Mega, Uno, Nano
  • Freescale FRDM KL25Z

Répondre

Retourner vers « Les BUS interfaces »