Le capteur MPX5700AP

Le matériel

Présentation du matériel

Généralement livré avec la seringue et le tube en plastique. On distingue bien une suele entrée sur le capteur (pression absolue (par rapport aux modèles à deux entrées (pression relative)

Caractéristiques:

  • Interface: analogique compatible Grove

  • Alimentation: 3,3 à 5 Vcc

  • Plage de mesure: 0 à 700 kPa

  • Sensibilité: 6,4 mV/kPa

  • Dimensions: 49 x 31 x 15 mm

Référence Seeedstudio: 110020248

A moins de 40 euros l'ensemble, c'est intéressant, le capteur seul est à 20 euros, et la partie électronique nécessaire pour le faire fonctionner n'est pas évidente à mettre en œuvre.

Par contre, cela nécessite une carte Grove pour plus de confort, à noter que si on ne dispose pas de carte, on peut brancher des fils directement entre la carte Arduino et l'interface GROVE, du capteur.

Mise en œuvre

Le montage

Pas compliqué, noter juste l'entrée utilisée sur la carte Grove , il s'agit du port A0, tout autre port analogique sera également fonctionnel (A1, A2 ou A3).

En étudiant le diagramme, on constate qui ne va pas forcément passer par l'origine, il faudra éventuellement calibrer . LA pente vaut 4.6/700 = 0.571 V.kPa-1.

Pour commencer, pas de librairie à importer, ce code teste plusieurs architectures possible (plusieurs cartes possibles).

On pourrait se passer des 20 premières lignes, le code simplifié pour Arduino Uno uniquement donnerait :

int rawValue; // A/D readings

int offset = 410; // zero pressure adjust

int fullScale = 9630; // max pressure (span) adjust

float pressure; // final pressure

void setup() {

Serial.begin(9600);

}

void loop() {

rawValue = 0;

for (int x = 0; x < 10; x++) rawValue = rawValue + analogRead(A0);

pressure = (rawValue - offset) * 700.0 / (fullScale - offset); // pressure conversion

Serial.print("Raw A/D is ");

Serial.print(rawValue);

Serial.print(" Pressure is ");

Serial.print(pressure, 1); // one decimal places

Serial.println(" kPa");

delay(1000);

}

1
// MPX5700 pressure sensor (700kPa)
2
3
#if defined(ARDUINO_ARCH_AVR)
4
#pragma message("Defined architecture for ARDUINO_ARCH_AVR.")
5
#define SERIAL Serial
6
7
#elif defined(ARDUINO_ARCH_SAM)
8
#pragma message("Defined architecture for ARDUINO_ARCH_SAM.")
9
#define SERIAL SerialUSB
10
11
#elif defined(ARDUINO_ARCH_SAMD)
12
#pragma message("Defined architecture for ARDUINO_ARCH_SAMD.")  
13
#define SERIAL SerialUSB
14
15
#elif defined(ARDUINO_ARCH_STM32F4)
16
#pragma message("Defined architecture for ARDUINO_ARCH_STM32F4.")
17
#define SERIAL SerialUSB
18
#else
19
#pragma message("Not found any architecture.")
20
#endif
21
22
23
24
int rawValue; // A/D readings
25
int offset = 410; // zero pressure adjust
26
int fullScale = 9630; // max pressure (span) adjust
27
float pressure; // final pressure
28
29
void setup() {
30
  SERIAL.begin(9600);
31
}
32
33
void loop() {
34
  rawValue = 0;
35
  for (int x = 0; x < 10; x++) rawValue = rawValue + analogRead(A0);
36
  pressure = (rawValue - offset) * 700.0 / (fullScale - offset); // pressure conversion
37
38
  SERIAL.print("Raw A/D is  ");
39
  SERIAL.print(rawValue);
40
  SERIAL.print("   Pressure is  ");
41
  SERIAL.print(pressure, 1); // one decimal places
42
  SERIAL.println("  kPa");
43
  delay(1000);
44
}

Aller plus loin avec python

Récupérer et traiter les mesures

Lire information dans la console, c'est un peu limité, surtout pour travailler avec des élèves.

Même si le copier / coller dans libreoffice calc fonctionne assez bien.

Première méthode (réutilisable pour d'autres occasions similaires) récupérer les données en csv

Récupérer les données en csv

Sur le principe, cela n'est pas compliqué :

  • On programme l'Arduino pour envoyer les données sur le port série à intervalles réguliers .En fait, on ne change rien au code sur le fond, si ce n'est de proposer une mise en forme différente.

  • Sur cet exemple, on affiche la pression calculée à la demande

  • On programme ensuite en python la lecture à la demande sur le port usb(port série)

Pour la partie arduino, le code est ci-dessous,

lignes 23 à 30, on a isolé la mesure dans une fonction qui ne retourne que la pression .

boucle principale :

La variable inString contient l'instruction envoyée par le script python.

Pour l'instant on fait simple, si la données reçue est le caractère m, on fait une mesure, on l'écrit sur le port série, puis on rend la main (en faisant un retour à la ligne Serial.println)

Sinon, on renvoie None

La fonction serialEvent permet de stocker les données envoyées par le script python, quand le caractère fin de ligne est détecté ('\n') , alors l'ensemble des données est stockée dans la variable InString, et le booléen String Complete passe à Vrai

1
//Definition de varibles et constantes 
2
//nécessaires aux mesures
3
4
int rawValue; // A/D readings
5
int offset = 410; // zero pressure adjust
6
int fullScale = 9630; // max pressure (span) adjust
7
float pressure; // final pressure
8
9
//on déclare une variable chaine de caractères
10
//qui stockera notre commande
11
String inString="";
12
//Vrai/Faux, pour tester si la commande est envoyée
13
//en faite on repérera la commande fin de ligne '\n'
14
boolean stringcomplete=false;
15
16
void setup()
17
{
18
  //ouverture du port série à 9600 bauds
19
   Serial.begin(9600);
20
   //reseve 128 byte en mémoire pour stocker un string 
21
   inString.reserve(128);
22
}
23
float mesurepression(){
24
  rawValue = 0;
25
  //pour 10 mesures
26
  for (int x = 0; x < 10; x++) rawValue = rawValue + analogRead(A0);
27
  //calcul de la pression en tenant compte de l'électronique
28
  pressure = (rawValue - offset) * 700.0 / (fullScale - offset); // pressure conversion
29
  return pressure;
30
}
31
void loop()
32
{
33
  if(stringcomplete){
34
    if(inString == "m") {
35
      Serial.println(mesurepression(),1); 
36
    }
37
    else Serial.println("none");
38
   inString=""; 
39
   stringcomplete=false;
40
  }
41
  
42
}
43
void serialEvent (){
44
  while (Serial.available()) { // tant que des caractères sont en attente d'être lus
45
46
    char c = (char) Serial.read(); // on lit le charactère
47
    //Serial.print(c);
48
    //detecté si nouvelle ligne est coché
49
    if(c == '\n'){
50
      //Serial.print(inString);
51
      stringcomplete = true;
52
    } else {
53
      inString +=c;
54
      //Serial.print(inString);
55
    }
56
  }
57
}
58

Le script python peut ainsi piloter la carte et nregistrer les données au format csv pour le traiter dans un tableur .

1
import serial, time
2
3
ser = serial.Serial('/dev/ttyACM0', 9600)
4
commande=''
5
mesures  = 'mesures.txt'
6
f =open(mesures,'w')
7
8
while commande != 'toto' :
9
	commande= input('V: en mL')
10
	#print(commande)
11
	#ser.write((commande).encode('utf8'))
12
	ser.write(b'm\n')
13
	serial_line = ser.readline()
14
	print(serial_line.decode('utf8'))
15
	if commande != 'toto' :
16
		f.write(serial_line.decode('utf8').strip().replace(".",",") + ";" + commande + '\n')
17
	#time.sleep(1) # sleep 5 minutes
18
19
	# Loop restarts once the sleep is finished
20
21
22
23
f.close()
24
ser.close() # Only executes once the loop exitsblur 

La preuve en image !