Точное измерение высоты с помощью BMP180

Тема в разделе "Arduino & Shields", создана пользователем Danil_2002, 13 авг 2019.

  1. Danil_2002

    Danil_2002 Гик

    Тоже думал по этому поводу. Но b707 озвучил причину почему я отказался.
     
  2. noevile

    noevile Гик

    радиовысотомер на пересечёнке и холма/горах подводить будет. а с джипиэс это шутка была. я у аэропортовских обитателей как-то спрашивал как они вообще ориентируются по барометрическим приборам. сказали что прямо перед вылетом куда-то там забивают показания давления над уровнем моря, получают уже свою высоту какую им надо и дальше уже летят куда им надо с погрешностью +/- километр.
     
  3. DetSimen

    DetSimen Guest

    с таким же успехом можно мерить высоту китайской лазерной рулеткой.
     
  4. noevile

    noevile Гик

    да нормально будет с барометром. вон самолёты летают и ничего, как-то летают. и твой цепелин покорит просторы воздушного пространства.
     
  5. Danil_2002

    Danil_2002 Гик

    Он то взлетит. Просто я хотел сделать удержание высоты, а если показания каждую секунду меняются в пределах метра...
     
  6. noevile

    noevile Гик

    фильтрацию сигнала делай. и вообще понаблюдай в монитор порта на плоттере что там происходит с барометром. я свой бме280 фильтрую раз в секунду и получаю прекрасную сглаженную картину.
     
  7. b707

    b707 Гуру

    введите в алгоритм гистерезис метра в три
     
    DetSimen и Danil_2002 нравится это.
  8. Danil_2002

    Danil_2002 Гик

    Под фильтраций имеется в виду усреднение значений?
     
  9. noevile

    noevile Гик

    да. а то показания скачут етить колотить. я как-то псевдо-предсказатель погоды тестировал относительно изменения атмосферного давления. вот тогда и потестил альтиметр.
     
    Danil_2002 нравится это.
  10. Danil_2002

    Danil_2002 Гик

    Окей, посмотрю тогда и про гистерезис, никогда его не использовал. Выберу оптимальный вариант
     
  11. Danil_2002

    Danil_2002 Гик

    Код (C++):
    #include <SFE_BMP180.h>
    #include <Wire.h>

    SFE_BMP180 pressure;

    double Tsum = 0, Psum = 0; // Арифметическая сумма
    double T = 0, P = 0; // Значения с датчика
    double Tfixed, Pfixed; // Отфильтрованные значения

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

    void loop()
    {
      PT_value();
      Serial.print("T: ");
      Serial.println(Tfixed);
      Serial.print("P: ");
      Serial.println(Pfixed);
    }
    void BMP_measurement()
    {
      char status;
      status = pressure.startTemperature();
      if (status != 0)
      {
        delay(status);
        status = pressure.getTemperature(T);
        if (status != 0)
        {
          status = pressure.startPressure(3);
          if (status != 0)
          {
            delay(status);
            status = pressure.getPressure(P,T);
          }  
        }
      }
    }
    void PT_value()
    {
      for (uint16_t st = 0; st < 20; st++)
      {
        BMP_measurement();
        Psum += P;
        Tsum += T;
      }
      Pfixed = Psum/20;
      Tfixed = Tsum/20;
      Psum = 0;
      Tsum = 0;
    }
     
    Вот результат:
    T: 24.97
    P: 997.84
    T: 24.97
    P: 997.83
    T: 24.97
    P: 997.83
    T: 24.97
    P: 997.79
    T: 24.98
    P: 997.77
    T: 24.97
    P: 997.76
    T: 24.97
    P: 997.75

    С этим уже можно работать
     
  12. noevile

    noevile Гик

    с единицами измерения только не напутай. насколько я помню там гептопаскали должны быть, а не мм/рт.ст.
    да и просто в плоттер выведи давление и посмотри критичность колебаний при усреднении. заодно прочитай в мануале на датчик время измерения. а то по программе 20 циклов измерения, но вполне может быть так, что достаточно брать значение 10 раз через 100мсек. (это я к тому что пока идёт выборка 20 раз остальная часть программы не выполняется и что там будет происходить с цепелином пока идёт усреднение контроллер знать не будет. ну это так. для размышления больше информация.) ну и сразу выводи значение уже высоты в плоттер и смотри как сильно скачет в статическом положении. как-то так.
     
  13. Danil_2002

    Danil_2002 Гик

    Вот я тоже пугаюсь 20 циклов. Думаю может сделать отдельный МК для этого, например Atmega8? и чтобы он передавал данные через USART
     
  14. b707

    b707 Гуру

    а что мешает между отдельными циклами не "спать". а выполнять остальную программу? - и никакой второй МК не нужен
     
    Danil_2002 нравится это.
  15. Danil_2002

    Danil_2002 Гик

    Ну как вариант
     
  16. parovoZZ

    parovoZZ Гуру

    надо ответить себе на несколько вопросов:
    1. какой коридор по высоте на эшелоне для самолетов?
    2. альтиметр, основанный на барометре, калибруется по давлению в точке приземления самолета?
    3. самолеты сажаются до касания в автоматическом режиме по GNSS или по другим высотомерам?
     
  17. noevile

    noevile Гик

    я делал просто на счётчике. отсчитал к примеру 100мсек делай опрос датчика (тут надо глянуть время формирования показаний давления. а то вдруг датчик ещё старый запрос не обработал, а к нему на вход уже новый запрос идёт). и контроллер стоять не будет и остальную периферию контролировать можно.
     
  18. Danil_2002

    Danil_2002 Гик

    Мне уже не надо, я все таки сделал через Mega8, правда вся прошивка не влезла, потому что я хотел чтобы еще значения QMC5883 получать. А прошивка для BMP180 забирает 97% от памяти меги, завтра куплю себе Mega328p
     
  19. Arkad_snz

    Arkad_snz Гик

    Странно!
    Как ни крутись - точность +- лапоть, километр, а теперь метры.
    Была здесь уже одна тяжба про высотомер для макета ракеты - ни к чему не пришла.
    Неужели задача не имеет решения!?
    Ан - нет! - Обратившись немного в прошлое - легко найдем приборы, где эта задача решена!
    Например - зенитный снаряд, который детонирует на заданной высоте. В любую погоду!
    Ну, если краснопузые голодранцы смогли решить задачу безо всяких ардуин!...
    Не, понятно, что зенитному снаряду большая точность не нужна - раскидать осколки где-то вблизи цели - достаточно для поражения такой хрупкой конструкции как самолет, но не километр же!
    ПВО того времени (ВОВ, Вторая мировая) решали свою боевую задачу не точностью (чего смеяться! - попасть в летящий самолет!), а количеством - забросить в небо, в сторону цели побольше снарядов, которые разорвутся на заданной высоте (т.н. "заградительный огонь").
     
    Последнее редактирование: 14 авг 2019
  20. parovoZZ

    parovoZZ Гуру

    те снаряды, что видел, срабатывали по таймеру.