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éthode : Principe 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.
Le programme ci-dessous permet l'affichage de la distance sur le moniteur série.
int echo = 4;//Définition de la borne E/S Echo
int trig = 3;//Définition de la borne E/S de déclenchement
long temps;//Variable temps durée de l'écho
float distance;//Variable distance
void setup() {
Serial.begin(9600);//Initialisation de la communication série
pinMode(echo, INPUT);//Déclaration de la borne Echo en ENTREE
pinMode(trig, OUTPUT);//Déclaration de la borne de déclenchement en SORTIE
digitalWrite(trig, 0);//Déclenchement à 0 -> pas de mesure
}
void loop() {
/*Envoi de l'impulsion déclenchant l'émission de la salve d'ultrasons
Il faut passer la borne Trig à l'état haut pendant 10 microsecondes
*/
digitalWrite(trig, 1);
delayMicroseconds(10);
digitalWrite(trig, 0);
//Fin de l'impulsion de déclenchement
temps = pulseIn(echo, 1, 30000);//On recueille la durée de l'impulsion de retour
distance = 0.5 * 340.0 * temps / 1000000.0; //On en déduit la distance
if (temps == 0) {//Au-delà du délais défini, pulseIn renvoie la valeur 0 si pas d'écho
Serial.println("Pas d'obstacle");
delay(1000);//On attend une seconde avant de faire la prochaine mesure
}
else {
Serial.print(distance, 2); //On affiche la valeur de la distance avec deux décimales
Serial.println(" m");
delay(1000);//On effectue une mesure toutes les secondes
}
}
Exemple : Questionnement é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
//NE MODIFIER QUE LES LIGNES EXPLICITEMENT PRÉCÉDÉES DE LA MENTION
//***À MODIFIER/COMPLÉTER***
int echo = 4;//Définition de la borne E/S Echo
int trig = 3;//Définition de la borne E/S de déclenchement
long temps;//Variable temps durée de l'écho
float distance;//Variable distance
void setup() {
Serial.begin(9600);//Initialisation de la communication série
pinMode(echo, INPUT);//Déclaration de la borne Echo en ENTREE
pinMode(trig, OUTPUT);//Déclaration de la borne de déclenchement en SORTIE
digitalWrite(trig, 0);//Déclenchement à 0 -> pas de mesure
}
void loop() {
/*Envoi de l'impulsion déclenchant l'émission de la salve d'ultrasons
Il faut passer la borne Trig à l'état haut pendant 10 microsecondes
*/
digitalWrite(trig, 1);
delayMicroseconds(10);
digitalWrite(trig, 0);
//Fin de l'impulsion de déclenchement
temps = pulseIn(echo, 1, 30000);//On recueille la durée de l'impulsion de retour
//***À MODIFIER/COMPLÉTER***
distance = .....
//FIN DES MODIFICATIONS
if (temps == 0) {//Au-delà du délais défini, pulseIn renvoie la valeur 0 si pas d'écho
Serial.println("Pas d'obstacle");
delay(1000);//On attend une seconde avant de faire la prochaine mesure
}
else {
Serial.print(distance, 2); //On affiche la valeur de la distance avec deux décimales
Serial.println(" m");
delay(1000);//On effectue une mesure toutes les secondes
}
}
Complément : Affichage 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.
//Pour utiliser l'écran LCD I2C
int echo = 9;//Définition de la borne E/S Echo
int trig = 8;//Définition de la borne E/S de déclenchement
long tempsAR;//Variable tempsAR durée de l'écho
float distance;//Variable distance
LiquidCrystal_I2C lcd(0x27, 20, 4);//Déclaration de l'écran LCD : adresse, nb colonnes, nb lignes
void setup() {
// put your setup code here, to run once:
lcd.init();//On initialise l'écran
lcd.backlight();//Rétroéclairage de l'écran
lcd.clear();//On efface l'écran
pinMode(echo, INPUT);//Déclaration de la borne Echo en ENTREE
pinMode(trig, OUTPUT);//Déclaration de la borne de déclenchement en SORTIE
digitalWrite(trig, 0);//Déclenchement à 0 -> pas de mesure
}
void loop() {
// put your main code here, to run repeatedly:
/*Envoi de l'impulsion déclenchant l'émission de la salve d'ultrasons
Il faut passer la borne Trig à l'état haut pendant 10 microsecondes
*/
digitalWrite(trig, 1);
delayMicroseconds(10);
digitalWrite(trig, 0);
//Fin de l'impulsion de déclenchement
tempsAR = pulseIn(echo, 1, 30000);//On recueille la durée de l'impulsion de retour
distance = 0.5 * float(tempsAR) * 340 / 1000000.0; //On en déduit la distance
lcd.clear();
lcd.setCursor(0, 0);//Positionnement du curseur sur l'écran
if (tempsAR == 0) {//Au-delà du délais défini, pulseIn renvoie la valeur 0 si pas d'écho
lcd.print("Pas d'obstacle");
delay(1000);//On attend une seconde avant de faire la prochaine mesure
}
else {
lcd.print(distance, 3); //On affiche la valeur de la distance avec trois décimales
lcd.print(" m");
delay(1000);//On effectue une mesure toutes les secondes
}
}
Ci-dessous, la version à compléter par les élèves.
//NE MODIFIER QUE LES LIGNES EXPLICITEMENT PRÉCÉDÉES DE LA MENTION
//***À MODIFIER/COMPLÉTER***
//Pour utiliser l'écran LCD I2C
int echo = 9;//Définition de la borne E/S Echo
int trig = 8;//Définition de la borne E/S de déclenchement
const float vitesseSon = 340.0; //Définition de la vitesse du son en m/s
long tempsAR;//Variable temps durée de l'écho
float distance;//Variable distance
LiquidCrystal_I2C lcd(0x27, 20, 4);//Déclaration de l'écran LCD : adresse, nb colonnes, nb lignes
void setup() {
// put your setup code here, to run once:
lcd.init();//On initialise l'écran
lcd.backlight();//Rétroéclairage de l'écran
lcd.clear();//On efface l'écran
pinMode(echo, INPUT);//Déclaration de la borne Echo en ENTREE
pinMode(trig, OUTPUT);//Déclaration de la borne de déclenchement en SORTIE
digitalWrite(trig, 0);//Déclenchement à 0 -> pas de mesure
}
void loop() {
// put your main code here, to run repeatedly:
/*Envoi de l'impulsion déclenchant l'émission de la salve d'ultrasons
Il faut passer la borne Trig à l'état haut pendant 10 microsecondes
*/
digitalWrite(trig, 1);
delayMicroseconds(10);
digitalWrite(trig, 0);
//Fin de l'impulsion de déclenchement
tempsAR = pulseIn(echo, 1, 30000);//On recueille la durée de l'aller-retour en µs
//***À MODIFIER/COMPLÉTER***
distance = .....//Entrer la relation permettant de calculer la distance en m
//Fin de la relation à modifier.
lcd.clear();
lcd.setCursor(0, 0);//Positionnement du curseur sur l'écran
if (temps == 0) {//Au-delà du délais défini, pulseIn renvoie la valeur 0 si pas d'écho
lcd.print("Pas d'obstacle");
delay(1000);//On attend une seconde avant de faire la prochaine mesure
}
else {
lcd.print(distance, 3); //On affiche la valeur de la distance avec trois décimales
lcd.print(" m");
delay(1000);//On effectue une mesure toutes les secondes
}
}