Composant · Capteur

HC-SR04 Ultrasonic Sensor

Le HC-SR04 est le capteur ultrason que la plupart des robots utilisent pour mesurer la distance. Télémétrie par écho, portée réelle, angles morts, et câblage.

Présentation

Le HC-SR04 est un capteur de distance ultrason — la petite carte aux deux cylindres argentés qui ressemblent à des yeux de robot. Il mesure la distance comme une chauve-souris ou un sous-marin : il émet une salve de son trop aigu pour être entendu, écoute l’écho, et chronomètre l’aller-retour. Pour quelques dollars, il donne à un robot le sens de l’espace devant lui, d’où son rôle de capteur par défaut du premier robot éviteur d’obstacles que presque tous construisent.

Les deux cylindres sont un émetteur et un récepteur. L’un gazouille, l’autre écoute. Tout le reste sur la carte est de la circuiterie de minutage qui convertit cet écho en un signal mesurable par votre microcontrôleur.

Schéma d'un HC-SR04 câblé à un microcontrôleur : des fils VCC, Trigger, Echo et GND à code couleur vont aux quatre broches du capteur ; le capteur émet des ondes ultrason qui se réfléchissent sur un objet, et la distance égale le temps d'écho fois la vitesse du son, divisé par deux.
Déclenchez une impulsion, chronométrez le retour de l'écho, et convertissez en distance — les quatre fils sont alimentation, masse, déclenchement et écho. Télécharger le SVG

Fonctionnement

Le capteur parle un langage simple à deux fils :

  1. Vous mettez la broche Trigger au HAUT pendant 10 microsecondes.
  2. Le capteur émet huit impulsions ultrason à 40 kHz et lève la broche Echo.
  3. Quand l’écho revient, il rebaisse Echo au BAS.
  4. Vous mesurez combien de temps Echo est restée au HAUT.

Cette largeur d’impulsion est le temps d’aller-retour. Le son voyage à environ 343 m/s dans l’air, donc distance = (temps_écho × 343) / 2 — la division par deux parce que le son est allé et revenu. La plupart du code Arduino enveloppe cela dans pulseIn() et un peu d’arithmétique.

Comme cela dépend de la vitesse du son, la lecture dérive légèrement avec la température (le son est plus rapide dans l’air chaud). Pour un robot évitant des murs, cette erreur est négligeable ; pour de la télémétrie précise, elle compte, et on compenserait la température.

Quand l’utiliser

Prenez un HC-SR04 dès qu’un robot doit savoir à peu près à quelle distance est la chose la plus proche — évitement d’obstacles, suivi de mur, garde « ne pas tomber de la table », ou déclencher un comportement quand quelque chose approche. Son large faisceau aide ici : il est difficile de rater un obstacle.

Regardez ailleurs quand il faut une distance précise, un faisceau étroit, ou des mises à jour rapides. Un capteur temps de vol utilise la lumière au lieu du son et donne une lecture étroite, rapide, précise au millimètre — mieux pour cartographier ou un robot qui doit juger un passage précis.

Câblage et pièges

  • Echo est une broche 5 V. Sur une carte 5 V comme l’Arduino Uno, c’est bon. Sur une carte 3,3 V comme l’ESP32, mettez un diviseur sur Echo sous peine d’endommager la broche.
  • Attention à l’angle mort et au cône. Rien de plus proche que ~2 cm ne s’enregistre, et le faisceau d’environ 15° signifie que le capteur rapporte la chose la plus proche dans un cône — un pied de table sur le côté peut le déclencher.
  • Les cibles molles et inclinées mentent. Mousse, tissu, ou mur à angle fort dispersent l’écho loin du récepteur, donc le capteur lit « loin » ou rien. Il marche mieux sur des surfaces plates et dures lui faisant face.
  • Ne scrutez pas trop vite. Laissez ~60 ms entre lectures pour que l’écho précédent meure ; scrutez plus tôt et des échos parasites donnent de fausses lectures. Filtrer le flux aide — voir dompter le bruit des capteurs.

Brochage

Broche Nom Sens Rôle
1 VCC Entrée 5 V. La carte tire environ 15 mA, en pic pendant un ping
2 Trig Entrée Impulsion au HAUT pendant 10 µs pour lancer une mesure
3 Echo Sortie Passe au HAUT au départ de la salve, au BAS à son retour. Sortie 5 V
4 GND — Masse

Les quatre broches sont toujours dans cet ordre, et le module est presque toujours orienté avec les broches à l’opposé des transducteurs, donc VCC est à gauche quand vous regardez les « yeux ».

Le câbler à un Arduino

HC-SR04 Arduino Uno ESP32
VCC 5 V 5 V (depuis VIN, pas le rail 3,3 V)
Trig Toute broche numérique Tout GPIO
Echo Toute broche numérique Via un diviseur — voir ci-dessous
GND GND GND

Le problème 3,3 V

La broche Echo sort un plein 5 V, et un GPIO d’ESP32 ou Raspberry Pi est prévu pour 3,3 V. Y injecter du 5 V dépasse son maximum absolu, et bien que cela survive souvent un temps, cela endommage vraiment la broche. Deux résistances règlent cela :

Echo ──┬── 1 kΩ ──┬── to 3.3 V GPIO
       │          │
       │        2 kΩ
       │          │
       └──────────┴── GND

Ce diviseur donne 5 V × 2/(1+2) = 3,33 V. Tout rapport proche de 2:1 convient — 1 kΩ et 2 kΩ, ou 10 kΩ et 20 kΩ. N’utilisez pas de valeurs au-delà d’environ 20 kΩ, sinon la capacité d’entrée de la broche ralentit le front assez pour fausser le minutage mesuré.

L’arithmétique de distance, et où elle se trompe

distance = (echo_microseconds x speed_of_sound) / 2

Le son voyage à 343 m/s à 20 °C, soit 0,0343 cm/µs. D’où la constante utilisée partout : divisez le temps d’écho par 58,2 pour obtenir des centimètres.

La vitesse du son dépend de la température, à peu près :

speed (m/s) = 331.3 + 0.606 x temperature_celsius
Température Vitesse du son Erreur en supposant 20 °C
0 °C 331 m/s Lit 3,5 % trop loin
20 °C 343 m/s —
40 °C 356 m/s Lit 3,7 % trop près

À 2 m, cela fait environ 7 cm entre un garage en hiver et une pièce chaude. Pour l’évitement d’obstacles, c’est sans objet. Pour tout ce qui mesure un passage, compensez — et si vous avez un MPU-6050 ou presque tout capteur I²C sur le robot, vous avez déjà une lecture de température.

Code minimal fonctionnel

const int TRIG = 9, ECHO = 10;
const unsigned long TIMEOUT_US = 25000UL;   // ~4.3 m, past the sensor's range

void setup() {
  Serial.begin(115200);
  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);
}

// Returns centimetres, or -1 when nothing came back.
float pingCm() {
  digitalWrite(TRIG, LOW);  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH); delayMicroseconds(10);
  digitalWrite(TRIG, LOW);

  unsigned long us = pulseIn(ECHO, HIGH, TIMEOUT_US);
  if (us == 0) return -1.0f;        // timeout: no echo, NOT "zero distance"
  return us / 58.2f;
}

// Median of three kills the occasional wild reading.
float pingMedianCm() {
  float a = pingCm(); delay(60);
  float b = pingCm(); delay(60);
  float c = pingCm();
  if (a > b) { float t = a; a = b; b = t; }
  if (b > c) { float t = b; b = c; c = t; }
  if (a > b) { float t = a; a = b; b = t; }
  return b;
}

void loop() {
  float cm = pingMedianCm();
  if (cm < 0) Serial.println("no echo");
  else        Serial.println(cm);
  delay(60);
}

Trois détails font la différence entre un capteur qui marche et un qui ne marche pas :

La temporisation n’est pas optionnelle. pulseIn sans temporisation bloque jusqu’à l’arrivée d’un écho, et sur une surface molle ou inclinée aucun n’arrive jamais. Le robot semble se figer à intervalles aléatoires, et la cause ressemble à tout sauf au capteur.

Zéro n’est pas une distance. Une temporisation signifie « rien n’est revenu », ce qui veut généralement dire que la chose la plus proche est loin ou invisible — l’opposé de zéro. Un code qui traite une temporisation comme 0 cm fera un arrêt d’urgence dans une pièce vide.

La médiane de trois écarte l’unique lecture aberrante que ces capteurs produisent régulièrement. Une seule valeur parasite de 20 cm en espace dégagé suffit à faire virer un robot dans un mur.

Lire honnêtement le diagramme de faisceau

La spécification dit 15°, ce qui sonne comme un étroit faisceau de torche. Ce n’est pas — c’est le demi-angle du lobe principal, et la conséquence pratique est qu’à 1 m le capteur écoute un cône d’environ 50 cm de large.

Distance Largeur de cône approximative
20 cm ~10 cm
50 cm ~26 cm
1 m ~53 cm
2 m ~105 cm

Le capteur rapporte la chose la plus proche n’importe où dans ce cône, sans rien dire sur où elle s’y trouvait. D’où un HC-SR04 détecte un cadre de porte qu’il ne peut pas localiser, et pourquoi un pied de table bien sur le côté déclenche un arrêt.

Pour errer dans une pièce, c’est un avantage — il est très difficile de rater un obstacle. Pour mesurer la distance à une chose particulière, c’est disqualifiant, et il faut un VL53L0X.

Ce qu’il ne peut pas voir

Ce sont de la physique, pas des défauts, et concevoir autour est le travail :

Surface Ce qui se passe Pourquoi
Mur à plus de ~45° Lit loin, ou rien Le son se réfléchit loin du récepteur, comme la lumière sur un miroir
Coussins, rideaux, mousse Ne lit rien Le matériau absorbe l’impulsion au lieu de la réfléchir
Objets très proches Ne lit rien sous ~2 cm Le récepteur est encore sourd de la salve d’émission
Objets fins (pied de chaise de chant) Détectés mais mal localisés Le cône est large ; le retour est réel mais le gisement non
Un autre HC-SR04 proche Lectures aberrantes aléatoires Il entend le gazouillis de l’autre capteur — décalez leurs minutages

Un robot ne comptant que sur la télémétrie ultrason poussera finalement un rideau jusqu’à ce que quelque chose cède. C’est exactement pourquoi un contacteur de choc est la fiabilité la moins chère de tout le robot.

Dépannage

Symptôme Cause probable Solution
Lit toujours 0 Temporisation traitée comme distance Renvoyez une sentinelle et gérez « pas d’écho » explicitement
Le robot se fige aléatoirement pulseIn sans temporisation Passez une temporisation — 25000 µs couvre toute la portée
Lectures sautant follement Scrutation plus rapide que ~60 ms Attendez que l’écho précédent meure
Stable mais faux de quelques pour cent Température Compensez avec la formule de vitesse du son
Marche sur table, pas sur le robot Bruit moteur sur le rail 5 V Découplez l’alimentation du capteur ; éloignez ses fils des fils moteur
Deux capteurs interfèrent Les deux s’entendant Déclenchez-les à tour de rôle, jamais ensemble
Broche ESP32 ne répondant plus Echo 5 V vers GPIO 3,3 V Ajoutez le diviseur — et vérifiez que la broche marche encore
Détecte des choses non en face Le cône 15° Normal ; rétrécissez l’angle utile mécaniquement ou utilisez un capteur laser

HC-SR04 ou VL53L0X ?

HC-SR04 VL53L0X
Méthode Son 40 kHz Laser 940 nm temps de vol
Portée 2 cm – 4 m 3 cm – 2 m (jusqu’à 4 m au mieux)
Faisceau ~15° demi-angle — cône large ~25° champ de vision, mais en fait un point étroit
Fréquence ~16 Hz (cycle 60 ms) Jusqu’à 50 Hz
Aveugle à Surfaces molles et très inclinées Surfaces mates sombres et miroirs, plein soleil
Interface Deux broches, sans bibliothèque I²C
Coût ~2 $ ~5 $

Ils échouent sur des matériaux opposés, ce qui rend le choix facile une fois la pièce connue. Le sonar voit une boîte couverte de tissu noir que le laser ne voit pas ; le laser voit une porte vitrée en biais que le sonar ne voit pas. Sur un robot qui doit être fiable, la réponse honnête est souvent les deux — plus un contacteur de choc pour quand les deux se trompent.

Explorer le graphe

Utilisé dans ces réalisations

Projets, parcours d'apprentissage et simulateurs qui intègrent le composant HC-SR04 Ultrasonic Sensor.

Comparer

Alternatives

Questions

FAQ : HC-SR04 Ultrasonic Sensor

Qu'est-ce que le capteur ultrason HC-SR04 ?

Le HC-SR04 est un capteur de distance bas coût qui mesure l'éloignement d'un objet en y faisant rebondir une salve d'ultrasons — le même principe que les chauves-souris et le sonar. C'est le capteur que la plupart des robots débutants utilisent pour détecter et éviter les obstacles.

Comment fonctionne le HC-SR04 ?

Vous envoyez une courte impulsion à sa broche Trigger. Le capteur émet huit salves ultrason à 40 kHz et lève sa broche Echo jusqu'au retour de la réflexion. Vous mesurez combien de temps Echo reste au haut, et comme le son voyage à environ 343 m/s, la distance égale ce temps fois la vitesse du son, divisé par deux pour l'aller-retour.

Quelle est la portée maximale du HC-SR04 ?

Le HC-SR04 mesure d'environ 2 cm à 4 m. Il est le plus précis dans la bande 5 cm à 2 m ; près de la limite de 4 m les lectures deviennent peu fiables, et les objets plus proches qu'environ 2 cm tombent dans son angle mort et ne peuvent pas être mesurés.

Le HC-SR04 est-il précis et fiable ?

Il est assez précis pour l'évitement d'obstacles — environ 3 mm de résolution sur une cible plate et dure lui faisant face. Il peine avec les surfaces molles ou inclinées (qui dispersent l'écho), est influencé par la température, et a un large faisceau d'environ 15°, donc il détecte un cône, pas un point.

Comment connecter un HC-SR04 à un Arduino ?

Câblez VCC au 5 V, GND à la masse, Trigger à toute broche de sortie numérique, et Echo à une broche d'entrée numérique. Une prudence : Echo sort du 5 V, donc si vous utilisez une carte 3,3 V comme un ESP32, abaissez-le avec un diviseur avant de le lire.

HC-SR04 vs US-100 — lequel est meilleur ?

L'US-100 est un proche cousin avec un mode compensé en température, une option d'interface série, et un fonctionnement 3,3–5 V, ce qui le rend plus précis et plus facile sur cartes 3,3 V. Le HC-SR04 est moins cher et a plus de tutoriels. Pour apprendre, le HC-SR04 convient ; pour la précision, l'US-100 a l'avantage.

Comment vérifier si mon capteur ultrason fonctionne ?

Affichez la distance mesurée sur le moniteur série et approchez puis éloignez votre main du capteur — la lecture doit suivre doucement. Si elle reste à zéro ou à une valeur maximale, vérifiez le câblage Trigger et Echo, confirmez une alimentation 5 V solide, et assurez-vous que votre temporisation couvre toute la portée de 4 m.

Pour aller plus loin

Références