Construire un télémètre avec un microcontrôleur

Objectif

Il s'agit ici de déterminer une distance à partir de la mesure de la durée du trajet d'une onde ultrasonore, connaissant la vitesse du son.

L'élève peut éventuellement réutiliser la vitesse du son qu'il aurait déterminée dans la manipulation précédente.

MéthodePrincipe de la mesure

Pour obtenir la distance entre l'émetteur et l'obstacle, on utilise la fonction pulseIn qui permet de connaître la durée nécessaire à un aller-retour. En utilisant la valeur de la vitesse du son, on en déduit la distance qui sépare le dispositif de l'obstacle par la relation \(D=\dfrac{v_{son}\times \Delta t}{2}\).

Attention : pulseIn renvoie une durée en microsecondes.

Fabrication d'un télémètre à l'aide d'une carte ArduinoInformations[1]

Le programme ci-dessous permet l'affichage de la distance sur le moniteur série.

1
int echo = 4;//Définition de la borne E/S Echo
2
int trig = 3;//Définition de la borne E/S de déclenchement
3
long temps;//Variable temps durée de l'écho
4
float distance;//Variable distance
5
void setup() {
6
  Serial.begin(9600);//Initialisation de la communication série
7
  pinMode(echo, INPUT);//Déclaration de la borne Echo en ENTREE
8
  pinMode(trig, OUTPUT);//Déclaration de la borne de déclenchement en SORTIE
9
  digitalWrite(trig, 0);//Déclenchement à 0 -> pas de mesure
10
}
11
12
void loop() {
13
  /*Envoi de l'impulsion déclenchant l'émission de la salve d'ultrasons
14
     Il faut passer la borne Trig à l'état haut pendant 10 microsecondes
15
  */
16
  digitalWrite(trig, 1);
17
  delayMicroseconds(10);
18
  digitalWrite(trig, 0);
19
  //Fin de l'impulsion de déclenchement
20
  temps = pulseIn(echo, 1, 30000);//On recueille la durée de l'impulsion de retour
21
  distance = 0.5 * 340.0 * temps / 1000000.0; //On en déduit la distance
22
  if (temps == 0) {//Au-delà du délais défini, pulseIn renvoie la valeur 0 si pas d'écho
23
    Serial.println("Pas d'obstacle");
24
    delay(1000);//On attend une seconde avant de faire la prochaine mesure
25
  }
26
  else {
27
    Serial.print(distance, 2); //On affiche la valeur de la distance avec deux décimales
28
    Serial.println(" m");
29
    delay(1000);//On effectue une mesure toutes les secondes
30
  }
31
}

ExempleQuestionnement élève possible

On peut proposer cette activité en prolongement de la mesure de la vitesse du son et ainsi réutiliser dans le programme la vitesse déterminée précédemment.

Le calcul de la distance à partir de la durée de l'impulsion peut être laissé aux élèves. Selon le niveau de maîtrise des élèves du langage Arduino, on peut laisser davantage de lignes à compléter.

Le programme ci-dessous demande aux élève d'entrer la relation permettant de calculer la distance

1
//NE MODIFIER QUE LES LIGNES EXPLICITEMENT PRÉCÉDÉES DE LA MENTION
2
//***À MODIFIER/COMPLÉTER***
3
int echo = 4;//Définition de la borne E/S Echo
4
int trig = 3;//Définition de la borne E/S de déclenchement
5
long temps;//Variable temps durée de l'écho
6
float distance;//Variable distance
7
void setup() {
8
  Serial.begin(9600);//Initialisation de la communication série
9
  pinMode(echo, INPUT);//Déclaration de la borne Echo en ENTREE
10
  pinMode(trig, OUTPUT);//Déclaration de la borne de déclenchement en SORTIE
11
  digitalWrite(trig, 0);//Déclenchement à 0 -> pas de mesure
12
}
13
14
void loop() {
15
  /*Envoi de l'impulsion déclenchant l'émission de la salve d'ultrasons
16
     Il faut passer la borne Trig à l'état haut pendant 10 microsecondes
17
  */
18
  digitalWrite(trig, 1);
19
  delayMicroseconds(10);
20
  digitalWrite(trig, 0);
21
  //Fin de l'impulsion de déclenchement
22
  temps = pulseIn(echo, 1, 30000);//On recueille la durée de l'impulsion de retour
23
  //***À MODIFIER/COMPLÉTER***
24
  distance = .....
25
  //FIN DES MODIFICATIONS
26
  if (temps == 0) {//Au-delà du délais défini, pulseIn renvoie la valeur 0 si pas d'écho
27
    Serial.println("Pas d'obstacle");
28
    delay(1000);//On attend une seconde avant de faire la prochaine mesure
29
  }
30
  else {
31
    Serial.print(distance, 2); //On affiche la valeur de la distance avec deux décimales
32
    Serial.println(" m");
33
    delay(1000);//On effectue une mesure toutes les secondes
34
  }
35
}

ComplémentAffichage de la distance sur un écran LCD

Le programme ci-dessous permet l'affichage de la distance mesurée sur un écran LCD au lieu du moniteur série.

1
#include <LiquidCrystal_I2C.h>//Pour utiliser l'écran LCD I2C
2
int echo = 9;//Définition de la borne E/S Echo
3
int trig = 8;//Définition de la borne E/S de déclenchement
4
long tempsAR;//Variable tempsAR durée de l'écho
5
float distance;//Variable distance
6
LiquidCrystal_I2C lcd(0x27, 20, 4);//Déclaration de l'écran LCD : adresse, nb colonnes, nb lignes
7
void setup() {
8
  // put your setup code here, to run once:
9
  lcd.init();//On initialise l'écran
10
  lcd.backlight();//Rétroéclairage de l'écran
11
  lcd.clear();//On efface l'écran
12
  pinMode(echo, INPUT);//Déclaration de la borne Echo en ENTREE
13
  pinMode(trig, OUTPUT);//Déclaration de la borne de déclenchement en SORTIE
14
  digitalWrite(trig, 0);//Déclenchement à 0 -> pas de mesure
15
}
16
17
void loop() {
18
  // put your main code here, to run repeatedly:
19
  /*Envoi de l'impulsion déclenchant l'émission de la salve d'ultrasons
20
     Il faut passer la borne Trig à l'état haut pendant 10 microsecondes
21
  */
22
  digitalWrite(trig, 1);
23
  delayMicroseconds(10);
24
  digitalWrite(trig, 0);
25
  //Fin de l'impulsion de déclenchement
26
  tempsAR = pulseIn(echo, 1, 30000);//On recueille la durée de l'impulsion de retour
27
  distance = 0.5 * float(tempsAR) * 340 / 1000000.0; //On en déduit la distance
28
  lcd.clear();
29
  lcd.setCursor(0, 0);//Positionnement du curseur sur l'écran
30
  if (tempsAR == 0) {//Au-delà du délais défini, pulseIn renvoie la valeur 0 si pas d'écho
31
    lcd.print("Pas d'obstacle");
32
    delay(1000);//On attend une seconde avant de faire la prochaine mesure
33
  }
34
  else {
35
    lcd.print(distance, 3); //On affiche la valeur de la distance avec trois décimales
36
    lcd.print(" m");
37
    delay(1000);//On effectue une mesure toutes les secondes
38
  }
39
}

Ci-dessous, la version à compléter par les élèves.

1
//NE MODIFIER QUE LES LIGNES EXPLICITEMENT PRÉCÉDÉES DE LA MENTION
2
//***À MODIFIER/COMPLÉTER***
3
#include <LiquidCrystal_I2C.h>//Pour utiliser l'écran LCD I2C
4
int echo = 9;//Définition de la borne E/S Echo
5
int trig = 8;//Définition de la borne E/S de déclenchement
6
const float vitesseSon = 340.0; //Définition de la vitesse du son en m/s
7
long tempsAR;//Variable temps durée de l'écho
8
float distance;//Variable distance
9
LiquidCrystal_I2C lcd(0x27, 20, 4);//Déclaration de l'écran LCD : adresse, nb colonnes, nb lignes
10
11
void setup() {
12
  // put your setup code here, to run once:
13
  lcd.init();//On initialise l'écran
14
  lcd.backlight();//Rétroéclairage de l'écran
15
  lcd.clear();//On efface l'écran
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
  tempsAR = pulseIn(echo, 1, 30000);//On recueille la durée de l'aller-retour en µs
31
  //***À MODIFIER/COMPLÉTER***
32
  distance = .....//Entrer la relation permettant de calculer la distance en m
33
  //Fin de la relation à modifier.
34
  lcd.clear();
35
  lcd.setCursor(0, 0);//Positionnement du curseur sur l'écran
36
  if (temps == 0) {//Au-delà du délais défini, pulseIn renvoie la valeur 0 si pas d'écho
37
    lcd.print("Pas d'obstacle");
38
    delay(1000);//On attend une seconde avant de faire la prochaine mesure
39
  }
40
  else {
41
    lcd.print(distance, 3); //On affiche la valeur de la distance avec trois décimales
42
    lcd.print(" m");
43
    delay(1000);//On effectue une mesure toutes les secondes
44
  }
45
}