Willkommen, Gast
Benutzername: Passwort: Angemeldet bleiben:
  • Seite:
  • 1
  • 2
  • 3

THEMA: Simpel Vario mit Druckanschluss

Simpel Vario mit Druckanschluss 07 Aug 2018 14:48 #1

  • nichtgedacht
  • nichtgedachts Avatar Autor
  • Offline
  • Expert Boarder
  • Expert Boarder
  • Beiträge: 95
  • Karma: 1
  • Dank erhalten: 26
HI,

Diese beiden bekannten Libraries wurden verwendet.
sourceforge.net/projects/jetiexsensorcpp..._V1.0.5.zip/download
github.com/jarzebski/Arduino-MS5611/archive/master.zip

An dem Vario gibt es nichts für den User einzustellen. Es wurde bereits der optimale Kompromiss zwischen Rauschunterdrückung und Reaktionszeit eingestellt.
Der Algorithmus basiert auf einem Code von Rolf R Bakke.

Dabei werden zwei digitale Tiefpassfilter 1. Ordnung, die einem simplen RC Glied entsprechen, parallel geschaltet.
Die Differenz der Ausgänge ist proportional der ersten Ableitung des Eingangssignals. In diesem Fall der Höhenänderungsgeschwindigkeit.
Die Tiefpasscharakteristik bleibt aber erhalten. D.h. das Signal nähert sich rasch aber in endlicher Zeit einer horizontalen Linie, wenn das
Eingangssignal (die Höhe) linear ansteigt. Die schnell erreichte Signalgröße (Vario) ist dabei stets proportional zur Steilheit eines linearen Anstiegs
des Eingangssignals. Die Verstärkung resp. Abschwächung des Nutzsignals ist abhängig von den eingestellten Zeitkonstanten und ihrem Verhältnis.
Ich habe den Algorithmus als Analogschaltung in LTSpice simuliert.
//#define DEBUG
 
#include <Wire.h>
#include <MS5611.h>         // from https://github.com/jarzebski/Arduino-MS5611/archive/master.zip
 
#ifndef DEBUG
#include "JetiExProtocol.h" // from https://sourceforge.net/projects/jetiexsensorcpplib/files/JetiExSensor_V1.0.5.zip/download
JetiExProtocol jetiEx;
#endif
 
MS5611 ms5611;
 
enum
{
  ID_CLIMB = 1,
  ID_ALTITUDE,
};
 
#ifndef DEBUG
JETISENSOR_CONST sensors[] PROGMEM =
{
  // id            name          unit         data type             precision 0->0, 1->0.0, 2->0.00
  { ID_CLIMB,      "Climb",      "m/s",       JetiSensor::TYPE_14b, 2 },
  { ID_ALTITUDE,   "Altitude",   "m",         JetiSensor::TYPE_14b, 0 },
  0 // end of array
};
#endif
 
double referencePressure;
float r_altitudes[50];
float r_altitude = 0, r_altitude0 = 0;
int j;
float climb = 0;
unsigned long time=0;
 
 
void setup() 
{
 
#ifdef DEBUG  
  Serial.begin(9600);
  //Serial.println("Initialize MS5611 Sensor");
#endif  
 
  // Initialize MS5611 sensor
  while(!ms5611.begin(MS5611_ULTRA_HIGH_RES))
  {
#ifdef DEBUG    
    Serial.println("Could not find a valid MS5611 sensor, check wiring!");
#endif    
    delay(500);
  }
 
  // Get reference pressure for relative altitude  
  referencePressure = 0;
  for ( j=0; j<50; j++) {
    referencePressure += ms5611.readPressure();
    delay(20);
  }
  referencePressure = referencePressure / 50;
 
  // Check settings
  //checkSettings();
 
#ifndef DEBUG
  jetiEx.Start( "mini_vario", sensors );
#endif
 
}
 
void checkSettings()
{
#ifdef DEBUG
  Serial.print("Oversampling: ");
  Serial.println(ms5611.getOversampling());
#endif  
}
 
void loop()
{
  long realPressure = ms5611.readPressure();
  float relativeAltitude = ms5611.getAltitude(realPressure, referencePressure);
 
  r_altitude0 = r_altitude0 - 0.15  * (r_altitude0 - relativeAltitude);
  r_altitude = r_altitude - 0.05 * (r_altitude - relativeAltitude);
 
  climb = (r_altitude0 - r_altitude) * 3;
 
#ifdef DEBUG
  Serial.print( r_altitude0);
  Serial.print( "\t" );
  Serial.println(climb);
#else
  jetiEx.SetSensorValue( ID_CLIMB,  round(climb * 100) );
  jetiEx.SetSensorValue( ID_ALTITUDE,  round(r_altitude0) );
  jetiEx.DoJetiSend();
#endif
 
  // loop frequency timer
  while (millis() < time) {
    //Serial.print("H");  // check going arround at given "time"
  }
   //Serial.println(time);
  time += 40;
 
}

Da der Mini Pro nur eine serielle Schnittstelle hat muss man das Programm für die Ausgabe auf der Konsole (Plotter oder Monitor)
mit einkommentiertem "#define DEBUG" laufen lassen. Zum Betrieb am Empfänger dann diese Zeile wieder auskommentieren.



Die beiden Platinen müssen ein gasdichtes Volumen umschließen. Man kann zum Testen das Röhrchen am Ende zulöten.
Dann darf keine Höhenänderung mehr angezeigt werden.

Das Vario wiegt ohne Kabel 4,8 g

Gruß
Dieter
Anhänge:
Folgende Benutzer bedankten sich: Alfred Neumann

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Simpel Vario mit Druckanschluss 08 Aug 2018 09:36 #2

  • walterh
  • walterhs Avatar
  • Offline
  • Senior Boarder
  • Senior Boarder
  • Beiträge: 42
  • Dank erhalten: 3
Ist ja sehr schön kompakt geworden.
Hast Du irgendwo mehr Details gepostet?
Grüße
Walter
Grüße Walter

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Simpel Vario mit Druckanschluss 08 Aug 2018 14:05 #3

  • nichtgedacht
  • nichtgedachts Avatar Autor
  • Offline
  • Expert Boarder
  • Expert Boarder
  • Beiträge: 95
  • Karma: 1
  • Dank erhalten: 26
Hallo Walter,

was willst Du denn noch wissen?

Was noch zu sagen wäre:

Der Arduino Mini Pro ist ein 3,3V Type.
Mit 2S LiPo Betriebsspannung könnte man stattdessen einen Mini Pro mit 5V verwenden.
Die Sensorplatine hat Levelshifter und kann mit 3,3V - 5V betrieben werden.
Dann könnte man, mit dann doppeltem Prozessortakt, die Abtastfrequenz verdoppeln. Das
Signal würde noch etwas glatter.

Die Verbindungen zwischen den Platinen wurde mit durchlötbarem Kupferlackdraht gemacht,
bis auf Vcc. Hier liegen sich die Vias genau gegenüber und man kann einen Stift von einem
Pfostenstecker nehmen. Vor dem Zusammensetzen müssen alle kleinen Vias auf der
Mini Pro Platine mit Epoxy gasdicht gemacht werden. Die am Ende unsichtbare LED auf
der Sensorplatine sollte vorher entfernt werden. Zum Schluss müssen die kleinen Vias
auf der Sensorplatine gedichtet werden. Das Röhrchen hat 2 mm Außendurchmesser und
wurde mit einem kurzen Stück 3mm Rohr am Loch adaptiert. Als Schlauch kommt ein
1mm x 1mm Silikonschlauch (1mm Innen 1mm Wandstärke) zur Verwendung. Das reicht
für eine TEK-Düse, weil die Druckunterschiede zum Statikdruck winzig sind.

Die Verbindungen sind

SDA
A4
SCL
A5
GND
GND
Vcc
Vcc

Der Empfänger (EXT) wird an TX, Raw, und GND angeschlossen.

Zum Programmieren braucht man den üblichen Seriell- zu USB-Adapter mit FTDI Chip drauf.
Dieser lässt sich auf 3,3V oder 5V jumpern.

Gruß
Dieter
.

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Simpel Vario mit Druckanschluss 08 Aug 2018 17:41 #4

  • walterh
  • walterhs Avatar
  • Offline
  • Senior Boarder
  • Senior Boarder
  • Beiträge: 42
  • Dank erhalten: 3

nichtgedacht schrieb: ....
Mit 2S LiPo Betriebsspannung könnte man stattdessen einen Mini Pro mit 5V verwenden.
Die Sensorplatine hat Levelshifter und kann mit 3,3V - 5V betrieben werden.
Dann könnte man, mit dann doppeltem Prozessortakt, die Abtastfrequenz verdoppeln. Das
Signal würde noch etwas glatter.
...
.


Mit welcher Frequenz misst Du den Druck? 25 Hz?
Würde dann eine schnellere Frequenz das Signal glatter machen?
Woher kommt Dein Noise?
Bringt bei nicht stark verwirbelter Luft eine Messung mit über 10 Hz eine Verbesserung?

Diese Flugsaison werde ich selber nichts bauen aber vielleicht im Winter. B)
Grüße Walter

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Simpel Vario mit Druckanschluss 08 Aug 2018 18:34 #5

  • FuniCapi
  • FuniCapis Avatar
  • Offline
  • Gold Boarder
  • Gold Boarder
  • Beiträge: 316
  • Karma: 1
  • Dank erhalten: 106
Ich mach bei meinen Eigenbauvarios alle 13ms eine Messung, also ca. 77Hz. Schneller geht nicht mit dem MS5611 wenn man Druck und Temperatur messen will.
Das funktioniert aber nicht mit der MS5611 Library. Da muss mann selber rann, siehe auch hier: Esens - All in one Sensor für Elektrosegler

Ohne Filterung oder Curve Fitting schwankt die Druckmessung zu sehr für ein vernüftiges Vario.
Ich mache Curve Fitting über 100 Samples. Das ist ein guter Kompromiss zwischen Reaktiongeschwindigkeit und Genauigkeit.

Gruss Lukas

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Letzte Änderung: von FuniCapi.

Simpel Vario mit Druckanschluss 08 Aug 2018 22:37 #6

  • nichtgedacht
  • nichtgedachts Avatar Autor
  • Offline
  • Expert Boarder
  • Expert Boarder
  • Beiträge: 95
  • Karma: 1
  • Dank erhalten: 26
Hallo Lukas,

ich verstehe in Deinem Algorithmus die Rechnerei an einigen Stellen nicht.

float x = -0.5 * (SAMPLES_ALTITUDE - 1) ist ja konstant, resp kann mit der Anzahl der Samples initial berechnet werden.
Dann wird die Summe über 1 bis n von x * x in sxx aufaddiert. Am Ende ist also auch sxx konstant.
Ich kapier' es nicht.

Gruß
Dieter

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

  • Seite:
  • 1
  • 2
  • 3
Ladezeit der Seite: 0.209 Sekunden
Powered by Kunena Forum