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

Arduino Discussion :

Calibration Accéléromètre LIS3DSH


Sujet :

Arduino

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2016
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Calibration Accéléromètre LIS3DSH
    Bonjour ,
    j'utilise un Accélérometre LIS3DSH , voila le code en arduino :
    Code : 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
    #include <Wire.h>
    int x,y,z;
    float K=0.061; // (4000/65535) milli-g per digit for +/-2g full scale using 16 bit digital output
    void setup()
    {
      Wire.begin();        // join i2c bus (address optional for master)
      Serial.begin(9600);  // start serial for output
      Wire.beginTransmission(0x1E); // transmit to device #30
      Wire.write(0x20);//Send address of 'Control register 4' to write configuration
      Wire.write(0x7F);//Write a value that enables x,y,z accelerometers
      Wire.endTransmission();// stop transmitting
    }
     
    void loop()
    {
      delay(1000);
     
      Wire.beginTransmission(0x1E); // transmit to device #30
      Wire.write(0x28);//Send address of LSB of x. Address is auto-increased after each reading.
      Wire.endTransmission();    // stop transmitting
     
      Wire.requestFrom(0x1E, 6);    // request 6 bytes from slave device #30
      x = Wire.read() | Wire.read()<<8; //x acceleration 
      y = Wire.read() | Wire.read()<<8; //y acceleration
      z = Wire.read() | Wire.read()<<8; //z acceleration
     
      Serial.println("x=" + String(K*x)+" mg  \ty=" + String(K*y)+" mg  \tz=" + String(K*z)+" mg");
    }
    le code marche bien mais je dois calibrer mon accélérometter , j'ai essayer plusieurs façon de le calibrer mais j'ai pas pu le faire , quelqu'un peut me guider comment je calibre ce capteur
    PS : une semaine de galère avec ! HELP PLEASE :'(

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


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 612
    Points : 56 717
    Points
    56 717
    Billets dans le blog
    40
    Par défaut
    Bonjour,

    Qu'entends-tu par "calibrer" ? Tu as un décalage (Zero-glevel offset) ?

    PS : il fonctionne réellement ce code pour les accélérations négatives ? Je vois dans la doc qu'il faut faire le complément à 2.

    OUT_X_L (28h), OUT_X_H (29h)
    X-axis acceleration data. The value is expressed in two’s complement.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2016
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    [Bonjour
    oui il marche et il me donne des valeur positive et négative ;
    sur l'axe de Z example j'ai 1004 mg ( sa varie entre 1000 et 1008 ) et sur x et y normalement on a 0 ( ou presque ) mais j'ai 70mg ( 62 a 70 sur y ) et -10 ( -10 a -18 mg sur x )
    que dois je faire !!!!!!

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


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 612
    Points : 56 717
    Points
    56 717
    Billets dans le blog
    40
    Par défaut
    Ok, le type int d'Arduino prend en charge les nombres négatifs...

    Il faudrait tourner le capteur dans tous les sens pour être sûr. Cela donne quoi si l'axe x et y sont disposés verticalement ?

    Dans une Application Note du composant, on trouve ceci :

    Nom : Capture_offset.JPG
Affichages : 613
Taille : 83,4 Ko

    Final acceleration output value is composed as:
    Output(axis) = Measurement(axis) - OFFSET_x(axis) * 32
    En écrivant dans les registres 10h, 11h et 12h, tu peux compenser le décalage du zéro avec un offset sur chaque axe.

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


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 612
    Points : 56 717
    Points
    56 717
    Billets dans le blog
    40
    Par défaut
    Citation Envoyé par ludo14
    Merci beaucoup pour l'info

    Ps : j'arrive pas a répondre dans la discussion je sais pas pourquoi !
    du coup pour les registres j’implémente comme çà ??
    je sais pas trop comment le faire !


    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
    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
     
    #include <Wire.h>
    #include <LIS3DSH.h>
    float K = 0.061; // (4000/65535) milli-g per digit for +/-2g full scale using 16 bit digital output
    LIS3DSH accel;
    #define offset_x= 0x10 ;
    #define offset_y=0x11;
    #define offset_z=0x12;
     
     
      float Acc_X, Acc_Y, Acc_Z ;
     
    void setup() 
    {
      Serial.begin(9600);
      Wire.begin();
      accel.enableDefault();
    }
     
    void loop() 
    {
      int16_t x, y, z;
      //int8_t temperature;
     
      accel.readAccel(&x, &y, &z);
      accel.readTemperature(&temperature);
      Acc_X= ((x)-offset_x*32);
      Acc_Y= ((y)-offset_y*32);
      Acc_Z= ((z)-offset_Z*32);
     
     
     
      Serial.print("Accel ");
      Serial.print("X: ");
      Serial.print(x);
      Serial.print(" Y: ");
      Serial.print(y);
      Serial.print(" Z: ");
      Serial.print(z);
      Serial.print(" T: ");
      //Serial.println(temperature);
     
    delay(1000);
    }


    tu peux me corriger si je me suis planter ???

    Merci

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


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 612
    Points : 56 717
    Points
    56 717
    Billets dans le blog
    40
    Par défaut
    Citation Envoyé par ludo14
    Ps : j'arrive pas a répondre dans la discussion je sais pas pourquoi !
    Bizarre, à suivre... Tu n'as pas de bouton [Répondre à la discussion] en bas à gauche de la page ?

    Citation Envoyé par ludo14
    tu peux me corriger si je me suis planter ???
    C'est un peu plus compliqué que ça

    Tes variables offset_xx ne contiennent que les adresses des registres du LIS3DSH, mas tu ne vas pas lire ou écrire dedans...

    Je vois maintenant que tu utilises une bibliothèque qui comprend sans doute des classes qui permettent de s'affranchir de tout le bazar des registres et du protocole I2C. C'est bien celle-là ?

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2016
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Oui bien sur mais sa passe pas depuis tout a l'heur !! :/ meme maintenant sa passe pas !
    la boite ou je suis bloque des site ! du coup sa me fait çà :/

    oui effectivement j'utilise cette bibliothèque
    du coup je me sens un peu perdu pour la calibration !
    comment je peux introduire la calibration stp !!!

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


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 612
    Points : 56 717
    Points
    56 717
    Billets dans le blog
    40
    Par défaut
    Citation Envoyé par ludo14 Voir le message
    meme maintenant sa passe pas !
    l'est quand même passé celui-là

    Eh bien, laisse tomber cette bibliothèque qui ne prend pas en charge l'offset. Le plus simple est de repartir de ton premier programme.

    Par exemple, pour ton axe y qui donne un décalage de +65 mg en gros.

    65 mg = (4000/65535) x 1064, et 1064 vaut environ 33 x 32.

    Pour aller au plus vite et tester le principe, dans le setup, tu rajoutes :

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Wire.beginTransmission(0x1E); // 0x1E = adresse du composant
    Wire.write(0x11); // pointer au registre OFF_Y
    Wire.write(33); // offset de 65 mg
    Wire.endTransmission(); // fin de transmission

    Rajoute un delay(5); entre une fin de transmission et un nouveau début.

    à tester...

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


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 612
    Points : 56 717
    Points
    56 717
    Billets dans le blog
    40
    Par défaut
    Citation Envoyé par ludo14
    Merci beaucoup c'est ce que j'ai fais j'ai mis ça pour calculer l'offset du coup maintenant la ponte ( Y=Ax+B ) , comment je peux calculer la ponte pour calibrer mon capteur , ? voila le code que j'ai fais , et pour l'offset normalement c'est ça

    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
    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
    #include <Wire.h>
    #include <LIS3DSH.h>
     
     
    float K = 0.061; // (4000/65535) milli-g per digit for +/-2g full scale using 16 bit digital output
    LIS3DSH accel;
     
    #define LIS3DSH_ADDR_SEL_HIGH  0x1d 
    void setup() 
    {
      Serial.begin(9600);
      Wire.begin();
      accel.enableDefault();
    }
     
    void loop() 
    {
      int16_t x, y, z;
      //int8_t temperature;
     
     
    Wire.beginTransmission(LIS3DSH_ADDR_SEL_HIGH); //On se connecte au composant avec l'adresse LIS3DSH_ADDR_SEL_HIGH (qui est codé sur 1 octet, par chance c'est deja fait dans une des librairie que t'utilises)
    Wire.write(0x10); 
    Wire.write(4); 
    Wire.endTransmission(); 
     
    Wire.beginTransmission(LIS3DSH_ADDR_SEL_HIGH); 
    Wire.write(0x11 ); 
    Wire.write(19); 
    Wire.endTransmission(); 
     
     
     
    Wire.beginTransmission(LIS3DSH_ADDR_SEL_HIGH); 
    Wire.write(0x12); 
    Wire.write(0);
    Wire.endTransmission(); 
     
      accel.readAccel(&x, &y, &z);
      //accel.readTemperature(&temperature);
     
      Serial.print("Accel ");
      Serial.print("X: ");
      Serial.print(x);
      Serial.print(" Y: ");
      Serial.print(y);
      Serial.print(" Z: ");
      Serial.print(z);
    delay(1000);
    }

    comment je peux mettre mon coef de correction ( la ponte )
    Merci
    Embêtant ton souci pour poster sur Developpez. Un problème de proxy ou autres, faudrait voir ça avec l'administrateur chez toi.

    Je regarde ton code...

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


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 612
    Points : 56 717
    Points
    56 717
    Billets dans le blog
    40
    Par défaut
    Visiblement, c'est de la haute précision que tu recherches...

    Alors il faut taper haut et à la source : http://www.st.com/resource/en/applic...dm00119044.pdf

    Un peu de maths pour déterminer les coefficients de la matrice, et encore, ces p'tits joueurs n'incluent pas l'influence de la température. Feu...

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2016
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Re oui c'est un peu compliquer !

    Oui comment dois je faire pour les coef et la matrice en Arduino ! . ??
    est ce que y'a une autre méthode pour calibrer ( le Min et le Max peut être utile ? )
    Help please

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


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 612
    Points : 56 717
    Points
    56 717
    Billets dans le blog
    40
    Par défaut
    Bonjour,

    Merci beaucoup c'est ce que j'ai fais j'ai mis ça pour calculer l'offset du coup maintenant la pente ( Y=Ax+B ) , comment je peux calculer la pente pour calibrer mon capteur ,
    2 équations à 2 inconnues (gain et offset) pour chaque axe, tu peux faire ça assez simplement avec 2 mesures par axe : une en orientant l'axe suivant +g, et l'autre suivant -g.

  13. #13
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2016
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Bonjour
    Bonjour j'ai pu calibrer l'accelero en utilisant le Min et le Max , et je suis un peu satisfait , du résultat

    il me reste juste a déterminer l'écart type et enlevé la gravité pour laisser que l'accélération linéaire

    si t'as une idée ??? comment on fait

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


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 612
    Points : 56 717
    Points
    56 717
    Billets dans le blog
    40
    Par défaut
    Bonjour,

    Citation Envoyé par ludo14 Voir le message
    [...] en utilisant le Min et le Max
    Je n'ai pas bien compris ce que tu fais, un calibrage ou un filtrage ?

    Citation Envoyé par ludo14 Voir le message
    il me reste juste a déterminer l'écart type
    , avec "calculer écart type"...

    Citation Envoyé par ludo14 Voir le message
    et enlevé la gravité pour laisser que l'accélération linéaire
    Tu n'as pas un axe de ton dispositif toujours orienté suivant + ou -g ?

  15. #15
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2016
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Salut
    Salut , j'ai utiliser un bouton poussoir a une pin , et j'ai mis Min et Max et je calibrer manuellement en plusieurs type d'axes ( -x.x -y y -z z ) et j'ai eu des résultat ( j'ai suivie l’exemple de ADXL335 sur Adafruit )

    maintenant je dois enlever la gravité et laisser l’accélération linéaire ? tu peux m'expliquer c'est quoi la différence et comment je peux faire çà ??

    pour l’écart type , j'ai pensé a Silab , pour le faire , pour mieux avoir une précision et voir mon écart type

    merci beaucoup

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


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 612
    Points : 56 717
    Points
    56 717
    Billets dans le blog
    40
    Par défaut
    Même "au repos", tu es "accéléré" à cause de la pesanteur (voir principe d'équivalence d’Einstein) et ton accéléromètre va mesurer une accélération g=9,81m/s2.

    En théorie, avec un accéléromètre seul tu ne peux pas isoler g de l'accélération linéaire (=force extérieure/masse).

    Apparemment on peut s'en sortir avec des filtres numériques, je suppose que cela fonctionne bien pour des mouvements "lents". J'ai découvert le principe dans la doc d'Android : SensorEvent API

  17. #17
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2016
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Bonjour ,
    Oui j'ai compris le principe mais j'ai pas compris comment l’interpréter en Arduino ,
    y'a une fonction en arduino pour faire ça si tu peux m'aider ??

    merci

Discussions similaires

  1. Calibration d'une caméra :quid de la distance ?
    Par horu dans le forum Traitement d'images
    Réponses: 18
    Dernier message: 29/11/2007, 16h47
  2. Calibration de caméras (cvFindChessBoard)
    Par SpongeBob dans le forum OpenCV
    Réponses: 1
    Dernier message: 03/05/2007, 23h03
  3. [Graveur] Calibration Area Error !
    Par bnadem35 dans le forum Périphériques
    Réponses: 4
    Dernier message: 01/12/2006, 18h10
  4. calibration multi point
    Par Platypus dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 23/10/2006, 11h16
  5. Calibrer une imprimante via xsl
    Par **jouly** dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 24/01/2006, 18h48

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