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...