Автопортал || Авто - статьи

Сельскохозяйственная техника
Чтение RSS

Ардуіно: датчик тиску BMP180 (BMP085)

  1. 1. Електронний барометр
  2. 2. Датчики BMP085 і BMP180
  3. 3. Підключення BMP180
  4. 4. Програма
  5. 5. Перетворення тиску в висоту над рівнем моря
  6. 6. Візуалізація
  7. 7. Висновок

Барометр - це пристрій, який вимірює атмосферний тиск. Тобто тиск повітря, який тисне на нас з усіх боків. Ще зі школи ми знаємо, що перший барометр був тарілку з ртуттю, і перевернутої колбою в ній. Автором цього пристрою був Еванджеліста Торрічеллі - італійський фізик і математик. Зняти показання ртутного барометра можна так само просто, як і показання спиртового термометра: чим тиск зовні колби більше, тим вище стовпчик ртуті всередині неї. Пари ртуті, як відомо, вельми отруйні. Пізніше, з'явився більш безпечний прилад - барометр-анероїд. У цьому барометр ртуть була замінена на гофровану коробку з тонкої жерсті, в якій створено розрідження. Під впливом атмосфери, коробочка стискається і через систему важелів повертає стрілку на циферблаті. Ось так виглядають ці два барометра. Зліва - анероїд, праворуч - барометр Торрічеллі. Барометр - це пристрій, який вимірює атмосферний тиск Навіщо нам може знадобитися барометр? Найчастіше, цей прилад використовують на літальних апаратах для визначення висоти польоту. Чим вище апарат піднімається над рівнем моря, тим менший тиск відчуває бортовий барометр. Знаючи цю залежність, легко визначити висоту. Інший поширений варіант використання - саморобна погодна станція. У цьому випадку ми можемо використовувати відомі залежності прийдешньої погоди від атмосферного тиску. Крім барометра, на такі станції ставлять датчики вологості і температури.

1. Електронний барометр

Такі громіздкі барометри ми не зможемо використовувати в робототехніці. Нам потрібен мініатюрний і енергоефективний прилад, який легко підключається до тієї ж Ардуіно Уно. Більшість сучасних барометрів роблять за технологією МЕМС, так само як і гіротахометри з акселерометром. МЕМС барометри засновані на п'єзорезистивного, або на тензометричних методі, в яких використовується ефект зміни опору матеріалу під дією деформуючих сил. Якщо відкрити корпус МЕМС барометра, можна побачити чутливий елемент (праворуч), який знаходиться прямо під отвором в захисному корпусі приладу, і плату управління (зліва), яка здійснює первинну фільтрацію і перетворення вимірів. Такі громіздкі барометри ми не зможемо використовувати в робототехніці

2. Датчики BMP085 і BMP180

До найдоступнішим датчикам тиску, які часто використовуються польотних контролерах і в різного роду саморобних електронних пристроях, можна віднести датчики компанії BOSH: BMP085 і BMP180. Другий барометр новіший, але повністю сумісний зі старою версією. До найдоступнішим датчикам тиску, які часто використовуються польотних контролерах і в різного роду саморобних електронних пристроях, можна віднести датчики компанії BOSH: BMP085 і BMP180 Трохи важливі характеристик BMP180:

  • діапазон вимірюваних значень: від 300 гПа до 1100 гПа (від -500м від + 9000м над рівнем моря);
  • напруга живлення: від 3.3 до 5 Вольт; сила струму: 5 мкА при швидкості опитування - 1 Герц;
  • рівень шуму: 0.06 гПа (0.5м) в грубому режимі (ultra low power mode) і 0.02 гПа (0.17м) а режимі максимального дозволу (advanced resolution mode).

Тепер підключимо цей датчик до контролера, і спробуємо оцінити атмосферний тиск.

3. Підключення BMP180

Обидва датчика мають I2C інтерфейс, так що їх без проблем можна підключити до будь-якій платформі з сімейства Ардуіно. Ось як виглядає таблиця підключення до Ардуіно Уно. BMP 180 GND VCC SDA SCL Ардуіно Уно GND + 5V A4 A5 Принципова схема Обидва датчика мають I2C інтерфейс, так що їх без проблем можна підключити до будь-якій платформі з сімейства Ардуіно Зовнішній вигляд макета

4. Програма

Для роботи з датчиком нам знадобиться бібліотека: BMP180_Breakout_Arduino_Library Викачуємо її зі сховищ, і встановлюємо в Arduino IDE. Тепер все готово для написання першої програми. Спробуємо отримати сирі дані з датчика, і вивести їх в монітор COM порту. #include <SFE_BMP180.h> #include <Wire.h> SFE_BMP180 pressure; void setup () {Serial.begin (9600); pressure.begin (); } Void loop () {double P; P = getPressure (); Serial.println (P, 4); delay (100); } Double getPressure () {char status; double T, P, p0, a; 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); if (status! = 0) {return (P); }}}}} Процедура отримання заповітного тиску з датчика не така тривіальна, і складається з декількох етапів. У спрощеному вигляді алгоритм виглядає так:

  1. запитуємо у барометра свідчення вбудованого датчика температури;
  2. чекаємо час A, поки датчик оцінює температуру;
  3. отримуємо температуру;
  4. запитуємо у барометра тиск;
  5. чекаємо час B, поки датчик оцінює тиск;
  6. отримуємо значення тиску;
  7. повертаємо значення тиску з функції.

Час B залежить від точності вимірювань, яка задається в функції startPressure. Єдиний аргумент цієї функції може приймати значення від 0 до 3, де 0 - найгрубіша і найшвидша оцінка, 3 - найточніша оцінка тиску. Завантажуємо програму на Ардуіно Уно, і спостерігаємо потік вимірювань атмосферного тиску. Спробуємо підняти датчик над головою, і опустити до рівня підлоги. Показання будуть трохи змінюватися. Залишилося тільки розібратися, як нам перетворити ці незрозумілі числа в висоту над рівнем моря.

5. Перетворення тиску в висоту над рівнем моря

Датчик BMP180 повертає величину тиску в гектопаскалях (гПа). Саме в цих одиницях прийнято вимірювати атмосферний тиск. 1 гПа = 100 Паскалей. Відомо, що на рівні моря тиск в середньому становить 1013 гПа, і кожен додатковий метр над рівнем моря буде зменшувати цей тиск всього на 0.11 гПа (приблизно). Таким чином, якщо ми віднімемо з результату функції getPressure число 1013, і розділимо залишилася різниця на 0.11, то ми отримаємо значення висоти над рівнем моря в метрах. Ось так зміниться наша програма: void loop () {double P, Alt; P = getPressure (); Alt = (P - 1013) /0.11; Serial.println (Alt, 2); delay (100); } В дійсності, тиск залежить від висоти над рівнем моря нелінійно, і наша формула годиться лише для висот на яких ми з вами зазвичай живемо. Благо, людству відома більш точна залежність тиску від висоти, яку ми можемо застосувати для отримання більш точних результатів. Датчик BMP180 повертає величину тиску в гектопаскалях (гПа) Тут p - виміряне в даній точці тиск, p0 - тиск щодо якого йде відлік висоти. У бібліотеці SFE_BMP180 вже є функція, яка використовує зазначену. формулу для отримання точної висоти. Використовуємо її в нашій програмі. #include <SFE_BMP180.h> #include <Wire.h> SFE_BMP180 pressure; double P0 = 0; void setup () {Serial.begin (9600); pressure.begin (); P0 = pressure.getPressure (); } Void loop () {double P, Alt; P = getPressure (); Alt = pressure.altitude (P, P0) Serial.println (Alt, 2); delay (100); } Double getPressure () {...} Я не став повністю копіювати функцію getPressure, щоб зберегти читабельність тексту. У програмі з'явилася ще одна змінна P0 - це тиск, який ми виміряємо на старті програми. У разі літального апарату, P0 буде тиском на стартовому майданчику, щодо якої ми почнемо набір висоти.

6. Візуалізація

Тепер спробуємо відобразити свідчення тиску в програмі SFMonitor, і подивимося як змінюється тиск при русі датчика на висоту 2 метри. static const byte PACKET_SIZE = 1; static const byte VALUE_SIZE = 2; static const boolean SEPARATE_VALUES = true; #include <SerialFlow.h> #include <SFE_BMP180.h> #include <Wire.h> SFE_BMP180 pressure; SerialFlow rd (& Serial); double P0 = 0; void setup () {rd.setPacketFormat (VALUE_SIZE, PACKET_SIZE, SEPARATE_VALUES); rd.begin (9600); pressure.begin (); P0 = getPressure (); } Void loop () {double P; P = getPressure (); rd.setPacketValue (100 + int ((P - P0) * 100)); rd.sendPacket (); delay (100); } Double getPressure () {...} У результаті роботи програми отримаємо графік тиску в паскалях: Тепер спробуємо відобразити свідчення тиску в програмі SFMonitor, і подивимося як змінюється тиск при русі датчика на висоту 2 метри

7. Висновок

Як ми з'ясували з уроку, визначення висоти над рівнем моря не така тривіальна задача. Мало того, що тиск залежить від висоти нелінійно, так ще картину псують різні зовнішні чинники. Наприклад, тиск у нас вдома постійно змінюється з плином часу. Навіть за кілька хвилин, висота виміряна нашим приладом може варіюватися в діапазоні 0.5 - 1 метра. Температура так само сильно впливає на якість вимірювань, тому нам доводиться враховувати її при розрахунку тиску. Для літальних апаратів рекомендується використовувати датчики підвищеної точності, такі як MS5611. У цього барометра точність вимірювань може досягати 0,012 гПа, що в 5 разів краще, ніж у BMP180. Також, для уточнення барометрической висоти польоту застосовують координати GPS. Успіхів у спостереженні за атмосферою! 🙂

Навіщо нам може знадобитися барометр?