Ignorer et passer au contenu

Livraison offerte à partir de 50€ d'achats, livrée sous 48h !

Livraison à partir de seulement 2.50€ !

Contents Menu Expand Light mode Dark mode Auto light/dark mode

Mesurer des distances avec le capteur ultrason HC-SR04 avec un ESP32 en code Arduino

(Mis à jour le 03/01/2023)

../_images/hcsr04-esp32-boards-preview.jpg

Le capteur HC-SR04 permet de mesurer des distances par rapport à un obstacle en se basant sur des ondes ultrasons. Les modules disponibles sont constitués en général d’un émetteur et récepteur ultrason ainsi que d’une puce qui s’occupe de les piloter.

Astuce

Vérifiez que le module que vous avez est bien un HC-SR04. Il existe plusieurs modules ultrasons qui se ressemblent visuellement mais qui n’utilisent pas la même puce. Le HC-SR04 (généralement en bleu) fonctionne uniquement en 5V alors que par exemple le RCWL-1601 (généralement en vert) fonctionne également en 3.3V. Heureusement, ils se pilotent en général de la même manière.

Prendre en main le module HC-SR04

Fonctionnement physique du capteur

fonctionnement physique ultrason

Si vous voulez comprendre comment fonctionne en lui-même le module, je vous conseille de consulter l’article qui explique le fonctionnement physique détaillé du HC-SR04 .

Caractéristiques techniques du HC-SR04

  • Tension d’alimentation : 5V

  • Consommation : Le capteur consomme autour de 20mA en fonctionnement.

  • Portée : Le module peut mesurer une distance comprise entre 3cm et 4m en théorie. En pratique, une étendue entre 10cm et 2.5m vous donnera les meilleurs résultats.

  • Angle de mesure : < 15°.

    Avertissement

    On peut mesurer des obstacles très légèrement décalés du module, mais la surface de l’obstacle doit être bien plane pour avoir des mesures fiables.

  • Fréquence ultrasons : 40 kHz

Branchements du capteur HC-SR04

Hormis les broches d’alimentation, seulement 2 broches sont requises pour contrôler le module. On peut même en utiliser qu’une seule ! En général, on en utilise 2 sauf si l’on manque de broches sur l’ESP32 disponibles.

Correspondance des broches

Module HC SR04

ESP32

TRIG

GPIO5

ECHO

GPIO18

GND

GND

VCC

5V

Note

Les broches GPIO5 et GPIO18 ont été choisies arbitrairement : vous pouvez prendre n’importe quelles broches de l’ESP32 de sortie pour TRIG et d’entrée pour ECHO .

Schéma électrique pour utiliser le module HC-SR04 avec un ESP32

../_images/breadboard-wiring-hc-sr04-2-pins-esp32-schematic.png

Circuit électrique à réaliser

../_images/breadboard-wiring-hc-sr04-2-pins-esp32-example.jpeg

Circuit électrique à réaliser

L’alimentation du module : 5V ou 3.3V ?

En fait, le module HC-SR04 n’est pas le plus adapté pour les cartes ESP32 car il fonctionne en 5V (niveaux logiques de 5V) alors que les ESP32 fonctionnent en 3.3V. Il faudrait l’alimenter en 5V, et rajouter soit des levels lifter, soit des ponts diviseurs de tensions sur la broche ECHO . De cette manière, la broche de l’ESP32 GPIO18 recevra du 3.3V au lieu du 5V original. Mais cela complexifie un peu le circuit.

Astuce

En pratique, si c’est pour une utilisation temporaire, les broches de l’ESP32 peuvent supporter une tension de 5V. C’est sur le long terme, qu’elles risquent d’être abîmées et de ne plus fonctionner. C’est pourquoi dans ce tutoriel, par simplicité, ces précautions ont été omises.

Note

Certains internautes disent qu’ils réussissent à alimenter le module HCSR04 en 3.3V, et obtenir des mesures fiables en augmentant la durée de l’impulsion envoyée. Cependant, je n’ai pas réussi à faire fonctionner ceux que j’avais en ma possession avec une tension de 3.3V.

Si vous utilisez beaucoup de cartes qui fonctionnent en 3.3V (ESP8266, ESP32, Raspberry Pi Pico, je vous conseille d’utiliser un modèle équivalent qui est prévu pour fonctionner à cette tension : par exemple le module RCWL-1601.

Mesurer facilement une distance avec les fonctions Arduino basiques

Pour l’utiliser, il n’est pas nécessaire d’utiliser des librairies externes, car le fonctionnement est très simple. En fait, quand l’ESP32 envoie une impulsion sur la broche TRIG , le module renvoie une impulsion sur la broche ECHO dont sa largeur est proportionnelle à la distance de l’obstacle.

Elle correspond à la durée prise par l’onde ultrasonore entre son émission et sa réception par le module. En appliquant, des formules physiques basiques, on trouve facilement la distance mesurée.

\[d_{obstacle}(cm) = \frac{T_{ultrason}(µs)\times v_{son}(m/s)\times 10^{-4}}{2}\]

Note

L’obtention de cette formule est détaillée dans l’article sur le fonctionnement d’un capteur ultrason .

Il suffit d’implémenter le déclenchement d’une mesure, récupérer la valeur et d’appliquer la formule. C’est ce que fait le code ci-dessous :

const int trig_pin = 5;
const int echo_pin = 18;

// Vitesse du son dans l'air
#define SOUND_SPEED 340
#define TRIG_PULSE_DURATION_US 10


long ultrason_duration;
float distance_cm;

void setup() {
  Serial.begin(115200);
  pinMode(trig_pin, OUTPUT); // On configure le trig en output
  pinMode(echo_pin, INPUT); // On configure l'echo en input
}

void loop() {
  // Prepare le signal
  digitalWrite(trig_pin, LOW);
  delayMicroseconds(2);
  // Créer une impulsion de 10 µs
  digitalWrite(trig_pin, HIGH);
  delayMicroseconds(TRIG_PULSE_DURATION_US);
  digitalWrite(trig_pin, LOW);

  // Renvoie le temps de propagation de l'onde (en µs)
  ultrason_duration = pulseIn(echo_pin, HIGH);

  // Calcul de la distance
  distance_cm = ultrason_duration * SOUND_SPEED/2 * 0.0001;

  // On affiche la distance sur le port série
  Serial.print("Distance (cm): ");
  Serial.println(distance_cm);

  delay(1000);
}

Le programme construit une impulsion de 10µs qui est envoyée sur le GPIO5 de l’ESP32.

La fonction pulseIn() bloque le programme tant qu’elle reçoit l’impulsion de réponse du HC-SR04 depuis la broche 18 . Ensuite le code calcule la distance à partir de la durée de l’onde ultrason. Le programme affiche la distance entre le module et un obstacle (ma main en l’occurrence 🙂) dans le moniteur série.

mesure distance ultrason hc sr04

On peut diminuer le délai delay(1000) pour avoir des mesures plus régulièrement. (Jusqu’à ce que le module ultrason ait le temps de faire la mesure)

Cette approche est très bien pour comprendre le fonctionnement du module HC-SR04. Néanmoins tel quel, il ne sera pas très pratique dans des programmes plus complexes, car il bloque l’exécution d’autres tâches via la fonction pulseIn() . La solution est d’utiliser des interruptions pour avoir des lectures de mesures asynchrones.

Les librairies pour le HC-SR04 en code Arduino compatible ESP32

L’utilisation de librairies externes dédiées au HC-SR04 est pertinente dans un plus gros projet, lorsqu’on veut avoir plus de fonctionnalités :

  • Gérer facilement plusieurs modules ultrasons

  • Avoir des lectures de distances asynchrones (avec des interruptions et des timers)

  • Gérer les erreurs de mesures

Avertissement

Si vous utilisez déjà des librairies pour le HC-SR04 avec une carte Arduino, il est probable que la libraire ne fonctionne pas correctement avec un ESP32. Par exemple, la librairie NewPing, qui est spécialisée dans les capteurs ultrasons, n’intègre pas encore la gestion des mesures asynchrones pour l’ESP32.

Cette section est réservée aux abonnés. Il vous reste 72% à découvrir.

Devenir membre premium

Déjà abonné ? Connectez-vous