2021-06-28 11:54:29 +08:00
|
|
|
|
# OpenVario-XCSOAR-Arduino
|
|
|
|
|
|
2021-06-28 12:14:51 +08:00
|
|
|
|
VEGA2
|
|
|
|
|
|
|
|
|
|
|
2021-06-28 12:02:21 +08:00
|
|
|
|
https://www.volavoile.net/index.php?showtopic=12188
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
新兴航
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
#include <Wire.h>
|
|
|
|
|
#include <Adafruit_BMP085.h>
|
|
|
|
|
/* deuxième sketch pour IAS pour LK8000 dans une forme plus rigoureuse*/
|
|
|
|
|
//int ptot=1013; //à supprimer quand BMP085 dispo;
|
|
|
|
|
Adafruit_BMP085 bmp;
|
|
|
|
|
void setup(){
|
|
|
|
|
Serial.begin (57600);
|
|
|
|
|
bmp.begin();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void loop(){
|
|
|
|
|
Serial.println("loop");
|
|
|
|
|
|
|
|
|
|
while (Serial.peek()!='$'){
|
|
|
|
|
if (Serial.available()<1){
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
Serial.print(char(Serial.read())); //penser à enlever le LN!
|
|
|
|
|
}
|
|
|
|
|
char nmea[83]={'$'};
|
|
|
|
|
get_nmea(nmea); //entre toute la trame dans la chaine nmea
|
|
|
|
|
if (get_entete(nmea)==true){ //si l'entete est celle qui donne la p_stat
|
|
|
|
|
Serial.println("if_loop true");
|
|
|
|
|
Serial.print("ptot "); Serial.print(bmp.readPressure()/100);Serial.println("hpa");
|
|
|
|
|
int ias=10*sqrt((2*((bmp.readPressure()/100) - get_pstat(nmea)))/1.225);
|
|
|
|
|
//calcul de l'IAS
|
|
|
|
|
Serial.print("IAS caculé est de: "); Serial.print(ias);Serial.println("dm/s");//penser à enlever le LN!
|
|
|
|
|
envoie_trame_ias(ias);
|
|
|
|
|
|
|
|
|
|
}else {
|
|
|
|
|
Serial.print("if loop false");
|
|
|
|
|
// Serial.print(nmea);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void get_nmea(char nmea[]){
|
|
|
|
|
// Serial.println("get_nmea");
|
|
|
|
|
for (int i=0; i<83; i++){
|
|
|
|
|
while (Serial.available()<1); // attente de 1 caractères dispo dans le buffer
|
|
|
|
|
nmea[i]=Serial.read(); //replissage de la chaine nmea avec les caratcères dispo
|
|
|
|
|
if (nmea[i]==10){ //si le caractère est <LF> on arrête de remplir
|
|
|
|
|
// Serial.print("caractere LF trouvé");
|
|
|
|
|
break; // et on quitte la boucle
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Serial.println(nmea); // on renvoie la trame sur la sortie serie //penser à enlever le LN!
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
boolean get_entete(char nmea[]){
|
|
|
|
|
// Serial.print(nmea);
|
|
|
|
|
char entete_alti[8]="$PGRMZ,";
|
|
|
|
|
for (int i=0;i<6;i++){
|
|
|
|
|
if(entete_alti[i]!=nmea[i]){
|
|
|
|
|
// Serial.print("condition fausse");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int get_pstat(char nmea[]){
|
|
|
|
|
char char_pstat[7]={'\0'};
|
|
|
|
|
int pstat;
|
|
|
|
|
for (int i=7 ; nmea!=',' ; i++){
|
|
|
|
|
char_pstat[i-7]=nmea;
|
|
|
|
|
}
|
|
|
|
|
// Serial.print(char_pstat);Serial.println("pieds");
|
|
|
|
|
pstat= atoi(char_pstat);
|
|
|
|
|
// Serial.print(pstat);Serial.println("pieds");
|
|
|
|
|
pstat=1013.25 * pow((288-(0.0065*pstat*0.3028))/288,5.255); //formule de conversion pieds en hpa
|
|
|
|
|
// Serial.print("pstat "); Serial.print(pstat); Serial.println("hPa");
|
|
|
|
|
return pstat;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void envoie_trame_ias(int ias){
|
|
|
|
|
// Serial.println("envoie trame ias");
|
|
|
|
|
char char_ias[4]={'\0'};
|
|
|
|
|
char char_nmea_ias[15]="$PLKAS,";
|
|
|
|
|
int n;
|
|
|
|
|
itoa (ias,char_ias,10);
|
|
|
|
|
// Serial.print("char_ias: "); Serial.println(char_ias);
|
|
|
|
|
|
|
|
|
|
for (int i=7; char_ias[i-7]!='\0';i++){
|
|
|
|
|
char_nmea_ias=char_ias[i-7];
|
|
|
|
|
n=i;
|
|
|
|
|
// Serial.print("i= "); Serial.println(i);
|
|
|
|
|
}
|
|
|
|
|
char_nmea_ias[n+1]=',';
|
|
|
|
|
/* char XOR=0;
|
|
|
|
|
for (int i=0; char_nmea_ias!='\0';i++){
|
|
|
|
|
XOR^=char_nmea_ias;
|
|
|
|
|
}*/
|
|
|
|
|
char_nmea_ias[n+2]=get_XOR(char_nmea_ias);
|
|
|
|
|
char_nmea_ias[n+3]=13;
|
|
|
|
|
char_nmea_ias[n+4]=10;
|
|
|
|
|
Serial.print (char_nmea_ias);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
char get_XOR(char trame[]){
|
|
|
|
|
// Serial.println("get_XOR");
|
|
|
|
|
char XOR='\0';
|
|
|
|
|
for (int i=0; trame!='\0';i++){
|
|
|
|
|
XOR^=trame;
|
|
|
|
|
}
|
|
|
|
|
return XOR;
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
为了准确测量空气速度,需要一个动态压力范围为 0-50mb (AMS5915) 的单向差动传感器。
|
|
|
|
|
|
|
|
|
|
对于分辨率为10cm的高度计,我们需要一个24位转换压力传感器(MS5611-01)和卡尔曼滤波降噪。
|
|
|
|
|
|
|
|
|
|
我怀疑你用 BMP085 操作的结果,被 BMP180 取代,但仍然不够精确,对于 pitot 和 alti-vario ...
|
|
|
|
|
|