Барометр — это устройство для измерения атмосферного давления. В робототехнике барометр часто используется для определения высоты полёта беспилотных летательных аппаратов, тех же квадрокоптеров. Также с помощью этого датчика можно сделать погодную станцию и наблюдать за изменением атмосферного давления в течение длительного времени.
В одном из ранних уроков мы подробно разбирались с понятием электронного МЭМС барометра и подключали к Ардуино датчик 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:
BMP180 | BMP280 | |
Точность измерения давления | 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 Uno | Gnd | 5V | A4 | A5 |
BMP280 ROC | Gnd | VIN | SDA | SCL |
Подключение BMP280 SPI
Arduino Uno | Gnd | 5V | 10 | 11 | 12 | 13 |
BMP280 ROC | Gnd | VIN | CS | MO | MI | CK |
Программа
Для теста напишем программу, которая будет выводить значение атмосферного давления, температуру датчика и высоту над уровнем моря в последовательный порт. Используем библиотеку 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);
Какой бы вариант мы не выбрали, загружаем программу на Ардуино и наблюдаем поток данных в мониторе последовательного порта.
Готово!
Корректировка высоты
В приведенном примере датчик вроде бы вычисляет высоту над уровнем моря. Однако, в качестве базового значения давления на уровне моря в функцию 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 | разрядность / точность | время опроса | потребление |
1 | 16 бит / 2,62 Па | 5,5 мс | 2,74 — 4,16 |
2 | 17 бит / 1,31 Па | 7,5 мс | 4,17 — 6,27 |
4 | 18 бит / 0,66 Па | 11,5 мс | 7,02 — 10,5 |
8 | 19 бит / 0,33 Па | 19,5 мс | 12,7 — 18,95 |
16 | 20 бит / 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 и фильтрация.
Полезные ссылки
Принципиальная схема платы BME280 от RobotClass
Сделал корректировку высоты , а в результатах не отображается высота (Approx altitude = inf m), в чем может быть проблема ?