Шановні друзі!
26 та 31 грудня магазин працюватиме до 16 години. 1 та 2 січня магазин працювати не буде.
Вітаємо всіх з Різдвом та Новим Роком!
Мобильная версия Форум Arduino Документация Гарантийные условия 0 0
UA RU
График работы магазина:
Пн-Пт: 8.00 - 19.00
Сб: 10.00 - 17.00
Вс: выходной
Каталог
Напиши статью и получи скидку!

Міряємо кут нахилу за допомогою акселерометру

2021-08-19

Все статьи →

В попередніх частинах нашої розповіді про аналоговий акселерометр ADXL335 ми навчилися позбавлятися шумів на його виходах - фільтрувати сигнал, а також шукати початок відліку сигналу - визначати нульові покази. Якщо ми встановимо ADXL на якийсь об'єкт і не будемо його повертати, то акселерометр буде міряти силу гравітації, яка діє на об'єкт. Вектор цієї сили завжди направлений вниз - в напрямку центру Землі. При горизонтальному положенні плати акселерометру цей вектор співпадає з віссю Z. Якщо ми повернемо ADXL на деякий кут ? навколо вісі Y, то на виходах акселерометру ми отримаємо напруги, які пропорційні величинам проекцій цієї сили на вісі просторової системи координат. На малюнку ці проекції вектора сили гравітації F позначимо Fx та Fz.

Для пошуку кута повороту ? розглянемо плаский варіант, обмежившись площиною Z0X:

Легко побачити, що вектор F та його проекції Fx та Fz утворюють прямокутний трикутник.

Катет a трикутнику відповідає довжині вектору Fx, катет b - довжині вектору Fz , а сила гравітації F співпадає з гіпотенузою С трикутника.

Очевидь, що ? легко знаходиться зі шкільного співвідношення:

Таким чином, для пошуку кута відхилення об'єкту від горизонтального положення відносно вісі Y потрібно виконати наступний алгоритм:

1. Виміряти напруги на відповідних виходах акселерометру при горизонтальному положенні об'єкту - Uxo та Uzo. Визначити нуль.

2. Визначити величину напруг Ux та Uz при нахиленні об'єкту.

3. Знайти величину відхилення напруг від "горизонтального" стану (від нуля).

?Ux = Ux - Uxo

?Uz = Uz - Uzo

4. Знаючи чутливості акселерометру по вісям Sx=300 мВ, знайти величину проекцій вектору на вісі координат (значення сили гравітації по вісям):

Gx = ?Ux / Sx

Gz = ?Uz / Sz

5. Обчислити кут:

a=arctg(Gx/Gz)

Почнемо реалізацію алгоритму. Зберемо схему.



Тепер візьмемо програму з попередньої частини статті (Шукаємо нуль в акселерометрі) та визначимо нульові покази акселерометра по вісям Х та Z. Для цього покладемо контролер з акселерометром горизонтально, так щоб вісь X була паралельна площині столу.


Для зручності я використав саморобний шилд, зібраний на базі Arduino Prototype Shield (код товару ASC111). Відкриваємо монітор порта та дочекавшись сталих значень, запишемо число Ux з точністю 5 знаків після коми. Ставимо контроллер так, щоб вісь Z була паралельна площині столу.

Перезапускаємо скетч і запишемо значення "нулю" Uz. В результаті я отримав такі числа:

Uxo = 1.51366

Uzo = 1.56282

УВАГА! У вас, скоріш за все, будуть інші значення. Тепер можна записати в Arduino програму визначення куту нахилу об'єкту відносно вісі Y. Не забуваємо замінити зірочки (*) на свої значення "нулів".


#include <Math.h> // підключаємо математичну бібліотеку

//Оголошення змінних

float ADC_ref=5.0; //максимальне значення напруги у АЦП

float analog_resolution=1024.0; //роздільна здатність АЦП

float zero_x =*.*****; //значення нулів

float zero_z = *.*****;

float sensitivity_x = 0.3; //чутливості по вісях

float sensitivity_z = 0.3;

unsigned int value_x; //значення зчитані з датчика

unsigned int value_z;

float gx; //проекції вектору гравітації

float gz;

float angle_y; //кут нахилу


void setup() {

       Serial.begin(9600);

}

void loop() {

       value_x = analogRead(A0); // читаємо дані з акселерометру

       value_z = analogRead(A2);

// обчислюємо проекції вектору гравітації на вісі X та Z

       gx = (value_x/analog_resolution*ADC_ref - zero_x)/sensitivity_x;

       gz = (value_z/analog_resolution*ADC_ref - zero_z)/sensitivity_z;

       angle_y =atan2(gx, gz)*RAD_TO_DEG; //розраховуємо кут нахилу

//виводимо кут нахилу

       Serial.print(" Ydeg = "); Serial.println(angle_y);

       delay(100);

}

Нахиляємо акселерометр по вісі Y та дивимось на результати у моніторі порта.


Якщо вам достатньо точності в 1 градус, тоді фільтр в останній програмі не потрібен. В іншому випадку ви можете додати його самостійно, але пристрій стане доволі інерційним, на точне вимірювання кута йому знадобиться деякий час, затримка буде пов'язана з інтегральною природою фільтру.

ВІТАЮ! Ви побудували простий інклінометр. На цьому наше невеличке дослідження закінчено.

Ваша оценка статьи:

Отлично
Хорошо
Удовлетворительно
Плохо
Очень плохо

Общая оценка:

Оценка "Міряємо кут нахилу за допомогою акселерометру"
4 из 5
сделана на основе 1 оценки 1 клиентских отзыва.

Благодарим Вас за обращение! Ваш отзыв появится после модерации администратором.
Олександр
14.11.2021 08:55:48
Де скетч?
оплата картами Visa и MasterCard