Accueil > ARDUINO > Capteurs > Mesure de distance avec Arduino (HC-SR04 & VL53L0X)
mercredi 22 janvier 2020, par
Dans cet Article, nous allons voir deux capteurs pour mesurer une distance par rapport à un obstacle avec une carte Arduino.
Les 2 capteurs utilisés :
Capteur | technologie | Portée | précision |
---|---|---|---|
HC-SR04 | onde ultra-son ("time of flight") | 2 cm à 400 cm | 1 cm environ |
VL53L0x | onde lumineuse infra rouge laser ("time of flight") | 5 cm à 120 cm (mode par défaut) | 3% à 7% (en intérieur) |
Ce capteur fonctionne sur le principe d’un sonar : Le capteur émet une onde ultra-son qui va se réfléchir sur un obstacle et on mesure le temps qu’elle met à revenir vers le capteur.
La documentation du capteur indique que : distance = 1/58 x durée = 0,172 x durée (distance en cm, durée ms)
VERIFICATION : Connaissant la vitesse de propagation du son dans l’air C=340 m/s environ, on peut en déduire la distance :
Remarque : La vitesse de propagation du son dans l’air dépend de différents paramètre dont la température. Il peut donc y avoir des fluctuations de mesures. https://fr.wikipedia.org/wiki/Vitesse_du_son
La documentation du HC SR04 fournit les chronogrammes suivants :
Pour effectuer une mesure, il faut :
int trig = 3 ; int echo = 2 ; long duree; float distance ; void setup() { pinMode(trig, OUTPUT ); pinMode(echo, INPUT ); Serial.begin(9600); } void loop() { // impulsion de 10 us sur la broche trig => déclenchement de la mesure digitalWrite(trig, 1 ); delayMicroseconds(10); digitalWrite(trig, 0 ); // lecture de la durée d'état haut de l'impulsion en us duree = pulseIn(echo, HIGH); distance = 0.017 * duree ; Serial.print("distance en cm : "); Serial.println(distance); delay(1000); }
Il ne reste plus qu’à ouvrir le "moniteur série" pour voir la distance de l’obstacle s’afficher.
L’instruction pulseIn() est bloquante. Elle ne permet pas d’avancer dans le programme tant que le front descendant de l’impulsion n’est pas apparu.
Quand on ne veut lire que des distances inférieures à 1 m, soit une durée maxi d’impulsion de la broche output de 5882 us , on va limiter la durée de lecture de l’impulsion en ajoutant un timeout à l’instruction pulseIn().
Lorsque la durée est supérieur à timeout , pulseIn() renvoie la valeur 0. Dans le programme suivant, on affiche la distance que si celle ci est inférieur à 1 m ( c’est à dire que distance est différent de 0)
int trig = 3 ; int echo = 2 ; long duree; float distance ; void setup() { pinMode(trig, OUTPUT ); pinMode(echo, INPUT ); Serial.begin(9600); } void loop() { // impulsion de 10 us sur la broche trig => déclenchement de la mesure digitalWrite(trig, 1 ); delayMicroseconds(10); digitalWrite(trig, 0 ); // lecture de la durée de l'impulsion (maxi 5882) duree = pulseIn(echo, HIGH, 5882); distance = 0.017 * duree ; if (distance) { Serial.print("distance en cm : "); Serial.println(distance); } delay(1000); }
Pour le mettre en œuvre, j’utilise la bibliothèque d’Adafruit sous licence BSD. https://github.com/adafruit/Adafruit_VL53L0X
Cette bibliothèque est installable depuis le gestionnaire de bibliothèques de l’IDE Arduino (croquis -> inclure une bibliothèque -> gérer les bibliothèques)
#include "Adafruit_VL53L0X.h" Adafruit_VL53L0X capteur = Adafruit_VL53L0X(); VL53L0X_RangingMeasurementData_t mesure; void setup() { Serial.begin(9600); // initialisation du capteur if (!capteur.begin()) { Serial.println(F("Echec de connexion au capteur VL53L0X")); while (1); } } void loop() { capteur.rangingTest(&mesure, false); // 'true' informations de debuggage // RangeStatus = 4 signifie que le mesure est erronée if (mesure.RangeStatus != 4) { Serial.print("Distance en mm : "); Serial.println(mesure.RangeMilliMeter); } else { Serial.println(" mesure erronée "); } delay(1000); }