Poor Mans Vario

Met elektronica kan je trouwens met een gewone Pitot-Statische buis en 2 druksensoren ook heel mooi een heel goede TEK Vario maken.
Je kunt dan de gemeten stuwdruk rekenkundig van de gemeten statische druk aftrekken voor de TEK Vario functie en de gemeten statische druk zelf voor de echte (druk)hoogte.
Ik heb daar eens aan zitten denken, toen ik de PMV ontwierp, omdat je dan hardwarematig zowel een luchtsnelheidsmeter als variometer in één en hetzelfde apparaat hebt zitten. Ik kon toen echter niet op een makkelijke wijze twee BMP180 druksensoren aan de Arduino koppelen via I2C. Met de komst van de BMP280 druksensor moduletjes is dat probleem opgelost, omdat je daar de laatste adresbit van de sensor hardwarematig kunt instellen. De PMV draait inmiddels ook op de BMP280, maar ik ben momenteel met wat eigenbouw FRSky GPS snelheids sensoren bezig, dus PMV ligt even stil.
 
Dank Rick, ik heb er een hele tijd naar zitten kijken maar kon geen fouten vinden, ook al zei mijn gevoel dat ik teveel had. Idd de hPa en Pa fout gemaakt.

Dat houdt inderdaad in dat wanneer je op een bepaalde hoogte vliegt en je snelheid neemt toe door een externe energiebron (thermiek of motor) de TEK Probe een lagere druk zal geven. Als je hierop je hoogte baseerd zal het dus een LAGERE hoogte te zien geven.
Dit moet volgens mij wel een hogere hoogte zijn ;)

Het buisje dat ik gebruikt heb heb ik bij mij SkyMelodie vario gekregen...

Groet Halmar
 
[QUOTE="Halmar, post: 3830616, member: 161"
Dit moet volgens mij wel een hogere hoogte zijn ;)
[/QUOTE]

Natuurlijk, stomme fout van me. Lagere druk > grotere hoogte.
 
Ik weet het.... draadje al een jaartje oud.... maar ik ben aan het experimenteren met deze PMV en wil daar de BMP280 voor gebruike maar krijg deze met geen mogelijkheid aan het draaien. Wel de test maar niet in de PMV code.

Is er al een complete code voor deze sensor... hij zou goed moeten zijn....???? misschien @hmeijdam ????
 
Ik heb twee jaar geleden ooit eens een stukje PMV code gemaakt voor de BMP280 en ik geloof dat het toen ook wel werkte, maar durf dat hier niet te beloven. De reden dat ik nooit met de BMP280 ben verder gegaan is omdat hij tot voor kort niet verkrijgbaar was in een handige layout om direct bovenop de Arduino pro mini te kunnen solderen zoals de BMP180. Ik laat de BMP280 dan ook via SPI communiceren en niet via I2C.

Kijk zelf maar even in onderstaande code of je het aan de gang krijgt. Ik geef zelf verder geen support op de BMP280, omdat de BMP180 nog goed verkrijgbaar is en de 280 verder geen voordelen heeft.
Je hebt de Adafruit BMP280 libraries hiervoor nodig.

Edit: o ja, nog wat. De BMP280 heeft vaak geen voltage regelaar aan boord, dus je zult een 3.3 V Pro Mini moeten gebruiken en geen 5 V. Onderstaande code had ik zo gemaakt dat de BMP280 van pen 4 t/m 9 direct op de 3.3 V pro mini past. Hij wordt dan via de processor gevoed, maar dat zie je vanzelf als je naar de definitie van die 6 pinnen kijkt.

Code:
//**********************************
//*          BMP280 version        *
//**********************************
// This is the Poor Mans Vario code for the BMP280 sensor by BOSCH Sensortec
// connect BMP280 to .........
// Servo signal input, connect to Arduino pin D3
// Audio output to transmitter on pin D2
// V1 Hans Meijdam, April 2016:
//
//  ****** This is a customizable variable that acts as a switch *****
// choose "1" if you also want to hear the altitude in meters if you fly below 100 meters.
// choose "0" if you only want to hear the 10 meters rounded altitude at all times.
// Default is 0.
const byte altitude_per_meter = 0; // only altitude in 10 meters
// const byte altitude_per_meter = 1; // altitude in whole meters if below 100 meters


//  ****** This is a customizable variable (0 - 500 range) that defines how large the dead band is ******
// A dead band of "0" (= default) means that the vario will beep constantly, even with no climb or sink at all.
// A small dead band (e.g. value 25 - 50) means that with a small amount of climb or sink the vario will start beeping
// A medium dead band (e.g. value 50 - 100) means that the vario will be silent, unless it observes a medium rate of climb or medium rate of sink.
// A high dead band (> 100) makes the vario only active at high rates of sink or climb.
int deadband = 0;  // no deadband or deadband defined by potmeter
// int deadband = 25;  // small deadband
// int deadband = 75;  // medium deadband
// int deadband = 150;  // large deadband

//  ****** Alternatively the deadband can be dynamically set by connecting a 10K potmeter over pins 12, A1 (rocker) and A2 ******
// const byte deadbandpotmeter = 0;  // no deadband potmeter present
const char deadbandpotmeter = 1;  // deadband potmeter is present (10K potmeter over pins 12, A1 (rocker) and A2)

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>

#define BMP_SCK  6 // SCK/SCL on BMP280
#define BMP_MISO 9 // SDO     on BMP280
#define BMP_MOSI 7 // SDA/SDI on BMP280
#define BMP_CS   8 // CSB     on BMP280
#define BMP_GND  5 // GND     on BMP280
#define BMP_VCC  4 // VCC     on BMP280

//Adafruit_BMP280 bme; // I2C
//Adafruit_BMP280 bme(BMP_CS); // hardware SPI
Adafruit_BMP280 bme(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);

const byte led = 13; // define pin that has a led connected to it
const byte audiopin = 3; // define the pin the audio signal is provided to
const byte servopin = 2; // define the pin the servo signal is connected to
unsigned long time = 0;
float toneFreq, toneFreqLowpass, flpressure, lowpassFast, lowpassSlow ;
float p0; // this will be used to store the airfield elevation pressure
int altitude;
int ch1; // Here's where we'll keep our channel values
int ddsAcc;
int analogpin1 = 0;

void setup()
{
 // Wire.begin();
 
  pinMode(BMP_GND, OUTPUT);
  pinMode(BMP_VCC, OUTPUT);
  digitalWrite(BMP_GND, LOW); //Provide GND to BMP280
  digitalWrite(BMP_VCC, HIGH); //Provide 3,3v to BMP280
  delay (100);
  pinMode(servopin, INPUT_PULLUP); // Set servopin input enabling altitude command input from receiver
  pinMode(audiopin, OUTPUT); // set audiopin as output
  pinMode(A2, OUTPUT); // Prepare for high end of potmeter
  pinMode(12, OUTPUT); // Prepare for low end of potmeter
  pinMode(A1, INPUT_PULLUP); // Prepare for potmeter input
  digitalWrite(A2, HIGH); // High end potmeter to 5 volt
  digitalWrite(12, LOW); //Low end potmeter to 0 volt
  Serial.begin(9600); // start serial for output
  analogpin1 = analogRead(1);    // read the input pin A1 potmeter value
  Serial.print("Analog pin A1 value: ");
  Serial.println(analogpin1);
  Serial.println("Setting up BMP280");
  if (!bme.begin()) {
    Serial.println("Could not find a valid BMP280 sensor, check wiring!");
    while (1);
  }
  delay(250);
  flpressure =(bme.readPressure());// get field pressure and move into float type
  p0 = lowpassFast = lowpassSlow = flpressure;
  Serial.print(" p0 = ");
  Serial.println(p0);
}

void loop()
{
  flpressure = (bme.readPressure());// move long type pressure into float type flpressure
  altitude = (float)44330 * (1 - pow(((float) flpressure/p0), 0.190295));
  altitude = abs(altitude); // if flying from hills negative altitude becomes indicated as positive
  lowpassFast = lowpassFast + (flpressure - lowpassFast) * 0.2;
  lowpassSlow = lowpassSlow + (flpressure - lowpassSlow) * 0.1;
  toneFreq = (lowpassSlow - lowpassFast) * 50;
  toneFreqLowpass = toneFreqLowpass + (toneFreq - toneFreqLowpass) * 0.1;
  toneFreq = constrain(toneFreqLowpass, -500, 500);
  ddsAcc += toneFreq * 100 + 2000;

  if (deadbandpotmeter == 1)
  {
    analogpin1 = analogRead(1);    // read the input pin A1 potmeter value
    deadband = map(analogpin1, 0, 1024, 500, 0); // map potmeter value to deadband range from 500 - 0
  }

  if (toneFreq < 0 || ddsAcc > 0)
  {
    if (abs(toneFreq)>deadband)
    {
      tone(audiopin, toneFreq + 550);
      ledOn();  // the Arduino led will blink if the Vario plays a tone, so you can test without having audio connected
    }
  }
  else
  {
    noTone(audiopin);
    ledOff();
  }
  int ones = altitude%10;
  int tens = (altitude/10)%10;
  int hundreds = (altitude/100)%10;
  int thousands = (altitude/1000)%10;
  ch1 = pulseIn(servopin, HIGH, 25000); // Read the pulse width of servo signal connected to pin D3
if((map(ch1, 1000,2000,-500,500)) > 0) // interpret the servo channel pulse, if the Vario should beep altitude or send vario sound
  {
    noTone(audiopin); // create 750 ms of silence, or you won't hear the first altitude beep
    ledOff();
    delay(750);

    if(hundreds == 0)
    {
      tone(audiopin,900);                //long duration tone if the number is zero
      ledOn();
      delay(600);
      noTone(audiopin);
      ledOff();
    }
    else
      for(char a = 0; a < hundreds; a++)          //this loop makes a beep for each hundred meters altitude
      {
        tone(audiopin,900); // 900 Hz tone frequency for the hundreds
        ledOn();
        delay(200);
        noTone(audiopin);
        ledOff();
        delay(200);
      }
    delay(750);                            //longer delay between hundreds and tens

    if(tens == 0)
    {
      tone(audiopin,1100);                //long pulse if the number is zero
      ledOn();
      delay(600);
      noTone(audiopin);
      ledOff();
    }
    else
      for(char a = 0; a < tens; a++)          //this loop makes a beep for each ten meters altitude
      {
        tone(audiopin,1100); //1100 Hz tone frequency for the tens
        ledOn();
        delay(200);
        noTone(audiopin);
        ledOff();
        delay(200);
      }

    if (altitude_per_meter == 1 && hundreds == 0)
    {
      delay(750);                            //longer delay between tens and ones

      if(ones == 0)
      {
        tone(audiopin,1300);                //long pulse if the number is zero
        ledOn();
        delay(600);
        noTone(audiopin);
        ledOff();
      }
      else
        for(char a = 0; a < ones; a++)          //this loop makes a beep for each meter altitude
        {
          tone(audiopin,1300); //1300 Hz tone frequency for the ones
          ledOn();
          delay(200);
          noTone(audiopin);
          ledOff();
          delay(200);
        }
    }
  }
}


void ledOn()
{
  digitalWrite(led,1);
}


void ledOff()
{
  digitalWrite(led,0);
}
 
Laatst bewerkt:
30 jaar geleden eens gemaakt. beruste op het principe van twee membramen uit een mini microfoon die in een brug stonden met een 555 en door het verschil in capaciteit een toon ging genereren. dat werd dan in een 100 Mhz zendertje gestuurd en je stond met een knots van een transistorradio op het veld naar de piepjes te luisteren. had wel een klein thermosflesje in je vliegtuig.
img_4441-jpg.297775
 

Bijlagen

  • IMG_4441.JPG
    IMG_4441.JPG
    162 KB · Weergaven: 1.176
Ik heb in het verleden eens gekeken naar OpenX Sensor, maar hun vario werkte toen niet met de BMP180 en/of de BMP280. Is dat nog steeds zo?
 
Ik heb in het verleden eens gekeken naar OpenX Sensor, maar hun vario werkte toen niet met de BMP180 en/of de BMP280. Is dat nog steeds zo?
Altimeter / Variometer:
  • Uses normally a MS5611 sensor (GY-63 or GY-86 module)
  • Alternatives: a BMP085, a BMP180 or a BMP280 sensor can be used as first sensor
  • A second barometric sensor can be added
  • Possibility to change vario sensitivity and/or to switch between 2 vertical speeds from TX while flying
 
O, dat is wel leuk! Daar ga ik zeker weer eens naar kijken. Ik had zelf al twee vario's gemaakt voor mijn FRSky zender (voor S-port en Hub protocol). De hoogte meting gaat prima, maar het variogeluid krijg ik maar niet voor elkaar om dat net zo stabiel maar toch gevoelig te krijgen als bij de PMV.
 
Ik heb ook een FrSky zender, en heb het variogeluid wel voor elkaar gekregen. Gebruikmaken van de telemetrie van de zender is toch wel heel mooi.
Je kunt die Open X sensor ook uitbreiden met een spanningsmeter voor je LiPo cellen. Dat is mij nog niet gelukt.
 
en heb het variogeluid wel voor elkaar gekregen.
Zou jij het stukje sourcecode willen delen, waarmee je vanuit de reeks drukmetingen de vertical-speed uitrekent? Ik heb daarvoor de opzet uit mijn PMV hergebruikt, maar daarmee krijg ik het niet goed voor elkaar. Of hij is te gevoelig en terwijl de kist op de grond ligt gaat het variogeluid al heen en weer, of hij is te ongevoelig om snel genoeg thermiek op te pikken.
 
Ik heb twee jaar geleden ooit eens een stukje PMV code gemaakt voor de BMP280 en ik geloof dat het toen ook wel werkte, maar durf dat hier niet te beloven.

Dank je @hmeijdam .... ingesteld op I2C en een klein beetje zitten knoeien en werkt als een tierelier. Heb alles op een 3.3 volt bordje, liep alleen vast op mijn ontvanger uitgang, die was niet hoog genoeg en staat er nu direct op dus zonder spanningsdeler.

De buren zullen wel denken.... wat een gestommel op de trap........ en morgen op de fiets, afstand testen
 
Laatst bewerkt:
Hallo Hans,
Ik heb van de mini-pro en de BMP180 sensor een setje opgebouwd en programmatje erin geschoten maar krijg de Vario niet aan de praat helaas.
De Arduino werk wel gewoon dus of de sensor is defect of ik doe iets verkeerd met het programma.

Is het nodig om de library van de BMP180 te installeren of is dat allemaal niet nodig en kan ik gewoon de code die in dit draadje staat in de Arduino schieten?

Alex
 
Nee, de code in de openingspost had ik zo gemaakt dat hij zonder BMP180 library werkt en compileert op elke standaard Arduino omgeving.
Misschien heb jij een BMP180 sensor met een ander I2C adres.

Stop onderstaande code eens in je arduino en kijk welk hex adres je sensor heeft

Code:
#include <Wire.h>

void setup() {
  Serial.begin (9600);

  // Leonardo: wait for serial port to connect
  while (!Serial)
    {
    }

  Serial.println ();
  Serial.println ("I2C scanner. Scanning ...");
  byte count = 0;
 
  Wire.begin();
  for (byte i = 1; i < 120; i++)
  {
    Wire.beginTransmission (i);
    if (Wire.endTransmission () == 0)
      {
      Serial.print ("Found address: ");
      Serial.print (i, DEC);
      Serial.print (" (0x");
      Serial.print (i, HEX);
      Serial.println (")");
      count++;
      delay (1);  // maybe unneeded?
      } // end of good response
  } // end of for loop
  Serial.println ("Done.");
  Serial.print ("Found ");
  Serial.print (count, DEC);
  Serial.println (" device(s).");
}  // end of setup

void loop() {}
 
Let ook even op dat de BMP180 sensor wel spanning krijgt. Als je je pro-mini alleen voedt middels je USB programmer, dan staat er geen stroom op de RAW pin van de pro-mini en krijgt je sensor geen stroom.
 
Back
Top