Le capteur à ultrasons HC-SR04 mesure une distance sans rien toucher : il émet une salve d’ultrasons et chronomètre l’écho qui revient. C’est le composant des robots qui évitent les obstacles, des jauges de niveau, des détecteurs de passage et des radars de recul.
Le module livré est le HC-SR04, la référence la plus répandue au monde. Il fonctionne en 5 V, se branche avec quatre fils, et ne demande aucune bibliothèque : deux broches numériques de l’Arduino suffisent, et la distance sort directement en centimètres.
Comment le capteur mesure une distance
Le principe s’appelle le temps de vol. Un émetteur piézoélectrique envoie huit impulsions à 40 kHz — des ultrasons, inaudibles pour l’oreille humaine. L’onde se propage dans l’air, rebondit sur le premier obstacle rencontré, et revient vers un récepteur placé juste à côté. Le module chronomètre ce trajet et le transmet sur sa broche Echo : la sortie reste haute pendant toute la durée de l’aller-retour.
Le son se déplace dans l’air à environ 343 mètres par seconde à 20 °C, soit 29 microsecondes par centimètre. Comme l’onde parcourt deux fois la distance à mesurer, il suffit de diviser la durée par 58 : distance en cm = durée en microsecondes / 58. C’est le seul calcul à connaître, et c’est exactement ce que fait le programme plus bas.
Les deux cylindres métalliques sont donc un émetteur, marqué T, et un récepteur, marqué R. C’est aussi pourquoi le capteur doit viser à peu près droit devant lui : un obstacle vu de biais renvoie l’écho ailleurs qu’à l’oreille du module.
Caractéristiques techniques
| Modèle | HC-SR04 — émetteur et récepteur à ultrasons avec circuit de commande intégré |
|---|---|
| Alimentation | 5 V continu, fournis par la carte Arduino |
| Consommation | 15 mA pendant une mesure, moins de 2 mA au repos |
| Plage de mesure | 2 cm à 400 cm |
| Résolution | 0,3 cm |
| Précision annoncée | Environ 3 mm sur une cible droite et dure |
| Fréquence de travail | 40 kHz |
| Angle utile | Moins de 15° de part et d’autre de l’axe du capteur |
| Déclenchement | Une impulsion de 10 µs sur la broche Trig |
| Sortie | Impulsion sur Echo, dont la durée est proportionnelle à la distance |
| Dimensions | 45 × 20 × 15 mm |
| Fixation | Quatre trous de vis aux angles de la carte |
| Cadence de mesure | Une mesure toutes les 60 ms au minimum |
Brochage : quatre broches, deux fils d’alimentation
Les quatre broches sont sérigraphiées sur la carte, sous les transducteurs :
VCC | Alimentation. À relier au 5 V de l’Arduino. |
|---|---|
Trig | Entrée de commande. Une impulsion de 10 µs descendante lance une mesure. |
Echo | Sortie. Elle passe au niveau haut à l’émission et retombe quand l’écho revient. À relier à une entrée numérique. |
GND | Masse commune avec la carte. |
La sortie Echo est en 5 V. Un Arduino Uno ou Mega la lit sans rien ajouter. Sur un module en 3,3 V (ESP32, ESP8266), en revanche, cette tension est trop élevée pour l’entrée : interposez un diviseur fait de deux résistances de 1 kΩ — la sortie tombe alors à 2,5 V, largement lue comme un niveau haut par un microcontrôleur en 3,3 V. La broche Trig, elle, accepte le 3,3 V directement : aucun étage de commande n’est nécessaire.
Mini-projet : un télémètre avec affichage et alerte de proximité
Un montage complet, à faire en une vingtaine de minutes : le capteur mesure, l’afficheur indique la distance en centimètres, et un buzzer sonne dès qu’un obstacle approche à moins de 20 cm.
Ce qu’il faut
| La mesure | Le capteur HC-SR04 — celui de cette page |
|---|---|
| Le cerveau | Uno R3 + câble USB |
| L’affichage | Afficheur LCD 16×02 I2C — deux fils seulement, au lieu de seize |
| L’alerte | Buzzer 16 ohms 2 kHz actif |
| Le support | Plaque d’essai 400 points |
| Les liaisons | 10 × fil mâle-femelle |
Pourquoi des fils mâle-femelle ? Le capteur porte quatre broches mâles, et une plaque d’essai n’accepte que des broches mâles : c’est le fil mâle-femelle qui relie les deux, l’extrémité femelle clipsée sur le capteur.
Le câblage
Capteur VCC | → Arduino 5V |
|---|---|
Capteur Trig | → Arduino D9 |
Capteur Echo | → Arduino D10 |
Capteur GND | → Arduino GND |
Afficheur VCC | → Arduino 5V |
Afficheur GND | → Arduino GND |
Afficheur SDA | → Arduino A4 |
Afficheur SCL | → Arduino A5 |
| Buzzer (fil rouge) | → Arduino D8 |
| Buzzer (fil noir) | → Arduino GND |
Le programme
À copier dans l’IDE Arduino, puis à téléverser. La bibliothèque LiquidCrystal_I2C s’installe depuis le gestionnaire de bibliothèques, sous le nom « LiquidCrystal I2C » de Frank de Brabander.
/*
* Telemetre a ultrasons - capteur HC-SR04
* Carte : Arduino Uno R3, afficheur LCD 16x02 en I2C, buzzer actif
*
* Composants, brochage et fiche complete : www.marocproduits.com
*/
#include "Wire.h"
#include "LiquidCrystal_I2C.h"
// Adresse I2C habituelle de l'adaptateur : 0x27, parfois 0x3F.
LiquidCrystal_I2C lcd(0x27, 16, 2);
const byte PIN_TRIG = 9; // impulsion de declenchement
const byte PIN_ECHO = 10; // duree de l'aller-retour
const byte PIN_BUZZER = 8; // buzzer actif
const int SEUIL_ALERTE_CM = 20; // distance d'alerte
void setup() {
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
pinMode(PIN_BUZZER, OUTPUT);
lcd.init();
lcd.backlight();
lcd.print("Telemetre pret");
Serial.begin(9600);
}
// Renvoie la distance en centimetres, ou 0 si aucun echo n'est revenu.
long mesurerDistance() {
// Une impulsion de 10 microsecondes sur Trig lance une mesure.
digitalWrite(PIN_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
// Echo reste haut pendant la duree de l'aller-retour. Le troisieme
// argument est un delai de garde de 30 millisecondes : sans lui, le
// programme attendrait sans fin un echo qui ne revient pas.
long duree = pulseIn(PIN_ECHO, HIGH, 30000);
// 29 microsecondes par centimetre, et l'onde fait un aller-retour :
// distance en centimetres = duree en microsecondes / 58.
return duree / 58;
}
void loop() {
long distance = mesurerDistance();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Distance :");
if (distance == 0) {
// Aucun echo : objet hors de portee, ou surface qui absorbe le son.
lcd.setCursor(0, 1);
lcd.print("hors portee");
digitalWrite(PIN_BUZZER, LOW);
} else {
lcd.setCursor(0, 1);
lcd.print(distance);
lcd.print(" cm");
if (distance > SEUIL_ALERTE_CM) {
digitalWrite(PIN_BUZZER, LOW);
} else {
digitalWrite(PIN_BUZZER, HIGH);
lcd.print(" ALERTE");
}
}
Serial.print("Distance : ");
Serial.print(distance);
Serial.println(" cm");
// Deux mesures trop rapprochees se brouillent : l'echo de la premiere
// peut revenir pendant la seconde. 60 millisecondes est le minimum.
delay(60);
}Comment ça marche
- La fonction
mesurerDistance()fabrique l’impulsion de déclenchement :Trigreste haut 10 µs, pas plus. Une impulsion plus longue ne casse rien, mais elle est inutile. pulseIn(PIN_ECHO, HIGH, 30000)attend que la brocheEchomonte, mesure combien de temps elle reste haute, et rend la durée en microsecondes. Le troisième paramètre est un délai de garde : sans lui, le programme s’arrêterait indéfiniment sur un obstacle absent. Au-delà du délai, la fonction rend0— c’est ainsi que le programme reconnaît une absence d’écho.- La division par 58 est le cœur du calcul. Pour aller plus loin, sachez que le diviseur réel vaut 58,3 : sur une mesure de quatre mètres, l’écart reste inférieur à deux centimètres.
- Le buzzer est un modèle actif : il contient son propre oscillateur, donc un simple
digitalWritele fait sonner. Avec un buzzer passif, il faudrait employertone()en précisant la fréquence. - La pause de 60 ms en fin de boucle n’est pas décorative : c’est le temps minimum pour que l’écho précédent soit retombé avant la mesure suivante.
Pour aller plus loin
- Une tête qui balaie l’horizon — fixez le capteur sur un servomoteur SG90 : en faisant varier l’angle de 0 à 180°, vous obtenez une carte des distances autour de vous.
- Un robot qui évite les obstacles — le même capteur, monté sur un châssis robotique à deux roues, détourne le robot dès qu’un mur s’approche.
- La fixation propre — pour visser le module sur un châssis, le support pour capteur ultrason HC-SR04 évite la carte qui ballotte sur ses entretoises.
- Une autre technologie — sur une cible très absorbante ou dans un environnement bruyant, le capteur infrarouge E18-D80NK est plus à l’aise : il mesure jusqu’à 80 cm, mais seulement en ligne droite et sur un objet réfléchissant.
Ce qui fausse une mesure — et ce qui n’est pas une panne
- Les surfaces molles ou inclinées. Un tissu, une mousse, un rideau ou un objet vu de biais renvoient peu ou pas d’écho. Le capteur annonce alors une distance trop grande, ou rien du tout. Ce n’est pas un défaut : l’onde est simplement diffuse dans une autre direction.
- Les objets trop petits ou trop minces. Sous le cône de 15°, un objet plus étroit que la zone visée peut passer inaperçu, ou être détecté seulement par intermittence.
- La température. La vitesse du son augmente d’environ 0,6 m par seconde par degré. Entre l’hiver et l’été, l’écart de mesure peut atteindre quelques centimètres sur une longue portée.
- Deux capteurs côte à côte. Le HC-SR04 n’émet pas sur une fréquence propre : deux modules qui mesurent en même temps se brouillent mutuellement. Faites-les mesurer en alternance.
- Une alimentation trop faible. Le module tire 15 mA en pointe. Alimenté depuis un port USB fatigué ou une sortie 3,3 V, il donne des mesures erratiques avant de refuser de mesurer. Reliez
VCCau 5 V, etGNDà la même masse que la carte.
Questions fréquentes
Ma mesure est toujours égale à zéro, pourquoi ?
Le programme renvoie zéro quand aucun écho n’est revenu avant le délai de garde. Trois causes se partagent la quasi-totalité des cas : l’obstacle est à moins de deux centimètres ou à plus de quatre mètres, la surface visée absorbe les ultrasons (tissu, mousse, rideau), ou les fils Trig et Echo sont inversés. Vérifiez le câblage avant de suspecter le capteur.
Peut-on l’alimenter en 3,3 V ?
Non. Le module demande 5 V pour fonctionner de façon fiable, et sa sortie Echo délivre elle aussi du 5 V. Pour un montage en 3,3 V, alimentez le capteur en 5 V, ramenez Echo sous 3,3 V avec le diviseur à deux résistances décrit plus haut, et laissez Trig tel quel.
Mesure-t-il à travers une vitre, un plastique ou dans l’eau ?
À travers une vitre fine ou un plastique tendu, oui, mais la mesure part du matériau, pas de ce qu’il y a derrière : c’est la paroi que le capteur voit. Dans l’eau, non — le transducteur est prévu pour l’air, et un capteur immergé ne mesure rien de fiable.
Le capteur chauffe-t-il ou s’use-t-il à force de mesurer ?
Non. Le transducteur est piézoélectrique, sans pièce en mouvement ni contact : rien ne s’use à mesurer. Seule contrainte à respecter, la cadence de 60 ms entre deux mesures, sous peine de brouillage entre un écho et le suivant.
Quelle différence avec un capteur de distance infrarouge ?
L’infrarouge est plus étroit et souvent plus rapide, mais sa portée est courte, il dépend de la couleur et de l’état de surface de la cible, et il souffre de la lumière du jour. Les ultrasons mesurent plus loin, sur presque toutes les matières, mais ils sont plus lents et sensibles aux surfaces molles. Beaucoup de projets utilisent les deux, l’un complétant l’autre.
À combiner avec
Si vous partez de zéro, le KIT Starter apporte la carte Uno R3, la plaque d’essai, les fils et de quoi afficher un résultat : en y ajoutant ce capteur, vous montez le télémètre de cette page. Pour un montage définitif sur un robot, prévoyez le support de fixation ci-dessus plutôt que de laisser la carte en équilibre sur les fils.








