Mesurer des distances avec un capteur à ultrason HC-SR04 et un Arduino

Salut les makers, aujourd'hui je vous propose un tuto sur l'utilisation du capteur à ultrasons HC-SR04. Nous allons apprendre nous servir de ce capteur au travers d'un exercice simple : mesurer des distances.

1. Principe de fonctionnement du capteur

1.1 Ondes sonores pour mesurer une distance

Pour mesurer des distances, une technique bien connue consiste à utiliser les ondes sonores. Le principe est simple : on émet une onde sonore, celle-ci se propage jusqu'à rencontrer un obstacle, rebondi et revient dans l'autre sens. Sachant la vitesse de propagation d'une onde, il suffit de mesurer le temps entre l'émission et la réception pour en déduire la distance de l'obstacle.

Propagation
Principe de mesure de distances

Comme l'onde parcourt au final deux fois la distance (aller puis retour), il faut alors diviser par deux la distance calculée.

On peut donc établir la relation suivante :

$$d = \dfrac{c \times t}{2}$$

  • $d$ : distance capteur/obstacle
  • $c$: célérité du son dans l'air
  • $t$: temps écoulé entre l'émission et la réception de l'onde

Une onde sonore se propage à environ $340 m.s^{-1}$ dans l'air à 15°C.

Imaginons que le temps mesuré soit de $588 µs$, la distance de l'obstacle est alors de $d = \dfrac{340 \times 588.10^{-6}}{2} = 0.1m$ soit 10 cm.

1.2 Fonctionnement du capteur

Le capteur HC-SR04 utilise ce même principe. Il dispose pour ça d'un émetteur d'onde sonore 40kHz et d'un récepteur.

HCSR04
Capteur HC-SR04

Le spectre audible de l'oreille humaine s'étend de 16Hz à 16kHz, n'espérez donc pas entendre quoi que ce soit. Votre chat, quant à lui, risque d'entendre un sifflement s'il est dans les parages.

Il dispose de 4 broches :

  • Vcc : Alimentation +5V DC
  • GND : Masse
  • Echo : Sortie de mesure
  • Trig : Entrée de déclenchement de la mesure

Pour lui faire émettre une série d'ondes (8 exactement), il faut envoyer une impulsion d'au moins 10µs sur la broche Trig.
En réponse, le capteur génère une impulsion sur la broche Echo dont la durée est proportionnelle au temps écoulé entre l'émission de l'onde incidente et la réception de l'onde réfléchie.

pulses
Signaux du HC-SR04

Et comment on fait si l'onde ne rencontre jamais d'obstacle ?

Dans ce cas on risque d'attendre indéfiniement, c'est pourquoi on doit définir un TIMEOUT, durée au-delà de laquelle on considère qu'il n'y a pas d'obstacle.

Par exemple, si on définit le TIMEOUT à 25ms, ça donne une distance max de $25.10^{-3} \times 340 = 8.5m$.

Lorsqu'on regarde dans la documentation constructeur, on se rend compte que le capteur a une distance de captation comprise entre 2cm de 4m. Pas la peine donc de définir un TIMEOUT au-delà de ~12ms.

2. Câblage avec l'Arduino

Pour le câblage rien de plus simple. On relie les masses ensemble, le Vcc au 5V de l'Arduino, et les broches Trig et Echo sur deux broches numériques de l'Arduino, 2 et 3 par exemple :

cablage
Câblage du HC-SR04 avec un Arduino Uno

3. Implémentation

Pour lire l'impulsion générée par le capteur, nous allons utiliser la fonction native pulseIn.


#define TIMEOUT     12000UL // 12ms -> ~4m à 340m/s
#define TRIG_PIN    2
#define ECHO_PIN    3
#define SOUND_SPEED 340.0/1000 // Vitesse en mm/µs

void setup() {
	Serial.begin(9600);

	pinMode(TRIG_PIN, OUTPUT);
	pinMode(ECHO_PIN, INPUT);
	digitalWrite(TRIG_PIN, LOW);
}

void loop() {
	// Génération de l'impulion de 15µs
	digitalWrite(TRIG_PIN, HIGH);
	delayMicroseconds(15);
	digitalWrite(TRIG_PIN, LOW);

	// Lecture de l'impulsion sur la broche Echo
	long duration = pulseIn(ECHO_PIN, HIGH, TIMEOUT);

	// Calcul de la distance en mm
	long distance = SOUND_SPEED * duration / 2.0;

	// Affichage de la distance
	Serial.print("Distance : ");
	Serial.print(distance);
	Serial.print("mm");
}

On upload tout ça dans notre Arduino préféré et ...

mesure
distances
Distance affichée dans le terminal

Tada 🙂 !

4. Conclusion

Un projet très simple à mettre en oeuvre mais qui reste très intéressant.

Si votre but est uniquement de réaliser un télémètre, alors ce code suffit. Par contre, dans le cas de l'utilisation au sein d'un système plus complexe (genre un robot évitant des obstacles) il serait préférable d'utiliser des interruptions pour la génération et lecture des impulsions. Ainsi, ça évite de bloquer le programme lorsqu'il attend l'impulsion Echo.

Have fun et à bientôt sur Fire-DIY !

Sources: [1] [2] [3]

Vos réactions (0) :

  1. Sois le/la premier(e) à commenter cet article !
Tu as besoin d'aide ? Utilise le Forum plutôt que les commentaires.

Un commentaire ?

* Champs obligatoires
Utilisation des données

Afin d'améliorer ton expérience utilisateur, nous utilisons des cookies 🍪