Capteur de pression MPXV7002DP et tube de pitot

Artouste:
bonjour
regarde çà
c'est prevu pour un 5010DP (10 kPa) , mais à la fonction de transfert pret c'est reutilisable
http://psginstrumentation.com/PitotPrandtlAirspeedSensor.pdf

Hello, merci pour le lien.
Tu veux dire que je pourrais utiliser la platine en remplaçant le module? Pourquoi ne pas garder le module par défaut dans ce cas? Et as tu un lien pour connaitre le prix de la solution?
:wink:

john_lenfr:
...
Tu veux dire que je pourrais utiliser la platine en remplaçant le module? Pourquoi ne pas garder le module par défaut dans ce cas? Et as tu un lien pour connaitre le prix de la solution?
:wink:

Bonjour john
faut pas m'en vouloir , mais je n'ai pas compris (le sens de ) ta question :grin:
tu envisage(rais) de faire quoi et avec quel capteur ?

Bonjour Artouste,
Je n'avais pas compris tes infos à l'origine alors.
J'ai pensé que tu me donnais ces liens pour adapter mon module sur la platine du lien que tu m'as donné.

Bon de toute façon pour l'instant je ne suis pas parti pour changer le hard donc je vais attendre de recevoir le module (oui je l'ai commandé finalement :D) et je ferais des tests réels comme ça je serais fixé

En tout cas ce qui est intéressant dans ton lien c'est les explications données pour la formule sur la vitesse.
:wink:

john_lenfr:
Bonjour Artouste,
Je n'avais pas compris tes infos à l'origine alors.
J'ai pensé que tu me donnais ces liens pour adapter mon module sur la platine du lien que tu m'as donné.

Bon de toute façon pour l'instant je ne suis pas parti pour changer le hard donc je vais attendre de recevoir le module (oui je l'ai commandé finalement :D) et je ferais des tests réels comme ça je serais fixé

En tout cas ce qui est intéressant dans ton lien c'est les explications données pour la formule sur la vitesse.
:wink:

bonjour john
ok je comprend mieux
de toutes façons, il faut avoir à l'esprit que la vitesse renvoyée dans ces conditions d'utilisation est plus une "appreciation de vitesse" qu'une reelle mesure.
pour ameliorer "le rendu" il faudrait déjà à minima prendre en compte l'alti

Oui, entièrement d'accord, c'est pour cela que je vais tester le module seul voir ce que ça donne.

Il ne faut pas oublier que c'est pour un modèle réduit donc une solution finale à + de 50€ est déjà presque trop cher (capteur+Nono).

:wink:

john_lenfr:
Oui, entièrement d'accord, c'est pour cela que je vais tester le module seul voir ce que ça donne.

Il ne faut pas oublier que c'est pour un modèle réduit donc une solution finale à + de 50€ est déjà presque trop cher (capteur+Nono).

:wink:

Tu utilise l'antenne de Prandtl vendu avec le kit ?
j'ai testé cet AM avec un 5010 , il faut effectivement "filtrer mechant" :grin:

J'ai pris ce kit:
http://store.3drobotics.com/products/airspeed-kit-with-mpxv7002dp

On verra bien ce que ça donne :wink:

john_lenfr:
J'ai pris ce kit:
http://store.3drobotics.com/products/airspeed-kit-with-mpxv7002dp

On verra bien ce que ça donne :wink:

ok
pense bien à la phase de calibration au sol et à un bon filtrage numerique.
l'altitude (sol) d'evolution max de ton modele est de combien ?
tu dispose déjà d'un altibaro dessus ?

Pour la calibration et filtrage je pense que je m'inspirerais du code exemple Airspeed du lien qu'on avait vu.
Sinon je n'ai rien d'autre qu'un GPS mais pas très précis niveau alti/baro donc à oublier.

Je verrais si je peux rajouter du code pour un BMP85 par exmple.

Mais là je suis déjà limite j'ai du retirer du code du GPS pour faire tourner le capteur de pression donc je verrais...

john_lenfr:
Pour la calibration et filtrage je pense que je m'inspirerais du code exemple Airspeed du lien qu'on avait vu.
Sinon je n'ai rien d'autre qu'un GPS mais pas très précis niveau alti/baro donc à oublier.

Je verrais si je peux rajouter du code pour un BMP85 par exmple.

Mais là je suis déjà limite j'ai du retirer du code du GPS pour faire tourner le capteur de pression donc je verrais...

ok
sous reserve de verif de stock demain
je dois avoir du 4115AP comme celui utilisé ici
http://www.psginstrumentation.com/BarometricAltimeter.pdf
si c'est bien le cas je te contacte en MP :grin:
et vu ce que je retrouve déjà dans mes "boites à grouilles" ... 8)

Petit code de test:

//
// Test for Airspeed Sensor

float time;
float ref_pressure, air_pressure, pressure_diff;
float airspeed_ratio = 1.54679; // 2/? (? = 1,225 kg/m3 )
float airspeed;
int AIRSPEED_CH = A5;

void setup()
{
    int i;
    
    //adc.Init();
    Serial.begin(9600);
    delay(1000);
    
    Serial.println("Initializing...");
    
    ref_pressure = analogRead(AIRSPEED_CH);
    
    for (i=1;i<=200;i++)
    {
      ref_pressure = (analogRead(AIRSPEED_CH))*0.25 + ref_pressure*0.75;
      
      delay(20);
    }
}

void loop()
{    
    if ((millis() - time) >= 20)
    {
      time = millis();
      
      air_pressure = analogRead(AIRSPEED_CH)*0.25 + air_pressure*0.75;
      
      if (air_pressure >= ref_pressure)
      {
        pressure_diff = air_pressure - ref_pressure;
      }
      else
      {
        pressure_diff = 0.0;
      }
      
      airspeed = sqrt(pressure_diff*airspeed_ratio);
      airspeed = airspeed * 3.6;
      Serial.print("air speed: ");
      Serial.print(airspeed);
      Serial.println(" km/h");
    }
}

Le module fonctionne avec le 0 autour de 2.42v.

Par contre je n'arrive pas à dépasser les 100km/h alors que j'avais calculé que le module pouvait aller jusquà 200km/h
Soit le double. Je me suis gouré ou dans mes calculs?

J'ai pris:

vitesse = racine carré ( (2 * Pt - Ps) / ro)
avec ro=masse volumique de l'air=1.293
Pt: pression totale
Ps: pression statique

Pt-Ps m'est donné directement par le module donc je vois pas ou je me suis planté

john_lenfr:
Petit code de test:
...
Par contre je n'arrive pas à dépasser les 100km/h alors que j'avais calculé que le module pouvait aller jusquà 200km/h
Soit le double. Je me suis gouré ou dans mes calculs?

...
Pt-Ps m'est donné directement par le module donc je vois pas ou je me suis planté

2.42 V moyenné pour vitesse = 0 , rien à redire
ton vecteur vitesse (pour ton cas ) n'evolue que dans un seul sens
tu peux remettre ton calcul exposant une Vmax de 200 km/h sur un vecteur simple avec ton capteur ?
je crois que tu confond l'amplitude absolue "captable" et l'amplitude relative utile du capteur pour ton appli

Si le capteur est capable d'aller jusqu'à +2kPa théoriquement on a:

vitesse = racine carré ( (2 * Pt - Ps) / ro)
v=221000/1.293
v=55.62m/s=200km/h

?

J'ai l'impression que d'avoir des valeurs données par l'ADC dans la plage 0 à 1023 fausse le calcul de la vitesse non?

john_lenfr:
Si le capteur est capable d'aller jusqu'à +2kPa théoriquement on a:

vitesse = racine carré ( (2 * Pt - Ps) / ro)
v=221000/1.293
v=55.62m/s=200km/h

?

J'ai l'impression que d'avoir des valeurs données par l'ADC dans la plage 0 à 1023 fausse le calcul de la vitesse non?

tu a verifié/determiné comment et avec quel "etalon vitesse vent " que tu ne depasse pas les 100 km/h ?
je regarderais sur paillasse et veine vent le comportement du capteur , mais ça ne sera pas avant jeudi

Quand je souffle (comme un bourin :grin:) dans le capteur il ne renvoie pas plus que 4,75v maxi pour un zéro à 2.42v.

Et avec ces valeurs le prog me renvoie 0 à 100km/h donc j'ai une erreur de conversion quelque part.

Quand j'utilise la fonction map je retrouve bien mon 0 à 200km/h par contre le zéro n'es tplus très bien détecté et je me retrouve à 9km/h à la place de 0 pour 2.42v

Faudrait que je teste le tube en voiture pour avoir une vitesse de comparaison et pour pouvoir étalonner.

john_lenfr:
Quand je souffle (comme un bourin :grin:) dans le capteur il ne renvoie pas plus que 4,75v maxi pour un zéro à 2.42v.
...
Faudrait que je teste le tube en voiture pour avoir une vitesse de comparaison et pour pouvoir étalonner.

heu comment dire :grin: :grin:
Il faut déjà bien faire la difference entre souffler dans le tube pitot et souffler devant et autour du tube pitot/antenne de prandtl .

fais déjà des tests simples avec un simple "seche-cheveux" positionné devant "le tube" à 1m , 50cm,40, 25,10,5,2,1 cm et trace sur papier la courbe 8)

et trace sur papier la courbe

Je trace quoi?

volt en sortie du module VS valeur ADC?
volt VS pression en kPa?
volt VS vitesse?
vitesse VS pression?
....

Voici ce que j'ai commencé:
Je suis parti de ça:
https://code.google.com/p/ardupilot-mega/downloads/detail?name=Airspeed_test.zip&can=2&q=

Que j'ai modifié hier pour obtenir un premier code de test du capteur avec initialisation:

//
// Test for Airspeed Sensor MPXV7002DP
// [url]http://johnlenfr.1s.fr[/url]

// Pressure sensor MPXV7002DP
#define PRESSURE_PIN A5

float time;
float ref_pressure, air_pressure, pressure_diff;
float airspeed_ratio = 1.5191;
float airspeed;

void setup()
{
    Serial.begin(9600);
    delay(1000);
    
    Serial.println("Initializing...");
    
    ref_pressure = analogRead(PRESSURE_PIN);
    
    for (int i=1;i<=200;i++)
    {
      ref_pressure = (analogRead(PRESSURE_PIN))*0.25 + ref_pressure*0.75;
      delay(20);
    }
}

void loop()
{    
    if ((millis() - time) >= 20)
    {
      time = millis();
      
      air_pressure = analogRead(PRESSURE_PIN)*0.25 + air_pressure*0.75;
      
      if (air_pressure >= ref_pressure)
      {
        pressure_diff = air_pressure - ref_pressure;
      }
      else
      {
        pressure_diff = 0.0;
      }
      
      airspeed = sqrt(pressure_diff*airspeed_ratio);
      
      Serial.print("air speed: ");
      Serial.print(airspeed*3.6);
      Serial.println(" km/h");
    }
}

Le problème c'est que ce code donne une vitesse maxi à 100km/h et non 200km/h comme on l'avait calculé.
Il y a donc un problème de conversion sur lequel je suis en train de plancher.

Donc pour l'instant sur mon module le 0 se situe à 2.42v et à 4.5v j'ai environ 100km/h.

J'ai donc voulu faire évoluer le premier code pour obtenir quelque chose de plus précis et surtout qui va jusq'à +2kPa soit 200km/h:

//
// Test for Airspeed Sensor MPXV7002DP
// [url]http://johnlenfr.1s.fr[/url]

// Pressure sensor MPXV7002DP
#define PRESSURE_PIN A5

float time;
float ref_pressure_in_Pa, air_pressure_in_Pa, pressure_diff_in_Pa, tension;
//float airspeed_ratio = 1.5191;
float airspeed_ratio = 1.54679; // 2x1000/? (? = 1,293 kg/m3 )
float airspeed;
int pressure_in_bit;

void setup()
{
    Serial.begin(9600);
    delay(1000);
    
    Serial.println("Initializing...");
    
    // init ref
    for (int i=1;i<=200;i++)
    {
      pressure_in_bit = (analogRead(PRESSURE_PIN))*0.25 + pressure_in_bit*0.75;
      ref_pressure_in_Pa = mapfloat(pressure_in_bit,102,921,-2,2) * 1000;
      delay(20);
    }
    Serial.println("init done");
}

void loop()
{    
    
    if ((millis() - time) >= 200)
    {
      time = millis();
      pressure_in_bit = analogRead(PRESSURE_PIN)*0.25 + pressure_in_bit*0.75;
      // Re-convert digital to analog float
      air_pressure_in_Pa = mapfloat(pressure_in_bit,102,921,-2,2) * 1000;
      tension = mapfloat(pressure_in_bit,0,1023,0,5);
      
      if (air_pressure_in_Pa >= ref_pressure_in_Pa)
      {
        pressure_diff_in_Pa = air_pressure_in_Pa - ref_pressure_in_Pa;
      }
      else
      {
        pressure_diff_in_Pa = 0.0;
      }

      airspeed = sqrt(pressure_diff_in_Pa*airspeed_ratio);  // in m/s
      airspeed = airspeed * 3.6;                            // in km/h
      
      Serial.print("air speed                              : ");
      Serial.print(airspeed);
      Serial.println(" km/h");
      Serial.print("pressure diff_in_Pa: ");
      Serial.println(pressure_diff_in_Pa);
      Serial.print("air_pressure_in_Pa: ");
      Serial.println(air_pressure_in_Pa);
      Serial.print("ref_pressure_in_Pa: ");
      Serial.println(ref_pressure_in_Pa);
      Serial.print("pressure in bit: ");
      Serial.println(ref_pressure_in_Pa);
      Serial.print("tension: ");
      Serial.println(tension);
    }
}

float mapfloat(long x, long in_min, long in_max, long out_min, long out_max) {
  return (float)(x - in_min) * (out_max - out_min) / (float)(in_max - in_min) + out_min;
}

Le soucis avec ce code, c'est que le "0" n'est plus très bien détecté et une petite variation de 0.01v fait passer de 0 à 9km/h d'un coup!

Donc j'ai un soucis qu'il va falloir résoudre...

john_lenfr:
Le problème c'est que ce code donne une vitesse maxi à 100km/h et non 200km/h comme on l'avait calculé.
Il y a donc un problème de conversion sur lequel je suis en train de plancher.

Donc pour l'instant sur mon module le 0 se situe à 2.42v et à 4.5v j'ai environ 100km/h.

J'ai donc voulu faire évoluer le premier code pour obtenir quelque chose de plus précis et surtout qui va jusq'à +2kPa soit 200km/h:
...
Le soucis avec ce code, c'est que le "0" n'est plus très bien détecté et une petite variation de 0.01v fait passer de 0 à 9km/h d'un coup!

Donc j'ai un soucis qu'il va falloir résoudre...

Bonjour John
C'est normal
demo theorique
l'ADC de l'arduino est un 10 bits = 1024 pas
tu utilise une Aref de 5V
le pas (resolution) est de 0.0049V (arrondi)
tu utilise un capteur differentiel qui pour un centrage à 0 te renvoi 512 =2.5V
dans ton cas tout ce qui est < 2.5V (512) est inutilisable
tu te retrouve dans cette configuration avec la moitié de l'etendue utilisable soit "seulement" 512 points exploitables
2000 Pa /512= 3.9 la resolution de ton systeme est donc de 3.9 Pa , ce qui correspond à une vitesse de 9.08 km/h

tu n'a que 2 solutions pour ameliorer la situation
decaler en hard ton centrage (AOP centré sur 2.5V)
ta resolution va doubler mais tu continuera à passer de 0 (vitesse nulle) à 6.17 pour un passage de lecture AD de 0 à 1
ET/OU
utiliser un ADC externe de resolution superieure (11,12,13,14 bits)
par exemple pour un 12 bits avec reprise de centrage par AOP , ta resolution sera de 0.49 Pa
le passage de 0 à 1 se traduira par une vitesse de 3.22 km/h

sous reserves de ne pas m'etre planté dans les calculs
j'ai relu, mais bon ... :grin:

Bonjour Artouste,

Je te remercie pour ce calcul, je n'avais pas trouvé le temps de le faire mais je suis ravi que tu ai pu le faire à ma place.

Partant de là, est-il possible d'améliorer le processus de conversion en prenant la ref interne à 1.1v en faisant analogReference(INTERNAL1V1)? Je ne sais pas d'ailleurs si sur un 328P elle est dispo?
Dans ce cas on serait entre 0 et 1.1v au lieu de 0 et 5v ce qui donnerait une résolution de 11mv à la place de 49mv?
Est-ce que ça améliorerais les choses?

Je ne suis pas sur car l'ADC est toujours sur 1024 pas...

Et as tu compris pourquoi je suis en vitesse maxi à 100km/h à la place de 200km/h.

Par ailleurs, je suis tombé là dessus:

Qu'en penses tu?