samedi 3 janvier 2015

Mesurer un angle d'inclinaison avec un accéléromètre

Aujourd'hui, nous construisons un inclinomètre, c'est à dire un appareil qui mesure sa propre inclinaison par rapport à l'horizontale.

Pour ce faire, nous utiliserons encore une fois un breakout basé sur l'accéléromètre MMA7455 relié à un Arduino Uno.

Puisqu'un accéléromètre sert à mesurer une accélération, il peut être un peu surprenant d'apprendre qu'on peut s'en servir pour mesurer l'inclinaison d'un objet immobile...   La raison, c'est qu'un accéléromètre ne fait pas la différence entre l'accélération et la gravité.  Lorsqu'il est immobile, l'accéléromètre mesure, en fait, le champ gravitationnel.

Pour être plus précis, l'accéléromètre mesure la composante de la force de gravité selon 3 axes:  l'axe des x (orienté selon le sens de la longueur du breakout), l'axe des y (orienté selon le sens de la largeur du breakout) et l'axe des z (orienté perpendiculairement à la surface du breakout).

Par exemple, si votre accéléromètre repose à plat sur la surface d'une table, l'axe des x et l'axe des y sont horizontaux, et l'axe des z est vertical:  toute la force gravitationnelle est orientée selon l'axe des z et l'accéléromètre affichera:

x:  0    y : 0     z: 63

... ce qui est l'équivalent de:

x:  63 sin 0°       y: 63 sin 0°     z: 63 cos 0°

(63 est la valeur correspondant à une accélération de 1 g, lorsque l'accéléromètre a été réglé pour mesurer des valeurs allant de -2g à +2g).

Supposons maintenant que vous inclinez  l'accéléromètre de 30°, de façon que l'axe des x ne soit plus parfaitement horizontal, et que l'axe des z ne soit plus parfaitement vertical.  La force gravitationnelle se répartit maintenant sur deux axes, avec une composante x et une composante z:

x: 63 sin 30°            y = 0      z = 63 cos 30°

Donc, pour mesurer l'angle d'inclinaison du breakout, il s'agit de mesurer les 3 composantes de l'accélération (x, y et z) et de faire un peu de trigonométrie.

Les branchements

Notre breakout sera branché pour être utilisé en mode I2C:
  • Vcc du breakout au 5 V de l'Arduino (car le breakout que j'utilise comporte un régulateur de tension:  si le vôtre n'en comporte pas, ou si vous n'êtes pas certain qu'il en comporte un, commencez par le brancher à 3,3V).
  • GND du breakout au GND de l'Arduino
  • SCL du breakout à l'entrée analogique A5 de l'Arduino
  • SDA du breakout à l'entrée analogique A4 de l'Arduino
Mon breakout semble déjà comporter des résistances de tirage à SCL et SDA, ainsi qu'à CS (pour activer le mode I2C).  Ces résistances peuvent être nécessaires si votre breakout est différent du mien.

Bibliothèque MMA7455

Si ce n'est pas déjà fait, installez la bibliothèque MMA7455 de Moritz Kemper.

Le sketch

Ce court sketch utilise les composantes x, y et z mesurées par l'accéléromètre pour calculer:

- l'angle que fait l'axe des x du breakout par rapport à l'horizontale
- l'angle que fait l'axe des y du breakout par rapport à l'horizontale
- l'angle que fait l'axe des z du breakout par rapport à la verticale, peu importe que cette inclinaison soit causée par une inclinaison de l'axe des x, ou par une inclinaison de l'axe des y, ou  par une combinaison des deux.



Conclusion:

Les mesures sont plausibles, mais il y a du bruit:  en laissant l'accéléromètre parfaitement immobile (donc son inclinaison ne change pas), la valeur mesurée peut varier de quelques degrés;  je m'attendais à mieux.

Yves Pelletier (Twitter: @ElectroAmateur)

2 commentaires:

  1. Bonjour,

    Merci bcp pour ce super article !
    Il y a juste une chose que je ne comprend pas, comment ça se fait que sqrt(xVal*xVal+yVal*yVal+zVal*zVal)nous donne l'accélération totale ?

    Merci d'avance pour votre réponqe
    Cordialement

    RépondreSupprimer
    Réponses
    1. c'est comme la norme d'un vecteur, tu prends la racine carrée des composantes carrés sur chaque axe

      Supprimer

Related Posts Plugin for WordPress, Blogger...