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.
Fonctionnement
Le capteur parle un langage simple à deux fils :
- Vous mettez la broche Trigger au HAUT pendant 10 microsecondes.
- Le capteur émet huit impulsions ultrason à 40 kHz et lève la broche Echo.
- Quand l’écho revient, il rebaisse Echo au BAS.
- 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