Россия, Иркутская область, д. Шаманаева, Трактовая улица, 2, 1 этаж
Телефон:
+7 (395) 239-99-35
Пн-пт: 09:00—19:00
whatsapp telegram vk email

Как подключить акселерометр к ардуино

Как подключить аналоговый акселерометр ADXL335 к Arduino

В этот раз мы займёмся подключением аналогового трёхосного акселерометра ADXL335 к Arduino.

Инструкция по подключению акселерометра ADXL335 к Arduino

Нам понадобится:
  • соединительные провода (рекомендую вот такой набор); (breadboard);
  • персональный компьютер со средой разработки Arduino IDE.

1 Принцип действияцифрового акселерометра

Акселерометры используют для определения вектора ускорения. Акселерометр ADXL335 имеет три оси, и благодаря этому он может определять вектор ускорения в трёхмерном пространстве.

Ввиду того, что сила земного притяжения – это тоже вектор, мы можем определять ориентацию акселерометра в трёхмерном пространстве относительно центра Земли.

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

image Принцип снятия измерений с аналогового акселерометра ADXL335

Рассмотрим подробнее, что же показывает нам акселерометр. Пусть датчик лежит горизонтально, например, на столе. Тогда проекция вектора ускорения будет равна «1g» по оси Z, или Zout = 1g. По остальным двум осям будут нули: Xout = 0 и Yout = 0. При повороте датчика «на спину», он будет направлен в противоположную сторону относительно вектора силы тяжести, т.е. Zout = −1g. Аналогично измерения снимаются по всем трём осям. Понятно, что акселерометр может быть расположен как угодно в пространстве, поэтому со всех трёх каналов мы будем снимать отличные от нуля показания.

Если датчик сильно тряхнуть вдоль вертикальной оси Z, то значение Zout будет больше, чем «1g». Максимальное измеряемое ускорение составляет «±3g» по каждой из осей («плюс» и «минус» тут обозначают направление ускорения).

Думаю, с принципом работы акселерометра разобрались. Теперь рассмотрим схему подключения.

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

Для питания акселерометра необходимо подать на вывод VCC модуля напряжение +3,3 В . Измерительные каналы датчика подключаются к аналоговым выводам Arduino, например, «A0», «A1» и «A2». Это вся схема 🙂

image Схема подключения аналогового трёхосевого акселерометра ADXL335 к Arduino

3 Калибровкааналогового акселерометра ADXL335

Загрузим вот такой скетч в память Arduino. Будем считывать с аналоговых входов показания по трём каналам, преобразовывать их в напряжение и выводить в последовательный порт.

Посмотрим, что же реально приходит с акселерометра на примере оси Z (см. последний столбец на иллюстрации). Когда датчик расположен горизонтально и смотрит вверх, приходят числа (2,03±0,01). Это должно соответствовать ускорению «1g» по оси Z и углу 0° согласно паспорту на ADXL335. Перевернём датчик. Приходят числа (1,69±0,01), что должно соответствовать «−1g» и углу 180°.

image Калибровка аналогового акселерометра ADXL335

4 Определение ускоренийпо трём осям акселерометра

Снимем значения с акселерометра при углах 90° и 270° и занесём в таблицу. Таблица показывает углы поворота акселерометра (столбец «A») и соответствующие им значения Zout в вольтах (столбец «B»).

image Определение ускорений по трём осям акселерометра ADXL335

Для наглядности приведён график напряжений на выходе Zout в зависимости от угла поворота. Голубое поле – это область значений в спокойном состоянии (при ускорении 1g). Розовое поле на графике – это запас для того чтобы мы могли измерять ускорение до +3g и до −3g.

При угле поворота 90° на ось Z приходится нулевое ускорение. Т.е. значение 1,67 вольт – это условный ноль Z . Тогда определим ускорение так: g = Zout – Z / Sz, здесь Zout – измеренное значение в милливольтах, Z – значение при нулевом ускорении в милливольтах, Sz – чувствительность датчика по оси Z, измеренная в мВ/g.

Чувствительность акселерометра приведена в паспорте и равна в среднем 300 мВ/g или 0,3 В/g, но вообще лучше провести калибровку акселерометра и вычислить значение чувствительности конкретно для вашего датчика по формуле: Sz = Z(0°) – Z(90°) В данном случае чувствительность акселерометра по оси Z = 2,03 – 1,68 = 0,35 В/g. Аналогично чувствительность нужно будет посчитать для осей X и Y.

В столбце «С» таблицы приводится расчётное ускорение при чувствительности, равной 350 мВ/g. Как видно, расчёты практически совпадают с номинальными величинами, которые даются на первом рисунке из паспорта на датчик ADXL335, т.е. наш датчик довольно точно показывает свою ориентацию в пространстве (я показал это просто для самопроверки, дальше это не пригодится).

5 Определение углов поворота акселерометра

Вспомнив базовый курс школьной геометрии, выведем формулу для вычисления углов поворота акселерометра: angle_X = arctg[ √(Gz 2 + Gy 2 ) / Gx ]. Значения получаются в радианах. Чтобы перевести радианы в градусы, поделим результат на число π и умножим на 180°.

В итоге полный скетч, вычисляющий ускорения и углы поворота акселерометра по всем осям, приведён на врезке. В комментариях даны пояснения к коду программы.

При выводе в порт Serial.print() символ t обозначает знак табуляции, чтобы столбцы были ровные, и значения располагались друг под другом. Символ + означает конкатенацию (объединение) нескольких строк. Оператор String() явно указывает компилятору, что численное значение нужно преобразовать в строку. Оператор round() округляет угол с точностью до 1°.

image Подключение аналогового акселерометра ADXL335 к Arduino с помощью макетной платы

Итак, мы с вами научились снимать и обрабатывать данные с аналогового акселерометра ADXL335 при помощи Arduino.

Полезный совет

Определите «нулевые» значения напряжений и чувствительности по осям X, Y и Z для вашего датчика с помощью скетча, описанного в разделе «Калибровка аналогового акселерометра ADXL335». Иначе углы и ускорения будут вычисляться со значительными ошибками.

Как работает акселерометр? Взаимодействие ADXL335 с Arduino

Вы когда-нибудь задумывались, как ваш смартфон отличает верх от низа? Это одна из самых классных функций современных смартфонов. У всех из них есть встроенное в схему крошечное устройство под названием акселерометр, которое может понимать, когда вы наклоняете его с одной стороны на другую. Таким образом, ваш смартфон автоматически определяет, когда нужно переключить положение экрана с портретного на альбомное.

Как работает акселерометр? Взаимодействие ADXL335 с Arduino

Акселерометры широко используются в чувствительных к движению и наклону приложениях с низким энергопотреблением, таких как мобильные устройства, игровые системы, защита дисков, стабилизация изображений, спортивные и медицинские устройства.

Давайте внимательнее посмотрим, что это, что они делают, и как работают.

Что такое ускорение?

Блестящий ученый Исаак Ньютон в своем втором законе движения определил ускорение, связав его с массой и силой.

Если у вас есть определенная сила (скажем, сила в вашей ноге, когда вы пинаете ею), и вы применяете ее к массе (футбольный мяч), вы заставляете массу ускоряться (мяч отлетит в воздухе).

Сила = Масса х Ускорение

Ускорение = Сила / Масса

Другими словами, ускорение – это количество силы, которое нам нужно для перемещения каждой единицы массы.

Как работает акселерометр?

Чтобы узнать, как работают акселерометры, полезно представить шар внутри трехмерного куба.

Рисунок 1 – Невесомость

Предположим, что куб находится в космическом пространстве, где всё находится в невесомом состоянии, шар просто будет плавать в середине куба.

Теперь давайте представим, что каждая стена представляет определенную ось.

Если мы внезапно переместим куб влево с ускорением 1g (единичное усилие 1g эквивалентно гравитационному ускорению 9,8 м/с 2 ), без сомнения, мяч ударится в стену X. Если мы измерим силу, которую мяч применяет к стене X, мы можем получить выходное значение 1g по оси X.

Рисунок 2 – Внезапное движение

Давайте посмотрим, что произойдет, если мы перенесем этот куб на Землю. Мяч просто упадет на стенку Z и применит силу 1g, как показано на рисунке ниже:

Рисунок 3 – Сила тяжести

В этом случае куб не перемещается, но мы всё равно получаем значение 1g по оси Z. Это потому, что сила тяжести тянет шар вниз с силой 1g.

Акселерометр измеряет статическое ускорение силы тяжести в приложениях, чувствительных к наклону, а также динамическое ускорение, возникающее в результате движения, удара или вибрации.

Как работает MEMS акселерометр?

Акселерометр MEMS (Micro Electro Mechanical Systems) состоит из микромеханической структуры, построенной поверх кремниевой пластины.

Рисунок 4 – Внутренняя работа MEMS акселерометра ADXL335

Эта конструкция подвешена на поликремниевых пружинах. Это позволяет конструкции отклоняться, когда к определенной оси применяется ускорение.

Из-за прогиба емкость между неподвижными пластинами и пластинами, прикрепленными к подвешенной конструкции, изменяется. Это изменение емкости пропорционально ускорению по этой оси.

Датчик обрабатывает это изменение емкости и преобразует его в аналоговое выходное напряжение.

Обзор аппаратного обеспечения акселерометра ADXL335

Основой модуля является небольшой трехосный MEMS акселерометр с низким энергопотреблением и с чрезвычайно низким уровнем шума от Analog Devices – ADXL335. Датчик имеет полный диапазон чувствительности ±3g. Он может измерять статическое ускорение, вызванное силой тяжести в приложениях, чувствительных к наклону, а также динамическое ускорение, вызванное движением, ударом или вибрацией.

Рисунок 5 – Обзор аппаратного обеспечения модуля акселерометра ADXL335

Датчик работает при питании от 1,8 до 3,6 В (оптимально 3,3 В) и обычно потребляет ток всего 350 мкА. Однако встроенный стабилизатор 3,3 В делает его идеальным выбором для взаимодействия с микроконтроллерами 5 В, такими как Arduino.

Эта дружественная макетная плата разводит каждый вывод ADXL335 на 6-выводный разъем с шагом 0,1 дюйма. Сюда входят 3 аналоговых выхода для измерений по осям X, Y и Z, 2 вывода питания и вывод самотестирования, который позволяет проверить работу датчика в конечном приложении.

Аналоговые выходы являются относительными, что означает, что выходной сигнал 0g номинально равен половине напряжения питания 3,3 В (1,65 В), -3g соответствует выходному напряжению 0 В, и 3g соответствует 3,3 В с полным масштабированием между ними.

Ниже приведена таблица с основными характеристиками микросхемы акселерометра ADXL335.

Рабочее напряжение 1,8 В — 3,6 В
Рабочий ток 350 мкА (типовой)
Диапазон чувствительности ±3g (полная шкала)
Диапазон температур от -40° до + 85° C
Чувствительные оси 3 оси
Чувствительность от 270 до 330 мВ/g (относительно)
Ударопрочность до 10000g
Размер 4мм х 4мм х 1,45 мм

Для более подробной информации обратитесь к техническому описанию по ссылке ниже.

Распиновка акселерометра ADXL335

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

Рисунок 6 – Распиновка модуля акселерометра ADXL335

Вывод VCC обеспечивает питание для акселерометра, который может быть подключен к 5 В на Arduino.

Вывод Выход X выводит аналоговое напряжение, пропорциональное ускорению, приложенному к оси X.

Вывод Выход Y выводит аналоговое напряжение, пропорциональное ускорению на оси Y.

Вывод Выход Z выводит аналоговое напряжение, пропорциональное ускорению на оси Z.

Вывод GND подключается к выводу GND на Arduino

Вывод ST (Self-Test) контролирует функцию самопроверки. Эта функция подробно обсуждается в конце.

Подключение акселерометра ADXL335 к Arduino UNO

Теперь, когда у нас есть полное представление о том, как работает акселерометр ADXL335, мы можем начать подключать его к нашей плате Arduino.

Подключение довольно простое. Начните с установки акселерометра на макетной плате. Подключите вывод VCC к выводу 5V на Arduino, а вывод GND – к выводу GND на Arduino. Также подключите выходы X, Y и Z к аналоговым выводам A0, A1 и A2 на Arduino.

Для получения точных результатов, нам нужно изменить опорное аналоговое напряжение (AREF) на Arduino. Это можно сделать, подключив вывод 3,3V на Arduino к выводу AREF.

Когда вы закончите, у вас должно получиться что-то похожее на показанное на рисунке ниже.

Рисунок 7 – Подключение модуля акселерометра ADXL335 к Arduino UNO

Итак, теперь, когда мы подключили наш акселерометр, пришло время написать код и протестировать его.

Код Arduino – чтение показаний акселерометра ADXL335

Скетч довольно прост. Он просто отображает калиброванное выходное напряжение датчика для каждой оси через последовательный интерфейс. Протестируйте скетч, прежде чем мы начнем его подробный разбор.

Скетч начинается с объявления аналоговых входных выводов Arduino, к которым подключены выходные выводы X, Y и Z датчика.

Далее мы определяем минимальные и максимальные значения, которые Arduino собирается предоставить. Поскольку плата Arduino содержит 10-разрядный аналого-цифровой преобразователь, она отобразит выходные напряжения датчика в диапазоне от 0 до 3,3 В в целочисленные значения в диапазоне от 0 до 1023. Именно поэтому для RawMin установлено значение 0, а для RawMax установлено значение 1023.

Переменная sampleSize указывает Arduino брать 10 отсчетов каждого преобразования, чтобы получить более точные результаты.

В функции setup() мы должны установить аналоговое опорное напряжение на EXTERNAL , так как мы подключили 3,3 В к выводу AREF на Arduino. Это делается путем вызова analogReference(EXTERNAL) .

Кроме этого, мы инициализируем здесь и последовательную связь с компьютером.

ПРЕДУПРЕЖДЕНИЕ

Если вы не вызовите analogReference(EXTERNAL) , вы закоротите вместе активный источник опорного напряжения (внутренний) и вывод AREF, что, возможно, приведет к повреждению микроконтроллера на плате Arduino..

В функции loop() мы считываем аналоговые выходы датчика каждые 200 мс. Вместо вызова функции analogRead() мы вызываем пользовательскую функцию ReadAxis() . Эта функция просто берет 10 выборок АЦП и возвращает среднее значение.

Преобразование показаний ADXL335 в ускорение (g)

Следующий фрагмент кода является наиболее важной частью программы. Он преобразует аналоговые выходные напряжения датчика в ускорение свободного падения (g).

Встроенная в IDE функция map() выполняет фактическое преобразование. Таким образом, когда мы вызываем map(xRaw, RawMin, RawMax, -3000, 3000) , значение RawMin будет преобразовываться в -3000 , значение RawMax – в 3000 , а значения между ними – в промежуточные значения.

Значения -3000 и 3000 не являются произвольными. Они фактически представляют ускорение свободного падения (в милли-g, которое составляет 1/1000 g), измеренное датчиком, то есть ± 3g (от -3000 до 3000 милли-g).

  • Когда датчик выдает 0 вольт на оси x, то есть xRaw = 0, функция map() возвращает -3000, представляющие -3g.
  • Когда датчик выдает 3,3 вольта по оси x, то есть xRaw = 1023, функция map() вернет 3000, представляющие +3g.
  • Когда датчик выдает 1,65 В на оси x, т.е. xRaw = 511, функция map() вернет 0, представляющий 0g.

Термин относительный будет иметь больше смысла, когда выходное напряжение будет увеличиваться линейно с ростом ускорения в заданном диапазоне.

Наконец, выходной сигнал датчика уменьшается до дробного значения g с помощью деления на 1000 и выводится в монитор последовательного порта.

На следующих рисунках показан вывод данных акселерометра в монитор последовательного порта в разных положениях.

Рисунок 8 – Вывод акселерометра ADXL335 на оси X — Рисунок 9 – Вывод акселерометра ADXL335 на оси Y + Рисунок 10 – Вывод акселерометра ADXL335 на X + Рисунок 11 – Вывод акселерометра ADXL335 на оси Y — Рисунок 12 – Вывод акселерометра ADXL335 на оси Z + Рисунок 13 – Вывод акселерометра ADXL335 на оси Z —

Функция самотестирования ADXL335

Акселерометр ADXL335 имеет функцию самопроверки, которая позволяет проверить работу датчика в конечном приложении.

Рисунок 14 – Вывод ST (самопроверка) на модуле управляет этой функцией

Когда контакт ST подключен к 3,3 В, на пластину акселерометра внутри действует электростатическая сила. Результирующее движение пластины позволяет пользователю проверить работоспособность акселерометра.

Типичное изменение выходного сигнала:

  • -1,08 g (-325 мВ) по оси X
  • +1.08 g (+325 мВ) по оси Y
  • +1,83 g (+550 мВ) по оси Z

Этот вывод ST при нормальном использовании может быть подключен к земле или оставлен «висеть» в воздухе.

ПРЕДУПРЕЖДЕНИЕ

Подача на вывод ST напряжения выше 3,6 В может привести к повреждению акселерометра.

Учебное пособие по акселерометру и гироскопу MPU6050. Подключение к Ардуино

MPU6050 имеет 3-осевой акселерометр и 3-осевой гироскоп, интегрированные в один чип. Гироскоп измеряет скорость вращения или скорость изменения углового положения во времени по осям X, Y и Z. Для измерения используется технология MEMS и эффект Кориолиса.

Выходные данные гироскопа измеряются в градусах в секунду, поэтому для получения углового положения нам просто нужно интегрировать угловую скорость.

С другой стороны, акселерометр MPU6050 измеряет ускорение. Вкратце, он может измерять гравитационное ускорение по трем осям, и используя некоторую тригонометрию, мы можем вычислить угол, под которым расположен датчик. Итак, если мы объединим данные акселерометра и гироскопа, мы сможем получить очень точную информацию об ориентации датчика в пространстве.

MPU6050 также называют устройством слежения за движением по шести осям или устройством с 6 степенями свободы (шесть степеней свободы) из-за его 6 выходов, или 3 выхода акселерометра и 3 выхода гироскопа.

Ардуино и MPU6050

Давайте посмотрим, как мы можем подключить и прочитать данные с датчика MPU6050 с помощью Ардуино. Для связи с Ардуино мы используем протокол I2C, поэтому нам нужны всего два провода для подключения по линии данных и два провода для питания.

Скетч MPU6050 Ардуино

Ниже приведем полный код, а после разъясним его поподробнее:

Описание кода: Итак, сначала нам нужно подключить библиотеку Wire.h, которая используется для I2C связи, и определить некоторые переменные, необходимые для хранения данных.

В разделе setup() нам нужно инициализировать библиотеку Wire.h и сбросить датчик через регистр управления . Для этого нам нужно взглянуть в datasheet, где мы можем увидеть адрес регистра:

Также, если мы хотим, мы можем выбрать полный диапазон для акселерометра и гироскопа, используя их регистры конфигурации. В этом примере мы будем использовать диапазон по умолчанию + — 2g для акселерометра и диапазон 250 градусов/с для гироскопа, поэтому оставим эту часть кода закомментированной:

В разделе loop() мы начинаем с чтения данных акселерометра. Данные для каждой оси хранятся в двух байтах или регистрах, и мы можем видеть адреса этих регистров в datasheet датчика:

Чтобы прочитать их все, мы начинаем с первого регистра и с помощью функции RequiestFrom() запрашиваем чтение всех 6 регистров для осей X, Y и Z. Затем мы читаем данные из каждого регистра, и, поскольку выходные данные состроят из старшего и младшего байта, мы соответствующим образом объединяем их, чтобы получить правильные значения:

Чтобы получить выходные значения от -1g до + 1g, подходящие для расчета углов, мы делим выходной сигнал с предварительно выбранной чувствительностью.

Наконец, используя две формулы, мы вычисляем углы крена и тангажа на основе данных акселерометра:

Далее тем же методом получаем данные гироскопа:

Мы считываем шесть регистров гироскопа, соответствующим образом объединяем их данные и делим их на предварительно выбранную чувствительность, чтобы получить результат в градусах в секунду:

Здесь вы можете заметить, что выходные значения корректируются на величину ошибок (объясним далее). Поскольку выходные данные выражаются в градусах в секунду, то нам нужно умножить их на время, чтобы получить только градусы. Значение времени фиксируется перед каждой итерацией чтения с помощью функции millis().

Наконец, мы объединяем данные акселерометра и гироскопа с помощью дополнительного фильтра. Здесь мы берем 96% данных гироскопа, потому что они очень точны и не подвержены внешним воздействиям.

Обратной стороной гироскопа является то, что он дрейфует или вносит ошибку в выходной сигнал с течением времени. Поэтому в долгосрочной перспективе мы используем данные акселерометра, в данном случае 4%, что достаточно для устранения ошибки дрейфа гироскопа.

Однако, поскольку мы не можем рассчитать рыскание по данным акселерометра, мы не можем реализовать для него дополнительный фильтр.

Прежде чем мы взглянем на результаты, объясним, как получить значения коррекции ошибок. Для вычисления этих ошибок мы можем вызвать пользовательскую функцию calculate_IMU_error(), когда датчик находится в неподвижном положении.

Здесь мы делаем 200 измерений для всех выходов, суммируем их и делим на 200. Поскольку мы удерживаем датчик в горизонтальном неподвижном положении, ожидаемые выходные значения должны быть 0. Таким образом, с помощью этого расчета мы можем получить среднюю ошибку датчика.

Мы просто печатаем значения на последовательном мониторе, и, узнав их, мы можем реализовать их в коде, как показано ранее, как для расчета крена, так и для тангажа, а также для трех выходов гироскопа.

Работа с Arduino и MPU6050

MPU6050 представляет собой 3-х осевой гироскоп и 3-х же осевой акселерометр в одном корпусе. Сразу поясню, что это и для чего:

  • Гироскоп измеряет угловую скорость вращения вокруг оси, условно в градусах/секунду. Если датчик лежит на столе – по всем трём осям будет значение около нуля. Для нахождения текущего угла по скорости нужно интегрировать эту скорость. Гироскоп может чуть привирать, поэтому ориентироваться на него для расчёта текущего угла не получится даже при идеальной калибровке.
  • Акселерометр измеряет ускорение вдоль оси, условно в метрах/секунду/секунду. Если датчик лежит на столе или движется с постоянной скоростью – на оси будет спроецирован вектор силы тяжести. Если датчик движется с ускорением – вдобавок к ускорению свободного падения получим составляющие вектора ускорения. Если датчик находится в свободном падении (в том числе на орбите планеты) – величины ускорений по всем осям будут равны 0. Зная проекции вектора силы тяжести можно с высокой точностью определить угол наклона датчика относительно него (привет, школьная математика). Если датчик движется – однозначно определить направление вектора силы тяжести не получится, соответственно угол тоже.

Модуль стоит в районе 150 рублей на нашем любимом AliExpress (ссылка, ссылка), а также входит в Arduino набор GyverKIT.

Итак, по отдельности акселерометр и гироскоп не могут обеспечить точное измерение угла, но вместе – ещё как могут! Об этом мы поговорим ниже. А начнём с подключения и базового общения с датчиком.

Подключение

Датчик подключается на шину i2c (SDA -> A4, SCL -> A5, GND -> GND). На плате стоит стабилизатор, позволяющий питаться от пина 5V (VCC -> 5V).

На модуле выведен пин AD0. Если он никуда не подключен (или подключен к GND) – адрес датчика на шине i2c будет 0x68, если подключен к питанию (VCC) – адрес будет 0x69. Таким образом без дополнительных микросхем можно подключить два датчика на шину с разными адресами.

Получение сырых данных

Библиотека MPU6050 от i2cdev

Расшифровка сырых данных

По каждой оси и параметру датчик выдаёт 16-битное знаковое значение ( -32768.. 32767 ). При стандартных настройках (как в примерах выше) это значение отражает:

  • Ускорение в диапазоне -2.. 2 g (9.82 м/с/с).
  • Угловую скорость в диапазоне -250.. 250 градусов/секунду.

Таким образом, для перевода сырых данных в величины СИ (если это нужно) можно сделать по каждой оси:

  • Ускорение в м/с/с при чувствительности 2: float accX_f = accX / 32768 * 2
  • Угловая скорость в град/с при чувствительности 250: float gyrX_f = gyrX / 32768 * 250

Думаю закономерность понятна.

Настройка чувствительности

Датчик позволяет настроить чувствительность по каждому параметру, в библиотеке i2cdev это делается так:

  • setFullScaleAccelRange(MPU6050_ACCEL_FS_2); – диапазон -2.. 2 g
  • setFullScaleAccelRange(MPU6050_ACCEL_FS_4); – диапазон -4.. 4 g
  • setFullScaleAccelRange(MPU6050_ACCEL_FS_8); – диапазон -8.. 8 g
  • setFullScaleAccelRange(MPU6050_ACCEL_FS_16); – диапазон -16.. 16 g
  • setFullScaleGyroRange(MPU6050_GYRO_FS_250); – диапазон -250.. 250 град/с
  • setFullScaleGyroRange(MPU6050_GYRO_FS_500); – диапазон -500.. 500 град/с
  • setFullScaleGyroRange(MPU6050_GYRO_FS_1000); – диапазон -1000.. 1000 град/с
  • setFullScaleGyroRange(MPU6050_GYRO_FS_2000); – диапазон -2000.. 2000 град/с

Перевести сырые данные можно таким же способом, как в предыдущем пункте, но с учётом нового диапазона.

Калибровка оффсетов

Для достижения максимальной точности измерений нужно откалибровать акселерометр и гироскоп. Калибровка акселерометра позволяет выставить “ноль” для вектора силы тяжести, а калибровка гироскопа уменьшает его “дрифт”, то есть статическое отклонение в режиме покоя. Идеально откалиброванный и лежащий горизонтально датчик должен показывать ускорение

16384 по оси Z и нули по всем остальным осям ускорения и угловой скорости. Но это фантастика =)

Максимально правильно использовать калибровку в проекте нужно так: калибровка по запросу (кнопка, меню, и т.д.), затем запись калибровочных значений в EEPROM. При запуске – чтение и настройка оффсетов из. Рассмотрим несколько примеров калибровки, первый – из библиотеки. Калибрует долго, но максимально точно. При малых вибрациях и движениях датчика в процессе калибровки (даже от громкого звука) калибровка может не закончиться. Второй вариант – мой упрощённый алгоритм калибровки, калибрует быстро, без возможности зависнуть при тряске, но даёт менее точный результат. Я делюсь примерами, в свой проект их нужно будет переносить вручную и аккуратно =)

Алгоритмы калибровки

16384 по оси Z и нули по всем остальным осям ускорения и угловой скорости. Но это фантастика =) Максимально правильно использовать калибровку в проекте нужно так: калибровка по запросу (кнопка, меню, и т.д.), затем запись калибровочных значений в EEPROM. При запуске – чтение и настройка оффсетов. Да, можно замерить значения по всем 6 осям в покое, сохранить их в переменные, а затем вычитать из свежих прочитанных в процессе работы. Такой способ работает для каких-то базовых операций с датчиком (определение перегрузок, тряски, наличия вращения, и т.д.). Для использования MPU6050 с целью максимально точного определения углов поворота платы такой вариант к сожалению не подходит: калибровать нужно рекурсивно. Рассмотрим несколько примеров калибровки, первый – из библиотеки. Калибрует долго, но максимально точно. При малых вибрациях и движениях датчика в процессе калибровки (даже от громкого звука) калибровка может не закончиться. Второй вариант – мой упрощённый алгоритм калибровки, калибрует быстро, без возможности зависнуть при тряске, но даёт менее точный результат. Я делюсь примерами, в свой проект их нужно будет переносить вручную и аккуратно =)

Ссылка на основную публикацию
Похожее