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 :
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 . 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 :
ou en fonction de la valeur numérique de la tension U (sur 12 bit) :
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)
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

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.