Датчик прискорення ардуїно для мотоцикл шолом. Як підключити цифровий акселерометр ADXL345 до Arduino Живлення акселерометрів ADXL337 та ADXL377
Перш ніж приступити до розгляду модуля гіроскопа та акселерометра, думаю, буде не зайвим коротко розібратися, що це таке. Гіроскоп являє собою пристрій, що реагує зміну кутів орієнтації контрольованого тіла. У класичному уявленні це якийсь інерційний предмет, який швидко обертається на підвісах. Як результат предмет, що обертається, завжди зберігатиме свій напрямок, а за положенням підвісів можна визначити кут відхилення. Насправді ж електронні гіроскопи побудовані за іншою схемою і влаштовані трохи складніше (вовчок, що обертається, впхнути в мікросхему було б не просто). Акселерометр - це пристрій, який вимірює проекцію прискорення, що здається, тобто різниці між істинним прискоренням об'єкта і гравітаційним прискоренням. На простому прикладі така система є деякою масою, закріпленою на підвісі, що володіє пружністю (пружина для гарного прикладу). Так от якщо таку систему повернути під якимось кутом, або кинути, або зрадити лінійне прискорення, то пружний підвіс відреагує на рух під дією маси і відхилиться і за цим відхиленням визначається прискорення. Таким чином, гіроскоп реагує на зміну в просторі незалежно від напрямок руху, за допомогою акселерометра може вимірювати лінійні прискорення предмета, а так само і штучно розраховується розташування предмета в просторі. Кожен пристрій має свої переваги та недоліки.
Мікросхема 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-521 | 1 | На базі MPU6050 | До блокноту | |
IC1 | МК AVR 8-біт | ATmega8 | 1 | До блокноту | ||
VR1 | Лінійний регулятор | L7805AB | 1 | До блокноту | ||
VR2 | Лінійний регулятор | AMS1117-3.3 | 1 | До блокноту | ||
HG1 | LCD-дисплей | 2004A | 1 | До блокноту | ||
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Елементи плати
Акселерометр на LIS331DLH
Акселерометр заснований на чіпі LIS331DLH і є мініатюрним датчиком прискорення виконаним за технологією MEMS компанії STMicroelectronicsd в корпусі LGA 16 (3x3x1 мм). Спілкування акселерометра з керуючою електронікою здійснюється за протоколом I²C/TWI. Адреса пристрою дорівнює 0b0011000.
Технічний ринок наповнений тисячами модулів датчиків, які коштують недорого і використовуються в проектному конструюванні. Перед цим модулі пов'язують із програмованим мікроконтролером. Акселерометр – інструмент, що використовується для розрахунку різниці між справжнім та гравітаційним прискоренням предмета. Датчик складається з плати із вбудованою мікросхемою.
Прилад застосовують скрізь. Стаття нижче – допоміжна інструкція щодо підключення акселерометра до Ардуїно.
Для проекту знадобляться кілька компонентів:
Мікроконтролер Arduino UNO R3
МК створено з використанням матеріалів контролера ATmega328:
- цифрові входи та виходи в кількості 14 штук, причому половина припадає на ШІМ-виходи;
- аналогічні входи, кількість – 6 штук;
- резонатор на основі кварцу потужністю 16 МГц;
- вбудований usb-вхід;
- контакт для підключення живлення;
- на МК розташовується кнопка, за допомогою якої можливе скидання даних та коду;
- контакт для програмування даних, що усередині схеми, іменований 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 |
- Приєднуємо модуль датчика до мікроконтролера.
- На МК Ардуїно завантажуємо відпрацьований код, поданий у розділі нижче.
- Відкриваємо середовище розробки Arduino IDE та моніторимо послідовний порт.
- Звіряємо виведені дані акселерометра та гіроскопа.
- Під час повороту датчика відомості не змінюють.
Гіроскоп – інструмент, який дозволяє виміряти реакцію тіла на переміщення кутів та взагалі орієнтації. Акселерометр служить вимірником проекції прискорення, яке тільки здається.
Крок 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
Після другого скетчу ви на екрані зможете побачити такі цифри:
Висновок
Модуль датчика – пристрій, що широко використовується у багатьох сферах людського життя. За допомогою датчика приводять у норму політ квадрокоптера, тому що гіроскоп та акселерометр часто застосовуються в сукупності.
Модуль допомагає скоординувати різноманітні електронні пристрої. Наприклад, часто прилад вбудовують у детектор руху та систему орієнтування, яка вбудовується у роботи для керування. Інші подібні пристрої з підтримкою сенсорної функції мають успіх в інших областях.
Акселерометр - це пристрій, який дозволяє виміряти динамічне та статичне прискорення по трьох осях X, Y і Z. Завдяки статичному прискоренню можна визначити положення в просторі (акселерометр як датчик повороту), а завдяки динамічному (рух або струс) - напрям прискорення.
Цифровий акселерометр ADXL345 - це 3-осьовий акселерометр з високою роздільною здатністю (13 біт) по осях з межею до ±16g. Модуль володіє зниженим енергоспоживанням та малими розмірами. Інформаційний обмін з модулем здійснюється за послідовними інтерфейсами I2C або SPI (3- або 4-провідний).
Існує безліч модулів Arduino з акселерометром ADXL345. Модуль може виглядати, наприклад, так:
Цей модуль має назву GY-291. Модуль має такі висновки:
Виведення модуля | Призначення | Підключати до висновку Arduino | |
---|---|---|---|
SPI | I2C | ||
GND | Земля | GND | GND |
VCC | живлення | +3,3V | +3,3V |
CS | Вибір керованого інтерфейсу SPI | 10 | - |
INT1 | Вихід переривання 1 (*) | - | - |
INT2 | Вихід переривання 2 (*) | - | - |
SDO | Дані від веденого | 12 | - |
SDA | Дані від майстра інтерфейсу SPI Шина даних інтерфейсу I2C | 11 | A4 |
SCL | Шина тактування | 13 | A5 |
(*) Роботи з перериваннями ADXL345 стосуватися цієї статті не будемо. Ось є хороша, в якій досить докладно описано питання роботи з перериваннями.
Залежно від вибраного інтерфейсу – SPI або I2C – підключення модуля буде відповідним, як показано в таблиці. Але в обох випадках дуже просто.
Розглянемо структуру регістрів мікросхеми ADXL345:
![](https://i0.wp.com/soltau.ru/images/adxl345/reg_map.png)
З іншого боку, нас цікавить регістр управління харчуванням, т.к. він відповідає за режим роботи пристрою:
Як бачимо, біт D3 ( Measure) перемикає акселерометр у режим виміру.
2 за інтерфейсом SPI
Акселерометр ADXL345 підтримує 3- та 4-провідні варіанти інтерфейсу SPI. Ми розглянемо лише 4-дротове підключення. Крім того, акселерометр працює в режимі 3 інтерфейсу SPI (пам'ятаєте, ми вже обговорювали: CPOL = 1, CPHA = 1). Діаграма, що показує обмін з акселерометром ADXL345 за 4-провідним інтерфейсом SPI:
![](https://i0.wp.com/soltau.ru/images/adxl345/diagram.png)
Тут біт MB- це ознака того, що ми збираємося читати багато байтів за раз (якщо біт встановлено один). Для тестування роботи з SPI пристроями та швидкого освоєння порядку обміну з ними я зазвичай використовую плату налагодження з мікросхемою FT2232H. Ця мікросхема підтримує безліч режимів, зокрема I2C і SPI. Управління роботою мікросхеми FT2232H – за допомогою програми SPI via FTDI, Про яку я вже неодноразово розповідав.
Підключимо акселерометр до налагоджувальної плати та прочитаємо регістр DEVID, В якому зберігається постійне значення-ідентифікатор акселерометра ADXL345. Значення ідентифікатора має бути 0xE5.
![](https://i0.wp.com/soltau.ru/images/adxl345/04.jpg)
Не забудемо перед читанням записати команду 0x80, яка вкаже акселерометру, що ми збираємося читати, починаючи з регістра на адресу 0x0 (див. діаграму вище, малюнок 38 - SPI 4-Wire Read):
![](https://i1.wp.com/soltau.ru/images/adxl345/read_id.png)
Видно, що в регістрі міститься число 0xE5, яке є значенням ідентифікатора акселерометра ADXL345, згідно з технічним описом (datasheet). Ось як це виглядає на часовій діаграмі:
![](https://i0.wp.com/soltau.ru/images/adxl345/adxl_read_id.png)
Пристрій відповідає все нормально. Тепер нам потрібно перевести акселерометр у режим вимірювання. Для цього необхідно записати в регістр POWER_CTL(Адреса регістра 0x2D) число 0x08 (установити біт Measureв HIGH). Після цього можна починати читати регістри з 0x32 до 0x37, в яких зберігаються дані про прискорення по трьох осях. Зробимо це за допомогою Arduino. Напишемо такий скетч:
Скетч для читання даних ADXL345 за SPI(розгортається) #includeОсь так виглядає часова діаграма роботи цього скетчу:
![](https://i2.wp.com/soltau.ru/images/adxl345/adxl_meas_read_xyz.png)
Зрозуміло, чому перший байт передачі від 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 виглядає так:
![](https://i0.wp.com/soltau.ru/images/adxl345/i2c_diagram.png)
Давайте перепишемо скетч для Arduino, який буде робити те саме, тільки з обміном по інтерфейсу I2C:
Скетч для читання даних ADXL345 I2C(розгортається) #includeДіаграма читання регістру DEVIDцифрового акселерометра ADXL345 при обміні за послідовним інтерфейсом I2C буде в такому випадку:
![](https://i2.wp.com/soltau.ru/images/adxl345/i2c_read_id.png)
Як видно, ADXL345 повертає очікуване значення 0xE5. А ось так виглядатиме діаграма читання регістрів, в яких зберігаються дані по осях XYZ:
Тут все ще простіше, ніж під час роботи з інтерфейсом SPI.
4 Розбір свідченьцифрового акселерометра ADXL345
Подивіться на фотографію нижче. На платі модуля намальовано три осі: X, Y та Z. Вони показують напрямок осей акселерометра. Напрями осей обумовлені розташуванням мікросхеми ADXL345 на платі. В даному випадку вісь X акселерометра спрямована горизонтально вправо, вісь Z спрямована горизонтально на нас, вісь Y вертикально вгору.
![](https://i1.wp.com/soltau.ru/images/adxl345/06.jpg)
А ось що виводить наш скетч в монітор послідовного порту середовища Arduino IDE (треба уточнити, що цей висновок спостерігається в режимі спокою - акселерометр нерухомо лежить на столі в положенні, як на фото).
![](https://i1.wp.com/soltau.ru/images/adxl345/xyz.png)
У трьох шпальтах представлено значення статичного прискорення, виміряне акселерометром по осях X, Y і Z, відповідно. У середньому стовпці – показання осі Y – значення більше, ніж у двох інших. Ці значення дано в умовних відліках, як вони записані в регістрах акселерометра. Акселерометр ADXL345 має декілька діапазонів вимірів. Давайте подивимося на зведену таблицю діапазонів та дозволів датчика акселерометра:
![](https://i1.wp.com/soltau.ru/images/adxl345/resolution.png)
Нагадаю, що 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.