Модуль барометра BMP280

Барометр — это устройство для измерения атмосферного давления. В робототехнике барометр часто используется для определения высоты полёта беспилотных летательных аппаратов, тех же квадрокоптеров. Также с помощью этого датчика можно сделать погодную станцию и наблюдать за изменением атмосферного давления в течение длительного времени.

В одном из ранних уроков мы подробно разбирались с понятием электронного МЭМС барометра и подключали к Ардуино датчик BMP180. На этот раз мы будем работать с более новой версией датчика — BMP280. А именно, с платой BMP280 ROC, разработанной в лаборатории RobotClass.

В отличие от BMP180, новый датчик может измерять давление более точно, а значит и высоту беспилотник будет удерживать надёжнее. Вот некоторые важные характеристики BMP280:

  • напряжение питания: от 3,3 до 5 В;
  • макс скорость I2C интерфейса: 3,4 МГц;
  • потребляемый ток: 2,7 мкA при частоте отсчетов в 1 Гц;
  • относительная точность (от 950 до 1050гПа, 25°C.): 0,12 гПа (1м);
  • абсолютная точность (от 950 до 1050гПа, от 0 до 40°C.): 1 гПа;
  • уровень шума: до 0,2 Па (1,7 см) и 0,01 температуры;
  • диапазон измеряемого давления: от 300 гПа до 1100 гПа (от 9000 м до -500 м).

Важные отличия от BMP180:

BMP180BMP280
Точность измерения давления1 Па0.16 Па
Точность измерения температуры0.1 С0.01 С
Частота измеренийдо 120 Гцдо 157 Гц
Рабочий ток (при эквивалентной точности)12 мкА2.7 мкА

На этом уроке мы подключим датчик BMP280 к контроллеру двумя способами: по шине I2C и по шине SPI. Разберемся с его настройкой и научимся вычислять высоту над уровнем моря.

Список необходимых компонентов

Для выполнения простого примера с датчиком BMP280 от RobotClass, кроме самого модуля датчика, потребуется Ардуино-совместимый контроллер и немного проводов вилка-розетка. Если вам не хватает что-то из этого, можно добавить эти компоненты в корзину прямо здесь и затем оформить заказ в нашем интернет-магазине.

В корзину
В корзину
В корзину

Подключение

На плате есть семь контактов для подключения:

  • VIN — питание, от 4,5 до 5,5 В;
  • 3V3 — питание 3,3 В;
  • GND — земля GND;
  • CS — контакт Chip Select для шины SPI;
  • MO/SDA — контакт MOSI для SPI, либо контакт SDA для шины I2C;
  • MI/SCL — контакт MISO для SPI, либо контакт SCL для шины I2C;
  • CK — тактовый сигнал для шины SPI.

Для подключения к Ардуино можно использовать как интерфейс I2C, так и SPI. Также плата датчика ROC поддерживает два рабочих напряжения: 5В и 3,3В, а значит его можно подключать и к Ардуино и к низковольтным (в плане логики) платам типа ESP или STM32. Ниже представлены два варианта схем подключения.

Подключение BMP280 I2C

Arduino UnoGnd5VA4A5
BMP280 ROCGndVINSDASCL

Подключение BMP280 SPI

Arduino Uno Gnd5V10111213
BMP280 ROC GndVINCSMOMICK

Программа

Для теста напишем программу, которая будет выводить значение атмосферного давления, температуру датчика и высоту над уровнем моря в последовательный порт. Используем библиотеку Adafruit_BMP280, которую можно найти в репозитории Arduino IDE. Для начала вариант с I2C интерфейсом.

#include <Adafruit_BMP280.h>

Adafruit_BMP280 bmp;
  
void setup() {
    Serial.begin(9600);
  
    if (!bmp.begin()) { // инициализация датчика
        Serial.println("Error!");
        while (1);
    }
}
  
void loop() {
    // вывод температуры в градусах
    Serial.print("t = ");
    Serial.print(bmp.readTemperature());
    Serial.println(" *C");
    
    // вывод давления в гектопаскалях
    Serial.print("p = ");
    Serial.print(bmp.readPressure() / 100.0F);
    Serial.println(" hPa");

    // вывод высоты над уровнем моря в метрах
    // 1013.25 - высота на уровне моря
    Serial.print("alt = ");
    Serial.print(bmp.readAltitude(1013.25));
    Serial.println(" m");
    
    Serial.println();
    delay(2000);
}

И второй вариант — в случае подключения по SPI. Процедуры setup и loop расписывать не будем, они остаются такими же.

#include <Adafruit_BMP280.h>

#define BMP_CS 10

Adafruit_BMP280 bmp(BMP_CS);
  
void setup() {
...
}
  
void loop() {
...
}

Как видим, для подключения через аппаратный SPI интерфейс достаточно передать дополнительный аргумент — CS (Chip Select) в конструктор объекта bmp. Всё остальное, эквивалентно коду для I2C.

Кстати, библиотека Adafruit_BMP280 позволяет работать и с программным SPI интерфейсом. Для этого в конструктор нужно передать номера всех контактов: CS, MOSI, MISO, SCK.

Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO,  BMP_SCK);

Какой бы вариант мы не выбрали, загружаем программу на Ардуино и наблюдаем поток данных в мониторе последовательного порта.

Arduino и BMP280

Готово!

Корректировка высоты

В приведенном примере датчик вроде бы вычисляет высоту над уровнем моря. Однако, в качестве базового значения давления на уровне моря в функцию readAltitude передается число 1013.25.

В действительности, давление на уровне моря зависит от погодных условий. Сегодня может быть 950 гПа, а завтра 1050 гПа, как в таких условиях определить верную высоту? Решить проблему можно с помощью периодической коррекции давления на уровне моря.

Предположим, что нужно запустить беспилотник, который будет летать всего 20-25 минут. За такое время давление вряд ли изменится и мы можем скорректировать его только при включении контроллера, прямо в функции setup.

float base; // в этой переменной будет храниться давление на уровне моря
void setup() {
    Serial.begin(9600);
  
    if (!bmp.begin()) { // инициализация датчика
        Serial.println("Error!");
        while (1);
    }

    // считываем текущее значения давления и переводим из Па в гПа
    base = bmp.readPressure() / 100.0F;
}

Теперь переменную base можно передавать в функцию readAltitude для вычисления адекватной высоты над уровнем моря.

Тонкая настройка

Датчик BMP280 имеет ряд настроек, которые позволяют адаптировать его под разные задачи: мониторинг погоды, определение высоты полета на улице либо в помещении, использование в составе умных устройств с низким энергопотреблением, и т.п.

Можно настроить:

  • режим работы — один из трёх режимов: нормальный, принудительный, сон;
  • oversampling (OS) — избыточность измерений, которая увеличивать точность;
  • рекурсивный фильтр (IIR) — фильтр, снижающий уровень шумов измерения;
  • время ожидания — время между измерениями в нормальном режиме.

Сон — это обычное состояние датчика (как и некоторых людей), в которое он переходит после подачи питания. Контроллер может перевести датчик в нормальный или принудительный режим.

В нормальном режиме датчик производит измерения через равные промежутки времени, определяемые параметром ожидания. То есть при обращении к нему микроконтроллера, он просто выдает уже сделанные ранее измерения, хранящиеся во временной памяти.

При переводе датчика в принудительный режим, он пробуждается, делает измерения, записывает их во временную память и снова засыпает. При обращении контроллера за данными, мы опять берем их из памяти.

Режим, oversampling и фильтрация влияют на точность, потребляемую энергию и скорость опроса. Вот к примеру, таблица зависимости времени опроса. Потребление рассчитано для принудительного режима с опросом каждую секунду.

oversamplingразрядность / точностьвремя опросапотребление
116 бит / 2,62 Па5,5 мс2,74 — 4,16
217 бит / 1,31 Па7,5 мс4,17 — 6,27
418 бит / 0,66 Па11,5 мс7,02 — 10,5
819 бит / 0,33 Па19,5 мс12,7 — 18,95
1620 бит / 0,16 Па37,5 мс24,8 — 36,85

По умолчанию, в библиотеке Adafruit_BMP280 датчик запускается в нормальном режиме с максимальными настройками OS, с выключенным фильтром и с временем ожидания 1 мс.

Для изменения параметров в библиотеке предусмотрена функция setSampling:

setSampling(sensor_mode mode, s_sampling t_sampling, sensor_sampling p_sampling, sensor_filter filter, standby_duration duration)

Пример использования:

 void setup() {
    Serial.begin(9600);
  
    // инициализация датчика
    if (!bmp.begin()) {
        Serial.println("Error!");
        while (1);
    }

    bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, // нормальный режим
                  Adafruit_BMP280::SAMPLING_X1, // OS температуры
                  Adafruit_BMP280::SAMPLING_X4, // OS давления
                  Adafruit_BMP280::FILTER_OFF, // фильтрация
                  Adafruit_BMP280::STANDBY_MS_500 // таймаут сна
    );
}

Константы MODE_, SAMPLING_ и прочее, можно найти в исходном коде библиотеки, в файле .h (ссылка в конце урока)

Вот так. Если нужен датчик для погодной станции — делаем минимальное потребление уменьшая точность и применяя принудительный режим с опросом раз в час. Для квадрокоптера подойдет нормальный режим и стандартный OS с какой-то фильтрацией. Для мобильных устройств, например, игровых манипуляторов — максимальный OS и фильтрация.

Полезные ссылки

Спецификация производителя

Исходный код Adafruit_BMP280

Принципиальная схема платы BME280 от RobotClass

RobotClass BMP280. Принципиальная схема

Изменено:

Модуль барометра BMP280: Один комментарий

  1. Сделал корректировку высоты , а в результатах не отображается высота (Approx altitude = inf m), в чем может быть проблема ?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.