Capteur de pression absolue Grove MPX5700AP

Introduction

Le module Grove MPX5700AP est un capteur de pression absolue délivrant une tension analogique compatible 5 V (Arduino) ou 3,3 V (Pyboard, Micro:bit, …). Pour rappel, la logique 3,3 V est devenue la norme dans le domaine des microcontrôleurs.

Présentation du MPX5700AP

Le circuit  MPX5700AP est un capteur de pression absolue analogique alimenté en 5 V. La mesure de pression s’échelonne de 15 kPa à 700 kPa pour une tension de sortie allant de 0,2 V à 4,7 V. Sa précision est au maximum égale à 2,5 % de la plage de mesure (700-15 = 685 kPa).

L’expression de la pression P (en kPa) en fonction de la tension U fournie s’exprime par la relation suivante :

    \[P=\dfrac{P_{max}-P_{min}}{U_{max}-U_{min}}\times (U-U_{min})+P_{min}=\dfrac{700-15}{4,7-0,2}\times (U-0,2)+15\]

Remarque : un étalonnage du capteur montre que la tension de 0,2 V donnée par le constructeur pour 15 kPa peut varier légèrement !

Fonctionnement sous 3,3 V

Pas mal d’électronique a été ajouté au capteur MPX5700AP pour rendre ce module Grove fonctionnel sous 3,3 V. En particulier, la tension de sortie est atténuée par un circuit d’amplification A=\dfrac{3,3}{4,7}\approx 0,702. C’est ainsi que la pression maximale de 700 kPa correspond à la tension pleine échelle du convertisseur analogique numérique soit 3,3 V.

Le tableau ci-dessous donne les caractéristiques de ce module Grove lorsqu’il est alimenté en 3,3 V.

  Minimum Maximum
Pression (kPa) 15 700
Tension analogique (V) 0,140 3,3
Tension numérique 12 bit (Pyboard) 174 4095
Tension numérique 10 bit (Micro:bit) 44 1023

L’expression de la pression P (en kPa) en fonction de la tension analogique U devient donc :

    \[P=\dfrac{P_{max}-P_{min}}{U_{max}-U_{min}}\times (U-U_{min})+P_{min}=\dfrac{700-15}{3,3-0,14}\times (U-0,14)+15\]

ou en fonction de la valeur numérique de la  tension U (sur 12 bit) :

    \[P=\dfrac{P_{max}-P_{min}}{U_{max}-U_{min}}\times (U-U_{min})+P_{min}=\dfrac{700-15}{4095-174}\times (N-174)+15\]

Lecture de la pression en langage Python

Pyboard (Micropython)

Le programme ci-dessous a été testé sur une carte Feather STM32F405 Express d’Adafruit.

# Mesure de pression avec module Grove MPX5700AP 15-700 kPa > 0.2-4.7 V 
from nanpy import ArduinoApi          # Gestion de la carte Arduino
from nanpy import SerialManager       # Gestion du port série
from time import sleep                # Importation de la fonction sleep()

port = SerialManager(device='COM6')   # Sélection du port série (exemple : device = 'COM6')
uno = ArduinoApi(connection=port)     # Déclaration de la carte Arduino

Pmin = 15     # Pression minimale en kPa
Pmax = 700    # Pression maximale en kPa
Umin = 41     # Tension minimale 0.2/5*1023 = 41 
Umax = 962    # Tension maximale 4.7/5*1023 = 962

while True:
    U = uno.analogRead(0)                        # Lecture de la tension numérique
    P = (Pmax-Pmin)/(Umax-Umin)*(U-Umin) + Pmin  # Calcul de la pression
    print(P, "kPa")                              # Affichage
    sleep(1)                                     # Temporisation (seconde)

Micro:bit (Micropython)

# Mesure de pression Grove MPX5700AP 15-700 kPa > 0.2-4.7V
from microbit import *

Vcc = 3.09    # Mesure au voltmètre de la tension d'alimentation entre 3V3 et GND
No  = 3       # Décalage (entier) obtenu pour une tension de OV sur l'entrée analogique

Pmin = 15     # Pression minimale du capteur
Pmax = 700    # Pression maximale du capteur
              # Amplification = 3,3/4,7 = 0.702
Umin = 0.14   # Tension minimale (0.2V * 0.702 = 0.140V)
Umax = 3.3    # Tension maximale (4.7V * 0.702 = 3.300V)



while True:
    N = pin1.read_analog()                       # Lecture de la tension numérique
    U = (N-No)*Vcc/(1023-No)                     # Calcul de la tension
    P = (Pmax-Pmin)/(Umax-Umin)*(U-Umin) + Pmin  # Calcul de la pression
    print(P, "kPa")                              # Affichage
    sleep(1000)                                  # Temporisation (ms)
Pour plus de précision, le programme précédent tient compte de la chute de tension d’alimentation Vcc et du décalage de la conversion analogique-numérique de la carte Micro:bit

Arduino (Python/Nanpy)

Le programme Python par interfaçage de la carte avec Nanpy est donné ci-dessous. Le capteur fonctionne ici sous 5 V.

# Mesure de pression avec module Grove MPX5700AP 15-700 kPa > 0.2-4.7 V 
from nanpy import ArduinoApi          # Gestion de la carte Arduino
from nanpy import SerialManager       # Gestion du port série
from time import sleep                # Importation de la fonction sleep()

port = SerialManager(device='COM6')   # Sélection du port série (exemple : device = 'COM6')
uno = ArduinoApi(connection=port)     # Déclaration de la carte Arduino

Pmin = 15     # Pression minimale en kPa
Pmax = 700    # Pression maximale en kPa
Umin = 41     # Tension minimale 0.2/5*1023 = 41 
Umax = 962    # Tension maximale 4.7/5*1023 = 962

while True:
    U = uno.analogRead(0)                        # Lecture de la tension numérique
    P = (Pmax-Pmin)/(Umax-Umin)*(U-Umin) + Pmin  # Calcul de la pression
    print(P, "kPa")                              # Affichage
    sleep(1)                                     # Temporisation (seconde)

La mesure de pression de 15 à 700 kPa se fait avec un peu plus de 900 points.

Application : vérification de la loi de Mariotte

Les programmes  suivants proposent de vérifier la loi de Mariotte à partir d’une seringue de 60 mL fournie avec le module Grove MPX5700AP.

La liste des différents volumes à fixer est à compléter dans le code. Les mesures sont affichées au format CSV. Elles devront être copiées vers un logiciel de traitement de données.

Pyboard (Micropython)

# Vérification de la loi de Mariotte avec module Grove MPX5700AP 15-700 kPa > 0.2-4.7 V
from pyb import Pin, ADC

adc = ADC(Pin("A0"))              # Déclaration du CAN

Pmin = 15                         # Pression minimale
Pmax = 700                        # Pression maximale
                                  # Amplification = 3,3/4,7 = 0.702
Umin = 174                        # Tension minimale (0.2V * 0.702 = 0.140V) N=174
Umax = 4095                       # Tension maximale (4.7V * 0.702 = 3.300V) N=4095

#volume   = [40]                  # Tableau initial des volumes à compléter - 40 mL pour pression atmosphérique
volume   = [60,50,40,35,30,25]    # Proposition de volumes
pression = []                     # Tableau des pressions

# Mesures
for vol in volume :                                   # Parcours des volumes prédéfinis
    input("Régler le volume sur " + str(vol) + " mL") # Validation du réglage du volume
    U = adc.read()                                    # Lecture de la tension numérique (12 bit)
    P = (Pmax-Pmin)/(Umax-Umin)*(U-Umin) + Pmin       # Calcul de la pression du capteur
    print(P, "kPa")                                   # Affichage de la pression
    pression.append(P)                                # Ajout de la mesure dans le tableau de pression

# Affichage au format CSV
print("V ; P")                        # Affichage entête des grandeurs
print("mL ; hPa")                     # Affichage entête des unités
for i in range(len(volume)):          # Parcours des points de mesures
    print(volume[i],";",pression[i])  # Affichage des mesures

Résultats :

Régler le volume sur 60 mL
77.36802 kPa
Régler le volume sur 50 mL
90.47054 kPa
Régler le volume sur 40 mL
108.1153 kPa
Régler le volume sur 35 mL
121.3925 kPa
Régler le volume sur 30 mL
136.9408 kPa
Régler le volume sur 25 mL
158.6037 kPa
V ; P
mL ; hPa
60 ; 77.36802
50 ; 90.47054
40 ; 108.1153
35 ; 121.3925
30 ; 136.9408
25 ; 158.6037

Micro:bit (Micropython)

# Vérification de la loi de Mariotte avec module Grove MPX5700AP 15-700 kPa > 0.2-4.7 V
from microbit import *

Vcc = 3.09    # Mesure au voltmètre entre 3V3 et GND
No  = 4       # Décalage (entier) obtenu pour une tension de OV

Pmin = 15     # Pression minimale
Pmax = 700    # Pression maximale
              # Amplification = 3,3/4,7 = 0.702
Umin = 0.14   # Tension minimale (0.2V * 0.702 = 0.140V) N=44
Umax = 3.3    # Tension maximale (4.7V * 0.702 = 3.300V) N=1023

#volume   = [40]                  # Tableau initial des volumes à compléter - 40 mL pour pression atmosphérique
volume   = [60,50,40,35,30,25]    # Proposition de volumes
pression = []                     # Tableau des pressions

# Mesures
for vol in volume :                                   # Parcours des volumes prédéfinis
    input("Régler le volume sur " + str(vol) + " mL") # Validation du réglage du volume
    N = pin1.read_analog()                            # Lecture de la tension numérique (10 bit)
    U = (N-No)*Vcc/(1023-No)                          # Calcul de la tension
    P = (Pmax-Pmin)/(Umax-Umin)*(U-Umin) + Pmin       # Calcul de la pression
    print(P, "kPa")                                   # Affichage de la pression
    pression.append(P)                                # Ajout de la mesure dans le tableau de pression

# Affichage au format CSV
print("V ; P")                        # Affichage entête des grandeurs
print("mL ; hPa")                     # Affichage entête des unités
for i in range(len(volume)):          # Parcours des points de mesures
    print(volume[i],";",pression[i])  # Affichage des mesures

Résultats :

Régler le volume sur 60 mL
79.3083 kPa
Régler le volume sur 50 mL
91.1404 kPa
Régler le volume sur 40 mL
109.546 kPa
Régler le volume sur 35 mL
122.693 kPa
Régler le volume sur 30 mL
137.154 kPa
Régler le volume sur 25 mL
160.161 kPa
V ; P
mL ; hPa
60 ; 79.3083
50 ; 91.1404
40 ; 109.546
35 ; 122.693
30 ; 137.154
25 ; 160.161

Arduino (Python/Nanpy)

# Vérification de la loi de Mariotte avec module Grove MPX5700AP 15-700 kPa > 0.2-4.7 V
from nanpy import ArduinoApi                    # Gestion de la carte Arduino
from nanpy import SerialManager                 # Gestion du port série

port = SerialManager(device='COM6')             # Sélection du port série ('COM6' à modifier)
uno = ArduinoApi(connection=port)               # Déclaration de la carte Arduino

Pmin = 15     # Pression minimale en kPa
Pmax = 700    # Pression maximale en kPa
Umin = 41     # Tension minimale 0.2/5*1023 = 41 
Umax = 962    # Tension maximale 4.7/5*1023 = 962

#volume   = [40]                  # Tableau initial des volumes à compléter - 40 mL pour pression atmosphérique
volume   = [60,50,40,35,30,25]    # Proposition de volumes
pression = []                     # Tableau des pressions

# Mesures
for vol in volume :                                   # Parcours des volumes prédéfinis
    input("Régler le volume sur " + str(vol) + " mL") # Validation du réglage du volume
    U = uno.analogRead(0)                             # Lecture de la tension numérique (10 bit)
    P = (Pmax-Pmin)/(Umax-Umin)*(U-Umin) + Pmin       # Calcul de la pression
    print(P, "kPa")                                   # Affichage de la pression
    pression.append(P)                                # Ajout de la mesure dans le tableau de pression

# Affichage au format CSV
print("V ; P")                        # Affichage entête des grandeurs
print("mL ; hPa")                     # Affichage entête des unités
for i in range(len(volume)):          # Parcours des points de mesures
    print(volume[i],";",pression[i])  # Affichage des mesures

Résultats :

Régler le volume sur 60 mL
75.98805646036917 kPa
Régler le volume sur 50 mL
87.88816503800217 kPa
Régler le volume sur 40 mL
104.99457111834963 kPa
Régler le volume sur 35 mL
117.63843648208469 kPa
Régler le volume sur 30 mL
133.25732899022802 kPa
Régler le volume sur 25 mL
154.82627578718783 kPa
V ; P
mL ; hPa
60 ; 75.98805646036917
50 ; 87.88816503800217
40 ; 104.99457111834963
35 ; 117.63843648208469
30 ; 133.25732899022802
25 ; 154.82627578718783
Pour marque-pages : Permaliens.

2 réponses à Capteur de pression absolue Grove MPX5700AP

  1. Mathis Launay dit :

    Bonjour,

    Il me semble que le capteur de pression MPX5700AP est mesure une pression différentielle et non une pression absolue.

    Mathis

    • Bonjour,
      C’est bien une mesure de pression absolue (AP = Absolute Pressure) !
      Sinon le MPX5700DP donne une mesure de pression différentielle (DP = Differential Pressure)
      Merci pour la remarque.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *