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
    Hierbij een draadje voor mensen die interesse hebben in, of vragen over de Poor Mans Vario.

    Wat is de Poor Mans Vario?
    Het is een op Arduino gebaseerde variometer, waarbij het het doel is om tegen zo laag mogelijke kosten een werkende variometer te hebben die zelfstandig kan werken. Dus niet afhankelijk van telemetrie.
    Denk aan hooguit €20 tot €30,- voor een werkende basic vario met ontvanger.

    Op zich is het al leuk om je in Arduino te verdiepen. De laatste keer dat ik iets programmeerde was in Basic op de Commodore 64, dus ik was weer beginner.

    Beter goed gejat, dan slecht verzonnen. Ik heb mijn eerste prototype dan ook gebouwd volgens de instructies in dit draadje

    Foto van Prototype II, op basis van de Arduino Pro Mini
    [​IMG]

    Hieronder de opsomming van de componenten om de poor-mans-vario te maken.

    De Arduino Nano is wellicht het geschiktste model om mee te beginnen. Deze kan direct op 5 volt worden aangesloten en heeft een micro USB poort, zodat je hem direct op je PC kunt aansluiten. Iets lastiger maar kleiner is de Arduino Pro Mini die ik voor mijn tweede prototype heb gebruikt. Die heeft geen USB poort.
    De Arduino Nano kun je oa kopen bij HK of via Ebay

    Vervolgens koop je een druksensor gebaseerd op de MS5611 sensormodule.
    Let op dat je een exemplaar koopt op een printplaatje met een voltage regulator die 5volt ingangsspanning naar 3,3 volt omzet. de sensormodule kan geen 5 volt aan.
    Ik heb deze module gekocht via Ebay
    (mocht deze link inmiddels niet meer werken, zoek dan in Ebay op MS5611

    Een goedkopere sensor is de BOSCH BMP180. Deze reageert niet zo snel als de MS5611, maar het scheelt je ongeveer €10,-. Er is aparte code voor de MS5611 en voor de BMP180 (die ook op zijn tragere voorganger BMP085 werkt). Je vindt ze allebei hieronder.
    Hardwarematig koppel je alle sensoren op dezelfde wijze aan de Arduino. Je kunt ook eerst met een BMP180 sensor beginnen en dan later upgraden naar de MS5611 sensor.

    Ik heb voor 5 volt uitvoeringen gekozen, omdat ik naast de voeding vanuit de ontvanger ook het servokanaal vanuit de ontvanger gebruik om mijn "afroep hoogte" commando aan de Vario te geven. Je moet niet zomaar een 3,3 Volt Arduino een 5 Volt PWM servo signaal op zijn input poort geven. Dan moet je een weerstand plaatsen volgens dit schema.

    Het volgende stukje hardware is een zendertje/ontvangertje combinatie. Ik heb diverse goedkope modules uitgeprobeerd en de superheterodyne werkt bij mij goed.
    Edit: later ben ik gaan testen en kwam er achter dat niet alle even goed werken. Zie hier.

    Je kunt met deze onderdelen en de informatie uit het RC-groups draadje een werkende vario bouwen. Om het geluid uit de ontvanger beter hoorbaar te maken heb ik er nog een 20x audio versterker trapje achter gebouwd obv de TILM386

    Foto: Het ontvanger gedeelte is een combinatie van de superheterodyne ontvanger gesoldeerd op een printje met het audio versterkertje
    [​IMG]


    Ik heb inmiddels de software zelf aangepast, zodat ik ook de hoogte t.o.v. de startlocatie kan laten afroepen door middel van een serie pieptoontjes.
    Hier is de code, zoals ik hem zelf in mijn Vario gebruik. Er zitten nog wat debug regels in, maar die zijn grotendeels met // op non-actief gesteld.

    Let op deze code is alleen voor gebruik met de MS5611 sensor

    Code:
    [FONT=Arial][SIZE=3]
    //**********************************
    //*   MS5611 sensor version    *
    //**********************************
    [/SIZE][/FONT]//[FONT=Arial][SIZE=3][FONT=Verdana][SIZE=2] This is the Poor Mans Vario code for the MS5611 sensor [/SIZE][/FONT][/SIZE][/FONT]
    // All code by Rolf R Bakke, Oct 2012
    // Modified by Hans Meijdam, June 2013. added  altitude feature
    // Modified by Hans Meijdam, November 2013.
    //   Led on Arduino is in sync with audio
    //   Bug fixed that now "Vario Mode" is default mode if no servo channel PWM data is present on pin D3
    //   Improved documentation here and there
    
    #include <Wire.h>
    const byte led = 13;
    unsigned int calibrationData[7];
    unsigned long time = 0;
    float toneFreq, toneFreqLowpass, pressure, 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;
    
    
    void setup()
    {
      Wire.begin();
      Serial.begin(9600); // in case you want to use the included serial.print debugging commands that are currently commented out
      delay(200);
      setupSensor();
      for (int p0=0; p0 <= 100; p0++){
        pressure = getPressure(); // warming up the sensor for ground level setting
      }
      p0 = getPressure(); // Setting the ground level pressure
      lowpassFast = lowpassSlow = pressure;
      pinMode(3, INPUT); // Set our input pins as such for altitude command input from receiver via pin D3
    }
    
    
    void loop()
    {
      pressure = getPressure();
      //  Serial.print(p0);
      //  Serial.print(" ");
      //  Serial.print(pressure);
      altitude = (float)44330 * (1 - pow(((float) pressure/p0), 0.190295));
      //  Serial.print(" ");
      //  Serial.println(altitude);
      lowpassFast = lowpassFast + (pressure - lowpassFast) * 0.1;
      lowpassSlow = lowpassSlow + (pressure - lowpassSlow) * 0.05;
      toneFreq = (lowpassSlow - lowpassFast) * 50;
      toneFreqLowpass = toneFreqLowpass + (toneFreq - toneFreqLowpass) * 0.1;
      toneFreq = constrain(toneFreqLowpass, -500, 500);
      ddsAcc += toneFreq * 100 + 2000;
      if (toneFreq < 0 || ddsAcc > 0)
      {
        tone(2, toneFreq + 510);
        ledOn();  // the Arduino led will blink if the Vario plays a tone, so you can test without having audio connected
      }
      else
      {
        noTone(2);
        ledOff();
      }
      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);
      while (millis() < time);        //loop frequency timer
      time += 20;
    
      ch1 = pulseIn(3, HIGH, 25000); // Read the pulse width of servo signal connected to pin D3
      //  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);
          }
    
        for (int p0=0; p0 <= 40; p0++)
        {
          pressure = getPressure(); // warming up the sensor again, by reading it 40 times
        }
      }
    }
    
    
    long getPressure()
    {
      long D1, D2, dT, P;
      float TEMP;
      int64_t OFF, SENS;
    
      D1 = getData(0x48, 10);
      D2 = getData(0x50, 1);
    
      dT = D2 - ((long)calibrationData[5] << 8);
      TEMP = (2000 + (((int64_t)dT * (int64_t)calibrationData[6]) >> 23)) / (float)100;
      OFF = ((unsigned long)calibrationData[2] << 16) + (((int64_t)calibrationData[4] * dT) >> 7);
      SENS = ((unsigned long)calibrationData[1] << 15) + (((int64_t)calibrationData[3] * dT) >> 8);
      P = (((D1 * SENS) >> 21) - OFF) >> 15;
    
      //  Serial.println(TEMP);
      //Serial.println(P);
    
      return P;
    }
    
    
    long getData(byte command, byte del)
    {
      long result = 0;
      twiSendCommand(0x77, command);
      delay(del);
      twiSendCommand(0x77, 0x00);
      Wire.requestFrom(0x77, 3);
      if(Wire.available()!=3) Serial.println("Error: raw data not available");
      for (int i = 0; i <= 2; i++)
      {
        result = (result<<8) | Wire.read();
      }
      return result;
    }
    
    
    void setupSensor()
    {
      twiSendCommand(0x77, 0x1e);
      delay(100);
    
      for (byte i = 1; i <=6; i++)
      {
        unsigned int low, high;
    
        twiSendCommand(0x77, 0xa0 + i * 2);
        Wire.requestFrom(0x77, 2);
        if(Wire.available()!=2) Serial.println("Error: calibration data not available");
        high = Wire.read();
        low = Wire.read();
        calibrationData[i] = high<<8 | low;
        Serial.print("calibration data #");
        Serial.print(i);
        Serial.print(" = ");
        Serial.println( calibrationData[i] );
      }
    }
    
    
    void twiSendCommand(byte address, byte command)
    {
      Wire.beginTransmission(address);
      if (!Wire.write(command)) Serial.println("Error: write()");
      if (Wire.endTransmission())
      {
        Serial.print("Error when sending command: ");
        Serial.println(command, HEX);
      }
    }
    
    
    void ledOn()
    {
      digitalWrite(led,1);
    }
    
    
    void ledOff()
    {
      digitalWrite(led,0);
    }
    
    

    Let op deze code is alleen voor gebruik met de BMP180 en BMP085 sensor
    Code:
    //**********************************
    //*   BMP085 and BMP180 version    *
    //**********************************
    // 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
    //
    
    #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;
    
    void setup()
    {
      Serial.begin(9600); // start serial for output
      Serial.println("Setting up BMP085");
      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;
      Serial.print(" p0 = ");
      Serial.println(p0);
      pinMode(3, INPUT); // Set our input pins as such for altitude command input from receiver via pin D3
    }
    
    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(" ");
      // Serial.println(altitude);
      lowpassFast = lowpassFast + (flpressure - lowpassFast) * 0.3;
      lowpassSlow = lowpassSlow + (flpressure - lowpassSlow) * 0.15;
      toneFreq = (lowpassSlow - lowpassFast) * 50;
      toneFreqLowpass = toneFreqLowpass + (toneFreq - toneFreqLowpass) * 0.1;
      toneFreq = constrain(toneFreqLowpass, -1000, 1000);
      ddsAcc += toneFreq * 100 + 2000;
    
      if (toneFreq < 0 || ddsAcc > 0)
      {
        tone(2, toneFreq + 510);
        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);
          }
    
        for (int p0=0; p0 <= 20; p0++)
        {
          // warming up the sensor again, by reading it 20 times
          bmp085_read_temperature_and_pressure(&temperature,&pressure);
        }
      }
    }
    
    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);
    }
    
    
    Ook nog even een filmpje gemaakt. Geen spannend filmpje hoor, maar je kunt horen hoe de Poor Mans Vario klinkt (MS5611 sensor) en op een gegeven moment hoor je een lange piep en vier kortere piepjes er achteraan. Dat is het opvragen van de hoogte. De eerste serie geeft de honderdtallen aan, waarbij een lange piep voor het cijfer "nul" staat. De tweede serie heeft een hogere toon en geeft de tientallen aan. In dit geval zijn dat 4 piepjes, dus de hoogte is in dit geval 40 meter, boven het niveau waar de Poor Mans Vario werd ingeschakeld.
    Zodra je hem inschakelt, onthoudt hij de druk van dat moment en ziet dat als veldhoogte vanwaaruit hij de hoogte zal berekenen.



    Nadeel: Poor Mans Vario werkt met hele goedkope zendertjes/ontvangertjes, die je normaal voor bijvoorbeeld het openen van een garagedeur gebruikt.. Deze werken op 433MHz en kennen geen verdere kanalen. Je kunt er praktisch gezien per vlieglocatie dus geen twee tegelijk gebruiken. Ze bestaan voor de Amerikaanse markt op de 315 MHz, maar dan ben je in theorie een zendpiraat :)

    EDIT: Op verzoek even de beschrijving van hoe de vlieghoogte wordt doorgegeven.

    De vario kent twee standen. Default is de "Vario" stand, waarin je kunt horen of je stijgt of daalt. Deze stand staat ook aan als je alleen 5 volt aansluit en geen servo kanaal.

    Als je de vario op een servo kanaal aansluit kan de vario tussen 2 standen worden geschakeld (sluit hem bijv. aan op een servo tester of op je gaskanaal). Nu kun je ook kiezen voor de hoogte afroep. Aan het kanaal kun je het beste een schakelaar toewijzen, die je standaard in de "vario" positie laat staan. Wil je hoogte afroep, dan doe je die schakelaar heel even naar de andere stand en zet hem weer terug. De Vario zal dan éénmaal de hoogte afroep routine doorlopen en daarna vanzelf weer de Vario routine opstarten.

    De hoogte afroep klinkt als volgt:

    Eerst worden de honderdtallen uitgezonden door pieptonen van 900Hz. Een lange toon is "0" en een korte toon is 100 meter. Hoor je dus 3 korte toontjes achter elkaar dan heb je in elk geval 300 meter.

    Vervolgens komen de tientallen met een 1100 Hz toon (klinkt dus hoger) Een lange toon is weer "0" en een korte toon is nu 10 meter. Hoor je dus 7 korte toontjes achter elkaar dan mag je nog 70 meter optellen bij de honderdtallen. Totaal was het in dit voorbeeld 370 meter hoogte.


    De DLG versie heeft als optie de mogelijkheid (bij bestellen aangeven) om beneden de honderd meter ook nog de hoogte in hele meters door te geven. Dat gebeurt dan met een aanvullende serie pieptonen op 1300 Hz. Het idee hierachter is het meten van je werphoogte.

    Nog wat voorbeelden:

    Lange toon 900Hz en lange toon 1100Hz is (0 x 100) + (0 x 10) = 0 meter. Dat is dus wat je hoort als je hem op de grond aan zet.

    Lange toon 900Hz en 5 korte tonen 1100Hz is (0 x 100) + (5 x 10) = 50 meter

    2 korte tonen 900Hz en 8 korte tonen 1100Hz is (2 x 100) + (8 x 10) = 280 meter.

    1 korte toon 900Hz en een lange toon 1100Hz is (1 x 100) + (0 x 10) = 100 meter. enz.



    DLG voorbeelden:

    Lange toon 900Hz, lange toon 1100Hz en lange toon 1300 Hz is (0 x 100) + (0 x 10) + (0 x 1) = 0 meter. Dat is dus wat je hoort als je hem op de grond aan zet.

    Lange toon 900Hz, 5 korte tonen 1100Hz en 7 korte tonen 1300Hz is (0 x 100) + (5 x 10) + (7 x 1) = 57 meter

    2 korte tonen 900Hz en 8 korte tonen 1100Hz is (2 x 100) + (8 x 10) = 280 meter.

    1 korte toon 900Hz en een lange toon 1100Hz is (1 x 100) + (0 x 10) = 100 meter. enz.

    (merk op dat de DLG versie boven de 100 meter dus hetzelfde gaat werken als de full size versie)


    Hans
     
    Laatst bewerkt: 1 jul 2015
  2. loeki

    loeki

    Lid geworden:
    19 mei 2009
    Berichten:
    1.036
    Locatie:
    Groesbeek
    Lijkt me een leuk bouwprojectje!

    Ik blijf dit draadje maar eens volgen!!

    grt, Louis
     
  3. nspierbundel

    nspierbundel

    Lid geworden:
    27 sep 2004
    Berichten:
    1.234
    Je kan je code middels github delen.
    Dan vallen eventueel ook alle wijzigingen worden bijgehouden
     
  4. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.884
    Locatie:
    Barneveld
    Bedankt voor de tip. Ik heb inmiddels de code in het startbericht geplaatst en dat gaat beter dan ik had gedacht.

    Hieronder de Video weer even zichtbaar gemaakt na de overgang naar de nieuwe foromsoftware (HM April 2015)


    (De startpost is nu te lang om te bewerken en geeft een error als ik dat probeer)
     
    Laatst bewerkt: 23 apr 2015
  5. nspierbundel

    nspierbundel

    Lid geworden:
    27 sep 2004
    Berichten:
    1.234
    Laatst bewerkt: 12 nov 2013
  6. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.884
    Locatie:
    Barneveld
    Zodra ik de indruk heb dat het direct code delen via dit forum niet meer goed werkt, omdat er bijvoorbeeld verschillende varianten ontstaan dan kom ik bij je terug. Voor nu lijkt het me leuk om het hier op het forum te houden d.m.v. de "code" feature van het forum zelf.
    Bedankt voor het meedenken :).
     
  7. Wubbe

    Wubbe

    Lid geworden:
    22 mrt 2005
    Berichten:
    3.361
    Locatie:
    Haarlem
    Ik ook!

    Ik heb inmiddels op advies van Hans alle onderdelen besteld bij mijn vrienden van HobbyKing en Ebay. Zodra de onderdelen binnen komen ga ik aan de gang en zal ik de vorderingen in dit draadje posten.

    Als de software groter wordt is een GitHub repository inderdaad wellicht wel handig. Het is nu zo weinig (177 regels) dat copy-paste voldoende lijkt :). Maar ja, dat denk ik nu. Wie weet wat er nog gaat ontstaan...

    Eerste update die ik zou verwachten is het uitspreken van de hoogte. De praktijk moet echter uitwijzen of ik daar nu zo'n behoefte aan zal hebben.
     
  8. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.884
    Locatie:
    Barneveld
    Ben ik al mee bezig geweest. Het interne geheugen van de Arduino is onvoldoende om een audio sample op te slaan. Ik heb toen een SD kaart laten aansturen en uitlezen door de Arduino, waar ik WAV audio samples op had staan. Dat werkt op zich goed naar een luidspreker, maar........helaas blijkt dan dat de OOK (OnOf Key) modulatie van de zender/ontvanger zoveel vervorming genereert, dat de spraak onverstaanbaar wordt. Je hebt dan weer een betere zender/ontvanger nodig die een audio spraak kwaliteit signaal kan verzenden. Om hiermee nog wat te experimenteren heb ik nog wel een goedkoop setje PMR Walkie Talkies liggen, maar in de praktijk werken de piepjes eigenlijk best Als je bijvoorbeeld op 590 meter zit, dan is het wel 5 keer een piepje met lage toon en 9 keer een piepje met hogere toon er achteraan. Dat duurt even. Ik heb nog overwogen om i.p.v. tientallen per 25 meter een piepje te geven. Dan krijg je maximaal 3 piepjes achter je honderdtallen en weet je tot op 25 meter hoe hoog je zit.
     
  9. nspierbundel

    nspierbundel

    Lid geworden:
    27 sep 2004
    Berichten:
    1.234
    En een arduino aan de ontvangende kant?
    Serieel de vario data versturen en lokaal in spraak omzetten
     
  10. Wubbe

    Wubbe

    Lid geworden:
    22 mrt 2005
    Berichten:
    3.361
    Locatie:
    Haarlem
    Een Arduino aan de ontvangende kant in plaats van aan de zend-kant is niet mogelijk, dus dan zou je 2 Arduino's nodig hebben.

    En dan is hij niet Poor Mans meer ;)
     
  11. nspierbundel

    nspierbundel

    Lid geworden:
    27 sep 2004
    Berichten:
    1.234
    Een poor man heeft genoeg aan piepjes ;)

    Goedkope attiny aan zender (2 euro) en arduino aan ontvanger
     
  12. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.884
    Locatie:
    Barneveld
    Goede vraag. Leon vroeg me eerder deze week ook over het direct naar de grond versturen van data van de druksensor.

    Hieronder mijn antwoord aan hem:

    Leon,
    Ik ben hiervan afgeweken om de volgende redenen.

    1)
    Volgens mij kan de luchtdrukmodule niet direct met een zender communiceren. Het I2C protocol moet omgezet worden in een signaal wat draadloos verzendbaar is. Je hebt dan toch een Arduino o.i.d. nodig in het vliegtuig om dat te doen. Als die Arduino toch nodig is, laat hem dan ook de rest van het werk maar uitvoeren. Je zou anders twee Arduino's nodig hebben.

    2)
    Datatransmissie overdracht vergt een veel krachtiger en stabieler verbinding dan een audio signaal.
    Ik heb proeven genomen met dezelfde zender en ontvanger om seriele datatransmissie tussen twee Arduino's tot stand te brengen. Ik heb hiervoor het "virtual wire" protocol gebruikt. Ik haal maximaal een afstand van 30 meter. Als ik dat vergelijk met de reikwijdte tests die ik deed door op de fiets door de straat te rijden en te kijken hoe lang ik mijn audio signaal nog kon horen, dan kwam ik over de grond tot ongeveer 500 meter. Op basis daarvan ben ik gaan bouwen en bij de testvlucht bleek het bereik ruim voldoende voor een modelzweefvliegtuig.

    Ik heb veel gezocht maar geen zender/ontvanger combinatie gevonden die de benodigde stabiele dataverbinding kan regelen en te koop is voor laten we zeggen minder dan 10 euro.
    Voor dat geld koop je wel een setje waarmee je een audio signaal kunt verzenden.

    Concluderend bespaart deze oplossing je een Arduino en werkt met een goedkopere zender/ontvanger.

    Als fallback scenario had ik destijds een setje goedkope PMR Walkie Talkies gekocht. Indien ik die gebruik voor het verzenden van het audio signaal, dan heb ik een bereik van 5 kilometer. Het gewicht van de walkie talkie vind ik echter te hoog en het bleek niet nodig.

    Groeten,
    Hans
     
  13. Wubbe

    Wubbe

    Lid geworden:
    22 mrt 2005
    Berichten:
    3.361
    Locatie:
    Haarlem
  14. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.884
    Locatie:
    Barneveld
    Leuk! Het gaat jou zeker lukken om onder de €30,- te blijven en je hebt nog een paar euro over om het audio signaal iets te versterken, mocht dat nodig zijn.

    Om nog verder de prijs te drukken, heb ik alvast goedkopere Arduino's (Pro Mini en Pro Micro) en druksensoren gekocht (BMP085 in 2 versies en BMP180), voor de volgende prototypes.
    [​IMG]
     
  15. nspierbundel

    nspierbundel

    Lid geworden:
    27 sep 2004
    Berichten:
    1.234
    Morgen ook maar eens verdiepen in die 433 setjes.
    Ns mee klooien, lijkt me leuk.
    Sbus2 is ook al bekend, misschien de vario chip daaraan koppelen (fasstest)
     
  16. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.884
    Locatie:
    Barneveld
    Om eens te testen met dit 2,4GHz setje heb ik ook nog ergens op het to-do lijstje staan. Bij die 433 setjes moet je goed op de + en de - letten. Bij omgekeerd aansluiten gaan ze meteen al stinkend dood :morning: en vraag me niet hoe ik dat weet :oops:

    [​IMG]
     
    Laatst bewerkt: 12 nov 2013
  17. PapaHotel

    PapaHotel

    Lid geworden:
    25 jul 2008
    Berichten:
    728
    Locatie:
    Den Haag
    Wat voor boordjes zijn deze?
     
  18. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.884
    Locatie:
    Barneveld
    Dat zijn deze. Vraag me niet naar het bereik. Wie weet is het maar 10 meter, want ik heb ze nog niet getest.
     
  19. PapaHotel

    PapaHotel

    Lid geworden:
    25 jul 2008
    Berichten:
    728
    Locatie:
    Den Haag
    De demo filmje ziet er bijzonder goed uit. Hoge resolutie maar toch heel stabiel. Bij mij thuis heb ik altijd last van pulserend luchtdrukverschillen (ong. 1hz). Daarom moet ik altijd naar buiten om het goed te kunnen testen.

    Goede experiment om er ook een BMP085 versie van te maken. Ik ben benieuwd of de iets lagere resolutie van de sensor merkbaar effect heeft op de prestaties van de vario.

    ps. Wat zijn de plannen met de 2.4 GHz module?
     
  20. Wubbe

    Wubbe

    Lid geworden:
    22 mrt 2005
    Berichten:
    3.361
    Locatie:
    Haarlem
    En een BMP180 versie. Da's de opvolger van de 085 en heeft zo te zien op de foto een lekker klein bordje :)

    EDIT: Ook hier te bestellen: http://www.vanallesenmeer.nl/Druksensor-Bosch-BMP180
     
    Laatst bewerkt: 12 nov 2013

Deel Deze Pagina