Poor Mans Vario

Discussie in 'Zweefvliegen' gestart door hmeijdam, 11 nov 2013.

  1. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.659
    Locatie:
    Barneveld
    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.
     
    Rick NL vindt dit leuk.
  2. Halmar

    Halmar

    Lid geworden:
    14 apr 2003
    Berichten:
    1.067
    Locatie:
    Amersfoort
    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.

    Dit moet volgens mij wel een hogere hoogte zijn ;)

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

    Groet Halmar
     
  3. Rick NL

    Rick NL The First Aviators

    Lid geworden:
    18 apr 2008
    Berichten:
    3.514
    Locatie:
    Gouda
    [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.
     
  4. Erik Janssen

    Erik Janssen

    Lid geworden:
    19 nov 2016
    Berichten:
    142
    Locatie:
    Hoorn
    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 ????
     
  5. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.659
    Locatie:
    Barneveld
    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: 25 okt 2018
    Erik Janssen vindt dit leuk.
  6. Erik Janssen

    Erik Janssen

    Lid geworden:
    19 nov 2016
    Berichten:
    142
    Locatie:
    Hoorn
    Dank je @hmeijdam ik ga er mee aan de slag, ben helaas zo'n type die alles net even anders doet en daardoor veel meer tijd kwijt is.... :)
     
  7. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.659
    Locatie:
    Barneveld
    Heel herkenbaar en vat ongeveer samen waarom ik hier ooit mee begonnen ben. Ik dacht toen ook ....dat moet anders kunnen.....
     
    Erik Janssen vindt dit leuk.
  8. Erik Janssen

    Erik Janssen

    Lid geworden:
    19 nov 2016
    Berichten:
    142
    Locatie:
    Hoorn
    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]
     

    Bijgevoegde bestanden:

    Rick NL en DirkSchipper vinden dit leuk.
  9. Wubbe

    Wubbe

    Lid geworden:
    22 mrt 2005
    Berichten:
    3.353
    Locatie:
    Haarlem
  10. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.659
    Locatie:
    Barneveld
    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?
     
  11. Erik Janssen

    Erik Janssen

    Lid geworden:
    19 nov 2016
    Berichten:
    142
    Locatie:
    Hoorn
    het is een POOR MAN vario dus die heb ik niet.FlySky...... ;)
     
  12. Wubbe

    Wubbe

    Lid geworden:
    22 mrt 2005
    Berichten:
    3.353
    Locatie:
    Haarlem
    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
     
  13. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.659
    Locatie:
    Barneveld
    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.
     
    Erik Janssen vindt dit leuk.
  14. Wubbe

    Wubbe

    Lid geworden:
    22 mrt 2005
    Berichten:
    3.353
    Locatie:
    Haarlem
    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.
     
  15. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.659
    Locatie:
    Barneveld
    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.
     
  16. Wubbe

    Wubbe

    Lid geworden:
    22 mrt 2005
    Berichten:
    3.353
    Locatie:
    Haarlem
  17. Erik Janssen

    Erik Janssen

    Lid geworden:
    19 nov 2016
    Berichten:
    142
    Locatie:
    Hoorn
    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: 28 okt 2018
  18. Alex Söntgerath

    Alex Söntgerath

    Lid geworden:
    28 jan 2004
    Berichten:
    662
    Locatie:
    Loon op Zand, Vlieg bij RVB te Kaatsheuvel
    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
     
  19. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.659
    Locatie:
    Barneveld
    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() {}
     
  20. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.659
    Locatie:
    Barneveld
    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.
     

Deel Deze Pagina