lundi 1 juin 2020

Mesurer une distance avec le télémètre laser VL53L1X

Le VL53L1X de ST Microelectronics est un capteur qui permet de mesurer la distance d'un obstacle situé à 4 m ou moins au moyen d'un laser (inoffensif pour les yeux) de type VCEL de 940 nm (infrarouge). Pour mes tests, j'ai utilisé un module fabriqué par la compagnie Waveshare, mais Sparksfun et Pololu ont également leur modèle. Plusieurs modules moins chers comportent plutôt le VL53L0X, dont la portée n'est que de 2 m.



Connexion du capteur

Le capteur comporte 6 connecteurs, mais seulement 4 d'entre eux sont nécessaires: 2 pour l'alimentation, et 2 pour la communication I2C.

VCC: à brancher à une tension de 3,3V ou 5 V. Puisque le capteur VL53L1X fonctionne à 2,8 V, tous les modèles de module (breakout) comportent un régulateur de tension permettant de l'utiliser à 3,3 V. Les modules fabriqués par Waveshare et Pololu acceptent les tensions de 5 V, mais pas celui de Sparkfun.

GND: à brancher à GND.

SDA: à brancher à la broche SDA de votre microcontrôleur  (par exemple: A4 pour l'Arduino Uno, PB6 pour la STM32 Blue Pill, GPIO 4 pour l'ESP8266, D21 pour l'ESP32).

SCL: à brancher à la broche SCL de votre microcontrôleur (par exemple: A5 pour l'Arduino Uno, PB7 par la STM32 Blue Pill, GPIO 5 pour l'ESP8266, D22 pour l'ESP32).

SHUT: entrée optionnelle "shutdown control". Je ne l'ai pas utilisée lors de mes tests.

INT: sortie optionnelle "interrupt output". Je ne l'ai pas utilisée lors de mes tests.

Choix et installation d'une bibliothèque Arduino

J'ai installé la bibliothèque VL53L1X conçue par Sparkfun. Il en existe également une conçue par Pololu, que je n'ai pas essayée. Les deux peuvent être installées par l'entremise du gestionnaire de bibliothèque de l'IDE Arduino.

Sketch

Voici un sketch de base qui affiche régulièrement la distance mesurée (en millimètres) dans le moniteur série de l'IDE Arduino. Tout le travail est fait en arrière-plan par les bibliothèques Wire et VL53L1X, le programme est donc très court.

-
-

Si vous constatez que la distance mesurée par le capteur n'est pas tout à fait exacte, vous pouvez la corriger au moyen de la méthode "setOffset" (ligne 23). Dans mon cas, la distance affichée était environ 20 mm plus courte que la distance réelle, et j'ai donc fait setOffset(20) pour ajouter 20 mm au résultat.

Par défaut, le capteur est réglé en mode "longue distance", ce qui permet de mesurer une distance maximale d'environ 4 mètres. La méthode "setDistanceModeShort" (ligne 33) permet de régler le capteur en mode "courte distance". La portée maximale est alors d'environ 2 m, mais les mesures sont moins perturbées par l'éclairage ambiant.

L'angle du champ de vision du capteur est, par défaut, de 27°. Pour certaines applications, ça peut faire en sorte que les mesures sont affectées par la présence d'obstacles indésirables en périphérie. Il est possible de diminuer ce champ de vision en contrôlant la région d'intérêt (ROI: region of interest). Le capteur est constitué d'une matrice de 16 X 16 éléments, et le contrôle de la ROI consiste à n'activer qu'une partie de ces éléments. Le faisceau le plus étroit (qui rendra le capteur sensible uniquement aux objets situés droit devant) est obtenu en utilisant la commande: setROI(4,4,199) (ligne 36) où le premier argument est la largeur de la matrice active (4 est le minimum), le deuxième est la hauteur de la matrice active (4 est, encore une fois, le minimum) et le troisième est le numéro de l'élément situé au centre de la matrice active (voir le fichier "SparkFun_VL53L1X.h" de la bibliothèque pour connaître l'ordre de numérotation (pas très intuitifs) des éléments de la matrice).


Quelques tests

J'ai fait quelques tests en branchant le VL53L1X à un module STM32 Blue Pill mais, comme je le disais plus haut, vous pouvez utiliser une carte Arduino conventionnelle (comme le Uno).



J'ai placé un grand panneau blanc rigide à différentes distances devant le capteur, et j'ai vérifié que la distance mesurée par le VL53L1X était conforme à ce que je mesurais avec un simple ruban à mesurer. Tel que mentionné un peu plus haut, j'ai constaté un écart d'environ 20 mm que j'ai pu compenser dans le sketch grâce à l'instruction setOffset.

J'ai également constaté que, en laissant l'obstacle parfaitement immobile à une distance d'environ 1 mètre, la distance affichée n'était pas toujours identique: elle pouvait facilement varier de presque 10 mm.  Par exemple, la capture d'écran ci-dessous montre que le même obstacle immobile à été mesuré à 1014 mm et à 1022 mm (donc 8 mm d'écart alors que rien de bougeait).



VL53L1X ou HC-SR04?

Puisqu'on peut se payer environ 12 modules à ultrasons HC-SR04 pour le prix d'un seul VL53L1X, on peut se demander en quoi le VL53L1X serait supérieur au HC-SR04. 


J'ai effectué un test consistant à mesurer la distance d'un même obstacle au moyen d'un VL53L1X et d'un HC-SR04.  Pour des distances inférieures à environ 3 mètres, l'écart entre les mesures était inférieur à 5 cm.


J'ai aussi vérifié la stabilité de la mesure de la distance d'un objet immobile à environ 1 mètres, pour constater que le HC-SR04 donnait des mesures étalées sur une plage de 14 mm: un tout petit peu moins stable que le VL53L1X, mais à peine.

Bref, portée similaire et résultats comparables: personnellement, je ne vois rien qui justifierait de payer 12 fois plus cher pour un VL53L1X. 


Yves Pelletier (TwitterFacebook)


6 commentaires:

  1. Bonjour,
    J'imagine qu'un avantage du capteur laser est que la mesure varie surement moins avec la température de l'air par rapport au capteur ultrasonore. Le tableau présenté sur ce site (http://tpe-ondesonore.e-monsite.com/pages/iii-l-influence-des-facteurs-physiques-sur-le-son.html) donne un écart de 10% entre -10°C et +30°C pour la vitesse du son et donc pour la mesure finale de distance.

    RépondreSupprimer
    Réponses
    1. Bonjour,

      Ce problème de variation avec la T°(encore faut-il avoir besoin d'une telle précision) peut être corrigé à faible prix en ajoutant une sonde de T° du genre DS18B20 pour appliquer un offset adéquat au résultat.

      Supprimer
  2. Salut, J'ai un usage en tête qui justifie l'utilisation d'un VL53L1X. Comme tu l'a mentionné, l'angle du champ de vision est réglable ce qui est un sacré plus. Il y a une autre caractéristique intéressante, c'est que le VL53L1X n'est pas impacté par les ultrasons lui. J'ai rencontré ce problème avec une antenne UHF pour lire des TAG RFID à longue distance et l'antenne perturbait la mesure de distance.
    En tout cas merci pour ton tuto très utile
    Marc

    RépondreSupprimer
  3. Bonjour,
    je suis incompétent dans le domaine mais je voulais savoir si en utilisant ce module VL53L1X, il était possible de contrôler-piloter la modulation de l'émission de lumière et de récupérer les données brutes (issues de la partie récepteur photodiode) pour faire un traitement extérieur .
    Merci pour toute réponse.
    Francis

    RépondreSupprimer
  4. Bonjour
    Je suis incompétent dans le domaine mais j’ai une question.
    Avec ce module VL53L1X, serait-il possible de contrôler-piloter la modulation de l’émission de lumière et de récupérer les données brutes issues de la partie détection par photodiode pour faire un traitement de ces données à l’extérieur.
    merci

    RépondreSupprimer