Comparaison HC-SR04 (ultrasons), Sharp GP2Y0A02YK0F (IR), VL53L0X (Laser), quelle solution choisir pour la mesure de distance avec Arduino ou Raspberry Pi

Nous allons comparer trois technologies de capteur de proximité qui permettent de faire de la mesure de distance. Le HC-SR04 par ultrasons, le Sharp GP2Y0A02YK0F par infrarouge et le VL53L0X par mesure du temps de vol (ToF) d’un faisceau laser. Vous trouverez un montage à imprimer en 3D ainsi que le code Arduino qui vus permettra de réaliser chez vous des tests comparatifs. Vous pourrez plus facilement tester ces capteurs avant de débuter le développement de vos projets Arduino, ESP32, ESP8266 ou Raspberry Pi.

 

Le HC-SR04 est un capteur assez précis et très simple de mise en oeuvre (à l’aide de l’une des nombreuses librairies Arduino) mais il peut s’avérer trop encombrant dans certains projets. On pourra le remplacer très avantageusement par un VL53L0X, un capteur qui mesure le temps de vol (Time Of Flight, ToF) d’un faisceau laser. Les 3 capteurs reposent tous sur le même principe physique. Ils mesurent le temps nécessaire au retour d’un faisceau réfléchi par un objet situé en face du capteur. Pour le HC-SR04 ce sera des ultra-sons, de la lumière infra-rouge pour le Sharp GP2Y0A02YK0F et un faisceau laser pour le VL53L0X.

Tous les codes source et le fichier ODT sont disponibles sur GitHub sur cette page.

Mesure de distance par ultrason, capteur HC-SR04

capteur ultrason mesure distance obstacleLe HC-SR04 est un capteur analogique qui nécessite deux câbles. Le premier (TRIG – Trigger) génère un faisceau d’ultrasons. Le seconde est activé dès que le faisceau retourné est détecté. Inutile de chercher à re-développer la roue, il existe plusieurs librairies Arduino et Python pour intégrer le HC-SR04 dans vos projets.

Il y a au moins 7 librairies disponibles directement depuis le gestionnaire de bibliothèque de l’IDE Arduino. Pour cet article, j’ai utilisé la librairie Bifrost développée par Jeremy Lindsay. On peut l’acheter pour moins d’un euro.

Caractéristiques du HC-SR04

  • Plage de mesure de distance : 2cm à 450cm (4,5m)
  • Précision de mesure : 0,3cm
  • Tension d’alimentation : 5V
  • Sortie numérique : PWM
  • Poids : 9g
  • Dimensions : 45mm x 20mm x 18mm

Toutes les promos

Mesure de distance par infrarouge (IR), capteur Sharp GP2Y0A02YK0F

Le Sharp GP2Y0A02YK0F renvoi directement un signal analogique proportionnel à la distance. C’est assez difficile de se procurer la version originale de Sharp. On achète le plus souvent des clones sous la référence A02YK0.

Après avoir testé plusieurs librairies, la librairie ZSharpIR développe par zoubworldArduino (page GitHub) donne satisfaction avec les clones chinois à moins de 4 euros.

Caractéristiques du Sharp A02YK0

  • Plage de mesure de distance : de 20cm à 150cm
  • Sortie analogique (signal proportionnel à la distance)
  • Taille de boîtier : 29.5mm x 13mm x 21.6mm
  • Consommation de courant typique : 33mA
  • Plage d’alimentation : de 4.5V à 5.5V
  • Tension de sortie : 0.4V
  • Plage de température de fonctionnement : de -10°C à +60°C

Toutes les promos

Mesure de distance par temps de vol laser, capteur VL53L0X (Adafruit ou équivalent)

Le VL53L0X est un capteur qui permet de réaliser des mesures de distances en mesurant le temps de vol d’un laser. La mesure de distance est numérique. Elle peut être récupérée via le bus I2C. Beaucoup plus compact et plus précis que le HC-SR04, ce capteur sera beaucoup plus facile à intégrer dans les projets robotiques, RC, drones…

J’ai  utilisé la librairie développée par le fabricant Pololu. Elle s’accommode très bien des capteurs compatibles. Pour cet article, j’ai acheté un clone à moins de 4€ sur AliExpress.

N’oubliez pas de retirer le (petit) film de protection présent à la surface du capteur.

Caractéristiques du VL53L0X

  • Plage de mesure de distance : jusqu’à 200cm (2m)
  • Bus i2c : adresse 0x29
  • Longueur d’onde du faisceau laser : 940nm
  • Taille de la carte (hors connecteur) : 25mm x 13mm (dépend du fabricant)
  • Plage d’alimentation : de 2.8V à 5.5V

Le VL53L1X permet d’atteindre 400cm. Il est plus difficile à se procurer. Le VL6180X est dédié à la mesure de précision en dessous de 10cm. Son prix est similaire, environ 4€.

Toutes les promos

Remarque importante pour le fonctionnement sur Arduino

L’emploi de la librairie Pololu nécessite de démarrer manuellement la fonction wire() dans le setup sinon le VL53L0X reste non trouvable sur le bus I2C.

Montage de test par impression 3D

Pour tester de façon rigoureuse les 3 capteurs, j’ai préparé un petit support sur lequel on pourra fixer ces derniers. Les trois capteurs sont positionnés de telle façon qu’ils mesurent la même distance. Vous pouvez télécharger le fichier STL sur Thingiverse ici.

Avec les 3 capteurs installés. De gauche à droite :

  • Sharp GP2Y0A02YK0F (clone)
  • HC-SR04
  • VL53L0X (de marque CJMCU)

Programme de test

Voici un programme de test qui réalise un série de 10 mesures. Le délai entre chaque mesure est d’une seconde par défaut. Il peut être modifié à l’aide de la constante DELAY_REFRESH.

Avant de téléverser le programme, vous devrez installer les librairies Arduino suivantes :

A la fin de chaque série de mesure, le tableau de mesure est affiché. Il suffit de l’importer dans un tableur pour vos calculs. Voici l’ordre de colonnes :

  • HC-SR04
  • Sharp IR
  • VL53L0X

Test du HC-SR04

Le premier capteur que je vous propose de tester est le capteur par ultrason HC-SR04. Comme on peut le voir sur le graphique, les mesures réalisées avec HC-SR04 sont très stables. La dispersion des mesures augmentent progressivement avec la distance. Elle reste toutefois très acceptable même à 1500mm. L’écart de mesure ne dépasse atteint 60mm à 1,5m.

test arduino distance measure hc-SR04

 

Synthèse des résultats de mesures du HC-SR04

Les mesures du HC-SR04 sont très précises en dessous de 500mm. Au delà, la précision est suffisante pour mesurer le niveau de remplissage d’un réservoir.

Distance (mm) Distance mesurée avec le HC-SR04 (mm) Ecart de mesure (mm) Ecart type (mm)
200 195,3 -4,7 1,25
300 288,8 -11,2 1,69
400 393,3 -6,7 3,53
500 506,9 6,9 6,61
600 574,8 -25,2 2,70
700 669,0 -31,0 3,16
800 761,2 -38,8 4,52
900 860,2 -39,8 1,69
1000 952,1 -47,9 6,61
1100 1 052,2 -47,8 7,19
1200 1 148,1 -51,9 7,09
1300 1 241,5 -58,5 4,48
1400 1 339,5 -60,5 6,22
1500 1 438,1 -61,9 6,49

Test du Sharp GP2Y0A02YK0F

La première série de mesure à mis en évidence la nécessité d’étalonner manuellement le capteur. J’ai testé un clone acheté sur AliExpress environ 3,5€. Pour ce test comparatif, j’ai utilisé la librairie ZSharpIR de zoubworldArduino (page GitHub)

sharp GP2Y0A02YK0F zwharp librarie arduino

 

Après avoir réalisé un étalonnage manuel et mis à jour la librairie, j’ai obtenu de bien meilleurs résultats. Je n’ai cependant pas pu dépasser 1300mm de mesure. La procédure d’étalonnage est détaillée pas à pas dans ce tutoriel.

sharp GP2Y0A02YK0F calibrated arduino

 

Si vous avez besoin de précision dans votre projet, je vous conseille de rester en dessous de 600mm. Il est très difficile d’étalonner correctement le capteur au delà de 1200mm. D’une part, le signal varie très faiblement, d’autre part, le capteur renvoi beaucoup de bruit. Il est préférable de filtrer les mesures sur un très grand nombre de point pour réduire les aberrations.

Distance (mm) Distance mesurée avec le Sharp A02YK0 (étalonné) Ecart de mesure (mm) Ecart type (mm)
200 212,0 12,0 0,32
300 283,4 -16,6 1,84
400 384,4 -15,6 7,52
500 481,7 -18,3 11,81
600 606,3 6,3 28,02
700 721,2 21,2 44,27
800 805,9 5,9 59,35
900 954,0 54,0 92,49
1000 1 090,5 90,5 133,90
1100 1 131,6 31,6 128,11
1200 1 196,0 -4,0 127,00
1300 1 221,7 -78,3 31,91
1400 1 385,0 -15,0 123,49
1500 1 412,3 -87,7 84,00

Test du VL53L0X

C’est avec le VL53L0X que l’on obtiendra les meilleurs résultats jusqu’à 1200mm (1,2m). Au delà, il arrive que le capteur n’arrive plus à mesurer. Cela se traduit par le renvoi d’un mesure aberrante de 8190mm. Par chance, c’est toujours la même valeur qui est renvoyée par la librairie (du moins dans mon cas). Il est donc très facile d’exclure tous les points de mesures erronés. Au delà de 1200mm, on perd environ 30% des points de mesure. Cela dépend très probablement de la surface. Plus la surface est réfléchissante, meilleure sera la précision de mesure. N’hésitez pas à partager vos expériences dans les commentaires

Si vous avez des projets qui nécessite plus de précision, vous pouvez opter pour son petit frère, le VL6180X. Son prix est similaire. Il permet de réaliser des mesures en dessous de 10cm

test arduino distance measure vl53l0X

 

Synthèse des résultats de mesures du VL53L0X

Les mesures du VL53L0X sont très précises jusqu’à 800mm. De 800 à 1200 mm, la précision est bonne. Au delà, le capteur environ 30% des mesures. Tout dépend de la surface de l’objet et de l’éclairage ambiant.

Distance (mm) Distance mesurée avec le VL53L0X (mm) Ecart de mesure (mm) Ecart type (mm)
200 211,8 11,8 1,81
300 307,7 7,7 3,16
400 415,5 15,5 3,03
500 515,1 15,1 5,93
600 610,7 10,7 7,23
700 729,0 29,0 5,96
800 801,0 1,0 11,24
900 858,6 -41,4 24,39
1000 977,3 -22,7 17,99
1100 1 080,3 -19,7 19,79
1200 1 149,3 -50,7 50,11
1300 1 221,8 -78,2 39,89
1400 1 347,3 -52,7 42,06
1500 1 371,9 -128,1 45,45

Synthèse, quelle solution choisir pour mesurer une distance avec un Arduino ou un Raspberry Pi

Les capteurs HC-SR04 et Sharp GP2Y0A02YK0F  nécessitent une tension d’alimentation de 5V. Il faudra utiliser un circuit de conversion de tension (environ 0,80€) pour les projets Raspberry Pi, ESP8266 et ESP32. Le VL53L0X acceptent une tension d’alimentation comprise entre 3V et 5V. On pourra l’utiliser directement dans tous les projets.

Caractéristiques HC-SR04 Sharp A02YK0 VL53L0X
Technologie Ultrason Faisceau Infrarouge Faisceau laser 940nm
Tension d’alimentation (V) 5V 4.5V à 5.5V 3V à 5V
Entrées / Sorties 2 E/S numériques PWM Analogique Bus i2c
Distance minimale (cm) 2 20
Distance maximale (cm) 450 150 200
Ecart de mesure à 500mm* 7 mm 18 mm 6 mm
Ecart de mesure à 1m* 48 mm 90 mm 23 mm
Ecart max. de mesure à 1,5m* 62 mm 88 mm 128 mm
Librairies Arduino conseillée HC-SR04 de Jeremy Lindsay ZSharpIR de zoubworldArduino

Etalonnage manuel (tutoriel)

Librairie Pololu
Documentation technique Sharp STMicroElectronic
Acheter Comparer les prix Comparer les prix Comparer les prix

(*) Données non officielles indicatives obtenues sur une moyenne de 10 mesures.

Coté performances et qualité de mesures, c’est le HC-SR04 et le VL53L0X qui donnent les meilleurs résultats. Le HC-SR04 est même bien meilleur que le laser à grande distance. La puissance du faisceau est certainement trop faible pour mesurer correctement au delà de 1200m.

HC-SR04 vs Sharp GP2YAO2 vs VL53L0X

HC-SR04 vs Sharp GP2YAO2 vs VL53L0X

Conclusion : quelle technologie choisir ?

Maintenant, vous allez certainement vouloir savoir quel capteur choisir. Il n’y a pas de réponse toute faite. Tout va dépendre de votre projet. Voici plusieurs critères dont il faut tenir compte

  • Environnement : intensité lumineuse, obstacles (diffraction des ultra-sons)
  • Surfaces : indice de reflexion (US, IR, Laser), taux d’absorption, matière, texture (peinture…)
  • Géométrie : certaines formes (angles) vont diffracter plus ou moins le faisceau incident et le rendre indétectable. C’est le principe utilisé pour les avions furtifs 🙂

Le mieux est de faire des tests avec ces différents technologie et choisir celle qui donne le meilleur résultat. 

Projet : mesurer le niveau d’un réservoir d’eau

Je vous propose maintenant un petit projet amusant que vous pourrez réutiliser dans un projet d’arrosage automatique de jardin. Pour la démo, j’ai utilisé un verre doseur d’une contenance d’un litre. Pour visualiser le taux de remplissage du réservoir, on utilisera une matrice de LED (4 blocs). Le réservoir mesurant moins de 20cm, on ne pourra pas utiliser le capteur Sharp A02YK0 qui n’est sensible que dans la plage 20 à 150cm.

 

Niveau d'un réservoir d'eau - Comparaison HC-SR04 (ultrason) VL53L0X (Temps de vol laser)

Code Arduino

Le code Arduino est assez long à expliqué en détail. Dans les grandes lignes :

  • Librairies utilisées
  • Pour utiliser une matrice de LED de 4*64 points, on peut utiliser la librairie MX_MAX72xx qui permet de gérer la matrice comme un seul et même élément. Voici la configuration
    • #define HARDWARE_TYPE MD_MAX72XX::FC16_HW (le type Pololu ne fonctionne pas sur les matrices génériques chinoises)
    • #define MAX_DEVICES 4. Ici, on dispose de 4 blocs de 8×8 pixels
    • MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES). Il est impératif d’initialiser le contrôleur en précisant toutes les broches, sinon ça ne fonctionne pas
  • OFFSET_HCSR04 permet d’ajuster l’origine du capteur par rapport au VL53L0X

Vidéo de démo

Rien de mieux qu’une petite vidéo de démonstration

Voilà, cette étude comparative est maintenant terminée, à vous de choisir le capteur le mieux adapté à votre projet. J’ai été très agréablement surpris par les performances des deux capteurs HC-SR04 et VL53L0X. Pour surveiller le niveau de remplissage d’un réservoir, le HC-SR04 se montre plus performant que le laser. L’eau est un milieu qui plus doit absorber le rayonnement laser que les ultrasons. Si vous avez des projets de voiture autonome ou RC, je vous conseille le VL53L0X, beaucoup plus compact et très simple de mise en oeuvre. Coté prix, comptez environ 3,50€ pour le VL53L0X et moins de 1€ pour le HC-SR04. N’oubliez pas de prendre en compte le milieu, la surface et la forme de l’objet. Le mieux est de faire des tests avec ces différents technologie et choisir celle qui donne le meilleur résultat.

Print Friendly, PDF & Email

Inscrivez-vous à la newsletter hebdomadaire

Aucun spam et aucun autre usage ne sera fait de votre email. Vous pouvez vous désinscrire à tout moment.

Comparateur de prix

Bons plans

Les offres suivantes se terminent bientôt. Utilisez le coupon indiqué pour profiter du prix promo

Domotique et objets connectés à faire soi-même