Accéléromètre et Gyroscope avec l’Arduino RP2040

 

Dans ce document, nous allons tout d’abord présenter les fonctions d’accéléromètre et gyroscope, puis le circuit LSM6DSOX et pour finir un programme d’exemple en CircuitPython

À quoi servent l’Accéléromètre et le Gyroscope ?

Tous nos téléphones portables sont équipés d’un accéléromètre et d’un gyroscope qui permet de détecter les mouvements effectués par l’utilisateur sur son téléphone :

  • Pivoter automatiquement l’écran
  • Réglage du capteur photo
  • Photo à 360 °

Typiquement, l’accéléromètre va détecter les mouvements tandis que le gyroscope l’orientation de l’appareil.

Deux fonctions bien distingues

Qu’est-ce qu’un accéléromètre

Ce capteur va mesurer l’accélération suivant les trois d’axes de l’espace x,y et z :

Fonctions d’un accéléromètre

En utilisant ces valeurs de l’accélération et en effectuant un traitement plus ou moins simple, il est possible de détecter les mouvements, les vibration, la vitesse etc..

Qu’est-ce qu’un gyroscope

Lorsqu’un objet tourne autour d’un axe, il n’a pas de vitesse linéaire comme un coureur, mais une vitesse angulaire.

Par exemple, la vitesse de rotation d’une roue, appelée vitesse angulaire peut être mesuré en tours par minutes, radians par seconde ou degrés par seconde.

En général, le gyroscope renvoie la mesure de la vitesse angulaire en degrés par seconde (degrees per second, dps)

Fonction d’un gyroscope

Le gyroscope pourra détecter les mouvements de rotation (pivotement)

Quelles sont leurs différences ?

L’accéléromètre est linéaire (suivant trois axes), tandis que le gyroscope est angulaire (autour de trois axes)

Principe de fonctionnement

Pour mesurer les accélérations linéaires ou angulaires, ces capteurs sont de type MEMs (Microelectromechanical systems).

Le principe de fonctionnement est le suivant : un peigne mobile est monté sur un peigne fixe et dès qu’il y a une accélération, il y a un déplacement de la partie mobile. Ensuite ce déplacement est converti en tension électrique.

Petit détail : les peignes mesurent moins de 100μm !!!

https://youtu.be/eqZgxR6eRjo

Le circuit LSM6DSOX

Le datasheet se trouve à l’adresse suivante :
Datasheet du LSM6DSOX

https://www.st.com/resource/en/datasheet/lsm6dsox.pdf

Présentation

Le LSM6DSOX est un circuit de type IMU (inertial measurement unit) que l’on traduire par l’unité de mesure inertielle produit par ST Electronics.

Ce capteur possède six axes de liberté :

  • Trois pour l’accélération linéaire
  • Trois autres pour la vitesse angulaire

Les calibres de l’accéléromètre sont +/2, +/-4, +/-8 ou +/-16 g entre une fréquence de 1.6Hz à 6.7kHz suivant la configuration.

Pour le gyroscope, il peut avoir une plage de travail de +/-125, 250, 500 ,1000 ou 2000 dps(degrees per second, degrés par seconde) pour une fréquence entre 12.5 Hz à 6.7 kHZ toujours suivant la configuration.

LSM6DSOX Intégré sur la carte Arduino RP2040

Ce capteur mesurant l’accélération et la vitesse angulaire est intégré sur la carte Arduino RP2040

Composant I2c d’adresse 0x6A, il est branché sur la RP2040 sur les ports I2c SDA/A4 et SCL/A5 :

Notez à droite, le symbole permettant d’identifier les axes x, y et z.

Exemple d’utilisation

D’après https://learn.adafruit.com/circuitpython-on-the-arduino-nano-rp2040-connect/accelerometer-gyroscope

Bibliothèques utilisées

Deux bibliothèques sont nécessaires :

  • adafruit_lsm6ds : pour l’accéléromètre/gyroscope
  • adafruit_register : i2c

Pour connaitre la procédure de copie des bibliothèques :

Gestion des blibliothèques CircuitPython

http://www.framboiseetcompagnie.fr/installation-des-bibliotheques-libraries-circuitpython/

Analyse du code

Une bibliothèque circuitpython permettant l’utilisation de ce circuit s’appelle adafruit_lsm6ds.lsm6dsox et est très simple à utiliser :

Après les classiques

import time
import board

nous allons importer la bibliothèque

from adafruit_lsm6ds.lsm6dsox import LSM6DSOX

Le capteur est en i2c donc on récupère les ports i2c et ensuite on les transmet comme paramètre pour la création de l’objet sensor de classe LSM6DSOX

Le capteur renvoie une valeur de la vitesse angulaire, pour que cela soit plus parlant je n’a voudrai en degrés/seconde, d’où rd qui va me permettre cette convertion

rd = 180/3.14159 # convertion radians en degrés

Les valeurs d’accélération et vitesse angulaire se récupère tout simplement à l’aide de sensor.accelaration et sensor.gyro renvoyant chacun un tuple

ax, ay, az = sensor.acceleration
gx, gy, gz = sensor.gyro # en radians/secondes

Les deuxièmes valeurs sont converties en degrés par secondes :

gdx, gdy, gdz = rd * gx, rd * gy, rd * gz

Puis on les affiche avec deux chiffres après la virgule pour les deux premiers et en entier pour le dernier :

print("Acceleration: X:%.2f, Y: %.2f, Z: %.2f m/s^2" % (ax,ay, az))
print("Gyro X:%.2f, Y: %.2f, Z: %.2f radians/s" % (gx, gy, gz))
print("Gyro X:%.0f, Y: %.0f, Z: %.0f degrés/s" % (gdx, gdy, gdz))

 

Et pour terminer, on met ces six lignes de code dans une boucle infinie et on met une pause de 0.5 seconde entre les affichages

while True:
    ax, ay, az = sensor.acceleration
    gx, gy, gz = sensor.gyro # en radians/secondes
    gdx, gdy, gdz = rd * gx, rd * gy, rd * gz
    #print("Acceleration: X:%.2f, Y: %.2f, Z: %.2f m/s^2" % (ax,ay, az))
    print("Gyro X:%.2f, Y: %.2f, Z: %.2f radians/s" % (gx, gy, gz))
    print("Gyro X:%.0f, Y: %.0f, Z: %.0f degrés/s" % (gdx, gdy, gdz))
    print("")
    time.sleep(0.5)

 

 

Code complet

# SPDX-FileCopyrightText: Copyright (c) 2020 Bryan Siepert for Adafruit Industries
# SPDX-License-Identifier: MIT
import time
import board
from adafruit_lsm6ds.lsm6dsox import LSM6DSOX #lsm6dsox register

i2c = board.I2C()  # uses board.SCL and board.SDA
sensor = LSM6DSOX(i2c)
rd = 180/3.14159 # convertion radians en degrés
while True:
    ax, ay, az = sensor.acceleration
    gx, gy, gz = sensor.gyro # en radians/secondes
    gdx, gdy, gdz = rd * gx, rd * gy, rd * gz
    #print("Acceleration: X:%.2f, Y: %.2f, Z: %.2f m/s^2" % (ax,ay, az))
    print("Gyro X:%.2f, Y: %.2f, Z: %.2f radians/s" % (gx, gy, gz))
    print("Gyro X:%.0f, Y: %.0f, Z: %.0f degrés/s" % (gdx, gdy, gdz))
    print("")
    time.sleep(0.5)

 

Exécution du code – ajout de bibliothèques

Pour cela il faut copier le programme sur la carte dans un fichier qui doit s’appeler code.py

Si vous exécutez ce code, vous allez avoir :

Ou sa traduction en français.

Il vous manque les fichiers de la bibliothèques adafruit_lsm6ds.lsm6dsox et vous ne le savez pas encore une autre : adafruit_register

Il faut les déposer sur votre carte, dans le lecteur CIRCUITPY pour qu’elles soient utilisées par votre programme.
Gestion des blibliothèques CircuitPython

Leave a Reply