Poor Mans Vario

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

  1. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.884
    Locatie:
    Barneveld
    Mooi gemaakt! Ik ben ook benieuwd naar je code voor het uitlezen op de PC en het tonen van de grafiek.
     
  2. Gert-Jan

    Gert-Jan

    Lid geworden:
    27 sep 2007
    Berichten:
    756
    Locatie:
    Ureterp
    Mooi werk. Ik sta op het punt om te beginnen met de bouw van zo'n vario. Ik deze logger erin meenemen denk ik.

    gj
     
  3. Rob2011

    Rob2011

    Lid geworden:
    24 okt 2009
    Berichten:
    4
    Locatie:
    Waddinxveen
    Ok, hierbij het programma (voor BMP180) met de datalogger code. Verderop leg ik uit hoe je (vrij?) makkelijk van de data een grafiek kan maken.

    Even een korte toelichting op het programma:
    De variabele voor de tijdsinterval voor de logger heet step en staat op een halve seconde. Het programma checkt of er een logger is gemonteerd en het kaartje er in zit. Zo niet is het een gewone PMV geworden.

    Het programma schrijft elke halve seconde op 1 regel de hoogte en de tijd naar de file FLYDATA.TXT. op het micro SC kaartje. Een gewone tekstfile dus. Dat ziet er zo uit voor een willekeurige 3-tal seconden tijdens de start:
    10 130
    14 131
    21 132
    26 133
    31 134
    36 135
    40 137
    De eerste regel geeft een hoogte aan van 10 m na 130 halve seconden. Zes halve seconden later zitten we op 40 m. Omdat er met integers (alleen hele getallen) wordt gewerkt kan je niet met seconden werken omdat je dan 2 hoogten krijgt met dezelfde tijd. En dat is lastig bij het maken van de grafiek.
    Het loggen begint met de regel **** start new flight **** om de vluchten uit elkaar te houden.

    Uiteraard is the sky the limit wat je wil loggen. Je zou de temperatuur erbij kunnen zetten, of de atmosferische druk, of de batterijspanning, of ... Het nut moet je zelf uitmaken.

    Code:
    //*******************************************
    //*      BMP180 version with data logger    *
    //*******************************************
    // This is the Poor Mans Vario code for the cheaper BMP085 and the BMP180 sensor by BOSCH Sensortec
    // Arduino <> Sensor: Connect VCC to VCC and GND to GND, SCL goes to analogue pin 5, SDA to analogue pin4.
    // Servo signal input, connect to Arduino pin D3
    // Audio output to transmitter on pin D2
    // All code by Rolf R Bakke, Oct 2012
    // Modified by Hans Meijdam, June 2013: added altitude feature
    // Modified by Hans Meijdam, November 2013: Sensor routine created for BMP085 and BMP180.
    // Modified by Hans Meijdam, July 2014: BETA Version
    // Modified by Rob Bootsman, March 2016: added data logger
    // - Switch to select if whole meters are called out if below 100 meters altitude
    // - Deadband to make vario silent if no certain climb or sink level is achieved
    // - Negative altitude becomes now indicated as if it was positive altitude
    //
    //
    //  ****** 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)
    
    // ****** Optional SD card datalogger *****
    // Log the altitude every <step> to an SD card using the SD library.
    // SD card attached to SPI bus as follows:
    // ** MOSI - pin 11
    // ** MISO - pin 12
    // ** CLK - pin 13
    // ** CS - pin 4
    // ** don't use pin 10
    // When you use the Ethernet Shield, CS is pin 4. Note that even if it's not
    // used as the CS pin (in this case), the hardware CS pin (10 on most Arduino boards,
    // 53 on the Mega) must be left as an output or the SD library functions will not work.
    const int chipSelect = 4;
    int step = 500;              // timing interval logger 1/2 sec
    int SDcard = 0;              // switch for datalogger
    #include <SD.h>
    #include <SPI.h>
    
    #include "Wire.h"
    const byte led = 13;
    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;
    #define I2C_ADDRESS 0x77
    const unsigned char oversampling_setting = 3;   //oversamplig for measurement
    const unsigned char pressure_waittime[4] = {
      5, 8, 14, 26 };
    //Sensor parameters taken from the BMP085 datasheet
    int ac1, ac2, ac3;
    unsigned int ac4, ac5, ac6;
    int b1, b2, mb, mc, md;
    int temperature;
    long pressure;
    int analogpin1 = 0;
    unsigned long previousMillis = 0;
    unsigned long currentMillis = 0;
    File myFile;
    
    void setup()
    {
      //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(A1, HIGH);     // gnd voor BMP
      //digitalWrite(A2, HIGH);     // gnd voor BMP
      //digitalWrite(12, LOW);      //Low end potmeter to 0 volt
      Serial.begin(9600);           // start serial for test output
      //analogpin1 = analogRead(1);             // read the input pin A1 potmeter value
      //Serial.print("Analog pin A0 value: ");
      //Serial.println(analogpin1);
      Serial.println("Setting up BMP180");
      Wire.begin();
      bmp085_get_cal_data();
      bmp085_read_temperature_and_pressure(&temperature,&pressure);
      flpressure=pressure;// move long type pressure into float type flpressure
      p0 = lowpassFast = lowpassSlow = flpressure;
    
      pinMode(3, INPUT); // Set our input pins as such for altitude command input from receiver via pin D3
     
      currentMillis = millis();
      previousMillis = currentMillis;
    
      // Is there a SD card connected?
      Serial.print("Initializing SD card...");
      // make sure that the default chip select pin is set to output, even if you don't use it:
      pinMode(10, OUTPUT);
      // check if the card is present and can be initialized:
      if (!SD.begin(chipSelect)) {
        Serial.println("Card not present"); 
        SDcard = 0;                                       // don't log the data
      }
      else {
        Serial.println("card initialized.");
        SDcard = 1;
        // schrijf data naar SD
        myFile = SD.open("flydata.txt", FILE_WRITE);
        myFile.println(" ");                            // to separate the data-output
        myFile.println("**** start new flight ****");
        myFile.close();             
      }
    }
    
    void loop()
    {
      bmp085_read_temperature_and_pressure(&temperature,&pressure);
      //Serial.print(temperature,DEC);  //
      //Serial.print(" ");  //
      //Serial.print(pressure,DEC);  //
      //Serial.print(" ");  //
      flpressure = pressure;// move long type pressure into float type flpressure
      altitude = (float)44330 * (1 - pow(((float) flpressure/p0), 0.190295));
      //Serial.print("altitude = ");                  
      //Serial.println(altitude); 
     
      // log the data to the SDcard every step
      if (SDcard == 1) {                                 
         currentMillis = millis();
         if (currentMillis - previousMillis > step ) {    // write altitude every step
           myFile = SD.open("flydata.txt", FILE_WRITE);   // open the file
           myFile.print(altitude); 
           myFile.print("  "); 
           myFile.println(millis()/step);                         
           myFile.close();                                // close the file                                     
           //Serial.print("Altitude = ");                  
           //Serial.print(altitude); 
           //Serial.print("   Tijd = ");
           //Serial.println(millis()/step);
           previousMillis = currentMillis;
         }  
      }
     
      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)    // dbpotm aanwezig
      {
        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(2, toneFreq + 550); 
          ledOn();  // the Arduino led will blink if the Vario plays a tone, so you can test without having audio connected
        }
      }
      else
      {
        noTone(2);
        ledOff();
      }
      while (millis() < time);        //loop frequency timer
      time += 20;
      int ones = altitude%10;
      int tens = (altitude/10)%10;
      int hundreds = (altitude/100)%10;
      int thousands = (altitude/1000)%10;
    // Serial.print ("thousands: ");
    //   Serial.println   (thousands);   
    //   Serial.print ("hundreds:  ");
    //   Serial.println   (hundreds); 
    //   Serial.print ("tens:      ");
    //   Serial.println   (tens); 
    //   Serial.print ("ones:      ");
    //   Serial.println   (ones);   
      ch1 = pulseIn(3, HIGH, 25000); // Read the pulse width of servo signal connected to pin D3
    //  Serial.print (ch1);
    //  if(ch1>1000){
    //      Serial.println("Left Switch: Engaged");
    //    }
    //     if(ch1<1000){
    //       Serial.println("Left Switch: Disengaged");
    //     }
      if((map(ch1, 1000,2000,-500,500)) > 0) // interpret the servo channel pulse, if the Vario should beep altitude or send vario sound
      {
        noTone(2); // create 750 ms of silence, or you won't hear the first altitude beep
        ledOff();
        delay(750);
    
        if(hundreds == 0)
        {
          tone(2,900);                //long duration tone if the number is zero
          ledOn();
          delay(600);
          noTone(2);
          ledOff();
        }
        else
          for(char a = 0; a < hundreds; a++)          //this loop makes a beep for each hundred meters altitude
          {
            tone(2,900); // 900 Hz tone frequency for the hundreds
            ledOn();
            delay(200);
            noTone(2);
            ledOff();
            delay(200);
          }
        delay(750);                            //longer delay between hundreds and tens
    
        if(tens == 0)
        {
          tone(2,1100);                //long pulse if the number is zero
          ledOn();
          delay(600);
          noTone(2);
          ledOff();
        }
        else
          for(char a = 0; a < tens; a++)          //this loop makes a beep for each ten meters altitude
          {
            tone(2,1100); //1100 Hz tone frequency for the tens
            ledOn();
            delay(200);
            noTone(2);
            ledOff();
            delay(200);
          }
    
        if (altitude_per_meter == 1 && hundreds == 0)
        {
          delay(750);                            //longer delay between tens and ones
    
          if(ones == 0)
          {
            tone(2,1300);                //long pulse if the number is zero
            ledOn();
            delay(600);
            noTone(2);
            ledOff();
          }
          else
            for(char a = 0; a < ones; a++)          //this loop makes a beep for each meter altitude
            {
              tone(2,1300); //1300 Hz tone frequency for the ones
              ledOn();
              delay(200);
              noTone(2);
              ledOff();
              delay(200);
            }
        } 
      }
    }
    
    void bmp085_read_temperature_and_pressure(int* temperature, long* pressure) {
      int ut= bmp085_read_ut();
      long up = bmp085_read_up();
      long x1, x2, x3, b3, b5, b6, p;
      unsigned long b4, b7;
    
      //calculate the temperature
      x1 = ((long)ut - ac6) * ac5 >> 15;
      x2 = ((long) mc << 11) / (x1 + md);
      b5 = x1 + x2;
      *temperature = (b5 + 8) >> 4;
    
      //calculate the pressure
      b6 = b5 - 4000;
      x1 = (b2 * (b6 * b6 >> 12)) >> 11;
      x2 = ac2 * b6 >> 11;
      x3 = x1 + x2;
    
      if (oversampling_setting == 3) b3 = ((int32_t) ac1 * 4 + x3 + 2) << 1;
      if (oversampling_setting == 2) b3 = ((int32_t) ac1 * 4 + x3 + 2);
      if (oversampling_setting == 1) b3 = ((int32_t) ac1 * 4 + x3 + 2) >> 1;
      if (oversampling_setting == 0) b3 = ((int32_t) ac1 * 4 + x3 + 2) >> 2;
    
      x1 = ac3 * b6 >> 13;
      x2 = (b1 * (b6 * b6 >> 12)) >> 16;
      x3 = ((x1 + x2) + 2) >> 2;
      b4 = (ac4 * (uint32_t) (x3 + 32768)) >> 15;
      b7 = ((uint32_t) up - b3) * (50000 >> oversampling_setting);
      p = b7 < 0x80000000 ? (b7 * 2) / b4 : (b7 / b4) * 2;
    
      x1 = (p >> 8) * (p >> 8);
      x1 = (x1 * 3038) >> 16;
      x2 = (-7357 * p) >> 16;
      *pressure = p + ((x1 + x2 + 3791) >> 4);
    }
    
    unsigned int bmp085_read_ut() {
      write_register(0xf4,0x2e);
      delay(5); //longer than 4.5 ms
      return read_int_register(0xf6);
    }
    
    void bmp085_get_cal_data() {
      //Serial.println("Reading Calibration Data");
      ac1 = read_int_register(0xAA);
      //Serial.print("AC1: ");
      //Serial.println(ac1,DEC);
      ac2 = read_int_register(0xAC);
      //Serial.print("AC2: ");
      //Serial.println(ac2,DEC);
      ac3 = read_int_register(0xAE);
      //Serial.print("AC3: ");
      //Serial.println(ac3,DEC);
      ac4 = read_int_register(0xB0);
      //Serial.print("AC4: ");
      //Serial.println(ac4,DEC);
      ac5 = read_int_register(0xB2);
      //Serial.print("AC5: ");
      //Serial.println(ac5,DEC);
      ac6 = read_int_register(0xB4);
      //Serial.print("AC6: ");
      //Serial.println(ac6,DEC);
      b1 = read_int_register(0xB6);
      //Serial.print("B1: ");
      //Serial.println(b1,DEC);
      b2 = read_int_register(0xB8);
      //Serial.print("B2: ");
      //Serial.println(b2,DEC);
      mb = read_int_register(0xBA);
      //Serial.print("MB: ");
      //Serial.println(mb,DEC);
      mc = read_int_register(0xBC);
      //Serial.print("MC: ");
      //Serial.println(mc,DEC);
      md = read_int_register(0xBE);
      //Serial.print("MD: ");
      //Serial.println(md,DEC);
    }
    
    long bmp085_read_up() {
      write_register(0xf4,0x34+(oversampling_setting<<6));
      delay(pressure_waittime[oversampling_setting]);
    
      unsigned char msb, lsb, xlsb;
      Wire.beginTransmission(I2C_ADDRESS);
      Wire.write(0xf6); // register to read
      Wire.endTransmission();
    
      Wire.requestFrom(I2C_ADDRESS, 3); // read a byte
      while(!Wire.available()) {
        // waiting
      }
      msb = Wire.read();
      while(!Wire.available()) {
        // waiting
      }
      lsb |= Wire.read();
      while(!Wire.available()) {
        // waiting
      }
      xlsb |= Wire.read();
      return (((long)msb<<16) | ((long)lsb<<8) | ((long)xlsb)) >>(8-oversampling_setting);
    }
    
    void write_register(unsigned char r, unsigned char v)
    {
      Wire.beginTransmission(I2C_ADDRESS);
      Wire.write(r);
      Wire.write(v);
      Wire.endTransmission();
    }
    
    char read_register(unsigned char r)
    {
      unsigned char v;
      Wire.beginTransmission(I2C_ADDRESS);
      Wire.write(r); // register to read
      Wire.endTransmission();
    
      Wire.requestFrom(I2C_ADDRESS, 1); // read a byte
      while(!Wire.available()) {
        // waiting
      }
      v = Wire.read();
      return v;
    }
    
    int read_int_register(unsigned char r)
    {
      unsigned char msb, lsb;
      Wire.beginTransmission(I2C_ADDRESS);
      Wire.write(r); // register to read
      Wire.endTransmission();
    
      Wire.requestFrom(I2C_ADDRESS, 2); // read a byte
      while(!Wire.available()) {
        // waiting
      }
      msb = Wire.read();
      while(!Wire.available()) {
        // waiting
      }
      lsb = Wire.read();
      return (((int)msb<<8) | ((int)lsb));
    }
    
    
    void ledOn()
    {
      digitalWrite(led,1);
    }
    
    
    void ledOff()
    {
      digitalWrite(led,0);
    }
    Hoe maak je de hoogtegrafiek?

    Dat kan vrij simpel met Excel, wat iedereen wel op z'n pc heeft staan. Eerst moet echter de datafile van de microSD naar de pc. Als je - zoals ik - geen SDslot op je pc hebt, kan je daarvoor dit apparaat aanschaffen. Ja, ik weet het, weer 70 centen armer.
    Vervolgens start je Excel op en open de file FLYDATA.TXT.
    De wizard van Excel ziet dat je een tekstfile wil importeren, geef aan dat de 2 kolommen zijn gescheiden door een spatie, controleer de kolommen en druk een paar keer op volgende. Nu staat als het goed is de hoogte en de tijd netjes in 2 kolommen A en B in je spreadsheet. Schoon de zaak een beetje op door de tekst ***start new flight*** weg te halen en de rijen met nullen voor de hoogte.

    Klik nu op de grafieken wizard, kies voor lijn.
    Bij stap 2 van de wizard ga je naar het tabblad 'reeks'. Daar zie je reeks1 en reeks2. Je verwijdert reeks 2 en kies bij 'labels categorieas(X)' de kolom B met de tijdwaarden.
    Druk een paar keer op volgende en geef een titel en as-namen op en je ziet dat de grafiek steeds mooier wordt. Met rechts klikken op de grafieklijn of op de assen kan je nog allerlei zaken aanpassen.

    En nu maar hopen dat je ongeveer dezelfde versie van Excel hebt ... Succes!
     

    Bijgevoegde bestanden:

    • ex1.jpg
      ex1.jpg
      Bestandsgrootte:
      47,1 KB
      Weergaven:
      336
    • ex2.jpg
      ex2.jpg
      Bestandsgrootte:
      44,8 KB
      Weergaven:
      334
    • ex3.jpg
      ex3.jpg
      Bestandsgrootte:
      41,9 KB
      Weergaven:
      339
  4. Gert-Jan

    Gert-Jan

    Lid geworden:
    27 sep 2007
    Berichten:
    756
    Locatie:
    Ureterp
    Rob

    Het kost misschien iets maar is wel heel makkelijk. Zelf gebruik ik een sd kaartje waar ik mijn mini in kan steken. een soort houder

    gj
     
  5. Gert-Jan

    Gert-Jan

    Lid geworden:
    27 sep 2007
    Berichten:
    756
    Locatie:
    Ureterp
    Vanmorgen stap 1 gezet. De code in het bordje gedownload. Nu stap 2 zo efficiënt mogelijk het boeltje aansluiten.

    gj
     
  6. wim

    wim

    Lid geworden:
    28 aug 2002
    Berichten:
    112
    Locatie:
    Meppel
    Hallo allemaal.
    Hans ik ben super tevreden werkt nu prima nogmaals bedankt.
    Ik had wel last van inslag van me zender maar door het plaatsen van een ferrietkern
    Was dat verholpen.
    Het zelfde heb ik gedaan in de zwever had last van een dip in de spanning.
    Hier bij Paar foto’s
    [​IMG] [​IMG] [​IMG] [​IMG]
     
  7. calmatosport

    calmatosport

    Lid geworden:
    16 okt 2007
    Berichten:
    1.186
    Locatie:
    Delft
    Wat een top idee is de PMV!

    Om te proberen heb ik eerst alles even uitgezet op een breadbord. Ik heb 2 BMP180 sensoren geprobeerd (op Vin 5V) maar die geven geen reactie. De BMP085 die ik nog had slingeren doet het wel (op 3,3V) met veel storing maar dat komt waarschijnlijk door de zender die te dichtbij staat.

    Ook netjes gesoldeerd doet de BMP180 niks en de serial geeft de melding:
    Setting up BMP085
    Reading Calibration Data

    Heeft iemand hetzelfde meegemaakt?

    Ook gebruik ik een Nano 3.0, waarbij de 5V pin maar 3,7V geeft als hij wordt gevoed door 5V vanwege de spanningsregelaar, dus de zender maar verhuisd naar Vin.
     
  8. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.884
    Locatie:
    Barneveld
    Probeer even een I2C scanner sketch te draaien om te kijken of je sensor wordt gevonden.
     
  9. calmatosport

    calmatosport

    Lid geworden:
    16 okt 2007
    Berichten:
    1.186
    Locatie:
    Delft
    De I2C scanner lijkt vast te lopen. Te zien aan het script zou hij ook een melding moeten geven als er niets gevonden wordt.
    Mijn (geniuine) Mega doet precies hetzelfde.
    Ik begin te vermoeden dat beide BMP180 sensoren een DOA zijn of dat ze beschadigd zijn op de breadboard door slechte verbindingen?

    Wel heb ik hem werkend gekregen met de BMP085. Het is niet ideaal maar ik ga hem toch inbouwen in m'n zwever om een beetje mee te prutsen.

    Raden jullie de bijgeleverde spiraal antennes aan of een 17,2cm koperdraadje?
     
  10. Jupa

    Jupa

    Lid geworden:
    22 aug 2016
    Berichten:
    1
    Locatie:
    Hilversum
    Hallo, setje gebouwd met een Nano en een BMP180. De vario werkt op de werkbank... :) Dat is stap1. Ik dacht dat ik in dit draadje ergens gelezen had dat iemand ook een versie had die de accu spanning kon meten en de ondergrens van een 3S akku 10.8 volt als alarm kon door sturen ipv vario signaal. Als de akku leeg is is de vario toch niet meer nodig.......:) 2 x door gelezen maar kan het niet meer vinden. Iemand een idee of ik het over het hoofd heb gezien of het me verbeeld. Zal de ingangsspanning met een spanning deler op een analoge poort moeten zetten A3 en de code moeten aanpassen. Zover was ik al.....

    Paco
     
  11. Hajo.M

    Hajo.M

    Lid geworden:
    1 nov 2015
    Berichten:
    276
    Locatie:
    Stadskanaal
    Na contact te hebben opgenomen met Hans had ik snel de onderdelen voor de vario in huis.
    Na alles gesoldeerd te hebben werkte het niet, het zendergedeelte in ieder geval niet, ontvanger deed het prima.
    Hans gecontracteerd en ik mocht hem opsturen, toen bleek dat m'n soldeer talent in de jaren behoorlijk achteruit was gegaan.
    Hans heeft alles gecontroleerd en hersteld ( zoveel service krijg je niet veel)
    Thuis uitgeprobeerd (zonder luidspreker alleen met oortje de oren zijn ook slecht..:) en alles werkt perfect nu.. gelijk een nieuwe zwever besteld en kan dus precies nagaan of ik in de thermiek zit..
     
  12. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.884
    Locatie:
    Barneveld
    Bouwinstructie Poor Mans Vario ontvanger versie 2

    Voor de ontvanger van de Poor Mans Vario heb ik een dubbelzijdig printje laten maken, waardoor het bouwen veel simpeler is. Hieronder een foto van het printje en de Versie 2 ontvanger.
    [​IMG]

    De benodigde onderdelen om de ontvanger te bouwen zijn verder niet gewijzigd.
    [​IMG]

    Bij het bouwen van de ontvanger is het handig om de platste onderdelen eerst te solderen en dan de hoogte in te werken. Dan vallen de onderdelen er niet uit als je het printje omdraait om ze vast te solderen.

    Stap 1: Soldeer de weerstand
    [​IMG]

    stap 2: Soldeer de LM386. Let op dat je hem er niet ondersteboven in soldeert. Het halve rondje in zijn dak zit op dezelfde plek als het getekende halve rondje op het printje. Let op: dit is een component met meerdere pootjes. Soldeer eerst één pootje vast en kijk dan of het component niet scheef zit en of het vlak op de print ligt. Nu kun je nog de ene soldering weer zacht maken en het component bewegen tot hij goed zit. Pas als je zeker weet dat hij goed zit soldeer je de overige pootjes vast.
    [​IMG]

    Stap 3: Soldeer de oortelefoon connector, de rechte pinheaders en de condensator. Ook dit zijn weer componenten met meerdere pootjes. Let op: soldeer de pinheaders met hun korte kant in de print, het langste stuk steekt naar boven uit. Let op: Bij het solderen van de condensator moet je zijn langste pootje in het gaatje met de " + " solderen.
    [​IMG]

    Stap 4: Soldeer de aan-uit schakelar. Hierbij kan een wasknijper helpen om hem mooi vlak te houden en aangeschoven tegen de 6 pinheaders. Het maakt niet uit bij de schakelaar wat onder of boven is.
    [​IMG]

    Uiteindelijk moet de schakelaar zo vastgesoldeerd worden:
    [​IMG]

    Stap 5: Ontvangermodule solderen
    Pak nu de ontvangermodule en de 4 gebogen pinheaders en controleer goed met onderstaande foto of je de gebogen pinheaders er correct in hebt gestoken, voor je ze vast soldeert (ze kunnen er op 4 manieren in worden gestoken en er is er maar één goed).
    [​IMG]

    Stap 6: Ontvangermodule op de print solderen. Check ook weer na één pootje solderen of hij een beetje recht zit, alvorens de andere 3 vast te zetten.
    [​IMG]

    Stap 6 Potmeter en antenne solderen. Dit zijn de laatste 2 componenten die gesoldeerd moeten worden. Als antenne kan de bijgeleverde spiraal worden gebruikt of een 17,2cm lang draadje. Ik heb soms de indruk dat een draadje iets beter ontvangt, maar dan moet het wel gestrekt zijn.
    [​IMG]

    Stap 7: Luidspreker solderen.
    [​IMG]

    Nu ben je klaar om de ontvanger aan te sluiten. Op onderstaande foto zie je dat de speaker rechts wordt aangesloten, waarbij het niet uitmaakt welk plugje waar. Aan de linkerkant zie je de aansluiting van de batterij. Hierbij zit de plus (rode draad) in het midden en de min (zwarte draad) zit aan de rechterkant. Hier maakt de oriëntatie van de plug natuurlijk wel uit.
    [​IMG]

    Mocht je de zender nog niet hebben gebouwd, dan kun je de ontvanger testen met bijvoorbeeld een afstandbedienbare autosleutel. Als je een oortelefoon aansluit, schakelt de speaker uit.
     
    Berrie vindt dit leuk.
  13. Halmar

    Halmar

    Lid geworden:
    14 apr 2003
    Berichten:
    1.066
    Locatie:
    Amersfoort
    Hier een paar plaatjes van mijn setup. Heb een houten kastje gemaakt voor de ontvanger, waar een enkele LiIon cel (3,6V) in zit.

    In mijn Radian XL de vario ingebouwd. Ik heb met smeltlijm de beide zeiden van de krimpkous dicht gemaakt, en hier een slangetje in zitten. Nu is het dus mogelijk om een TE buis aan te sluiten.

    Eerst een paar keer gevlogen zonder TE buis, erg tevreden met deze variometer. Doet het erg goed. Kan wel goed merken als je snelheid oppakt of optrekt, het geluid is af en toe wat zenuwachtig. Ook niet zo raar zonder compensatie, en door de ventilatiegaten in de romp zal de druk daar ook niet heel stabiel zijn. Met TE buis werd dit veel beter. Compensatie lijkt ook echt te werken, totdat je de snelheid er te ver uit trekt, in de buurt van overtrek klopt er niets meer van, maar das niet erg. Gewoon rondvliegend geeft hij met TE buis een veel beter beeld van wat er in de lucht gebeurt. Al met al met de vario een heel aantal vluchten van rond een uur gemaakt, langste was goed 2 uur met slechts 41 seconden motorloop :). Dan begin je toch wel lichamelijke klachten te krijgen, en word het tijd om te landen.
    Ik heb er 'lange' rechte antennes op gemaakt, moet een wat beter bereik geven. Of dit echt nodig was weet ik niet, maar als de 2,6 meter Radian heeel erg klein is doet de vario het nog prima!
    Nog wel een belangrijke opmerking. Door het toevoegen van de TE buis klopt de hoogtemeting niet meer. Achter de buis word immers een lagere druk gemeten. Bij 16km/h is dit zo'n 100 meter te hoog, bij 40km/h is dit al 500 meter te hoog. Mits het een goede TE buis is natuurlijk.

    Al met al een erg mooi apparaatje Hans!

    Groet Halmar
     
    Berrie vindt dit leuk.
  14. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.884
    Locatie:
    Barneveld
    Leuk dat het het gelukt is met de TE buis. Ik was al benieuwd of en hoe dat zou gaan werken, toen we daar laatst over spraken. Wat me verrast is de enorme afwijking in hoogte al bij 40km per uur en dat de TE buis dan toch goed werkt. Ik zou bij zo'n afwijking verwachten dat de vario compleet onbruikbaar is, omdat de minste of geringste snelheidsverandering een onmiddellijke reactie geeft op de vario toon. Als ik mijn vliegtuig 2 meter optil om het weg te gooien, dan hoor ik m'n vario al reageren. Als je in dode lucht een beetje aanduikt en je zet 20 meter hoogte om in extra snelheid, dan zou de vario met de juiste TE buis toch geen drukverschil (= hoogteverschil) moeten meten?

    Of andersom. Jij vliegt op 50 echte meters hoogte met een snelheid van 40 km/u in dode lucht (jouw vario denkt dan dat hij op 50+500=550 meter vliegt). Je trekt de neus iets omhoog, waardoor de snelheid langzaam terugloopt tot 16 km/uur. Je zult die 24km/u snelheid hebben omgezet in extra hoogte en vliegt nu wellicht op 110 echte meters hoogte (60 meter hoogte winst ten koste van snelheid). Jouw vario denkt nu op 110 +100 =220 meter te vliegen. Tijdens de klim heeft hij dus een forse daaltoon laten horen omdat hij denkt van 550 naar 220 meter te zijn gegaan. Dan werkt je TE Buis toch veel te sterk? Of maak ik nu ergens een denkfout?
     
  15. flymax

    flymax PH-SAM

    Lid geworden:
    11 jan 2009
    Berichten:
    2.064
    Locatie:
    Onder de rook van Zwolle
    Halmar, heb je een TE buis gekocht of heb je er zelf een gemaakt?
     
  16. Rick NL

    Rick NL PH-SAM

    Lid geworden:
    18 apr 2008
    Berichten:
    4.048
    Locatie:
    Gouda
    Vliegtuigen worden vaak uitgerust met een Statische- en een Pitot buis om hoogte en vliegsnelheid te bepalen.
    De statische buis heeft dwars gaatjes op enige afstand van de kop en meet de statische druk ter plaatse.
    De Pitot buis met het gaatje voorin op de kop, meet ter plaatse de totale druk, dwz, de statische + de dynamische druk (½*rho*V²).
    Meestal worden beide buizen gecombineerd in een Pitot-Statische buis.

    Door het verschil tussen de totale en de statische druk is dus de dynamische druk en maakt het mogelijk de snelheid te bepalen.
    De statische druk geeft een indicatie van de hoogte, omdat deze druk afneemt met de hoogte volgens ongeveer 11.7 Pa per meter op zeeniveau.

    Een TEK Probe is zodanig geconstrueerd dat deze niet zoals de Pitot de totale druk meet (Pstat + ½*rho*V²) maar juist Pstat - ½*rho*V².
    Deze TEK probe meet daarmee de totale energie van het toestel (potentieële + kinetische energie). Bij normale vlucht neemt deze af terwijl bij vliegen in thermiek deze toeneemt. Bij aanduiken en of up trekken blijft deze praktisch gelijk aan de horizontale vlucht.

    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.

    De invloed is echter niet zo groot als Halmar aangeeft. Hij zit een factor 100 fout. Waarschijnlijk gerekend met hPa ipv Pa.
    16 km/h is 4.44 m/s met rho = 1.225 op zeeniveau levert dit een waarde voor ½*rho*V² van 12.10 Pa wat neerkomt op 1.03 meter.
    40 km/h is 11.11 m/s met rho = 1.225 op zeeniveau levert dit een waarde voor ½*rho*V² van 75.62 Pa wat neerkomt op 6.46 meter.

    Net zoals je met een normale P-S buis de hoogte behoort te meten met de statische gaatjes zou je bij een TEK Probe voor een echt zuivere hoogtemeting dus een extra statische buis moeten nemen.
    Of gewoon zoals vaak in modellen gebeurt de druk in de romp nemen als statische druk, met alle onzekerheden over de juistheid van deze meting omdat je slechts met toeval daar de echte statische druk meet.
     
  17. Niek

    Niek PH-SAM Forum veteraan

    Lid geworden:
    21 aug 2002
    Berichten:
    8.779
    Locatie:
    Almere
    Wasda een TE buis? Ik heb een erg onnauwkeurige vario meter, die na aansluiten naar veld al op 20 m zit voor de start.. En bij de landing nog ergens in de stratosfeer blijft hangen...
     
  18. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.884
    Locatie:
    Barneveld
    Het zou me verbazen als een TE buis dat op gaat lossen. Hier wordt tevens uitgelegd wat een TE buis is (m.n. aangehecht artikel van NASA)
     
    Laatst bewerkt: 6 sep 2017
  19. Rick NL

    Rick NL PH-SAM

    Lid geworden:
    18 apr 2008
    Berichten:
    4.048
    Locatie:
    Gouda
    Dan is er wat goed mis Niek.
    Leiding verstopt? Gaatje(s) dicht? Sensor kapot?
    Kan idd niet door het type buis komen, maar door een van de andere mogelijkheden.
     
  20. Rick NL

    Rick NL PH-SAM

    Lid geworden:
    18 apr 2008
    Berichten:
    4.048
    Locatie:
    Gouda
    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.
     

Deel Deze Pagina