Accueil > ARDUINO > Capteurs > Mesure de distance avec Arduino (HC-SR04 & VL53L0X)

Mesure de distance avec Arduino (HC-SR04 & VL53L0X)

mercredi 22 janvier 2020, par thebault

Présentation

Dans cet Article, nous allons voir deux capteurs pour mesurer une distance par rapport à un obstacle avec une carte Arduino.

JPEG - 44.8 ko
VL53L0x
JPEG - 59.6 ko
HC-SR04

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)

Caractéristiques du capteur HC-SR04

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.

JPEG - 32.8 ko

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 :

  • C = 2 x distance / durée donc distance = 0,5 x C x durée (on prend 2 fois la distance car l’onde parcours l’aller et le retour)
  • donc distance = 0,5 x 340 x durée = 170 x durée (distance en m, durée en s)
  • Si maintenant, on exprime la durée en millisecondes (us) et le distance en centimètres (cm), on obtient : distance = 0,017 x durée (distance en cm, durée us), ce qui correspond à peu prés à la documentation.

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 :

JPEG - 12.6 ko

Pour effectuer une mesure, il faut :

  • envoyer une impulsion sur la broche trigger (=déclenchement)
  • le capteur émet une salve d’ondes ultra sons
  • la broche output passe à 1 pendant une durée proportionnelle à la distance

Branchements du capteur HC-SR04

JPEG - 316.3 ko

Programme Arduino

  1. int trig = 3 ;
  2. int echo = 2 ;
  3. long duree;
  4. float distance ;
  5.  
  6. void setup() {
  7. pinMode(trig, OUTPUT );
  8. pinMode(echo, INPUT );
  9. Serial.begin(9600);
  10. }
  11.  
  12. void loop() {
  13. // impulsion de 10 us sur la broche trig => déclenchement de la mesure
  14. digitalWrite(trig, 1 );
  15. delayMicroseconds(10);
  16. digitalWrite(trig, 0 );
  17. // lecture de la durée d'état haut de l'impulsion en us
  18. duree = pulseIn(echo, HIGH);
  19. distance = 0.017 * duree ;
  20. Serial.print("distance en cm : ");
  21. Serial.println(distance);
  22. delay(1000);
  23. }

Télécharger

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)

  1. int trig = 3 ;
  2. int echo = 2 ;
  3. long duree;
  4. float distance ;
  5.  
  6. void setup() {
  7. pinMode(trig, OUTPUT );
  8. pinMode(echo, INPUT );
  9. Serial.begin(9600);
  10. }
  11.  
  12. void loop() {
  13. // impulsion de 10 us sur la broche trig => déclenchement de la mesure
  14. digitalWrite(trig, 1 );
  15. delayMicroseconds(10);
  16. digitalWrite(trig, 0 );
  17. // lecture de la durée de l'impulsion (maxi 5882)
  18. duree = pulseIn(echo, HIGH, 5882);
  19. distance = 0.017 * duree ;
  20. if (distance) {
  21. Serial.print("distance en cm : ");
  22. Serial.println(distance);
  23. }
  24. delay(1000);
  25. }

Télécharger

Caractéristiques du capteur VL53L0X

Branchements du capteur VL53L0X

JPEG - 284.1 ko

Programme

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)

  1. #include "Adafruit_VL53L0X.h"
  2.  
  3. Adafruit_VL53L0X capteur = Adafruit_VL53L0X();
  4. VL53L0X_RangingMeasurementData_t mesure;
  5.  
  6. void setup() {
  7. Serial.begin(9600);
  8.  
  9. // initialisation du capteur
  10. if (!capteur.begin()) {
  11. Serial.println(F("Echec de connexion au capteur VL53L0X"));
  12. while (1);
  13. }
  14. }
  15.  
  16. void loop() {
  17. capteur.rangingTest(&mesure, false); // 'true' informations de debuggage
  18. // RangeStatus = 4 signifie que le mesure est erronée
  19. if (mesure.RangeStatus != 4) {
  20. Serial.print("Distance en mm : ");
  21. Serial.println(mesure.RangeMilliMeter);
  22. }
  23. else {
  24. Serial.println(" mesure erronée ");
  25. }
  26. delay(1000);
  27. }

Télécharger

SPIP | | Plan du site | Suivre la vie du site RSS 2.0
Habillage visuel © digitalnature sous Licence GPL