Датчик прискорення ардуїно для мотоцикл шолом. Як підключити цифровий акселерометр ADXL345 до Arduino Живлення акселерометрів ADXL337 та ADXL377

Головна / 2 Cool Reader

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

Мікросхема MPU6050 містить на борту як акселерометр, так і гіроскоп, а також ще й температурний сенсор. MPU6050 є основним елементом модуля GY-531. Крім цієї мікросхеми на платі модуля розташована необхідна обв'язка MPU6050, у тому числі підтягуючі резистори інтерфейсу I 2 C, а також стабілізатор напруги на 3,3 вольта з малим падінням напруги (при живленні вже в 3,3 вольта на виході стабілізатора буде 3 вольта ) з фільтруючими конденсаторами. Ну і бонусом на платі розпаяний SMD світлодіод з обмежуючим резистором як індикатор напруги живлення. Розмір плати модуля GY-521 10 х 20 мм.

Схема модуля представлена ​​нижче (номінали можуть відрізнятися в різних версіях модуля):

Характеристики MPU6050:

  • напруги живлення 2,375 - 3,46 вольт
  • споживаний струм до 4 мА
  • інтерфейс передачі даних - I2C
  • максимальна швидкість I2C – 400 кГц
  • вхід для інших датчиків I2C
  • внутрішній генератор на 8 МГц (поза модулем можливість підключити зовнішній кварцовий резонатор на 32,768 кГц або 19,2 МГц)

Потрібно відзначити можливість MPU6050 працюватиме в майстер режимі I2C для AUX висновків, до яких можна підключити ще один зовнішній датчик (наприклад, магнітометр). Чесно кажучи, я не розумію, для чого це взагалі потрібно, якщо простіше підключати додаткові датчики до загальної шини I2C мікроконтролера.

Функції MPU6050:

  • трьох осьовий MEMS гіроскоп із 16 бітним АЦП
  • трьох осьовий MEMS акселерометр з 16 бітним АЦП
  • Digital Motion Processor (DMP)
  • slave I 2 C для підключення до мікроконтролера
  • master I 2 C для підключення до мікросхеми додаткового датчика
  • регістри даних датчиків
  • переривання
  • температурний сенсор
  • самоперевірка гіроскопа та акселерометра
  • регістр ідентифікації пристрою

Зовнішній вигляд модуля GY-521:

У комплекті йдуть штирьові з'єднання кутові та прямі. Припаяний був прямий штирьовий роз'єм.

Дані вимірювання датчиків можна зчитувати як з регістрів зберігання, так і користуватися функціями FIFO. Є окремий регістр під назвою Who am I, значення, записане в цьому регістрі постійно і його можна тільки вважати, можна використовувати як ідентифікатор пристрою значення в регістрі 104 або 0х68. Окремим висновком є ​​вихід переривань, який налаштовується регістрами налаштування під певні події.

Датчики гіроскопа та акселерометра виготовлені як MEMS (мікроелектромеханічна система) - зовнішній вплив на датчик спочатку змінює стан механічної частини, потім зміна стану механічної частини призводить до зміни сигналу електричної частини. Одним словом, в одному корпусі зібрана не тільки електроніка, а й механіка. У мікросхемі MPU6050 міститься відразу два MEMS датчики, виробник стверджує, що їх взаємний вплив один на одного зведено до мінімуму. Ну що ж, зовсім добре за ціну готового модуля порядку 2 уе. До речі, ці модулі можна придбати на торгових майданчиках aliexpress або ebay.

Розберемося як можна використовувати датчики акселерометра та гіроскопа. Температурний датчик чіпати навіть не будемо – дані про температуру прочитали, перевели у людські значення та насолоджуємось. Гіроскоп видає значення миттєвої кутової швидкості з роздільною здатністю, заданою в налаштуваннях, наприклад 2000 градусів за секунду. Якщо прошити мікроконтролер і дивитися на отримані дані, побачимо тільки нулі. Якщо почати крутити датчик, отримаємо миттєві значення кутової швидкості. Зауважте, що швидкість ми отримуємо в градусах за секунду, а це означає, що лінійні швидкості не впливають на ці показання - показання будуть змінюватися лише при повороті датчика у просторі. Далі за допомогою цих даних можна отримати орієнтацію об'єкта у просторі. Для цього потрібно отримати миттєве значення кутової швидкості та помножити його на проміжок часу між опитуваннями датчика гіроскопа. Приклад роздільна здатність 2000 градусів за секунду, проміжок між опитуваннями датчика 0,1 секунда, значення миттєвої швидкості 300, отже 300*0,1=30 - цей час вісь гіроскопа було повернуто на 30 градусів. Далі кожне набуте значення потрібно скласти з попереднім. Якщо вісь рухалася в одному напрямку - значення 30 градусів, якщо в іншому, то -30, таким чином, при поверненні датчика у вихідне положення завжди (в ідеалі) буде 0, при відхиленні від вихідного положення, при виконанні вищеописаних дій отримаємо кут відхилення . Обробляючи кути трьох осей гіроскопа можна отримати орієнтацію об'єкта у просторі.

Таким чином, при інтегруванні стану кута положення також інтегрується і похибка - при тривалому використанні можна отримати вже абсолютно неправильні значення. Тому часто гіроскоп використовують у парі з акселерометром, утворюючи у простому варіанті альфа-бета-фільтр або комплементарний фільтр.

З акселерометром все простіше. Вимірюючи прискорення трьох осей датчика можна отримати дані, перетворюючи їх за допомогою геометрії, якими можна також отримати орієнтацію об'єкта в просторі. Крім цього, акселерометр вимірює лінійні прискорення, тобто орієнтація об'єкта може спотворюватися при русі датчика в лінійних напрямках. Також за допомогою акселерометра можна визначати рух об'єкта чи його зіткнення. Наприклад, детектувати падіння об'єкта або поштовх про перешкоду, щоб оминати це.

Дані від акселерометра отримуємо завжди досить точні, тобто нуль завжди залишається нулем ні за яких впливів (мається на увазі не залежить ні від часу, ні від характеру впливу), проте недолік криється в тому, що дані йдуть шумом у деякому діапазоні даних, тобто до десятих часток градуса точно вимірювати кут не вийде. Зате, виходячи з експериментальних даних, точність до цілих значень градуса тримається цілком стабільно. Не забуваймо про вплив лінійних прискорень.

Якщо датчик придбали, можна переходити до розгляду нутрощів модуля, а головного елемента - мікросхеми MPU6050. Інформація зберігається у регістрах мікросхеми, яких понад 100 (!). І ось тут і криється величезний підводний камінь. виробник не утруднився розписати в документації всю інформацію, а навів лише інформацію про найнеобхідніше. Насправді не відомо навіть скільки ж там регістрів, доступних для читання або запису або того й іншого. Також інформації на деякі регістри просто немає, крім його назви. Ну що ж, доведеться експериментально визначати вплив значень, записаних у деякі регістри.

Наприкінці статті можна завантажити вихідний код прикладу використання даного модуля. Усередині ви знайдете інформацію про те, як зчитувати дані датчиків модуля, а також ініціалізацію пристрою або просто початкове налаштування регістрів для початку роботи з модулем GY-521.

Інтерфейс I 2 C працює за стандартною схемою. Адреса мікросхеми може бути двох значень (без біта читання/запису) залежно від стану виведення AD0 - b1101000, якщо AD0 з'єднаний із землею і b1101001, якщо AD0 з'єднаний із джерелом живлення. Відповідно плюс біт читання чи запису.

Мікросхема містить Digital Motion Processor (DMP), він потрібен у тому, щоб обробляти дані, одержувані з датчиків гіроскопа і акселерометра. Все це робиться для того, щоб підвищити точність даних, оскільки при обробці даних на мікроконтролері точність може постраждати через зниження швидкості їх обробки. Як правило, алгоритми обробки руху повинні працювати з досить високою частотою, як правило, 200 Гц, як стверджує документація.

Щодо регістрів, то їх досить велика кількість, необхідна інформація знаходиться в карті регістрів на MPU6050, документ додається до статті. Крім цього, додається вихідник з налаштуваннями цих регістрів.

Для демонстрації роботи модуля було зібрано схему:

Тут використано мікроконтролер Atmega8, дані виводяться на РК дисплей 2004А (4 рядки по 20 символів). На екран виводиться наступна інформація, отримана та перетворена від мікросхеми MPU6050 модуля: 1. значення по трьох осях акселерометра, 2. значення по трьох осях гіроскопа, 3. температура, 4. кути відхилення за даними акселерометра (розраховані ресурсами мікроконтролера), по осі Z за даними гіроскопа (також шляхом підрахунку мікроконтролерів). У першому та другому пункті дані мають миттєвий характер - тобто саме те, що зчитується з регістрів зберігання, це означає, що для гіроскопа це швидкість, у стані спокою всі значення дорівнюватимуть нулю.

Крім цього, є 6 світлодіодів, які спалахують залежно від положення датчика по осі Y акселерометра.

Модуль датчиків містить стабілізатор на 3,3 вольта, тому його можна підключати як до 5 вольта, так і до 3,3 вольтів. Мікроконтролер запитується від напруги 3,3 вольта, щоб не узгоджувати рівні I 2 C.

Зібраний пристрій на макетній платі:

Для програмування мікроконтролера конфігурація ф'юз бітів (Atmega8):

Область застосування таких датчиків є досить широкою. Даний модуль часто застосовують для стабілізації польоту квадрокоптера через спільне використання гіроскопа і акселерометра. Крім цього, модуль можна використовувати для координації різних пристроїв - від просто детектора руху до системи орієнтації різних роботів або управління рухами будь-якими пристроями. Область подібних сенсорних пристроїв досить нова та цікава для вивчення та застосування в аматорській техніці.

У висновку хотілося б відзначити, що дані модуль - це недороге і досить хороше рішення при необхідності використання гіроскопа та/або акселерометра, велика кількість налаштувань датчиків дозволить налаштувати їх під будь-які пристрої, малі розміри модуля легко дозволять вбудовувати його в більшість схем.

До статті додається прошивка мікроконтролера, вихідний код, документація на MPU6050 та відео роботи датчика у схемі.

Список радіоелементів

Позначення Тип Номінал Кількість ПриміткаМагазинМій блокнот
MOD1 МодульGU-5211 На базі MPU6050 До блокноту
IC1 МК AVR 8-біт

ATmega8

1 До блокноту
VR1 Лінійний регулятор

L7805AB

1 До блокноту
VR2 Лінійний регулятор

AMS1117-3.3

1 До блокноту
HG1 LCD-дисплей2004A1 До блокноту
C1 470 мкФ1 До блокноту
C2, C3, C5 Конденсатор100 нФ3 До блокноту
C4 Електролітичний конденсатор220 мкФ1 До блокноту
C6 Електролітичний конденсатор10 мкФ1

Інструкція

Акселерометри використовують визначення вектора прискорення. Акселерометр ADXL335 має три осі, і завдяки цьому він може визначати вектор прискорення у тривимірному просторі. Зважаючи на те, що сила земного тяжіння - це теж вектор, то акселерометр може визначати свою власну орієнтацію в тривимірному просторі щодо центру Землі.
На ілюстрації наведено малюнки з паспорта (http://www.analog.com/static/imported-files/data_sheets/ADXL335.pdf) на акселерометр ADXL335. Тут зображені координатні осі чутливості акселерометра по відношенню до геометричного розміщення корпусу пристрою в просторі, а також таблиця значень напруги з 3 каналів акселерометра в залежності від його орієнтації в просторі. Дані в таблиці наводяться для спокою датчика.
Розглянемо докладніше, що показує нам акселерометр. Нехай датчик лежить горизонтально, наприклад, на столі. Тоді проекція вектора прискорення дорівнюватиме 1g по осі Z, або Zout = 1g. По решті двох осей будуть нулі: Xout = 0 і Yout = 0. При повороті датчика "на спину", він буде направлений у протилежний бік щодо вектора сили тяжіння, тобто. Zout = -1g. Аналогічно виміри знімаються по всіх трьох осях. Зрозуміло, що акселерометр може бути розташований як завгодно в просторі, тому з усіх трьох каналів ми зніматимемо відмінні від нуля показання.
Якщо датчик сильно труснути вздовж вертикальної осі Z, то значення Zout буде більшим, ніж "1g". Максимальне прискорення - "3g" по кожній з осей в будь-якому з напрямків (тобто як з "плюсом", так і з "мінусом").

Думаю, із принципом роботи акселерометра розібралися. Тепер розглянемо схему з'єднання.
Чіп аналогового акселерометра ADXL335 досить дрібний і вміщений у BGA корпус, і в домашніх умовах його складно змонтувати на плату. Тому я використовуватиму готовий модуль GY-61 з акселерометром ADXL335. Такі модулі в китайських інтернет-магазинах коштують майже копійки.
Для живлення акселерометра необхідно подати на висновок модуля VCC напруга +3,3 В. Вимірювальні канали датчика підключаються до аналогових висновків Arduino, наприклад, "A0", "A1" і "A2". Це вся схема:)

Завантажимо такий скетч на згадку Arduino. Зчитуватимемо з аналогових входів показання по трьох каналах, перетворюватимемо їх у напругу і виводитимемо їх у послідовний порт.
Arduino має 10-розрядний АЦП, а максимальна допустима напруга на виводі – 5 вольт. Виміряні напруги кодуються бітами, які можуть набувати лише 2 значення - 0 або 1. Це означає, що весь діапазон вимірювань буде поділений на (1+1) в 10-му ступені, тобто. на 1024 рівні відрізки.
Для того щоб перевести показання, що знімаються в вольти, потрібно кожне виміряне на аналоговому вході значення поділити на 1024 (відрізка), а потім помножити на 5 (вольт).
Подивимося, що реально приходить з акселерометра з прикладу осі Z (останній стовпець). Коли датчик розташований горизонтально і дивиться нагору, приходять числа (2,03 +/-0,01). Отже, це має відповідати прискоренню "+1g" по осі Z та куту 0 градусів. Перевернемо датчик. Приходять числа (1,69 +/-0,01), що має відповідати "-1g" та кутку 180 градусів.

Знімемо значення з акселерометра при кутах 90 і 270 градусів та занесемо до таблиці. Таблиця показує кути повороту акселерометра (стовпець "A") та відповідні їм значення Zout у вольтах (стовпець "B").
Для наочності наведено графік напруги на виході Zout залежно від кута повороту. Блакитне поле – це область значень у спокійному стані (при прискоренні 1g). Рожеве поле на графіку - це запас для того, щоб ми могли вимірювати прискорення до +3g і до -3g.
При повороті 90 градусів на вісь Z припадає нульове прискорення. Тобто. значення 1,67 вольт – це умовний нуль Zo для осі Z. Тоді знайти прискорення можна так:
g = Zout - Zo/sensitivity_z, тут Zout - виміряне значення в мілівольтах, Zo - значення при нульовому прискоренні в мілівольтах, sensitivity_z - чутливість датчика по осі Z. Чутливість наведена в паспорті і дорівнює в середньому 300 мВ/g, але взагалі краще провести калібрування акселерометра та обчислити значення чутливості конкретно для вашого датчика за формулою:
sensitivity_z = * 1000. У разі чутливість акселерометра по осі Z = (2,03 - 1,68)*1000 = 350 мВ. Аналогічно чутливість потрібно буде порахувати для осей X та Y.
У стовпці "С" таблиці наводиться прискорення, обчислене для п'яти кутів при чутливості, що дорівнює 350. Як видно, вони практично збігаються з тими, що показані на малюнку 1.

Згадавши базовий курс геометрії, отримаємо формулу для обчислення кутів повороту акселерометра:
angle_X = arctg [sqrt (Gz ^ 2 + Gy ^ 2) / Gx].
Значення виходять у радіанах. Щоб перевести їх у градуси, поділимо на число "Пі" та помножимо на 180.
У результаті повний скетч, що обчислює прискорення та кути повороту акселерометра по всіх осях, наведено на ілюстрації. У коментарях наведено пояснення до коду програми.
При виведенні в порт "Serial.print()" символ "\t" означає знак табуляції, щоб стовпці були рівні та значення розташовувалися один під одним. "+" означає конкатенацію (з'єднання) рядків. Причому оператор "String()" явно вказує компілятор, що чисельне значення потрібно перетворити в рядок. Оператор "round()" округлює кут з точністю до 1 градуса.

Отже, ми з вами навчилися знімати та обробляти дані з аналогового акселерометра ADXL335 за допомогою Arduino. Тепер ми можемо використовувати акселерометр у своїх розробках.

Дозволяє визначати прискорення діюче у напрямі осей X, Y, Z і застосовується визначення орієнтації об'єкта у просторі: кутів крену і тангажу.

Відео огляд

Підключення та налаштування

Акселерометр спілкується з керуючою електронікою за протоколом I²C/TWI. Для підключення використовується два 3-провідні шлейфи. При підключенні модуля до Arduino зручно використовувати. Для отримання даних із акселерометра ми написали бібліотеку Troyka-IMU. Вона приховує в собі всі тонкощі протоколу, через який передаються дані з акселерометра та надає прості та зрозумілі функції для виведення значень.

Приклад роботи

Як приклад виведемо в Serial порт напрямок і величину прискорення вільного падіння по осях X, Y, Z.

accelerometer.ino // бібліотека до роботи I²C#include // бібліотека до роботи з модулями IMU#include // створюємо об'єкт до роботи з акселерометром Accelerometer accel; void setup() ( // відкриваємо послідовний порт Serial.begin (115200); // Виводимо повідомлення про початок ініціалізації Serial.println ("Accelerometer init..."); // ініціалізація акселерометра accel.begin(); // встановлюємо чутливість акселерометра // 2g - за замовчуванням, 4g, 8g accel.setRange (RANGE_2G) ; // Виводимо повідомлення про вдалу ініціалізацію Serial.println ("Initialization completed"); ) void loop() ( // Висновок напрямку та величини прискорення в м/с² по осі X Serial.print(accel.readAX()); Serial.print (" \t \t ") ; // Висновок напрямку та величини прискорення в м/с по осі Y Serial.print(accel.readAY()); Serial.print (" \t \t ") ; // Висновок напрямку та величини прискорення в м/с по осі Z Serial.print(accel.readAZ()); Serial.print (" \t \t "); Serial.println (""); delay (100); /* // висновок напрямку та величини прискорення в м/с² X, Y і Z float x, y, z; accel.readAXYZ(&x, &y, &z); Serial.print(x); Serial.print("\t\t"); Serial.print(y); Serial.print("\t\t"); Serial.print(z); Serial.println(""); delay(100); */ }

Елементи плати

Акселерометр на LIS331DLH

Акселерометр заснований на чіпі LIS331DLH і є мініатюрним датчиком прискорення виконаним за технологією MEMS компанії STMicroelectronicsd в корпусі LGA 16 (3x3x1 мм). Спілкування акселерометра з керуючою електронікою здійснюється за протоколом I²C/TWI. Адреса пристрою дорівнює 0b0011000.

Технічний ринок наповнений тисячами модулів датчиків, які коштують недорого і використовуються в проектному конструюванні. Перед цим модулі пов'язують із програмованим мікроконтролером. Акселерометр – інструмент, що використовується для розрахунку різниці між справжнім та гравітаційним прискоренням предмета. Датчик складається з плати із вбудованою мікросхемою.

Прилад застосовують скрізь. Стаття нижче – допоміжна інструкція щодо підключення акселерометра до Ардуїно.

Для проекту знадобляться кілька компонентів:

Мікроконтролер Arduino UNO R3

МК створено з використанням матеріалів контролера ATmega328:

  1. цифрові входи та виходи в кількості 14 штук, причому половина припадає на ШІМ-виходи;
  2. аналогічні входи, кількість – 6 штук;
  3. резонатор на основі кварцу потужністю 16 МГц;
  4. вбудований usb-вхід;
  5. контакт для підключення живлення;
  6. на МК розташовується кнопка, за допомогою якої можливе скидання даних та коду;
  7. контакт для програмування даних, що усередині схеми, іменований ICSP.

Старт роботи починається з подачі електричного живлення до плати. Користувач підключає до плати зі схемою блок живлення або зарядний пристрій. Також процедура здійснюється за допомогою usb-кабелю, який підключений до комп'ютера та мікроконтролера. Для розробки програми знадобиться безкоштовне середовище програмування Arduino IDE.

Увага! Користувач розробляє програми з використанням Ардуїно тільки якщо плати сумісні з архітектурою мікроконтролера. Інакше програма не запрацює.

Користувач створює в безкоштовному середовищі код, потім його компілює і завантажує пророблену програму в пам'ять Ардуїно. Мова, якою програмується код, Wiring максимально наближена до популярної серед програмістів мови – C++. Крім того, МК підтримує версії для осей Віндовс, Мак ОС і Лінукс.

Модуль датчика для гіроскопа акселерометра на Arduino з 3 осями - GY-521 (MPU-6050)

В основі компонента лежить мікросхема MPU-6050. У комплект входять 2 предмети – гіроскоп та акселерометр. Дані пристрої перед конструюванням обробляються і потім переносяться прямо в мікроконтролер через інтерфейс

Модуль датчика допомагає визначати місце та переміщення інструменту у просторі. Вимірюються диферент і кути нахилу за допомогою вектора сили тяжкості та швидкості в процесі обертання. Також включено функцію вимірювання температурного режиму. Переміщення визначається лінійним прискоренням та кутовою швидкістю. Повна картина малюється по 3 осях.

Компонент нерідко порівнюють із людським вестибулярним апаратом, який допомагає людям відчувати силу тяжіння та утримувати рівновагу.

Макетна плата, призначена для прототипування

Налагодження - невід'ємна частина побудови електронних схем. Макетна плата є незамінною для конструкції електронної апаратури. Раніше у винахідництві використовували традиційні макетні плати, але зараз широко поширені макетні плати, які зручні тим, що не потребують додаткових спайок.

Таким чином, процес збирання та налагодження електронної схеми в рази прискорюється: не доводиться часто використовувати паяльник, щоб змінити зламані радіодеталі.

Матеріал для виготовлення макетних безпайкових плат – пластик. Крім того, всі контакти надійно скріплені до плати, тому часті перемикання не зіпсують елемента.

З'єднувальні проводи тато-тато

Звичайні дроти тато-тато нам підійдуть, ще їх називають дроти-перемички. Такі коштують недорого і продаються скрізь, на будь-якому ринку чи будь-якому онлайн-магазині для радіоаматорів.

Крок 2. Схема підключення акселерометра до мікроконтролера Arduino

Порядок та схема підключення досить прості:

GY-521 (MPU-6050) Arduino Uno
VCC 3.3 V
GND GND
SCL A5
SDA A4
  1. Приєднуємо модуль датчика до мікроконтролера.
  2. На МК Ардуїно завантажуємо відпрацьований код, поданий у розділі нижче.
  3. Відкриваємо середовище розробки Arduino IDE та моніторимо послідовний порт.
  4. Звіряємо виведені дані акселерометра та гіроскопа.
  5. Під час повороту датчика відомості не змінюють.

Гіроскоп – інструмент, який дозволяє виміряти реакцію тіла на переміщення кутів та взагалі орієнтації. Акселерометр служить вимірником проекції прискорення, яке тільки здається.

Крок 3. Програмуємо Arduino для обробки інформації, отриманої з акселерометра

Алгоритм написання програми у послідовності:

// Підключаємо необхідні роботи бібліотек #include "MPU6050.h"; #include "I2Cdev.h"; #include "Wire.h"; // Створюємо об'єкт, що символізує модуль датчика MPU6050 axeler; // Створюємо об'єкт бібліотеки Wire Wire b; // Створюємо об'єкт, який символізує контакт I2C I2Cdev h; // Вводимо цифрові дані, відповідальні за точки в 3-х осях int16_t axx, axy, axz; int16_t gix, giy, giz; // Оголошуємо метод, який запускатиме програму void setup() ( // Починаємо роботу Wire.begin(); h.begin(38400); // Виробляємо ініціалізацію, звіт виводиться після компіляції h.println("Initializing I2C devices.). ."); axeler.initialize(); delay(100); ) // Зчитуємо значення гіроскопа та акселерометра за допомогою адрес, які належать описаним вище змінним void loop() ( axeler.getMotion6(&axx, &axy, &axz, &gix, &giy , &giz);// Виводимо значення, що вийшло на екран h.print("a/g:\t"); h.print(axx); h.print("\t"); h.print(axy); .print("t"); hl.print(axz); h.print("t"); h.print(gix); h.print("t"); h.print("\t"); h.println(giz);

Вуаль! Акселерометр Arduino запрограмований.

У принципі, для різноманітності можна написати ще один скетч (нижче), але тоді нам потрібна буде ще одна бібліотека - , яка перетворює показання координат X та Y.

#include #include "Kalman.h" Kalman kalmanX; Kalman KalmanY; uint8_t IMUAddress = 0x68; /* IMU Data */ int16_t accX; int16_t accY; int16_t accZ; int16_t tempRaw; int16_t gyroX; int16_t gyroY; int16_t gyroZ; double accXangle; // Angle calculate using the accelerometer double accYangle; double temp; double gyroXangle = 180; // Angle calculate using the gyro double gyroYangle = 180; double compAngleX = 180; // Calculate angle using a Kalman filter double compAngleY ​​= 180; double kalAngleX; // Calculate angle using a Kalman filter double kalAngleY; uint32_t timer; void setup() ( Wire.begin(); Serial.begin(9600); i2cWrite(0x6B,0x00); // Disable sleep mode kalmanX.setAngle(180); // Set starting angle kalmanY.setAngle(180); timer = micros(); ) void loop() ( /* Update all the values ​​*/ uint8_t* data = i2cRead(0x3B,14); accX = ((data<< 8) | data); accY = ((data << 8) | data); accZ = ((data << 8) | data); tempRaw = ((data << 8) | data); gyroX = ((data << 8) | data); gyroY = ((data << 8) | data); gyroZ = ((data << 8) | data); /* Calculate the angls based on the different sensors and algorithm */ accYangle = (atan2(accX,accZ)+PI)*RAD_TO_DEG; accXangle = (atan2(accY,accZ)+PI)*RAD_TO_DEG; double gyroXrate = (double)gyroX/131.0; double gyroYrate = -((double)gyroY/131.0); gyroXangle += kalmanX.getRate()*((double)(micros()-timer)/1000000); // Calculate gyro angle using the unbiased rate gyroYangle += kalmanY.getRate()*((double)(micros()-timer)/1000000); kalAngleX = kalmanX.getAngle(accXangle, gyroXrate, (double)(micros()-timer)/1000000); // Calculate the angle using a Kalman filter kalAngleY = kalmanY.getAngle(accYangle, gyroYrate, (double)(micros()-timer)/1000000); timer = micros(); Serial.println(); Serial.print("X:"); Serial.print(kalAngleX,0); Serial.print(" "); Serial.print("Y:"); Serial.print(kalAngleY,0); Serial.println(" "); // The accelerometer"s maximum samples rate is 1kHz } void i2cWrite(uint8_t registerAddress, uint8_t data){ Wire.beginTransmission(IMUAddress); Wire.write(registerAddress); Wire.write(data); Wire.endTransmission(); // Send stop } uint8_t* i2cRead(uint8_t registerAddress, uint8_t nbytes) { uint8_t data; Wire.beginTransmission(IMUAddress); Wire.write(registerAddress); Wire.endTransmission(false); // Don"t release the bus Wire.requestFrom(IMUAddress, nbytes); // Send a repeated start and then release the bus after reading for(uint8_t i = 0; i < nbytes; i++) data [i]= Wire.read(); return data; }

Після другого скетчу ви на екрані зможете побачити такі цифри:

Висновок

Модуль датчика – пристрій, що широко використовується у багатьох сферах людського життя. За допомогою датчика приводять у норму політ квадрокоптера, тому що гіроскоп та акселерометр часто застосовуються в сукупності.

Модуль допомагає скоординувати різноманітні електронні пристрої. Наприклад, часто прилад вбудовують у детектор руху та систему орієнтування, яка вбудовується у роботи для керування. Інші подібні пристрої з підтримкою сенсорної функції мають успіх в інших областях.

Акселерометр - це пристрій, який дозволяє виміряти динамічне та статичне прискорення по трьох осях X, Y і Z. Завдяки статичному прискоренню можна визначити положення в просторі (акселерометр як датчик повороту), а завдяки динамічному (рух або струс) - напрям прискорення.

Цифровий акселерометр ADXL345 - це 3-осьовий акселерометр з високою роздільною здатністю (13 біт) по осях з межею до ±16g. Модуль володіє зниженим енергоспоживанням та малими розмірами. Інформаційний обмін з модулем здійснюється за послідовними інтерфейсами I2C або SPI (3- або 4-провідний).

Існує безліч модулів Arduino з акселерометром ADXL345. Модуль може виглядати, наприклад, так:

Цей модуль має назву GY-291. Модуль має такі висновки:

Виведення модуляПризначенняПідключати до висновку Arduino
SPII2C
GNDЗемляGNDGND
VCCживлення+3,3V+3,3V
CSВибір керованого інтерфейсу SPI10 -
INT1Вихід переривання 1 (*)- -
INT2Вихід переривання 2 (*)- -
SDOДані від веденого12 -
SDAДані від майстра інтерфейсу SPI
Шина даних інтерфейсу I2C
11 A4
SCLШина тактування13 A5

(*) Роботи з перериваннями ADXL345 стосуватися цієї статті не будемо. Ось є хороша, в якій досить докладно описано питання роботи з перериваннями.

Залежно від вибраного інтерфейсу – SPI або I2C – підключення модуля буде відповідним, як показано в таблиці. Але в обох випадках дуже просто.

Розглянемо структуру регістрів мікросхеми ADXL345:


З іншого боку, нас цікавить регістр управління харчуванням, т.к. він відповідає за режим роботи пристрою:

Як бачимо, біт D3 ( Measure) перемикає акселерометр у режим виміру.

2 за інтерфейсом SPI

Акселерометр ADXL345 підтримує 3- та 4-провідні варіанти інтерфейсу SPI. Ми розглянемо лише 4-дротове підключення. Крім того, акселерометр працює в режимі 3 інтерфейсу SPI (пам'ятаєте, ми вже обговорювали: CPOL = 1, CPHA = 1). Діаграма, що показує обмін з акселерометром ADXL345 за 4-провідним інтерфейсом SPI:


Тут біт MB- це ознака того, що ми збираємося читати багато байтів за раз (якщо біт встановлено один). Для тестування роботи з SPI пристроями та швидкого освоєння порядку обміну з ними я зазвичай використовую плату налагодження з мікросхемою FT2232H. Ця мікросхема підтримує безліч режимів, зокрема I2C і SPI. Управління роботою мікросхеми FT2232H – за допомогою програми SPI via FTDI, Про яку я вже неодноразово розповідав.

Підключимо акселерометр до налагоджувальної плати та прочитаємо регістр DEVID, В якому зберігається постійне значення-ідентифікатор акселерометра ADXL345. Значення ідентифікатора має бути 0xE5.


Не забудемо перед читанням записати команду 0x80, яка вкаже акселерометру, що ми збираємося читати, починаючи з регістра на адресу 0x0 (див. діаграму вище, малюнок 38 - SPI 4-Wire Read):


Видно, що в регістрі міститься число 0xE5, яке є значенням ідентифікатора акселерометра ADXL345, згідно з технічним описом (datasheet). Ось як це виглядає на часовій діаграмі:


Пристрій відповідає все нормально. Тепер нам потрібно перевести акселерометр у режим вимірювання. Для цього необхідно записати в регістр POWER_CTL(Адреса регістра 0x2D) число 0x08 (установити біт Measureв HIGH). Після цього можна починати читати регістри з 0x32 до 0x37, в яких зберігаються дані про прискорення по трьох осях. Зробимо це за допомогою Arduino. Напишемо такий скетч:

Скетч для читання даних ADXL345 за SPI(розгортається) #include const byte READ = 0x80; //біт маркер читання const byte MB = 0x40; //біт MB (багатобайтова передача) const int CS = 10; // пін вибору веденого void setup() ( Serial.begin(115200); SPI.begin(); SPI.setClockDivider(SPI_CLOCK_DIV32); // дільник частоти 500 кГц SPI.setDataMode(SPI_MODE3); // задаємо третій режим SPI byte id; readRegister(0x00, 1, id); // читаємо регістр DEVID Serial.print("ID="); Serial.println(id, HEX); writeRegister(0x2D, ​​0x08); // Переводимо ADXL345 в режим вимірювання } void loop() ( byte buff; readRegister(0x32, 6, buff); // читаємо значення по осях X, Y, Z int x = ((int) buff) // записує значення в регістр void writeRegister(byte reg, byte value) ( digitalWrite(CS, LOW); SPI.transfer(reg); SPI.transfer(value); digitalWrite(CS, HIGH); } // Читає з регістра задану кількість байтів void readRegister(byte reg, int bytesToRead, byte *outBuff) ( digitalWrite(CS, LOW); reg = reg | READ; // покажемо акселерометру, що хочемо з нього читати if (bytesToRead > 1) (reg = reg | MB; // і читати хочемо багато байтів) SPI.transfer(reg); // записуємо адресу регістра, з якого починаємо читання for (int i = 0; i)

Ось так виглядає часова діаграма роботи цього скетчу:


Зрозуміло, чому перший байт передачі від Arduino під час читання значень прискорень по осях - число 0xF2? Це адреса першого регістра, з якого починаємо читання (0x32), об'єднаний за АБОз 0x80 - маркером читання READ- і з 0x40 – маркером багатобайтової передачі MB: 0x32 OR 0x80 OR 0x40 = 0011_0010 OR 1000_0000 OR 0100_0000 = 1110_1101 = 0xF2

Що означають лічені значення? Це питання розглядається в останній розділ статті. Крім того, існує ряд бібліотек для Arduino, які спрощують налаштування та читання даних з акселерометра, дозволяючи не думати про такі низькорівневі речі як регістри, біти та байти. Посилання на бібліотеки також наведено наприкінці статті.

3 Робота з цифровим акселерометром ADXL345за інтерфейсом I2C

Тимчасова діаграма інформаційного обміну з ADXL345 за інтерфейсом I2C виглядає так:


Давайте перепишемо скетч для Arduino, який буде робити те саме, тільки з обміном по інтерфейсу I2C:

Скетч для читання даних ADXL345 I2C(розгортається) #include const int adxl345 = 0x53; // I2C адреса ADXL345 void setup() ( Serial.begin(9600); Wire.begin(); // запишемо адресу регістра DEVID Wire.beginTransmission(adxl345); Wire.write(byte(0x00)); Wire.endTransmission(); // прочитаємо регістр DEVID: Wire.requestFrom(adxl345, 1); while (Wire.available()) ( byte c = Wire.read(); Serial.print("ID = "); Serial.println(c, HEX); ) // переведемо акселерометр в режим вимірювань Wire.beginTransmission(adxl345 ); Wire.write(byte(0x2D)); Wire.write(byte(0x08)); Wire.endTransmission(); } void loop() (// Запишемо адресу початку даних по осях X, Y та Z: Wire.beginTransmission(adxl345); Wire.write(byte(0x32)); Wire.endTransmission(); // Прочитаємо 6 байтів значень XYZ: int i = 0; byte xyz; Wire.requestFrom(adxl345, 6); while (Wire.available()) ( byte c = Wire.read(); xyz[i] = c; i++; ) // порахуємо та відобразимо значення X, Y, Z: int x = word(xyz, xyz); int y = word(xyz, xyz); int z = word(xyz, xyz); Serial.print(x); Serial.print("\t"); Serial.print(y); Serial.print("\t"); Serial.println(z); delay(100); }

Діаграма читання регістру DEVIDцифрового акселерометра ADXL345 при обміні за послідовним інтерфейсом I2C буде в такому випадку:


Як видно, ADXL345 повертає очікуване значення 0xE5. А ось так виглядатиме діаграма читання регістрів, в яких зберігаються дані по осях XYZ:

Тут все ще простіше, ніж під час роботи з інтерфейсом SPI.

4 Розбір свідченьцифрового акселерометра ADXL345

Подивіться на фотографію нижче. На платі модуля намальовано три осі: X, Y та Z. Вони показують напрямок осей акселерометра. Напрями осей обумовлені розташуванням мікросхеми ADXL345 на платі. В даному випадку вісь X акселерометра спрямована горизонтально вправо, вісь Z спрямована горизонтально на нас, вісь Y вертикально вгору.


А ось що виводить наш скетч в монітор послідовного порту середовища Arduino IDE (треба уточнити, що цей висновок спостерігається в режимі спокою - акселерометр нерухомо лежить на столі в положенні, як на фото).

У трьох шпальтах представлено значення статичного прискорення, виміряне акселерометром по осях X, Y і Z, відповідно. У середньому стовпці – показання осі Y – значення більше, ніж у двох інших. Ці значення дано в умовних відліках, як вони записані в регістрах акселерометра. Акселерометр ADXL345 має декілька діапазонів вимірів. Давайте подивимося на зведену таблицю діапазонів та дозволів датчика акселерометра:


Нагадаю, що g- це прискорення вільного падіння, чисельно дорівнює приблизно 9,81 метра в секунду за секунду (м/с 2).

Діапазон за замовчуванням - від −16gдо 16g(розмах 32g). Відповідно до таблиці, цей діапазон прискорень припадає 13 біт точності чи 2 13 = 8192 отсчёта. Таким чином, на 1 відлік припадає прискорення 32g/8192 = 0,00390625g=0,00390625×9,81 ≈ 0,038 м/с 2 . Маючи це на увазі, виходить, що в даному висновку прискорення скетчу становить:

Що ж, цілком логічно. Вісь спрямована вертикально, тобто. вздовж вектора сили земного тяжіння, і значення прискорення приблизно дорівнює константі g. Прискорення по осях X і Z, які лежать в одній горизонтальній площині, приблизно однакові і знаходяться близько 0. Через кривизну стола, на якому стоїть датчик, значення дещо відрізняються. Якби я вирівняв акселерометр за рівнем, його показання були б більш точні. В ідеальному випадку по осі Y має бути прискорення 9,8 м/с 2 а по осях X і Z - 0.

Крім того, датчик ADXL345 має можливість тонкого налаштування та калібрування. У цьому прикладі ми цього не робили, а використовували акселерометр із заводськими налаштуваннями, як є. Відсутність калібрування також може вносити деякі спотворення показання датчика. Рекомендую застосовувати спеціальні бібліотеки Arduino, які спрощують взаємодію з акселерометром ADXL345, зокрема дозволяють проводити тонке налаштування.

Завантажити бібліотеку ADXL345

В архіві лежить технічний опис (datasheet) на цифровий акселерометр ADXL345. Установка бібліотеки здійснюється шляхом копіювання розархівованої папки з бібліотекою в директорію librariesсередовища Arduino IDE.

  • завантажити бібліотеку Arduino для акселерометра ADXL345 з Depositfiles.

© 2023 androidas.ru - Все про Android