Mesurer la célérité d’un son (première générale)¶
Programme de première générale 2019 - Enseignement de spécialité.
Exploiter la relation entre la durée de propagation, la distance parcourue par une perturbation et la célérité, notamment pour localiser une source d’onde. Déterminer, par exemple à l’aide d’un microcontrôleur ou d’un smartphone, une distance ou la célérité d’une onde.
Présentation du module HC-SR04¶
Les modules du type HC-SR04 sont des émetteurs-récepteurs ultrasonores fonctionnant par réflexion. Ils sont utilisés généralement dans des applications comme télémètre (< 5 m).
Fonctionnement¶
- Le module est alimenté entre
GND
etVcc
(généralement 5 V ou 3,3 V sur certains modules). - Le déclenchement d’une mesure (émission d’une salve) se fait par une brève impulsion (> 10 µs) sur l’entrée
trig
. - La durée que prend l’onde pour aller de l’émetteur au récepteur est celle de l’impulsion renvoyée sur la sortie
echo
.
Modification du module¶
Tel qu’il est vendu, ce module n’a peu d’intérêt en sciences physiques car les signaux électriques sur l’émetteur et le récepteur ne sont pas accessibles. Il est possible de résoudre ce problème en y soudant des connecteurs supplémentaires (voir photo ci-dessous) et de visualiser les signaux correspondants à l’oscilloscope ou avec une interface d’acquisition.

Mesure de la célérité du son¶
La manipulation consiste à relever la durée de l’écho sonore à l’aide du microcontrôleur pour différentes distances et déduire la célérité du son.
Algorithme¶
TRIG <- 0
REPETER :
TRIG <- Vcc # Début impulsion sur Trig
Attendre 10 µs
TRIG <- 0 # Fin impulsion sur Trig
Dt <- Durée impulsion sur Echo # Mesure
Afficher Dt
Attendre 1 s
Pour plus de précision, il est possible de modifier le programme afin de réaliser plusieurs mesures de la durée de l’écho et d’en déduire sa moyenne.
Arduino (C/C++)¶
// Mesure de la durée de l'écho sonore
#define pinTrig 8 // Trig sur broche 8
#define pinEcho 9 // Echo sur broche 9
long dureeEcho; // Durée de l'Echo
void setup() {
pinMode(pinTrig,OUTPUT); // Broche Trig en sortie
digitalWrite(pinEcho,LOW); // Sortie Trig à l état bas
pinMode(pinEcho,INPUT); // Broche Echo en entrée
Serial.begin(9600); // Paramétrage du port série
}
void loop() {
digitalWrite(pinTrig,HIGH); // Début impulsion de declenchement
delayMicroseconds(10); // Attendre 10 microseconde
digitalWrite(pinTrig,LOW); // Fin impulsion (Etat bas)
dureeEcho = pulseIn(pinEcho,HIGH); // Mesure de la durée de l'impulsion sur Echo
Serial.print("Durée (µs) = "); // Affichage sur port série
Serial.println(dureeEcho);
delay(1000); // Attendre 1s
}
Arduino (Python/Nanpy)¶
# Réalisé avec une version modifiée de Nanpy par Eurosmart
from nanpy import SerialManager, Ultrasonic
from time import sleep
port = SerialManager(device='/dev/ttyACM0') # Sélection du port série (exemple : device = 'COM6')
moduleUltrason = Ultrasonic(trig=8, echo=9, useInches=False, connection=port) # Déclaration du module HC-SR04
sleep(0.1) # Temporisation
for i in range(10):
duree = moduleUltrason.get_duration() # Durée en µs pour l'aller-retour du son
print("Durée =", duree, "µs") # Affichage
sleep(1) # Temporisation
Résultats :
Durée = 1456 µs
Durée = 1453 µs
Durée = 1451 µs
Durée = 1450 µs
Durée = 1453 µs
Durée = 1453 µs
Durée = 1447 µs
Durée = 1444 µs
Durée = 1452 µs
Durée = 1446 µs
Application : réalisation d’un télémètre¶
Connaissant la célérité du son, la distance par rapport à un obstacle est calculée par le microcontrôleur à l’aide de la relation suivante :
Il suffit d’ajouter le calcul de la distance juste après la mesure de la durée.
Arduino (C/C++)¶
// Mesure de la durée d'une distance
#define pinTrig 8 // Trig sur broche 8
#define pinEcho 9 // Echo sur broche 9
long dureeEcho; // Durée de l'Echo
float distance; // Distance en module et réflecteur
float vitesse = 345 ; // Vitesse obtenue
void setup() {
pinMode(pinTrig,OUTPUT); // Broche Trig en sortie
digitalWrite(pinEcho,LOW); // Sortie Trig à l état bas
pinMode(pinEcho,INPUT); // Broche Echo en entrée
Serial.begin(9600); // Paramétrage du port série
}
void loop() {
digitalWrite(pinTrig,HIGH); // Début impulsion de declenchement
delayMicroseconds(10); // Attendre 10 microseconde
digitalWrite(pinTrig,LOW); // Fin impulsion (Etat bas)
dureeEcho = pulseIn(pinEcho,HIGH); // Mesure de la durée de l'impulsion sur Echo
distance = (vitesse*dureeEcho*1E-6)/2; // Calcul de la distance
Serial.print("Duree (us) = "); // Affichage sur port série
Serial.println(dureeEcho); //
Serial.print("Distance (m) = "); // Affichage sur port série
Serial.println(distance); //
delay(1000); // Attendre 1s
}
En autonome avec un écran LCD :
//Application : télémètre sur écran LCD 2x16
#include <LiquidCrystal.h> // Importation de la librairie LiquidCrystal
#define pinTrig 8 // Trig sur broche 8
#define pinEcho 9 // Echo sur broche 9
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Brochage de l'afficheur
float distance; // Distance en module et réflecteur
long dureeEcho; // Durée mesurée
float vitesse = 345 ; // Vitesse obtenue
void setup() {
pinMode(pinTrig,OUTPUT); // Broche Trig en sortie
digitalWrite(pinEcho,LOW); // Sortie Trig à l état bas
pinMode(pinEcho,INPUT); // Broche Echo en entrée
lcd.begin(16, 2); // fixe le nombre de colonnes et de lignes de l afficheur
}
void loop() {
digitalWrite(pinTrig,HIGH); // Début impulsion de déclenchement
delayMicroseconds(10); // Attendre 10 microseconde
digitalWrite(pinTrig,LOW); // Fin impulsion (Etat bas)
dureeEcho = pulseIn(pinEcho,HIGH); // Mesure de la durée de l'impulsion sur Echo
distance = (vitesse*dureeEcho*1E-6)/2; // Calcul de la distance
lcd.setCursor(0,0); // place le curseur au début de la ligne 0
lcd.print("Distance en m"); // Affiche la légende
lcd.setCursor(0,1); // place le curseur au début de la ligne 1
lcd.print(distance); // Affiche la valeur de la distance
delay(1000); // Attendre 1s
}
Arduino (Python/Nanpy)¶
# Réalisé avec une version modifiée de Nanpy par Eurosmart
from nanpy import SerialManager, Ultrasonic
from time import sleep
port = SerialManager(device='/dev/ttyACM0') # Sélection du port série (exemple : device = 'COM6')
moduleUltrason = Ultrasonic(trig=8, echo=9, useInches=False, connection=port) # Déclaration du module HC-SR04
sleep(0.1) # Temporisation
vitesse_son = 345 # vitesse du son 345 m/S dans l'air
for i in range(10):
duree = moduleUltrason.get_duration() # Durée en µs pour l'aller-retour du son
print("Durée =", duree, "µs") # Affichage
distance = (vitesse_son*duree*1E-6)/2; # Calcul de la distance en m
print("Distance = ", distance, "m") # Affichage
sleep(1) # Temporisation
Résultats :
Durée = 1997 µs
Distance = 0.34448249999999997 m
Durée = 1996 µs
Distance = 0.34431 m
Durée = 2019 µs
Distance = 0.34827749999999996 m
Durée = 8214 µs
Distance = 1.416915 m
Durée = 8181 µs
Distance = 1.4112225 m
Durée = 8177 µs
Distance = 1.4105325 m
Durée = 1822 µs
Distance = 0.314295 m
Durée = 1915 µs
Distance = 0.3303375 m
A retenir¶
- Le module HC-SR04 fournit un signal Echo pour la mesure automatique de la durée de propagation du son.
- La fonction
pulseIn()
mesure cette durée.