IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Raspberry Pi Discussion :

Récupérer les données d'un capteur en i2c


Sujet :

Raspberry Pi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Femme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2021
    Messages : 9
    Par défaut Récupérer les données d'un capteur en i2c
    Bonjour,
    je travaille sur un projet pour le développement d'une centrale inertielle, soit la récupération des données d'un capteur 10 DOF et leur affichage au sein d'une IHM.
    j'ai réussi à établir la connexion entre mon programme et le capteur mais je ne vois pas comment je pourrais faire pour récupérer les données. Est-ce que vous avez des idées de fonctions que je peux utiliser pour ça svp?
    Voila à quoi ressemble mon code:
    Code Qt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #include "mainwindow.h"
    #include <QApplication>
    #include <cstdio>
    #include <iostream>
    #include <unistd.h>
    #include <fcntl.h>
    #include <sys/ioctl.h>
     
    using namespace std;
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
     
        int file_i2c;
        int length;
        int buffer[4];
        char *filename= (char*) "/dev/i2c-1";
     
        if((file_i2c=open(filename, O_RDWR))<0)
        {
            cout<<"fail to open I2C bus"<<endl;
        }
        int addr= 0x77;
        if(ioctl(file_i2c, 0x0703, addr)<0)
        {
            cout<<"failed to acquire bus access or talk to the slave"<<endl;
        }
        length=4;
        if(read(file_i2c, buffer,length)!=length)
        {
            cout<<"Failed to read from the i2c bus"<<endl;
     
        }else {
          //  int nb=read(file_i2c,buffer,length);  
             //   cout<<"nb"<<nb<<endl;  
         //je ne sais pas quoi mettre dans cette partie
    }

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 213
    Billets dans le blog
    48
    Par défaut
    Bonsoir,

    Citation Envoyé par Lyndaasihjo Voir le message
    j'ai réussi à établir la connexion entre mon programme et le capteur mais je ne vois pas comment je pourrais faire pour récupérer les données. Est-ce que vous avez des idées de fonctions que je peux utiliser pour ça svp?
    La suite consiste à taper dans les registres du capteur, en écriture pour envoyer les commandes I2C, en lecture pour récupérer les données brutes.
    Voir Implementing I2C device drivers in userspace.
    Regarde du côté des fonctions i2c_smbus_read_word_data() et i2c_smbus_write_word_data().

    Pour connaître les adresses des registres, les commandes et le protocole en général, il faut éplucher la datasheet du capteur I2C

  3. #3
    Membre habitué
    Femme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2021
    Messages : 9
    Par défaut
    Merci pour ta réponse. J'ai suivi ton conseil et télécharger les différentes bibliothèques qui me permettent d'utiliser ces fonctions mais j'ai un problèmes qui persiste, mon programme ne veut pas compiler et on m'affiche "undefined reference to i2c_smbus_read_word_data()"
    J'ai pourtant isoler les bibliothèques concernant la fonction comme ci-dessous, cette astuce a l'air de fonctionner pour des personnes ayant ete confronté a la meme error mais ca ne fonctionne pas dans mon cas.
    Code Qt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    extern "C" {
    #include <linux/i2c-dev.h>
    #include <i2c/smbus.h>
    }

    Est ce que tu as d'autres idées?

    Voila a quoi ressemble mon code:

    Code Qt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    extern "C" {
    #include <linux/i2c-dev.h>
    #include <i2c/smbus.h>
    }
     
    #include "mainwindow.h"
    #include <QApplication>
    #include <cstdio>
    #include <iostream>
    #include <unistd.h>
    #include <fcntl.h>
    #include <sys/ioctl.h>
    #include <stdio.h>
    #include <stdlib.h>
    using namespace std;
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
     
        int file_i2c;
        int length;
        int buffer[4];
        char *filename= (char*) "/dev/i2c-1";
        if((file_i2c=open(filename, O_RDWR))<0)
        {
            cout<<"fail to open I2C bus"<<endl;
        }
        int addr= 0x77;
        if(ioctl(file_i2c, 0x0703, addr)<0)
        {
            cout<<"failed to acquire bus access or talk to the slave"<<endl;
        }
        length=4;
        if(read(file_i2c, buffer,length)!=length)
        {
            cout<<"Failed to read from the i2c bus"<<endl;
     
        }else {
     
                cout<<"Data read"<<endl;
     
                __u8 reg = 0x10; /* Device register to access */
                __s32 res;
     
                res=i2c_smbus_read_word_data(file_i2c,reg);
     
    }
     
        return a.exec();
    }

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 213
    Billets dans le blog
    48
    Par défaut
    Citation Envoyé par Lyndaasihjo Voir le message
    [...] mon programme ne veut pas compiler et on m'affiche "undefined reference to i2c_smbus_read_word_data()"
    ...
    As-tu essayé leur équivalent avec read/write ?

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    /*
     * Using I2C Write, equivalent of
     * i2c_smbus_write_word_data(file, reg, 0x6543)
     */
    buf[0] = reg;
    buf[1] = 0x43;
    buf[2] = 0x65;
    if (write(file, buf, 3) != 3) {
      /* ERROR HANDLING: I2C transaction failed */
    }
     
    /* Using I2C Read, equivalent of i2c_smbus_read_byte(file) */
    if (read(file, buf, 1) != 1) {
      /* ERROR HANDLING: I2C transaction failed */
    } else {
      /* buf[0] contains the read byte */
    }

  5. #5
    Membre habitué
    Femme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2021
    Messages : 9
    Par défaut
    Les fonctions read() et write() fonctionnent, je les ai même utilisé dans mon code, mon problème c'est que je n'arrive pas à lire les valeurs dans le buffer pour pouvoir les exploiter.

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 213
    Billets dans le blog
    48
    Par défaut
    Cette partie-là dépend du capteur utilisé. Quelle est la référence du capteur ?

  7. #7
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 213
    Billets dans le blog
    48
    Par défaut
    Bonsoir,

    Citation Envoyé par Lyndaasihjo Voir le message
    Code Qt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
        int addr= 0x77;
        if(ioctl(file_i2c, 0x0703, addr)<0)
        {
            cout<<"failed to acquire bus access or talk to the slave"<<endl;
        }
    D'après la doc, l'adresse du composant est 0x68 par défaut. Il est étonnant que tu aies pu te connecter au capteur

    Que signifie la valeur 0x0703 ?

    Ne serait-ce pas plutôt quelque chose comme :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int addr = 0x68; /* adresse I2C par défaut */
     
    if (ioctl(file_i2c, I2C_SLAVE, addr) < 0) {
      /* erreur à gérer */
      exit(1);
    }

  8. #8
    Membre habitué
    Femme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2021
    Messages : 9
    Par défaut
    Bonjour,
    vous avez raison , c'est une erreur très stupide de ma part. Les deux adresse 0x68 et 0x77 étant inscrite sur le capteur, j'ai associé l'une au gyroscope et l'autre a l'accéléromètre. Le programme fonctionnait mais me retournais buffer[0]= 0. Les résultats obtenue avec l'adresse 0x68 paraissent beaucoup plus plausibles, il ne me reste plus qu'a exploiter ces données de la bonne façon pour obtenir le résultat finale.
    Merci beaucoup pour votre aide.
    0x0703 correspond a l'adresse esclave du bus I2C de ma Rpi, la notation I2C_SLAVE ne fonctionne pas directement.

  9. #9
    Membre habitué
    Femme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2021
    Messages : 9
    Par défaut
    Rebonjour,
    est ce que vous avez des idées pour la façon de récupérer ces valeurs. Je ne trouve rien de bien concret sur internet, la majorité des projet porte sur de l'Arduino. J'ai essayer de m'inspirer de la librairie Arduino MPU9250.h ainsi que la Datasheet MPU9250 Register Map mais je ne comprends pas comment exploiter ces données.

Discussions similaires

  1. Récupérer les données de capteurs domotiques
    Par titcholo dans le forum Delphi
    Réponses: 6
    Dernier message: 23/12/2020, 12h19
  2. Récupérer les données d'une batterie via i2C²
    Par DECIDELife dans le forum Raspberry Pi
    Réponses: 0
    Dernier message: 20/07/2018, 15h21
  3. [VBA-E] Récupérer les données d'un capteur en USB
    Par $p00ky dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 17/05/2006, 15h29
  4. Récupérer les données interbase dans une TStringGrid
    Par Ousse dans le forum Bases de données
    Réponses: 1
    Dernier message: 24/03/2005, 12h51
  5. Récupérer les données d'une iframe
    Par juli1 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 09/02/2005, 22h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo