Capteur de distance à Ultrasons
Principe
Les capteurs de distance à ultrasons utilisent le principe de l’écho pour déterminer la distance à laquelle se trouve un objet :
- Un court signal sonore est envoyé (inaudible car dans le domaine des ultrasons – environ 40kHz) ;
- Le son est réfléchi par une surface et repart en direction du capteur : c’est l’écho ;
- Une fois revenue à son point de départ, l’onde sonore est détectée par le capteur.
La durée entre l’instant de l’émission et l’instant de la réception peut être mesurée. Le signal ayant parcouru 2 fois la distance entre le capteur et la surface (un aller-retour), on peut la calculer ainsi :
\(\text{distance} =\frac{1}{2}\times \text{vitesse du son}\times\text{durée}\)
Remarque la vitesse du son est environ égale à 340 m/s.
Câblage
Comme la plupart des composants actifs, les capteurs de distance à ultrasons doivent être alimentés (5V le plus souvent).
Ils fonctionnent de la manière suivante :
- l’Arduino envoie au capteur par un port numérique une courte impulsion (10μs environ) à l’entrée « trigger » du capteur ;
- cela déclenche l’émission d’un signal sonore très court (8 oscillations environ) ;
- lorsque ce signal est parti, la sortie « echo » du capteur passe à l’état
HIGH
; - dès que le signal sonore revient, il est détecté par le capteur dont la sortie « echo » repasse à
LOW
.
Remarque : si le signal retour n’est pas détecté, la durée du signal « echo » est limitée à 36 ms environ (cela dépend des modèles), soit 6m environ.
Programme
Sans bibliothèque
Pour envoyer une impulsion sur le port de sortie ‘trigger« , on utilise la fonction digitalWrite
.
Pour connaitre la durée de l’impulsion sur le port d’entrée « echo« , on utilise la fonction pulseIn
. (référence)
// Définition des numéros de port const int trigPin = 11; // Trigger (emission) const int echoPin = 12; // Echo (réception) // Variables utiles long duree; // durée de l'echo int distance; // distance void setup() { pinMode(trigPin, OUTPUT); // Configuration du port du Trigger comme une SORTIE pinMode(echoPin, INPUT); // Configuration du port de l'Echo comme une ENTREE Serial.begin(9600); // Démarrage de la communication série } void loop() { // Émission d'un signal de durée 10 microsecondes digitalWrite(trigPin, LOW); delayMicroseconds(5); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Écoute de l'écho duree = pulseIn(echoPin, HIGH); // Calcul de la distance distance = duree*0.034/2; // Affichage de la distance dans le Moniteur Série Serial.print("Distance : "); Serial.print(distance); Serial.println("cm"); }
Avec la bibliothèque NewPing
Si ce n’est pas encore fait, installer la bibliothèque NewPing.
Cette bibliothèque propose une prise en charge optimisée et simultanée de plusieurs capteurs de distance à ultrasons (jusqu’à 16!)
#include <NewPing.h> #define TRIGGER_PIN 12 #define ECHO_PIN 11 #define MAX_DISTANCE 200 NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); void setup() { Serial.begin(115200); } void loop() { delay(50); int uS = sonar.ping(); Serial.print("Ping: "); Serial.print(uS / US_ROUNDTRIP_CM); Serial.println("cm"); }
Exemple
…
Pour en savoir plus …
Bibliothèque NewPing
Bonjour et bravo pour votre site,
J’ai une petite question… J’ai du mal à déterminer si le capteur ultrason délivre une information de type logique ou analogique ?
Cordialement.
Bonjour
Étant donné que l’Arduino mesure un temps, il s’agit d’une grandeur analogique, numérisée par l’horloge, puis convertie en distance.
CF
Merci pour l’info.
Bonjour,
Merci pour cette présentation très détaillée!
Je me pose toutefois une question au sujet des chronogrammes des signaux émis/reçus par le capteur : la durée « image » de la distance mesurée (signal « echo ») doit-elle toujours être prise entre le début de la réception du signal par le récepteur et la fin de l’émission du signal par l’émetteur? Dans un autre exemple que j’ai rencontré, cette durée est mesurée entre le début de ces deux signaux.
Remerciements par avance,
Hippolyte
Bonjour
Merci pour ce commentaire constructif.
Il existe sans doute plusieurs modes de fonctionnement de ce type de capteur. J’ai de mon coté tenté d’interpréter certains documents publiés par des constructeurs de capteur (par exemple https://cdn.sparkfun.com/datasheets/Sensors/Proximity/HCSR04.pdf) des documents pas vraiment satisfaisants à mon gout d’un point de vue pédagogique. Si vous me communiquez d’autres documents convaincants, j’enrichirai cet article.
Cédrick
Bonjour,
Plusieurs collègues m’ont confirmé, certains de manière catégorique, que la mesure de la distance par ultrasons se fait bien par mesure de la durée entre la fin de l’émission et le début de la réception, conformément à ce que vous avez fait apparaître dans cet article.
Merci pour votre réponse, et pour le lien vers le document constructeur.
Hippolyte
Bonjour, merci pour le tuto.
qu’est que c’est: US_ROUNDTRIP_CM
Je l’utilise parce que piqué un exemple mais je ne l’ai pas trouvé dans les paramètre de newPing
Bonjour
US_ROUNDTRIP_CM est une constante (qui vaut 57) et qui permet la conversion micro-secondes >> cm.
comment utiliser NewPing, si tu peux nous donner un schema avec un senseble de code que l’on pourra datpter
Bonjour
Avec ou sans Newping, le câblage est le même (voir celui proposé sur cet article).
Quant à l’exemple de code, celui fourni avec la bibliothèque est très bien. Pour l’ouvrir, il suffit, depuis l’IDE Arduino, de faire Fichier>Exemples>NewPing>NewPingExample.
CF
Bonjour. Merci pour le projet et pour toutes les astuces. Je me suis inspiré par votre projet pour faire un min sèche-mains à ultrason. Ci-dessous le lien du projet pour les personnes intéressées: https://www.electronique-mixte.fr/projet-electronique-17-seche-mains-ultrason-avec-arduino/