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.
bonjour John
Passer sur la ref interne 1.1V (qui existe sur 328P) ne te sera d'aucune utilité
comme tu est centré à 2.5V pour Vitesse=0 l'arduino te renverra simplement un beau 1023 pour tout ce qui depassera 1.1V et comme de base tu est déjà à 2.5V ...
de plus ne pas oublier que si le capteur sort un courbe considérée "lineaire" V=Pa , la fonction de transfert vers Vitesse elle ne l'est pas , la resolution à faible vitesse est beaucoup plus faible qu'aux hautes vitesse = plus tu va vite , plus le pas de progression est faible entre 1 et 2 Pa , tu a une resolution de 1.9 km/h et entre 1999 et 2000 Pa la resolution est de 0.2 km/h.
autrement dit : une mesure pitot s'ameliore avec la vitesse
pas cherché pour ton "soucis" de 100/200
je regarde ton lien
edit : ok rapidement lu
en fait il propose un diviseur de tension ramenant l'amplitude à 1.1V , l'idée est bonne , ne coute pas chere , mais il utilise un 5004 pas un 7002, tu peux tester avec ton 7002, mais tu ne va rester que sur une resolution/amplitude exploitable de 512 pas
tout ce qui sera lu < 0.55V sera ejecté .
de plus il faudra prendre encompte la qualité du pont diviseur (qualité intrinseque des R constituantes) , faire ainsi c'est ajouter de l'erreur possible.
dans son cas (5004) il debute à 0V pour PT=PS pas à 2.5V
En réalité je n'ai pas d'intéret sur les faibles vitesses, la plage de vitesse intéressante sera de 40 km/h à 150 km/h .
C'est juste que je me suis rendu compte que le module de pression ne se recentre pas forcément à sa valeur initiale et que donc par conséquent s'il y a ne serais ce qu'un écart de 0.01v ça se voit dans les valeurs
john_lenfr:
En réalité je n'ai pas d'intéret sur les faibles vitesses, la plage de vitesse intéressante sera de 40 km/h à 150 km/h .
C'est juste que je me suis rendu compte que le module de pression ne se recentre pas forcément à sa valeur initiale et que donc par conséquent s'il y a ne serais ce qu'un écart de 0.01v ça se voit dans les valeurs
Ok je te laisse potasser le lien
a+
j'ai commenté au dessus
si ta cible est la fourchette 40/150 km/h tu peux esperer theoriquement au mieux une resolution evoluant entre ~ 0.25 et 0.15 km/h
mais il ne faut pas non plus pour le bilan de precision oublier :
-la precision intrinseque du capteur
l'influence de sa tension d'alim (stabilité de cette alim)
la precision de la REF du convertisseur AD
et autres "perturbateurs" tel que le changement des conditions physique P°/altitude/T°
j'ai commenté au dessus
si ta cible est la fourchette 40/150 km/h tu peux esperer theoriquement au mieux une resolution evoluant entre ~ 0.25 et 0.15 km/h comment j'arrive à avoir une valeur qui passe de 0 à 9km/h alors?
mais il ne faut pas non plus pour le bilan de precision oublier :
-la precision intrinseque du capteur 2.5 à 6.5%
l'influence de sa tension d'alim (stabilité de cette alim) cela n'est-il pas supprimé par la partie calibration avec centrage de la valeur 0 (par exemple dans mon cas à 2.42v?)
la precision de la REF du convertisseur AD ça je peux rien faire
et autres "perturbateurs" tel que le changement des conditions physique P°/altitude/T° pris en compte dans le code de jpparisy sur lequel je vais me caler dans sa fonction get_air_speed() (par la suite il pourra être prévu une mesure de la température par un capteur I2C et éventuellement un capteur d'alti?
john_lenfr:
j'ai commenté au dessus
si ta cible est la fourchette 40/150 km/h tu peux esperer theoriquement au mieux une resolution evoluant entre ~ 0.25 et 0.15 km/h comment j'arrive à avoir une valeur qui passe de 0 à 9km/h alors?
mais il ne faut pas non plus pour le bilan de precision oublier :
-la precision intrinseque du capteur 2.5 à 6.5%
l'influence de sa tension d'alim (stabilité de cette alim) cela n'est-il pas supprimé par la partie calibration avec centrage de la valeur 0 (par exemple dans mon cas à 2.42v?)
la precision de la REF du convertisseur AD ça je peux rien faire
et autres "perturbateurs" tel que le changement des conditions physique P°/altitude/T° pris en compte dans le code de jpparisy sur lequel je vais me caler dans sa fonction get_air_speed() (par la suite il pourra être prévu une mesure de la température par un capteur I2C et éventuellement un capteur d'alti?
heu john , je repond (enfin j'espere) aux questions posées
ce que j'ai indiqué = c'est pour la zone de vitesse que tu indique , soit entre entre 40 et 150 km/h
pour le saut soudainn de 9 km/h à partir de 0 j'ai expliqué le pourquoi plus haut 8)
la (partie) situation de calibration n'est pas une constante ,, fais le test en situation meteo changeante sans bouger le pitot de son emplacement , à 10 mn d'intervalle la nouvelle valeur moyennée de calibration sera tres surement differente de +/- quelques points, et en condition de vol cette reference qui ne peut plus etre verifiée evolue evidemment aussi.
Artouste:
heu john , je repond (enfin j'espere) aux questions posées
Oui, parfaitement, et je t'en remercie.
ce que j'ai indiqué = c'est pour la zone de vitesse que tu indique , soit entre entre 40 et 150 km/h
pour le saut soudainn de 9 km/h à partir de 0 j'ai expliqué le pourquoi plus haut 8)
Ok je comprends mieux
la (partie) situation de calibration n'est pas une constante ,, fais le test en situation meteo changeante sans bouger le pitot de son emplacement , à 10 mn d'intervalle la nouvelle valeur moyennée de calibration sera tres surement differente de +/- quelques points, et en condition de vol cette reference qui ne peut plus etre verifiée evolue evidemment aussi.
Sur le forum de modélisme un intervenant m'a préconisé de réaliser une calibration 2 points.
Je ne vois pas trop de quoi il s'agit mais si je la comprend je pense l'utiliser dans ma phase calibration prévue par un menu sur mon appareil.
Auquel cas le centrage du 0 + calibration amélioreront la précision de la mesure.
Donc je pense que j'ai tous les éléments qu'il me faut maintenant je dois faire de nouveaux tests.
pas cherché pour ton "soucis" de 100/200
Je n'ai pas cherché non plus mais comme j'ai fait des tests rapide il faut que je reprenne tout ça à tête reposée.
En fait j'avais 0 à 100 quand j'ai pris le code par défaut du wiki airspeed.
Je n'ai obtenu du 0 à 200 qu'en utilisant mon code avec ma fonction map()
Ce qui est bizarre au passage c'est que sur le lien vers le site modelisme il n'utilise pas la fonction map() pour avoir les bonnes valeurs. Mais c'est peut être parce que sont capteur renvoi 1 à 4.9v alors que moi je travaille sur la plage 2.5 à 4.5v?
john_lenfr:
...
Sur le forum de modélisme un intervenant m'a préconisé de réaliser une calibration 2 points.
Je ne vois pas trop de quoi il s'agit mais si je la comprend je pense l'utiliser dans ma phase calibration prévue par un menu sur mon appareil.
Auquel cas le centrage du 0 + calibration amélioreront la précision de la mesure.
Donc je pense que j'ai tous les éléments qu'il me faut maintenant je dois faire de nouveaux tests.
...
pour faire une calibration 2 points , il te faut un etalon/reference de vitesse vent relatif , t'a ça en magasin ?
de toutes façons 1, 2 ou x points , ça ne change rien au fait que le calage zero (=vitesse nulle au sol ) n'est pas perenne c'est juste une calibration valide à l'instant T.
A mon "louchometre de precision" et compte tenu de la dispersion de ta chaine d'acquisition/traitement, je ne pense pas que tu puisse obtenir un resultat dont le taux d'erreur serait au dessous de +/- 15 % (et encore)
Ok donc j'oublie la calibration.
De toute façon dans ce cas je vais considérer que mon 2.42v est équivalent au 2.50v du datasheet avec une réponse linéaire.
Il ne faut effectivement pas que j'oublie que c'est pour "alarmer" le décrochage d'un planeur modelisme.
C'est pas non plus pour faire de la mesure de pression précise.
john_lenfr:
Ok donc j'oublie la calibration.
De toute façon dans ce cas je vais considérer que mon 2.42v est équivalent au 2.50v du datasheet avec une réponse linéaire.
Il ne faut effectivement pas que j'oublie que c'est pour "alarmer" le décrochage d'un planeur modelisme.
C'est pas non plus pour faire de la mesure de pression précise.
le 2.5V du datasheet est typique, tu ne peux pas en tenir compte arbitrairement comme ça, en faisant ainsi tu amplifie le bilan d'erreur.
regarde le DS Tableau 1
il est referencé sur VS = 5.0 Vdc
ton offset peut varier entre 2.25 et 2.75 (delta 0.5V)
la sortie FSO entre 4.25 et 4.75
et ça c'est à la condition que VS soit,bien exactement 5V
sachant déjà qu'un arduino alimenté par USB ou le regulateur n'aura déjà pas la meme valeur (qui sert d'AREF) , tu imagine facilement le cumul des erreurs possibles si tu ne calibre pas au moins un petit peu
Bonsoir
Je crois que je vais stopper toute communication sur ce topic
la participation simultanée/croisée à plusieurs forums specialisés est une chose parfatement normale.
ça ne me perturbe pas et aucunement.
J'aime beaucoup moins (autant dire pas du tout) , l'attribution, le plagiat jusqu'et y compris "mes tournures" redactionelles
pour celles et ceux qui ne comprendrait pas ma position ici :
voir
Bonjour
Ayant eu un echange par MP avec Johnlenfr , compte tenu de sa comprehension sur mon courroux (coucou ) et son "explication" font que je considere l'incident parfaitement clos.
Artouste:
Bonjour
Ayant eu un echange par MP avec Johnlenfr , compte tenu de sa comprehension sur mon courroux (coucou ) et son "explication" font que je considere l'incident parfaitement clos.
Bonjour,
Je te remercie encore pour ta compréhension et reprend de ce pas le sujet ce soir...
Hello Artouste,
J'ai commencé le code ci-après mais j'ai un doute sur la partie initialisation.
En effet quand j'initialise j'obtiens par exemple une valeur de l'ADC à 513, pour une tension mesurée au multimètre de 2.42v.
Je n'arrive pas à comprendre comment tenir compte du fait que j'ai ces valeurs à la place du couple théorique 2.5v/511?
Pourrais tu m'éclairer sur ce sujet car j'avoue qu'avec la fatigue je me sens perdu...
exemple:
#include "Pressure.h"
#define PRESSURE_PIN A5
Pressure MPXV7002DP(PRESSURE_PIN);
void setup() {
Serial.begin(9600);
Serial.println("init...");
int val = MPXV7002DP.Init();
Serial.println("init done!");
Serial.println(val);
}
void loop() {
int val2 = MPXV7002DP.GetAirSpeed();
Serial.println(val2);
}
cpp:
/*
Pressure.h - Library for pressure sensor.
Created by johnlenfr, May 15, 2014.
http://johnlenfr.1s.fr
SOURCE CODE .CPP
*/
#include "Arduino.h"
#include "Pressure.h"
Pressure::Pressure(int pin){
//
pinMode(pin,INPUT);
_pin = pin;
}
int Pressure::Init(){
//
ref_pressure = analogRead(_pin);
for (int i=1;i<=200;i++)
{
ref_pressure = (analogRead(_pin))*0.25 + ref_pressure*0.75;
delay(20);
}
return ref_pressure;
}
int Pressure::GetAirSpeed(){
//
int air_pressure = 0;
for (int i = 0; i < 8; i++)
air_pressure += analogRead (_pin);
air_pressure >>= 3;
if (air_pressure < ref_pressure)
air_pressure = ref_pressure;
pitotpressure = 5000.0f * ((air_pressure - ref_pressure) / 1024.0f) + PRESSURE_SEA_LEVEL; // differential pressure in Pa, 1 V/kPa, max 3920 Pa
ambientpressure = PRESSURE_SEA_LEVEL;
temperature = 20.0f + ABSOLUTE_0_KELVIN;
density = (ambientpressure * DRY_AIR_MOLAR_MASS) / (temperature * UNIVERSAL_GAS_CONSTANT);
airspeed_ms = sqrt ((2 * (pitotpressure - ambientpressure)) / density);
airspeed_kmh = airspeed_ms * 3.600; // convert to km/h
return airspeed_kmh;
}
header:
/*
Pressure.h - Library for pressure sensor.
Created by johnlenfr, May 15, 2014.
http://johnlenfr.1s.fr
HEADER CODE .H
*/
#ifndef Pressure_h // Basically, this prevents problems if someone accidently #include's the library twice.
#define Pressure_h // starting .h
#include "Arduino.h" // needed for constants and functions declarations
// DEFINE CONSTANTS
// #define constant value
#define ABSOLUTE_0_KELVIN 273.16f
#define PRESSURE_SEA_LEVEL 101325.0f
#define UNIVERSAL_GAS_CONSTANT 8.3144621f
#define DRY_AIR_MOLAR_MASS 0.0289644f
class Pressure{ // name of the class
public: // public methods and variables
Pressure(int pin); // constructor of the class
int Init();
int GetAirSpeed();
private: // private methods and variables
int _pin;
int ref_pressure;
float pitotpressure;
float ambientpressure;
float temperature;
float airspeed_ms;
float airspeed_kmh;
float density;
};
//extern Pressure Pressure; //Externalisation de l'objet.
#endif // ending .h
Exact, du coup je comprends encore moins.
Est-ce que cela ne viendrait pas du fait que ma tension d'alimentation ne serait pas pile poil à 5v?
Comment résoudre ce problème de calage du coup?
Car en réalité j'ai: a*513/1024 = 2.42v
soit a=4.83v
Re,
Ton appareil de mesure te donne une idée de la tension mais en aucun cas une valeur exact.
Faire des mesures exactes est un art qui dépasse largement nos compétences d'amateur.
Fait une double mesure c'est à dire:
john_lenfr:
Exact, du coup je comprends encore moins.
Est-ce que cela ne viendrait pas du fait que ma tension d'alimentation ne serait pas pile poil à 5v?
Comment résoudre ce problème de calage du coup?
Car en réalité j'ai: a*513/1024 = 2.42v
soit a=4.83v
les valeurs min/max du 7002
pour un 5V "exact" d'alim (ce qui ne peut exister) tu peux avoir jusqu'a 0.5V de dispersion
la reference de tension de l'ADC du MCU qui est actuellement la tension d'alim du MCU
cette tension aussi n'est pas un 5V exact = à 16 Mhz tu peux alimenter ton MCU entre 4.5V et 5.5V .
ce qui te donne un pas d'ADC pouvant varier entre 0.004339 et 0.005371 V
j'ai expliqué plus haut que selon si l'arduino est alimenté par USB ou par son regulateur fixe, la tension ne sera pas la meme, et donc par ricochet l'AREF non plus.
Tu vois que la dispersion est déjà là tres importante.
donc la premiere chose à faire pour ameliorer la situation est d'alimenter ton capteur au plus pres d'un 5V et de te servir aussi de ce meme "5V" comme AREF pour ton MCU.
une plutot pas trop mauvaise solution serait d'utiliser un petit LM317L en TO92 (ou SOIC) pour ça