Mesurer des distances avec le capteur ultrason HC-SR04 avec un ESP32 en code Arduino
(Mis à jour le 03/01/2023)
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
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.
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
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.
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.
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 premiumDéjà abonné ? Connectez-vous