Mise en oeuvre de l’accéléromètre LIS2DW12

Cet exemple montre comment mesurer une accélération selon trois axes à l’aide du capteur MEMS LIS2DW12 de STMicroelectronics.

Il consiste à allumer une LED selon l’axe sur lequel l’accélération de la gravité est détectée. Le vecteur accélération est décomposé sur un trièdre (x, y, z) orthogonal précisé sur cette page.

Voici la configuration des axes de l’accélération / couleurs de LED :

  • Accélération détectée selon l’axe x : LED verte allumée
  • Accélération détectée selon l’axe y : LED bleue allumée
  • Accélération détectée selon l’axe z : LED rouge allumée

Matériel requis

  1. La carte NUCLEO-WB55
  2. Une carte d’extension I2C équipée du capteur MEMS LIS2DW12 (par exemple la X-NUCLEO-IKS01A3)

Le code MicroPython

Les scripts présentés ci-après sont disponibles dans la zone de téléchargement.

Le fichier lis2dw12.py est la bibliothèque contenant les classes pour gérer l’accéléromètre. Il doit être copié dans le répertoire du disque USB virtuel associé à la NUCLEO-WB55 : PYBFLASH.

Éditez maintenant le script main.py et copiez-y le code qui suit :

# Objet du script :
# Mesure les accélérations suivant 3 axes orthogonaux (en mg) toutes les demi secondes. 
# Allume ou éteint les LED de la carte selon les valeurs des accélérations
# Cet exemple nécessite un shield X-NUCLEO IKS01A3 pour l'accéléromètre MEMS LIS2DW12 

from machine import I2C
import pyb # Pour gérer les LED
import lis2dw12 # Pilote de l'accéléromètre
from time import sleep_ms # Pour temporiser

# On utilise l'I2C n°1 de la carte NUCLEO-WB55 pour communiquer avec le capteur
i2c = I2C(1) 

# Pause d'une seconde pour laisser à l'I2C le temps de s'initialiser
sleep_ms(1000)

# Instanciation de l'accéléromètre
accelerometre = lis2dw12.LIS2DW12(i2c)

led_bleu = pyb.LED(1)
led_vert = pyb.LED(2)
led_rouge = pyb.LED(3)

while True:
	sleep_ms(500)
	if abs(accelerometre.x()) > 700 : # Si la valeur absolue de l'accélération sur l'axe x est supérieure à 700 mg alors
		led_vert.on()
		print("led_vert.on")
	else:
		led_vert.off()
	if abs(accelerometre.y()) > 700 : # Si la valeur absolue de l'accélération sur l'axe y est supérieure à 700 mg alors
		led_bleu.on()
		print("led_bleu.on")
	else:
		led_bleu.off()
	if abs(accelerometre.z()) > 700 : # Si la valeur absolue de l'accélération sur l'axe z est supérieure à 700 mg alors
		led_rouge.on()
		print("led_rouge.on")
	else:
		led_rouge.off()

Programmer un inclinomètre

Avec un peu de trigonométrie, il est possible de programmer un inclinomètre à l’aide d’un accéléromètre. Le principe est le suivant : lorsque l’accéléromètre est immobile (ou en mouvement rectiligne uniforme sans vibrations) et que son plan est horizontal, il mesure exactement 1g, l’accélération de la pesanteur, suivant son axe z. Si le plan de l’accéléromètre dévie de l’horizontale, alors l’accélération de la gravité terrestre ne sera plus colinéaire à l’axe z.
Le détail des calculs est donné dans la note d’application de Freescale AN3461. Nous avons utilisé la révision 2 de cette note pour notre exemple. Si vous souhaitez améliorer cet algorithme, vous trouverez une approche plus élaborée dans la révision 6, disponible ici.

Le code MicroPython

Les scripts présentés ci-après sont disponibles dans la zone de téléchargement

Copiez LIS2DW12.py dans le répertoire du disque USB virtuel associé à la NUCLEO-WB55 : PYBFLASH. Éditez maintenant le script main.py :

# Objet du script :
# Mesure les accélérations suivant 3 axes orthogonaux (en mg) toutes les quarts de seconde. 
# Utilise cette mesure pour évaluer l'inclinaison du plan de l'accéléromètre par rapport au plan horizontal (tilt)
# Source : Freescale AN3461 rev 2 (page 4)
# Cet exemple nécessite un shield X-NUCLEO IKS01A3 pour l'accéléromètre MEMS LIS2DW12.

from machine import I2C
import LIS2DW12 # Pilote de l'accéléromètre
from time import sleep_ms # Pour temporiser
from math import sqrt, atan, pi # Fonctions et constantes trigonométriques

# Facteur de conversion entre les radians et les degrés pour les angles
RadToDeg = 180 / pi

# On utilise l'I2C n°1 de la carte NUCLEO-WB55 pour communiquer avec le capteur
i2c = I2C(1) 

# Pause d'une seconde pour laisser à l'I2C le temps de s'initialiser
sleep_ms(1000)

# Instanciation de l'accéléromètre
accelerometre = LIS2DW12.LIS2DW12(i2c)

while True:

	# Relevé des accélération
	ax = accelerometre.x()
	ay = accelerometre.y()
	az = accelerometre.z()
	
	# Angle entre l'axe des x et le sol
	denom = sqrt(ay*ay + az*az)
	if denom != 0:
		rho = atan(ax/denom) * RadToDeg
		print("Angle entre l'axe des x et le plan horizontal : %.1f°" % rho)

	# Angle entre l'axe des y et le sol
	denom = sqrt(ax*ax + az*az)
	if denom != 0:
		phi = atan(ay/denom) * RadToDeg
		print("Angle entre l'axe des y et le plan horizontal : %.1f°" % phi)
	
	# Angle entre l'axe des z et la verticale
	if az != 0:
		rho = atan(sqrt(ax*ax + ay*ay)/az) * RadToDeg
		print("Angle entre l'axe des z et la direction verticale : %.1f°" % rho)

	print("")
	
	sleep_ms(250)

Affichage sur le terminal série de l’USB User

Une fois le script lancé avec CTRL-D, faites varier l’orientation du module autour des axes Ox et Oy. Observez les valeurs affichées pour les différents angles.

Axes LIS2DW12 Sortie tilt LIS2DW12