Mesurer la vitesse du son avec un microcontrôleur et le capteur de distance HCSR04

Objectif

On détourne l'usage initialement prévu pour déterminer la vitesse de l'onde ultrasonore en mesurant le temps mis par l'onde pour parcourir une distance connue.

MéthodePrincipe de la mesure

Il s'agit de connecter l'émetteur/récepteur d'ultrasons comme indiqué précédemment puis de placer un obstacle permettant la réflexion de l'onde.

On mesure le plus précisément possible la distance qui sépare le composant de l'obstacle en prenant comme référence les capsules protégées par la grille du capteur.

Cette valeur peut être entrée dans un programme en tant que variable. Le programme mesure le temps mis par l'onde pour effectuer un aller-retour et renvoie la valeur en microsecondes. Il est alors possible de calculer la vitesse du son et de l'afficher.

On peut utiliser le moniteur série (plus simple) ou un écran LCD pour afficher le résultat.

Montage permettant de déterminer la vitesse du sonInformations[1]

Le code ci-dessous affiche la valeur de la vitesse mesurée sur le moniteur série.

1
/*Principe du montage :
2
   On place l'émetteur-récepteur US à une distance
3
   connue d'un obstacle entre 30 cm et 2 m (mesurée à la règle).
4
   La distance est entrée dans la variable distance
5
   Le microcontrôleur mesure la durée d'un A/R
6
   Il affiche la valeur de la vitesse du son mesurée.
7
*/
8
int echo = 9;//Définition de la borne E/S Echo
9
int trig = 8;//Définition de la borne E/S de déclenchement
10
unsigned long temps;//Variable temps durée de l'écho
11
float Vson,tempsAR,distance=0.50; //Variable vitesse du son, durée de l'AR
12
//La valeur de la distance peut être modifiée en fonction de l'expérience
13
14
void setup() {
15
  Serial.begin(9600);//Initialisation de la communication série
16
  pinMode(echo, INPUT);//Déclaration de la borne Echo en ENTREE
17
  pinMode(trig, OUTPUT);//Déclaration de la borne de déclenchement en SORTIE
18
  digitalWrite(trig, 0);//Déclenchement à 0 -> pas de mesure
19
}
20
21
void loop() {
22
  // put your main code here, to run repeatedly:
23
  /*Envoi de l'impulsion déclenchant l'émission de la salve d'ultrasons
24
    Il faut passer la borne Trig à l'état haut pendant 10 microsecondes
25
  */
26
  digitalWrite(trig, 1);
27
  delayMicroseconds(10);
28
  digitalWrite(trig, 0);
29
  //Fin de l'impulsion de déclenchement
30
  temps = pulseIn(echo, 1, 30000);//On recueille la durée (en µs) de l'impulsion (un A/R)
31
  tempsAR = float(temps); //la variable temps est un entier, on en fait un décimal (tempsAR) pour les calculs.
32
  Vson = 2 * distance  / (tempsAR / 1000000); //On calcule la vitesse du son (le temps est en µs)
33
  //Affichage de la vitesse du son mesurée
34
  Serial.print("V=");
35
  Serial.print(Vson, 0);
36
  Serial.println(" m/s");
37
  delay(1000);//On effectue une mesure toutes les secondes
38
}

ExempleExemple de code à fournir aux élèves

Selon le niveau de maîtrise du langage, on peut fournir aux élèves un code à compléter plus ou moins lacunaire. À minima, on peut exiger d'eux qu'ils complètent la relation permettant de calculer la vitesse à partir de la distance et de la mesure de la durée de l'aller-retour.

Cela peut aussi être l'occasion de répéter plusieurs mesures et d'en faire une analyse statistique.

1
/*Principe du montage :
2
   On place l'émetteur-récepteur US à une distance
3
   connue d'un obstacle entre 30 cm et 2 m (mesurée à la règle).
4
   Le microcontrôleur mesure la durée d'un A/R
5
   Vous devez compléter la relation permettant de calculer la vitesse du son
6
*/
7
int echo = 9;//Définition de la borne E/S Echo
8
int trig = 8;//Définition de la borne E/S de déclenchement
9
unsigned long temps;//Variable temps durée de l'écho
10
float distance = 0.50, Vson, tempsAR; //Variable distance (ADAPTER À VOTRE EXPÉRIENCE), vitesse du son et temps de l'aller-retour
11
12
void setup() {
13
  //****NE PAS MODIFIER CETTE SECTION****
14
  Serial.begin(9600);
15
  pinMode(echo, INPUT);//Déclaration de la borne Echo en ENTREE
16
  pinMode(trig, OUTPUT);//Déclaration de la borne de déclenchement en SORTIE
17
  digitalWrite(trig, 0);//Déclenchement à 0 -> pas de mesure
18
}
19
20
void loop() {
21
  // put your main code here, to run repeatedly:
22
  /*Envoi de l'impulsion déclenchant l'émission de la salve d'ultrasons
23
    Il faut passer la borne Trig à l'état haut pendant 10 microsecondes
24
  */
25
  digitalWrite(trig, 1);
26
  delayMicroseconds(10);
27
  digitalWrite(trig, 0);
28
  //Fin de l'impulsion de déclenchement
29
  temps = pulseIn(echo, 1, 30000);//On recueille la durée (en µs) de l'impulsion (un A/R)
30
  tempsAR = float(temps); //la variable temps est un entier, on en fait un décimal (tempsAR) pour les calculs.
31
32
  //****ENTREZ ICI LA RELATION PERMETTANT DE CALCULER Vson
33
  //À PARTIR DE distance et tempsAR
34
  Vson= Votre relation
35
  //Affichage sur le moniteur série
36
  Serial.print("V=");
37
  Serial.print(Vson,0);
38
  Serial.println("m/s");
39
  delay(2000);//On effectue une mesure toutes les 2 secondes
40
}

ComplémentRéglage de la distance capteur - obstacle à l'aide d'un potentiomètre et affichage sur écran LCD

Au lieu d'entrer la valeur de la distance manuellement dans le programme, l'utilisation du montage suivant permet de l'ajuster à l'aide d'un potentiomètre entre deux bornes définies dans le programme.

On gagne en souplesse d'utilisation pour effectuer des mesures en faisant varier la distance capteur - obstacle.

Montage permettant la mesure de la vitesse du sonInformations[2]

Il faut modifier le programme pour :

  • définir la valeur de la variable distance à l'aide du potentiomètre dont le curseur est relié à l'entrée analogique A0.

  • afficher les résultats des mesures sur l'écran LCD.

1
/*Principe du montage :
2
   On place l'émetteur-récepteur US à une distance
3
   connue d'un obstacle entre 30 cm et 2 m (mesurée à la règle).
4
   Le potentiomètre sert à la définir dans la variable
5
   distance (contrôler sur l'écran LCD)
6
   Le microcontrôleur mesure la durée d'un A/R
7
   Il affiche la valeur de la vitesse du son mesurée.
8
*/
9
#include <LiquidCrystal_I2C.h>//Pour utiliser l'écran LCD I2C
10
int echo = 9;//Définition de la borne E/S Echo
11
int trig = 8;//Définition de la borne E/S de déclenchement
12
unsigned long temps;//Variable temps durée de l'écho
13
float Dmin, Dmax, distance, vSon, tempsAR; //Variable distance (bornes et distance capteur-obstacle), vitesse du son et temps de l'aller-retour
14
LiquidCrystal_I2C lcd(0x27, 20, 4);//Déclaration de l'écran LCD : adresse, nb colonnes, nb lignes
15
void setup() {
16
  Dmin = 0.30; //Distance minimale Capteur-Obstacle
17
  Dmax = 2.00; //Distance maximale Capteur-Obstacle
18
  //Initialisation des réglages
19
  lcd.init();//On initialise l'écran
20
  lcd.backlight();//Rétroéclairage de l'écran
21
  lcd.clear();//On efface l'écran
22
  pinMode(echo, INPUT);//Déclaration de la borne Echo en ENTREE
23
  pinMode(trig, OUTPUT);//Déclaration de la borne de déclenchement en SORTIE
24
  digitalWrite(trig, 0);//Déclenchement à 0 -> pas de mesure
25
}
26
27
void loop() {
28
  // put your main code here, to run repeatedly:
29
  /*Ajustement de la distance à l'aide du potentiomètre
30
    On envisage une distance entre Dmin et Dmax (peut être modifié dans la boucle setup())
31
  */
32
  //Lecture de la distance (en m) ajustée à l'aide du potentiomètre
33
  distance = Dmin + (analogRead(A0) / 1023.0 * (Dmax - Dmin));
34
  /*Envoi de l'impulsion déclenchant l'émission de la salve d'ultrasons
35
    Il faut passer la borne Trig à l'état haut pendant 10 microsecondes
36
  */
37
  digitalWrite(trig, 1);
38
  delayMicroseconds(10);
39
  digitalWrite(trig, 0);
40
  //Fin de l'impulsion de déclenchement
41
  temps = pulseIn(echo, 1, 30000);//On recueille la durée (en µs) de l'impulsion (un A/R)
42
  tempsAR = float(temps); //la variable temps est un entier, on en fait un décimal (tempsAR) pour les calculs.
43
  vSon = 2 * distance  / (tempsAR / 1000000); //On calcule la vitesse du son
44
  //lcd.clear();
45
  lcd.setCursor(0, 0);//Positionnement du curseur sur l'écran
46
  lcd.print("D=");
47
  lcd.print(distance, 3);
48
  lcd.print(" m");
49
  lcd.setCursor(0, 1);
50
  if (temps == 0) {//Au-delà du délais défini, pulseIn renvoie la valeur 0 si pas d'écho
51
    lcd.print("Pas d'echo");
52
    delay(500);//On attend 0.5 seconde avant de faire la prochaine mesure
53
  }
54
  else {
55
    //Affichage de la vitesse du son mesurée
56
    lcd.print("V=");
57
    lcd.print(vSon, 0);
58
    lcd.print(" m/s");
59
    delay(500);//On effectue une mesure toutes les 0.5 seconde
60
  }
61
}