BTS Mesure BTS Mesure
Présentation2014CapteursModulationTyponsArduinoDémodulationApp InventorCourbesVidéos
 
CTNPT1000PressionPhotodiodeAccéléro

Etalonnage des capteurs de pression MPX5100 et BMP 180

Courbe étalonnage MPX5100 :

Protocole :

La carte Arduino fait l'acquisition simultanée de la tension du capteur MPX5100 et de la tension de sortie de notre Presiomètre étalon Jeulin. Puis elle écrit les résultats sur une carte SD, chaque baisse de pression de 20 hPa déclenche une nouvelle mesure.

Afficher l'image d'origineNous plaçons notre montage sous une cloche pour platine à vide.
 

Etalon : d'après la notice Jeulin :
Gamme : 0 à 2 000 hPa
Précision : 2 % ±4 hPa
Résolution : 1 hPa
Pression maximale : 4 000 hPa
Sortie Analogique : 1000 hPa -> 0 V et 0 hPa -> -2,5 V

Résultats de notre étalonnage :

Excellente linéarité (R² = 0,999999)

Etendue de mesure de 150 hPa à 1000 hPa

Sensibilité = 4,4 mV / hPa

Equation : P (en hPa) = 227 V + 130  avec V tension de sortie du MPX5100 en V

Reproductibilité MPX5100

Afin de tester la fidélité de notre capteur nous avons réalisé 4 étalonnages successifs dans les mêmes conditions.

Nous avons tracé sur le même graphe les 4 séries de points.

Comme on peut le constater les 4 séries de points sont sur la même droite.

Le capteur est donc très fidèle.

Test en situation sur la carte finale :

Attention : il faut éloigner le capteur de l'émetteur Kiwi :
trop près les mesures sont fortement perturbées.

Courbe étalonnage BMP180 :

Le BMP180 :

Il s'agit d'un capteur à sortie numérique (protocole de communication I2C)
  • Vin: 3 to 5VDC
  • Pressure sensing range: 300-1100 hPa (9000m to -500m above sea level)
  • Up to 0.03hPa / 0.25m résolution
  • -40 to +85°C operational range, +-2°C température accuracy
  • This board/chip uses I2C 7-bit address 0x77.
Nous avons profité du montage ci-dessus pour étalonner en même temps le BMP180

Résultats de notre étalonnage :
  • Excellente linéarité (R² = 0,999999)
  • Etendue de mesure de 23 hPa à 1000 hPa
  • correction à prendre en compte    Pcorrigée  = 1,02 * PBMP180 - 19       en hPa
  • Excellente fidélité comme le montre notre série de 4 étalonnages : toutes les droites sont confondues.
Avantages du BMP180 sur le MPX5100 :
  • Nettement moins cher (1,50 € contre 25 €)
  • Gamme de mesure plus importante (jusqu'à la limite de notre pompe à vide le capteur est linéaire)
  • Mesure la température et effectue automatiquement les corrections nécessaires.
  • Il est nettement moins sensible aux perturbations électromagnétiques de l'émetteur Kiwi
Inconvénients :
  • Nécessite un Microcontrôleur (nous disposons de l'Arduino)
  • Nécessite un peu de programmation (une bibliothèque et un exemple sont fournis)



Nos 4 séries de mesure au format Excel

Voici le programme Arduino que nous avons utilisé pour réaliser cet étalonnage.

Nous utilisons 4 bibliothèques :

  • Wire : pour utiliser la liaison série I2C
  • SD : pour programmer le lecteur de carte SD
  • RTClib : pour horodater nos mesures (facultatif)
  • BMP180 : pour dialoguer avec le BMP180
#include <SD.h>

#include <Wire.h>      // Pour capteur pression BMP 180
#include <RTClib.h>
RTC_DS1307 RTC;
#include <BMP180.h>     // A4 : SDA     A5 : SCL
BMP180 barometer;

DateTime maintenant;
char complet[20];
char date[12];
char heure[8];

int chipSelect=10;
int rouge = 7;   //LED RGB 
int vert = 6; 
int bleu = 5;
boolean erreurSD;

long P_BMP;
float T_BMP,V_MPX,P_old=100000,P_J, V_J;

void setup()
{
  Serial.begin(9600); 
  
  pinMode(chipSelect, OUTPUT);
  pinMode(rouge, OUTPUT);
  pinMode(vert, OUTPUT);
  pinMode(bleu, OUTPUT);
  digitalWrite(chipSelect,HIGH);
  RTC.begin();
  IniBMP (); 
  delay(2000); 
  IniSD();    // Appel Sous Programme
  digitalWrite(vert,LOW);
  digitalWrite(bleu,LOW);  

  maintenant = RTC.now();
  sprintf(complet, "%02d/%02d/%d %02d:%02d:%02d", 
          maintenant.day(), maintenant.month(), maintenant.year(),
          maintenant.hour(), maintenant.minute(), maintenant.second());
  Serial.println(complet);
}

// Boucle Principale :

void loop()
{
  do {
      if (!erreurSD) digitalWrite(vert,HIGH);
      V_J = 5*float(analogRead(A0))/1024;        // A1 sortie Pressiomètre Jeulin 0V --> 1000 hPa  2.5V --> 0 hPa
      P_J= 40000*(2.5-V_J);                      // http://www.ens-lyon.fr/DSM/AGREG-Physique/oral/Notices/N096-029.pdf
      if (P_J > 98100) P_old=100000;
    } 
  while(P_old-P_J < 2000);
  digitalWrite(vert,LOW);
  V_J = 5*float(analogRead(A0))/1024;
  P_J= 40000*(2.5-V_J);
  P_old=P_J;  
  V_MPX = 5*float(analogRead(A1))/1024;  
  Serial.print("V_J = "); Serial.print(V_J,3);Serial.println(" V");
  Serial.print("P_J = "); Serial.print(P_J,0);Serial.println(" Pa");
  Serial.print("V_MPX = "); Serial.print(V_MPX,3);Serial.println(" V");
  PressionBMP();
  ecritureSD(); 
}

// Sous Programmes :

void IniSD()
{
    if (!SD.begin(chipSelect)){
       Serial.println("Erreur carte SD");
       digitalWrite(rouge,HIGH);
       erreurSD= true;
       return;}

    Serial.println("Carte presente");
    digitalWrite(vert,HIGH);
    maintenant = RTC.now();
    sprintf(complet, "%02d/%02d/%d %02d:%02d:%02d", 
          maintenant.day(), maintenant.month(), maintenant.year(),
          maintenant.hour(), maintenant.minute(), maintenant.second());
    File Pression = SD.open("Pression.csv", FILE_WRITE);
          if (Pression) { 
            Pression.print(complet);
            Pression.print(";");          
            Pression.print("P Jeulin (Pa)");
            Pression.print(";");
            Pression.print("V MPX5100 (V)");
            Pression.print(";");
            Pression.print("P BMP180 (Pa)");
            Pression.print(";");
            Pression.println("T BMP180 (C)");        
            Pression.close();}
}
      
void ecritureSD() {
  
    File Pression = SD.open("Pression.csv", FILE_WRITE);
     maintenant = RTC.now();
     // sprintf(date, "%02d/%02d/%d",maintenant.day(), maintenant.month(), maintenant.year());
  sprintf(heure, "%02d:%02d:%02d",maintenant.hour(), maintenant.minute(), maintenant.second());          
  Serial.println(heure);
      if (Pression) {
        erreurSD=false;
        digitalWrite(rouge,LOW);
        digitalWrite(bleu,HIGH);
        Pression.print(heure);
        Pression.print(";"); 
        Pression.print(P_J);
        Pression.print(";");
        Pression.print(V_MPX,3);
        Pression.print(";");
        Pression.print(P_BMP);
        Pression.print(";");
        Pression.println(T_BMP,1);        
        Pression.close();
        digitalWrite(bleu,LOW); 
        }
      else  {
          digitalWrite(rouge,HIGH);
          erreurSD=true;  
          Serial.println("Erreur Pression.csv");}
        

    }

void IniBMP () 
 {// Initialisation capteur BMP180
  Wire.begin();
  barometer = BMP180();
  if(barometer.EnsureConnected()){
    Serial.println("Connection etablie au BMP180."); 
    digitalWrite(bleu, HIGH); // Set our LED.
    barometer.SoftReset();
    barometer.Initialize();}
  else {Serial.println("Connexion impossible au BMP180."); digitalWrite(bleu, LOW);}
 }
  
void PressionBMP() 
 {
  if(barometer.IsConnected)
  {
    P_BMP = barometer.GetPressure();
    Serial.print("Pression BMP 180 : ");
    Serial.print(P_BMP); Serial.print(" Pa");
    T_BMP = barometer.GetTemperature();
    Serial.print("\tTemperature: ");
    Serial.print(T_BMP);
    Serial.write(176);
    Serial.println("C");
  }
 }