loader

i2M.2026.Arduino. Mesure d'une distance dans un gaz avec émetteur/récepteur US (moyenne & ecart type à la volée)

Mesure expérimentale précise d'une distance par des salves d'ultrasons dans l'air ou dans un autre gaz AVEC Traitement statistique sur une série de mesure (moyenne écart-type)

- Arduino UNO
- Schield LCD 2x16
- capteur ultra-sons SR04 ou SR05

On place l'émetteur à une certaine distance d'un obstacle. 
Préciser dans les premières lignes du programme, la température et les paramètres physiques du gaz dans lequel on travaille. Par défaut l'air.
La calcul de distance se fait à partir d'une célérité calculée à partir de ces paramètres.
Eventuellement, on bricole un récipient dans lequel on peut introduire d'autres gaz : CO2, He, ...
Dans ce cas la "distance mesurée" correspond à la profondeur du récipient (photos à venir).


On appuie sur le bouton reset pour lancer les mesures qui sont effectuées à la volée. On réappuie sur le bouton Reset pour relancer une nouvelle série de mesures.

OBJECTIF :
Mesurer une distance dans un gaz à l'aide d'un capteur à ultra-sons (classique)

INTERET SPECIFIQUE DU PROGRAMME :
Faire une série de mesures à la volée (en continu). La valeur affichée sur l'écran LCD est la valeur moyenne et l'écart-type calculé à la volée selon la méthode de Welford.
=> Est affiché à l'écran :
 - Nombre N de mesures effectuées
 - Dernière valeur mesurée 
 - Valeur moyenne des N mesures
 - Ecart-type des N mesures
=> Sensibiliser à la précision de la mesure

UTILISATION PEDAGOGIQUE POSSIBLE :
1a. On mesure dans un premier temps la profondeur du récipient contenant de l'air. Paramètres par défaut dans le programme pour calculer la célérité théorique des sons dans un gaz.
1b. On vérifie avec une mesure directe.
2. On injecte dans le récipient un autre gaz. La distance mesurée est différente (à la hausse ou à la baisse selon qu'on injecte He ou CO2)
3a. On modifie les paramètres physiques avec ceux du nouveau gaz dans le programme.
3b. On vérifie qu'on retrouve la profondeur du récipient.

Conclusion => La célérité des sons dans un gaz dépendent de la nature du gaz et de sa température.
Discussion => Précision des résultats entre mesure unique et moyenne sur N mesures.


AMELIORATIONS : 
Dans le cas de l'utilisation d'un récipient. Il est envisageable d'intégrer un capteur de pression et un capteur de température pour acquérir ces deux valeurs automatiquement.

[iframe]#include
LiquidCrystal lcd(8,9,4,5,6,7);

// variables ports digitaux
int trigg = 12;
int echo = 11;

// Constantes physiques
// amélioration possible en utilisant un array à 2D
String gaz = "air" ;
float T = 20 ; // °C (à changer selon conditions du jour)
float coeff_laplace = 1.400 ; //indice adiabatique (air=1.400 ; He=1.660 ; CO2=1.300 à 20°C)
float M_gaz = 0.028964 ; // kg.mol-1 (air=0.028964 ; He=0.0040026 ; CO2=0.044009)
float R = 8.314462 ; // constante des gaz parfaits
float c_son = sqrt(coeff_laplace*R*(T+273.15)/M_gaz);

// Variables diverses et mesures
int freq_mesures = 100 ; // temps entre chaque mesure
float nb_mes = 0; // nombre de mesures effectuées
float moy = 0; // valeur moyenne
float moy_carre = 0; // moyenne des carrés
float delta; // ecart à la moyenne
float sigma; // ecart-type
float temps ; // en microsecondes
float distance ; // en cm

void envoiUS() {
  digitalWrite(trigg,LOW);
  delayMicroseconds(10);
  digitalWrite(trigg,HIGH);
  delayMicroseconds(10);
  digitalWrite(trigg,LOW);
  temps = pulseIn(echo,HIGH); // en microscondes
}

// Efface les deux lignes de l'écran du shield LCD
void reset_ecran ()
{
  lcd.setCursor(0, 0); lcd.print("                ");
  lcd.setCursor(0, 1); lcd.print("                ");
}

// Affiche à l'écran : nb de mesures + distance + moyenne + ecart type
void affiche_resultats() {
  lcd.setCursor(0,0); lcd.print("Nb:" + String(nb_mes,0));
  lcd.setCursor(8,0); lcd.print("d:" + String(distance,1)); 
  lcd.setCursor(0,1); lcd.print("m:" + String(moy,2));
  lcd.setCursor(8,1); lcd.print("s:" + String(sigma,2));
}

void setup() {
  // Initialisation ports digitaux et écran LCD
  pinMode(12,OUTPUT);
  pinMode(11,INPUT);
  lcd.begin(16,2);
  lcd.setCursor(0,0); lcd.print("Mesure distance"); 
  lcd.setCursor(0,1); lcd.print("in " + gaz );   
  lcd.setCursor(8,1); lcd.print(" in cm"); 
  delay(5000);
  reset_ecran();
  lcd.setCursor(0,0); lcd.print("celerite");
  lcd.setCursor(0,1); lcd.print(String(c_son,2) + " m/s"); 
  delay(5000);
}

void loop() {
  // Les mesures se font à la volée
  // Bouton reset pour réinitialiser les mesures
  
  envoiUS();
  distance = c_son*temps/ 20000 ; // distance en cm
  
  // calcul moyenne/ecart type selon méthode de Welford
  nb_mes++;
  delta = distance - moy;
  moy = moy + delta/nb_mes;
  moy_carre = moy_carre + delta*(distance - moy);
  sigma = sqrt(moy_carre/(nb_mes-1));
  
  // on remet à jour l'affichage
  reset_ecran();
  affiche_resultats();
  delay(freq_mesures); // attendre avant la prochaine mesure
}[/iframe]

Licencia de uso

Licence Creative Commons

Este recurso está disponible bajo los términos de la licencia Creative Commons Attribution-Share Alike 2.0 France License.