Акселерометр и гироскоп mpu6050

Разница между гироскопом и акселерометром

Многие из современных мобильных гаджетов — смартфонов и планшетов — оснащены гироскопами и акселерометрами. Что это за аппаратные компоненты?

Содержание статьи

Гироскоп, встраиваемый в мобильный гаджет, это небольшое устройство, способное определять собственный (а значит, и того девайса, на котором оно размещено) угол наклона относительно земной поверхности и передавать соответствующие координаты в то или иное приложение. Например — в игру, установленную на смартфоне либо планшете или иной вид ПО. Использование приложениями данных с гироскопа дает возможность пользователю эффективно управлять интерфейсом девайса или, например, игровыми персонажами.

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

к содержанию ↑

Что такое акселерометр?

Акселерометр в мобильном гаджете — это устройство, позволяющее измерять собственное (а значит, и того девайса, на котором оно размещено) ускорение. Даже если длина «разгона» составляет миллиметры.

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

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

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

Способность акселерометра измерять ускорение исключительно полезна для работы систем защиты некоторых электронных устройств от последствий падения или неудачной «перепасовки» одним пользователем другому.

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

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

к содержанию ↑

Сравнение

Главное отличие гироскопа от акселерометра — в принципах работы данных аппаратных компонентов.

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

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

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

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

к содержанию ↑

Таблица

Гироскоп Акселерометр
Что между ними общего?
Оба устройства позволяют определить их положение относительно земли, а также того гаджета, в котором они инсталлированы, и могут задействоваться в этих целях одновременно
В чем разница между ними?
Определяет собственный угол наклона относительно земли Определяет ускорение относительно земной поверхности
Не может использоваться в целях измерения длительности перемещения устройства Может применяться для измерения длительности перемещения устройства

Источник: https://TheDifference.ru/chem-otlichaetsya-giroskop-ot-akselerometra/

Ардуино: акселерометр MPU6050

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

На этот раз мы перейдем от теории к практике: подключим датчик к Ардуино, и напишем пару программ для работы с ним. Подключать будем модуль MPU6050 от RobotClass.

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

Характеристики модуля MPU6050 ROC:

  • напряжение питания: от 3,5 до 6 В;
  • потребляемый ток: 500 мкА;
  • ток в режиме пониженного потребления: 10 мкА при 1,25 Гц, 20 мкА при 5 Гц, 60 мкА при 20 Гц, 110 мкА при 40 Гц;
  • диапазон: ± 2, 4, 8, 16g;
  • разрядность АЦП: 16;
  • интерфейс: I2C (до 400 кГц).

На плате имеется 8 контактов:

  • VCC — положительный контакт питания;
  • GND — земля;
  • SDA — линия данных I2C;
  • SCL — линия синхроимпульсов I2C;
  • INT — настраиваемое прерывание;
  • AD0 — I2C адрес; по-умолчанию AD0 подтянут к земле, поэтому адрес устройства — 0x68; если соединить AD0 к контактом питания, то адрес изменится на 0x69;
  • XCL, XDA — дополнительный I2C интерфейс для подключения внешнего магнитометра.

1. Подключение MPU6050 к Ардуино

Соединим контакты датчика с Ардуино Уно согласно стандартной схеме для интерфейса I2C:

MPU6050 ROC GND VCC SDA SCL
Ардуино Уно GND +5V A4 A5

Принципиальная схема

Внешний вид макета

2. Программа для получения сырых данных с акселерометра MPU6050

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

#include “I2Cdev.h” #include “MPU6050.h” #define T_OUT 20 MPU6050 accel; unsigned long int t_next; void setup() { Serial.begin(9600); accel.initialize(); Serial.println(accel.testConnection() ? “MPU6050 connection successful” : “MPU6050 connection failed”); } void loop() { long int t = millis(); if( t_next < t ){ int16_t ax_raw, ay_raw, az_raw, gx_raw, gy_raw, gz_raw; t_next = t + T_OUT; accel.getMotion6(&ax_raw, &ay_raw, &az_raw, &gx_raw, &gy_raw, &gz_raw); Serial.println(ay_raw); // вывод в порт проекции ускорения на ось Y } }

Для работы программы потребуются библиотеки: MPU6050 и I2Cdev, ссылки на которые можно найти в конце урока.

Загружаем программу на Ардуино и открываем окно графика. Поворачиваем датчик вокруг оси X на 90 градусов в одну сторону, потом на 90 в другую. Получится примерно такая картина.

На графике хорошо видно, что при наклоне оси Y вертикально, акселерометр выдает значения близкие к 4000 тысячам. Откуда берется это число?

3. Точность измерения ускорения в MPU6050

Дело в том, что датчик MPU6050 позволяет настраивать точность измерений. Можно выбрать один из четырех классов точности: ±2G, 4G, 8G и 16G, где 1G — это одна земная гравитация.  Используемая нами библиотека по-умолчанию настраивает датчик на диапазон ±8G (прим. по ссылке внизу статьи библиотека по-умолчанию устанавливает ±2G).

С другой стороны, MPU6050 имеет 16 разрядный АЦП. 2 в степени 16 даст нам число 65 536. Поскольку датчик может измерять и отрицательное и положительное ускорение, то он будет выдавать нам числа от -32768 до +32768.

Сложив эти два факта вместе получаем, что при таких настройках 1G будет равен числу 4096 (ну а -1G равен числу -4096). Это вполне совпадает с наблюдаемыми на графике значениями!

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

4. Программа для вычисления угла наклона акселерометра MPU6050

Добавим в предыдущую программу вычисление угла поворота датчика вокруг оси X:

#include “I2Cdev.h” #include “MPU6050.h” #define TO_DEG 57.29577951308232087679815481410517033f #define T_OUT 20 MPU6050 accel; float angle_ax; long int t_next; float clamp(float v, float minv, float maxv){ if( v>maxv ) return maxv; else if( v= 0){ angle_ax = 90 – TO_DEG*acos(ay); } else { angle_ax = TO_DEG*acos(-ay) – 90; } Serial.println(angle_ax); // вывод в порт угла поворота вокруг оси X } }

Загружаем программу в Ардуино и снова пробуем вращать датчик. Теперь на графике отображается угол наклона в градусах!

Ну вот, мы получили уже что-то пригодное для дальнейшего использования. Видно, что датчик поворачивался сначала на 30 с лишним градусов в одну сторону, потом примерно на 60 в другую. Работает!

Заключение

На этом уроке мы получили с датчика MPU6050 сначала сырые данные, а потом и угол его наклона в градусах. Это большое достижение. Но впереди еще немного математики и еще более крутые результаты! Будем делать комплементарный фильтр, который позволит работать с датчиком даже в условиях вибрации и тряски.

Полезные ссылки

Изменено: 5 Янв, 2018 23:06

Источник: http://robotclass.ru/tutorials/arduino-accelerometer-mpu6050/

GY-521 – модуль с гироскопом, акселерометром и термометром MPU-6050 для Ардуино

Подписка

  • Магазины Китая
  • BANGGOOD.COM
  • Радиотовары
  • Пункт №18

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

Также, его можно применить в светящемся шлеме! Удобно, не правда ли? Наклонил голову вправо — загорелось правое «полушарие» =) влево — левое, согнул голову в шее — сзади на шлеме высветился стоп-сигнал! Вот только, думаю, моей шеи хватит минут на 5 таких упражнений, потом — коллдаун, в виде боли на неделю обеспечен.

Итак, заказал — прислали, теперь нужно разобраться и продемонстрировать функционал для Вас, уважаемые читатели Муськи. Пришло с треком, не известно, почему, но в Киеве посылку держали неделю (или это глюки системы треккинга). Дошла чуть менее, чем за три недели. Упаковано в три слоя утеплителя — для амортизации.

Сам модуль — внутри запаянного пакетика со штрих-кодом на наклейке:Размеры платы: 20×16мм. В комплекте два набора штыревых контактов: ровные и загнутые — удобно, не придется гнуть или ровнять.

Большие отверстия не металлизированы, как на картинке в магазине, поэтому, если Вы будите их прикручивать болтами к «минусу», эффекта не будет. Я заливаю их термоклеем, а он, образуя «шапочки», надёжно фиксирует плату.
Отвертия контактов металлизированы отлично, паяются без проблем. Модуль GY-521 включает понижающий линейный стабилизатор для питания от 5В, красный светодиод питания и обвязку, обеспечивающую работу по протоколу I2C.

Схема

Взята из статьи про такой же модуль — cxem.net/mc/mc324.php

MPU-6050 снабжен акселерометром, гироскопом и термометром. Зачем нужен термометр — не понятно, вероятно, его было удобно разместить в этой микросхеме.

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

— 16-битный АЦП, — напряжение питания 3-5В, — поддержка протокола «IIC» (может, I2C ?), — диапазон ускорений: ± 2 ± 4 ± 8 ± 16g, — диапазон «гиро»: ± 250 500 1000 2000 ° / s, — покрытие иммерсионным золотом вместо лужения, — ток при работе последнего примера составил 5.3 мА и 1.

2 мА когда устройство не успело стартовать (питание на модуль было подано после выполнения setup() контроллером) Для интерфейса I2C у Ардуино имеются контакты A4 (SDA) и A5 (SCL), да-а, это те, которые расположены чёрти-где (на одной плате у меня они были справа от контроллера, на другой с левого края).

В коде нужно использовать библиотеку Wire, прочитать о ней можно туточки. Минимальная схема во Fritzing такая:
… а значит у нас уже не 8 лишних штырьков, а целых двенадцать! Термометр тестировать проще всего: залил скетч отсюда, открыл монитор порта, выставил скорость на 9600, —

побежали такие строки

AcX = 1624 | AcY = -808 | AcZ = 15176 | Tmp = 25.14 | GyX = 11 | GyY = 314 | GyZ = -138 AcX = 1584 | AcY = -876 | AcZ = 15112 | Tmp = 25.00 | GyX = 0 | GyY = 193 | GyZ = -163 AcX = 1616 | AcY = -904 | AcZ = 15172 | Tmp = 25.05 | GyX = -2 | GyY = 264 | GyZ = -181 AcX = 1648 | AcY = -836 | AcZ = 14948 | Tmp = 25.09 | GyX = 3 | GyY = 146 | GyZ = -192 AcX = 1792 | AcY = -800 | AcZ = 15216 | Tmp = 25.09 | GyX = 27 | GyY = -181 | GyZ = -218 AcX = 1864 | AcY = -900 | AcZ = 14932 | Tmp = 25.09 | GyX = 11 | GyY = 48 | GyZ = -206 AcX = 2144 | AcY = -796 | AcZ = 14860 | Tmp = 25.05 | GyX = 8 | GyY = 100 | GyZ = -191 AcX = 2088 | AcY = -916 | AcZ = 14952 | Tmp = 25.14 | GyX = 11 | GyY = 158 | GyZ = -189 AcX = 2180 | AcY = -752 | AcZ = 14964 | Tmp = 25.14 | GyX = 6 | GyY = 334 | GyZ = -182 AcX = 2296 | AcY = -796 | AcZ = 15076 | Tmp = 25.05 | GyX = -3 | GyY = 184 | GyZ = -189 AcX = 2160 | AcY = -788 | AcZ = 15176 | Tmp = 25.14 | GyX = -8 | GyY = 184 | GyZ = -172 AcX = 2036 | AcY = -852 | AcZ = 14988 | Tmp = 25.09 | GyX = 3 | GyY = 292 | GyZ = -172 AcX = 1984 | AcY = -836 | AcZ = 14892 | Tmp = 25.09 | GyX = 38 | GyY = 90 | GyZ = -205 AcX = 2136 | AcY = -708 | AcZ = 14976 | Tmp = 25.19 | GyX = -5 | GyY = 270 | GyZ = -148 AcX = 2000 | AcY = -788 | AcZ = 14888 | Tmp = 25.14 | GyX = -35 | GyY = 239 | GyZ = -157 AcX = 2008 | AcY = -784 | AcZ = 15048 | Tmp = 25.19 | GyX = -3 | GyY = 342 | GyZ = -183 AcX = 1884 | AcY = -868 | AcZ = 15140 | Tmp = 25.19 | GyX = -3 | GyY = 214 | GyZ = -194 AcX = 2072 | AcY = -820 | AcZ = 15020 | Tmp = 25.28 | GyX = 41 | GyY = 157 | GyZ = -205 AcX = 2008 | AcY = -780 | AcZ = 15144 | Tmp = 25.24 | GyX = 0 | GyY = 220 | GyZ = -204 AcX = 1924 | AcY = -828 | AcZ = 14968 | Tmp = 25.24 | GyX = -9 | GyY = 254 | GyZ = -187 AcX = 1920 | AcY = -828 | AcZ = 14936 | Tmp = 25.33 | GyX = 7 | GyY = 253 | GyZ = -185 AcX = 2012 | AcY = -728 | AcZ = 14904 | Tmp = 25.14 | GyX = 16 | GyY = 190 | GyZ = -167 AcX = 1900 | AcY = -744 | AcZ = 15048 | Tmp = 25.42 | GyX = -4 | GyY = 162 | GyZ = -177 AcX = 1940 | AcY = -780 | AcZ = 14992 | Tmp = 25.28 | GyX = -34 | GyY = 271 | GyZ = -191 AcX = 1960 | AcY = -900 | AcZ = 15080 | Tmp = 25.38 | GyX = 2 | GyY = 194 | GyZ = -182

AcX = 1840 | AcY = -952 | AcZ = 15012 | Tmp = 25.38 | GyX = 19 | GyY = 272 | GyZ = -167

Вследствие нагревания феном для волос, значение Tmp = взлетело до 80. Далее покрутили в пространстве платкой — другие показания тоже изменяются, но это не наглядно.

Данные, выводимые вторым скетчем

InvenSense MPU-6050 June 2012 WHO_AM_I: 68, error = 0 PWR_MGMT_1: 40, error = 0 MPU-6050 Read accel, temp and gyro, error = 0 accel x,y,z: 12180, 9468, -9168 temperature: 22.153 degrees Celsius gyro x,y,z: -462, -5303, -490, MPU-6050 Read accel, temp and gyro, error = 0 accel x,y,z: 13204, 8928, -7420 temperature: 22.482 degrees Celsius gyro x,y,z: 282, -2012, -956, MPU-6050 Read accel, temp and gyro, error = 0 accel x,y,z: -1276, 7932, -16232 temperature: 22.435 degrees Celsius gyro x,y,z: -1168, 1159, 1258, MPU-6050 Read accel, temp and gyro, error = 0 accel x,y,z: 6216, 10604, -12796 temperature: 22.576 degrees Celsius gyro x,y,z: -2161, 4363, 2176,
Более приятный глазу пример описан в этой статье. Там реализована трансляция положения предмета в реальном времени! Для повторения эксперимента, нужно скачать по ссылкам в конце той статьи:
скетч для Ардуино — GY_521_send_serial (в atmega128 у меня залилось без проблем)
и прогу для 3D-рендеринга ShowGY521Data.
Последнюю нужно запускать в IDE Processing, статья была написана в 2013 году и для нормальной работы, качать лучше версию 1.5.1, в исходнике нужно подправить номер порта:
short portIndex = 1;
в строке 15 вместо 1 поставить порядковый номер COM-порта, но не номер из его имени (у меня, при подключении программатора, появляется один порт «COM15», я исправил на , если у Вас, допустим, есть порты «COM8» и «COM10», причем, последний соединён с Ардуино, то ничего исправлять не надо);
myPort = new Serial(this, portName, 38400);
в строке 42 поставить скорость, которая была в скетче для Ардуино — 19200. Запускаем программу…

видим три объекта, моделирующих гироскоп, акселерометр и нечто «средне».

При отклонении платы, объекты синхронно пляшут, акселерометр подёргивается реще

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

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

Думаю, можно будет реализовать с помощью этого модуля какую-нибудь «неваляшку», шлем обклеивать светодиодами как-то рука не поднимается.

Тентаклиевый монстр

, о котором я писал ранее, был пересмотрен, урезан и сокращён (кстати, на этом фото заметно отличие в качестве металлизации отверстий обозреваемой платы и дешевой платы Ардуино):
если отсоединить тентакли шлейф от креплений, то откроются два ряда контактов, у которых нужно «поотламывать половинки», — в результате получится разъем, удобно вставляющийся в отверстия макетной платы. Для пущей надёжности, нужно проклеить корпус, т.к. держаться на одних контактах конструкция не будет.
всё ещё может напугать, но на самом деле бояться нечего:
спаял с обратной стороны контакты, прозвонил их тестером — и можно подключать. Лично моя практика показывает, что лучше потратить пару секунд на предварительную проверку, чем ткнуть «не туда» и спалить девайс… Я так спалил Orange Pi PC =)

Даташит на сенсор MPU-6050
Описание регистров MPU-6050
Неплохая статья

Товар предоставлен для написания обзора магазином. Обзор опубликован в соответствии с п.18 Правил сайта.

Планирую купить +38 Добавить в избранное Обзор понравился +20 +36

Источник: https://mysku.ru/blog/china-stores/40178.html

Гироскоп акселерометр модуль GY-521 MPU-6050 Arduino

Дайте объективную оценку и проголосуйте.

(1 голосов, среднее: 9,00)Загрузка…

GY-521 MPU-6050 Arduino

Что такое гироскоп?

Гироскоп используется для определения положения объекта относительно земной поверхности.

Принцип его работы вне зависимости от сферы применения одинаковый — датчиком рассчитывается скорость движения вдоль каждой оси координат.

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

Что такое акселерометр?

Акселерометр – это прибор, предназначенный для измерения кажущегося ускорения. Кажущееся ускорение – это разница между гравитационным и истинным ускорениями объекта. Простыми словами, это устройство позволяет измерять ускорение того девайса, на котором оно размещено. Даже если длина «разгона» составляет миллиметры.

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

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

Если Вам понадобился гироскоп или акселерометр, посетите www. arduinomania.in.ua!

Модуль GY-521 MPU-6050 Arduino

У Arduino есть модуль, реализующий функции гироскопа и акселерометра — это Arduino GY-521, который построен на микросхеме MPU-6050.

DataSheet MPU-6050 (английский)

Как можно узнать из даташита в модуле стоит 2 инерционных датчика от MEMS (Micro Electro Mechanical System — микро-электро-механические системы).

MEMS производит датчики из кремния с использованием кольцевого резонатора. Также применяется пьезоэлектрическая тонкая пленка, получаемая в результате глубокого травления силикона.

В процессе создания происходят обработка стекла, фотолитография, вафельное склеивание и т.д.

Технические характеристики

  • Размер: 2,1 см х 1,6 см х 0,3 см;
  • Гироскопы в диапазоне +/- 250 500 1000 2000 градусов / сек;
  • Диапазон Ускорение: + / — 2 г, + / — 4 г, + / — 8 г, + / — 16g;
  • Питание: 3.3В ~ 5.0В;
  • Чип MPU-6050: 16 битный АЦП, 16-ти битный вывод данных;
  • Связь c контроллером по стандартному коммуникационному протоколу IIC (I2C);
  • Диаметр отверстий (2 шт.) для монтажа датчика GY-521: 3 мм;
  • Шаг распиновки: 2,54 мм.

 Схема подключения GY-521 MPU-6050 к Arduino

Купить гироскоп акселерометр Arduino GY-521 MPU-6050 с доставкой

Пример программного кода для GY-521 MPU-6050 Arduino

Прочитать данные из COM порта поможет Serial Monitor:

Если значения координат, возвращаемые гироскопом будут беспорядочно меняться находясь в покое, то для стабилизации значений нужно использовать фильтр Калмана. Для Arduino есть библиотека Kalman.h.

Видео в тему:

Источник: http://arduinolife.in.ua/gy-521-mpu-6050/

Вычисление смещения с использованием акселерометра и гироскопа (MPU6050)

Я знаю, что это старый пост, но я думал, что опубликую некоторые исправления из экспериментов, которые я сделал с MPU 6050 и arduino.

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

однако уравнение Xf = 1/2at ^ 2 + Vot + Xo также неверно, потому что оно ТОЛЬКО для ПОСТОЯННЫХ ускорений.

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

Xf = 1/4 (Af + Ao) t ^ 2 + Vot + Xo

Где Xf – конечное расстояние в метрах, Af – окончательное ускорение ТОКА в m/s ^ 2, Ao – предыдущее ускорение последнего набора данных в m/s ^ 2, t – ИЗМЕНЕНИЕ во времени BETWEEN Af и Ao устанавливает данных в SECONDS, Vo – мгновенная скорость последнего набора данных в м/с, а Xo – конечное расстояние последнего набора данных или сумма всех предыдущих расстояний в метрах. Vo должно быть рассчитано с использованием предыдущего ускорения и ускорения с двух предыдущих наборов данных назад или Ao-1 с использованием следующего уравнения кинематики:

Vo = 1/2 (Ao + Ao-1) * t + Vo-1

Где Vo – предыдущая мгновенная скорость в m/s, Ao – предыдущее ускорение в m/s ^ 2, Ao-1 – ускорение от двух наборов данных назад в m/s ^ 2, t – изменение времени между Ao и Ao-1 в SECONDS, а Vo-1 – мгновенная скорость в м/с набора данных Ao-1 или двух наборов данных назад.

Во-вторых, вам нужно использовать более надежные часы. Я рекомендую использовать функцию micros() и помнить, что t является CHANGE по времени между наборами данных. Я не уверен в надежности, но это лучшее, что я могу придумать. УБЕДИТЕСЬ, чтобы преобразовать из микросекунд в SECONDS при использовании указанных уравнений.

В-третьих, я рекомендую вам откалибровать ваши смещения так часто или даже каждый раз в самом начале вашего кода, комбинируя свой код с помощью калибровочного эскиза, такого как Luis Ródenas. Вы можете поместить его в процедуру setup() и можете использовать небольшое значение буфера или набор данных, например 200 или 300, чтобы вы не слишком долго ждали экспериментов.

В-четвертых, вы можете либо работать, используя среднее значение между двумя ускорениями набора данных (это то, что мы делаем выше), либо сделать это еще дальше, и использовать среднее количество различных наборов данных, например, использовать буферный массив fifo для хранения различных значений ускорения и принимать среднее значение всех значений в буфере. Буферы Fifo требуют, чтобы определенное количество значений оставалось в них постоянно, но по мере того, как новое значение вступает в силу, уходит более старое. Чем больше fifo, тем более неточными будут расчеты расстояний, но буфер fifo позволит более высоким значениям ускорения слишком сильно влиять на ваши данные. Размер вашего буфера требует от вас найти sweetspot между точностью и одинокими выбросами в значениях ускорения. Если вы используете буфер fifo для вашего значения ускорения, используйте следующие уравнения:

Xf = 1/2At ^ 2 + Vot + Xo

Vo = Aold * t + Vo-1

Где A – новое среднее ускорение, полученное из гипотетического буфера FIFO, Aold – это старое среднее ускорение от последнего среднего FIFO, а t – изменение времени между двумя отдельными точками набора данных. Все в стандартных единицах, конечно, м/с и т.д.

Вы неплохо выполнили преобразование исходных значений ускорения в m/s ^ 2 путем деления на 16384 и умножения на 9.8m/s ^ 2. Значение 16384 зависит от стандартной настройки чувствительности +-2g, которая может измениться, если вы выберете другую настройку, такую как +-4g.

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

Важно поддерживать контролируемую среду для вашего акселерометра, используя вентиляторы или что угодно, чтобы поддерживать гироскоп/акселерометр при комнатной температуре или 25 ° C.

В библиотеке Jeff Rowberg MPU6050 есть функция для получения текущей температуры, mpu.getTemperature() Я верю.

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

Вы можете попробовать настроить свой гироскоп на менее чувствительную настройку, потому что я знаю, что mpu 6050 установлен по умолчанию +-2g, более высокая настройка может помешать многим проблемам влиять на ваши показания, но это станет менее чувствительным к небольшим смещениям.

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

Источник: http://qaru.site/questions/9191508/calculating-displacement-using-accelerometer-and-gyroscope-mpu6050

101 применение шлюза UART-to-I2C/SPI/1W (RH-0004). Часть 6. Подключение 3-осевого гироскопа/акселерометра MPU6050 к компьютеру

Насмотрелся я в ютубе видосов про всякие гироскопы, ну и захотелось мне тоже с ними поиграться. Одной из самых популярных оказалась платка GY-521 с чипом MPU6050 (фотка справа). Дёшево и сердито. Что из этого в итоге получилось, я сейчас попробую рассказать.

Итак, чип MPU6050 включает в себя:

  • 3-осевой гироскоп c 16-битным АЦПнастраиваемый диапазон: ±250, ±500, ±1000, ±2000 0/sec (dps)
  • 3-осевой акселерометр с 16-битным АЦПнастраиваемый диапазон: ±2g, ±4g, ±8g, ±16g
  • температурный сенсор
  • digital motion processor (DMP)
  • буфер FIFO (1024 байта)

Приятные и полезные «плюшки»:

  • ток потребления в нормальном режиме всего 4 мА (а есть ещё режим пониженного потребления)
  • система прерываний (детектор движения с программируемым порогом срабатывания, переполнение буфера FIFO…)
  • выбор источника тактирования из нескольких вариантов, включая внешний источник и внутренний генератор 8 MHz
  • программируемый низкочастотный фильтр (DLPF)
  • программируемая частота сэмплирования (Sample Rate = Gyroscope Output Rate / (1+ SMPLRT_DIV), где Gyroscope Output Rate = 1 kHz при включенном DLPF и 8 kHz при выключенном)
  • возможность подключить внешний трехосевой магнитометр

Работа с чипом происходит через регистры, посредством интерфейсов SPI или I2C, в зависимости от модификации чипа. Мне достался чип с интерфейсом I2C (что, собственно, без разницы). Документ с картой регистров можно скачать в конце статьи, а схема показана на рисунке справа.

Как правило, модуль GY-521 используют совместно с Arduino, либо с чем-то подобным, имеющим на борту достаточно «толстый» контроллер.

«Толстый» контроллер нужен ввиду того, что данные гироскопа и акселерометра (мгновенные скорости вращения и ускорения по трём осям) обычно нафиг никому не нужны.

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

Есть второй путь, — использовать встроенный Digital Motion Processor. Он может сам проводить интегрирование и отдавать нам уже положение тела в пространстве в виде кватерниона (это такая математическая сущность, которой очень удобно описывать всякие вращения, подробнее как-нибудь отдельно про неё напишу).

Я решил использовать DMP. Это позволяло обойтись без сложных вычислений и подключить модуль напрямую к компьютеру с помощью шлюза UART-to-I2C/SPI/1W (шлюз, как всегда, был дополнен преобразователем USB-to-UART, чтобы подключаться к компьютеру по USB).

Запитать плату также можно прямо от шлюза, — для этого надо установить перемычку выбора питания на шлюзе (JP1) в положение +5В. Контакты соединяем следующим образом:

  • SCL
  • SDA
  • VCC
  • GND

С DMP есть только одна проблема — на него совершенно нет документации. Её в принципе и на сам чип не много, но на DMP вообще нет. Перерыв кучу разных источников, я обнаружил, что все работающие варианты сходятся к одному источнику — библиотеке под AVR Дэвида Джирони (Davide Gironi) от 2012 года, который, в свою очередь, ссылается на библиотеку для ардуино от Джефа Роуберга (Jeff Rowberg).

Как этот DMP работает, какие фильтры использует, — никто толком не знает (кто-то конечно знает, но кто знает — не рассказывает). В DMP просто заливается в виде бинарников эн-цать блоков кода, в процессе чего необходимо сделать несколько включений, выключений, переключений (этот алгоритм я опишу ниже), и всё, — остаётся только читать данные из буфера FIFO.

Размер буфера, как уже отмечалось, 1024 байта. Есть двухбайтный регистр-счётчик, содержащий количество байт в буфере (FIFO_COUNTH, FIFO_COUNTL). Чтобы эти регистры корректно обновлялись нужно обязательно вычитывать оба регистра, причём первым обязательно FIFO_COUNTH. Кроме того, можно настроить прерывания по переполнению буфера и по поступлению в буфер очередной порции данных.

Данные от DMP имеют вид блоков по 42 байта следующей структуры:

Как видите, размер буфера FIFO не кратен размеру пакета от DMP, то есть надо считывать данные быстрее, чем буфер успеет переполниться, ну или в случае переполнения придётся что-то придумывать для определения начала пакета от DMP. Я решил, что успею сделать это даже по USB, если выбрать частоту сэмплирования поменьше, скажем 200 Гц и ниже.

Итак, мне оставалось просто портировать нужные функции из C для AVR в С++ Builder, что и было в итоге сделано. Задача сильно облегчалась тем, что я, в своё время, написал специальную динамически подключаемую библиотеку (rh0004.dll) для работы со шлюзом и теперь для общения по I2C пользовался стандартными функциями из этой библиотеки. Функции я портировал следующие:

  • mpu6050_readBytes — прочитать указанное число байт, начиная с определённого адреса
  • mpu6050_readByte — прочитать один байт по указанному адресу
  • mpu6050_writeBytes — записать указанное число байт, начиная с определённого адреса
  • mpu6050_writeByte — записать один байт по указанному адресу
  • mpu6050_readBits — прочитать указанные биты из байта по определённому адресу
  • mpu6050_readBit — прочитать один бит из байта по определённому адресу
  • mpu6050_writeBits — записать указанные биты в байт по определённому адресу
  • mpu6050_writeBit — записать один бит в байт по определённому адресу
  • mpu6050_setMemoryBank — выбор банка памяти
  • mpu6050_setMemoryStartAddress — установка указателя адреса в выбранном банке памяти
  • mpu6050_readMemoryBlock — чтение блока памяти
  • mpu6050_writeMemoryBlock — запись блока памяти
  • mpu6050_writeDMPConfigurationSet — запись блока конфигурации DMP
  • mpu6050_getFIFOCount — чтение количества байт, находящихся в буфере FIFO
  • mpu6050_getFIFOBytes — чтение заданного количества байт из буфера FIFO
  • mpu6050_getIntStatus — чтение регистра INT_STATUS (статус прерываний)
  • mpu6050_resetFIFO — очистить буфер FIFO
  • mpu6050_getXGyroOffset
  • mpu6050_setXGyroOffset
  • mpu6050_getYGyroOffset
  • mpu6050_setYGyroOffset
  • mpu6050_getZGyroOffset
  • mpu6050_setZGyroOffset
  • mpu6050_setSleepDisabled — выйти из спящего режима
  • mpu6050_setSleepEnabled — перейти в спящий режим
  • mpu6050_testConnection — прочитать регистр MPU6050_RA_WHO_AM_I
  • mpu6050_init — инициализация акселерометра и гироскопа
  • mpu6050_dmpInitialize — инициализация DMP
  • mpu6050_dmpEnable — включение DMP
  • mpu6050_dmpDisable — отключение DMP

Как вы наверное заметили, часть функций (такие как get(set)X(Y,Z)GyroOffset) не описана вообще, а часть описана непонятно (скажем, про блоки и банки памяти).

Это спасибо документации, в ней вообще отсутствуют описания регистров с нулевого по 12-й, а так же со 109-го по 113-й (судя по препарируемой библиотеке, они имеют отношение к начальной калибровке и DMP).

Эту часть пришлось тупо скопировать, без какого-либо понимания почему, зачем и как.

Переходим к самому интересному. Алгоритм инициализации акселерометра и гироскопа (функция mpu6050_init) выглядит следующим образом:

  1. выходим из спящего режима, — функция mpu6050_setSleepDisabled() сбрасывает бит MPU6050_PWR1_SLEEP_BIT в регистре MPU6050_RA_PWR_MGMT_1
  2. выбираем источник тактирования, — я выбрал XGYRO (прописываем соответствующие биты в регистр MPU6050_RA_PWR_MGT_1)
  3. настраиваем низкочастотный фильтр (прописываем соответствующие биты в регистр MPU6050_RA_CONFIG), я настроил фильтр на 42 Hz
  4. настраиваем частоту сэмплирования (прописываем соответствующие биты в регистр MPU6050_RA_SMPLRT_DIV), я использовал частоту 200 Hz
  5. настраиваем диапазон шкалы гироскопа (прописываем соответствующие биты в регистр MPU6050_RA_GYRO_CONFIG)
  6. настраиваем диапазон шкалы акселерометра (прописываем соответствующие биты в регистр MPU6050_RA_ACCEL_CONFIG)

Собственно, после описанных выше манипуляций чип заработает и можно будет читать с него «живые» данные гироскопа и акселерометра по всем трём осям. Жаль, что эти данные без обработки, как мы уже говорили, никому не нужны.

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

Демонстрационная программа для компьютера, позволяющая вычитывать из чипа данные от DMP и визуализировать угловое положение чипа в пространстве, была написана на C++ Builder-е. Для визуализации использовалась библиотека OpenGL. Программу с исходниками, документацию на чип MPU6050 и ссылку на видео в youtube, демонстрирующее работу программы, можно найти ниже.

Источник: http://radiohlam.ru/?p=1875

Arduino и MPU6050 для определения угла наклона

Файл, приведенный ниже, будет работать с цифровыми датчиками ускорения MPU6050, которые подключены к плате Arduino через I2C протокол по адресу 0x68.

Работоспособность проверена на платах Arduino Uno и Arduino Mega. Данный файл заголовка требует файл Wire.h перед добавлением “gyro_Accel.h”.

Кроме того, перед вызовом встроенных функций, надо инициализировать шину I2Cс помощью команды Wire.begin();.

Программа для Arduino с файлом заголовка и примером расположены на Github

Логи версии:

Версия 0.1 beta (Дата:2014-06-22): Сам файл заголовка для калибровки и чтения данных с датчика MPU6050 через i2c протокол и пример использования заголовочного файла для расчета угла.

Версия 0.2 beta (Дата:2014-10-08): Исправлены баги в файле примера. “accel_x_scalled” и “accel_y_scalled” теперь возвращают корректные значения углов.

Глобальные переменные

Данный заголовочный файл включает в себя следующие глобальные переменные:

int accel_x_OC – Содержит измерения положения акселерометра относительно оси x при калибровке

int accel_y_OC – Содержит измерения положения акселерометра относительно оси y при калибровке

int accel_z_OC – Содержит измерения положения акселерометра относительно оси z при калибровке

int gyro_x_OC – Содержит измерения положения гироскопа относительно оси x

int gyro_y_OC – Содержит измерения положения гироскопа относительно оси y

int gyro_z_OC – Содержит измерения положения гироскопа относительно оси z

float temp_scalled – Содержит абсолютное значение температуры в градусах цельсия

float accel_x_scalled – данные оси x акселерометра минус данные калибровки

float accel_y_scalled – данные оси y акселерометра минус данные калибровки

float accel_z_scalled – данные оси z акселерометра минус данные калибровки

float gyro_x_scalled – данные гироскопа относительно оси x минус данные калибровки

float gyro_y_scalled – данные гироскопа относительно оси y минус данные калибровки

float gyro_z_scalled – данные гироскопа относительно оси z минус данные калибровки

Функции в программе Arduino для работы с mpu6050

MPU6050_ReadData()

Эта функция считывает данные с акселлерометра, гироскопа и датчика температуры. После считывания данных, значения переменных (temp_scalled, accel_x_scalled, accel_y_scalled, accel_z_scalled, gyro_x_scalled, gyro_y_scalled and gyro_z_scalled) обновляются.

MPU6050_ResetWake()

Эта функция сбрасывает настройки чипа на значения по-умолчанию. Рекомендуется использовать сброс настроек перед настройкой чипа на выполнения определенной задачи.

MPU6050_SetDLPF(int BW)

Эта функция настраивает встроенный фильтр низких частот. Переменная int BW должна содержать значения (0-6). Пропускная способность фильтра будет изменяться в соответствии с представленной ниже таблицей.

Если int BW не в диапазоне 0-6, фильтр низких частот отключается, что соответствует установке – бесконечность.

MPU6050_SetGains(int gyro,int accel)

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

MPU6050_ReadData()

Эта функция использует масштабные коэффициенты для расчета результата. Если не используются значения (0-3), MPU6050_ReadData() отобразит необработанные значения с датчика с погрешностью калибровки. Для получения обработанных значений, установите переменные для калибровки (accel_x_OC, accel_y_OC, accel_z_OC, gyro_x_OC, gyro_y_OC and gyro_z_OC) в нуль.

MPU6050_OffsetCal()

Эта функция позволяет откалибровать акселерометр и гироскоп. Рассчитанные значения записываются в переменные accel_x_OC, accel_y_OC, accel_z_OC, gyro_x_OC, gyro_y_OC и gyro_z_OC для дальнейшей коррекции.

Для проведения калибровки необходимо расположить оси x и y axes платы MPU6050 в горизонтальной плоскости, а ось z – перпендикулярно к основанию. Даже незначительные перемещения платы во время калибровки понижают точность расчета базовой точки.

Ось z калибруется относительно силя земного притяжения – 9.81 м/с2 (1g), что учтено в коде.

Калибровка mpu6050

Калибровка гироскопа и акселерометра – это очень важный шаг. Приведенные значения для гироскопа имеют вид: “gyro_x_scalled = ”, так как для получения угла поворота относительно оси по данным угловой скорости, необходимо провести интегрирование.

Если “gyro_x_scalled” содержит ошибку или неверно выбрана база, эта ошибка также интегрируется и превращается в значительную погрешность в результате. Так что в идеале измерения должны показывать нуль, если гироскоп не движется вокруг каких-либо осей координат.

На практике добиться идеала практически невозможно, так что наша задача – минимизировать эту ошибку.

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

На рисунках далее показано использование функции MPU6050_OffsetCal() непосредственно в программе в Arduino IDE.

Скетч Arduino для калибровки платы акселерометра/гироскопа MPU6050:

Результат работы скетча для калибровки в серийном мониторе

Расчет угла с помощью гироскопа mpu6050

Данные с гироскопа имеют вид:

В дальнейшем в статье мы будем рассматривать все на примере оси x. Для расчета угла необходимо проинтегрировать переменную “gyro_x_scalled”

является количеством итераций

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

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

Мы предполагаем, что начальные углы относительно осей x, y, z после калибровки равны 0, 0 и 90 градусов соответственно, так что для итерации n=0:

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

В этом смысле жаль, что платы Arduino достаточно медленные, кристаллы у них работают с частотой 16 МГц и снятие измерений каждые 10-20 мс становится достаточно затруднительным (учитывая тот факт, что процессор занят не только расчетом угла, но и другими параллельными задачами).

Мы можем использовать T в виде переменной или константы, я, лично, предпочитаю использовать константу для каждого цикла. В проекте динамические факторы не учитывались, просто использовалась частота итераций с разрывом в 20 мс (0.02 с).

Погрешность гироскопа – «дрифт» (drift)

Из-зза неидеальной калибровки гироскопа, “gyro_x_scalled” никогда не равна нулю и со временем “angle_x_gyro” изменяет свои значения.

Для решения данной проблемы, проводится расчет угла с помощью акселерометра и полученные значения сравнывиются с углом гироскопа. Так как модуль MPU6050 располагается горизонтально, ускорение по оси z равно 1g (то есть, 9.

81) как это показано на рисунке. Мы можем использовать этот вектор ускорения и его проекцию на ось y для расчета угла между осями x и y.

Угол, который рассчитывается с помощью акселерометра, рассчитывается по зависимости:

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

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

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

Окончательно уравнение для определения угла наклона принимает вид:

На рисунке ниже приведена имплементация полученных зависимостей в оболочке Arduino IDE

Окончательный расчет угла наклона и подбор коэффициентов усиления для фильтра

Результаты снимались для различных параметров коэффициентов усиления фильтра и приведены на рисунках по порядку. Коэффициент усиления 1 означает, что фактически идут измерения только с гироскопа. Можно заметить, что в конце angle_x и angle_y отклоняются от значений, рассчитанных с помощью значений с акселерометра.

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

Источник: http://arduino-diy.com/arduino-MPU6050-dlya-opredeleniya-ugla-naklona

Подключаем акселерометр / гироскоп MPU-6050 (GY-521) к ARDUINO и серво двигателям (стабилизатор для камеры)

Немного информации по проекту : 

Датчик  MPU-6050 содержит в себе интегрированный 3х-осевой акселерометр и построен на базе MEMS  3х-осевом MEMS-гироскопе.

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

Он очень точен, поскольку он имеет 16-разрядный AD (от аналого-цифрового) преобразователя для каждого канала. Поэтому он захватывает оси  x, y и z одновременно. Датчик имеет стандартный протокол связи I²C, поэтому его легко подключить к ардуино .

Датчик MPU-6050 даже не стоит дорого, возможно, он самый дешевый на рынке, особенно учитывая тот факт, что он сочетает в себе акселерометр и гироскоп.

Я отобрал самые дешевые варианты на алиэкспресс :

Купить  MPU-6050   http://ali.pub/26g64n 

Для удобства ардуино уно http://ali.pub/26g69b  

Сервоприводы SG 90  http://ali.pub/26g6ek  

(Я рекомендую использовать более с мет. шестернями )

  VG996R     http://ali.pub/26g6jf 

Комплект из 4 штук – дешевле http://ali.pub/26g6mc 

Схематика и характеристики датчика гироскопа :

Вот некоторые особенности датчика MPU-6050:

Чип со встроенным 16-разрядным АЦП-преобразователем

Диапазон измерения гироскопа: ± 250, 500, 1000 и 2000 ° / с

Диапазон измерения акселерометра: +2, +4, +8, +16 г

Интерфейс: I²C

Питание: от 3 до 5 В

Вы можете найти спецификацию MPU-6050 ЗДЕСЬ.

Для моих тестов я купил модуль GY-521 – плату с обвесом . Ниже приведена схема подключения модуля GY-521 для тех, кто хочет разобраться :

Рассмотрим подробнее работу датчика с платой Ардуино :

Ардуино , гироскоп и 2 серво привода :      

GY-521 Arduino Uno
VCC 3.3V
GNS GND
SCL A5
SDA A4

Подключение на схеме и на макетке для лучшего визуального восприятия :

Как видно из электрической схемы, я приводил в действие два серводвигателя с внешним источником питания 5 В (это связано с тем, что  сервомоторы вместе потребляют более 500 мА (500 мА = максимальный ток, поставляемый USB-портом версии 2.0 )). Теперь перейдем к коду, чтобы загрузить в  Arduino.

// MPU6050 & Servo

// byDenisGeek

#include<\p>

#include<\p>

#include<\p>

#define MPU 0x68  // I2C address of the MPU-6050

Servo ServoX, ServoY;

double AcX,AcY,AcZ;

int Pitch, Roll;

void setup(){

  Serial.begin(9600);

  ServoX.attach(8);

  ServoY.attach(9);

  init_MPU(); // Inizializzazione MPU6050

}

void loop()

{

  FunctionsMPU(); // Acquisisco assi AcX, AcY, AcZ.

  Roll = FunctionsPitchRoll(AcX, AcY, AcZ);   //Calcolo angolo Roll

  Pitch = FunctionsPitchRoll(AcY, AcX, AcZ);  //Calcolo angolo Pitch

  int ServoRoll = map(Roll, -90, 90, 0, 179);

  int ServoPitch = map(Pitch, -90, 90, 179, 0);

  ServoX.write(ServoRoll);

  ServoY.write(ServoPitch);

  Serial.print(“Pitch: “); Serial.print(Pitch);

  Serial.print(” “);

  Serial.print(“Roll: “); Serial.print(Roll);

  Serial.print(”
“);

}

void init_MPU(){

  Wire.begin();

  Wire.beginTransmission(MPU);

  Wire.write(0x6B);  // PWR_MGMT_1 register

  Wire.write(0);     // set to zero (wakes up the MPU-6050)

  Wire.endTransmission(true);

  delay(1000);

}

//Funzione per il calcolo degli angoli Pitch e Roll

double FunctionsPitchRoll(double A, double B, double C){

  double DatoA, DatoB, Value;

  DatoA = A;

  DatoB = (B*B) + (C*C);

  DatoB = sqrt(DatoB);

  Value = atan2(DatoA, DatoB);

  Value = Value * 180/3.14;

  return (int)Value;

}

//Funzione per l'acquisizione degli assi X,Y,Z del MPU6050

void FunctionsMPU(){

  Wire.beginTransmission(MPU);

  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)

  Wire.endTransmission(false);

  Wire.requestFrom(MPU,6,true);  // request a total of 14 registers

  AcX=Wire.read()

Источник: http://electronica52.in.ua/proekty-arduino/delaem-giroskop-stabilizator-na-mpu6050-gy521-arduino-podkluchaem-2-servo-dvigatelya-

Модуль GY-521 3-х осевой акселерометр и гироскоп MPU-6050 RKP-GY-521-MPU6050 – Датчики положения – «Robot-Kit.ru» интернет-магазин Arduino

Модуль GY-521 на микросхеме MPU6050 это 3-х осевой гироскоп и акселерометр на три координаты, а также датчик температуры окружающей среды.

  • На плате модуля GY-521 размещены необходимые для надежного функционирования подтягивающие резисторы.

  • Обмен данными с роботизированным контроллером управления осуществляется по шине IIC (I2C).
  • Необходимое напряжение питания для модуля RKP-GY-521-MPU6050 и всех имеющихся на нем датчиков равно 3,3V.

  • Модуль GY-521 на базе микросхемы MPU-6050 это решение, объединяющее 3-х координатный гироскоп, 3-х координатный акселерометр и 9-ти координатные алгоритмы Motion Fusion.

  • Датчик RKP-GY-521-MPU6050 является первым в мире интегрированным шести координатным решением на базе технологии Motion Processing, которое позволяет избавиться от межкоординатной разориентации гироскопа и акселерометра.

  • Датчики на основе чипов MPU-6050 имеют такие же размеры и распиновку, как и предыдущее семейство MPU-3000 3-координатных гироскопов, что позволяет легко провести модернизацию уже созданного оборудования.
  • Для наиболее точного трекинга быстрых и медленных движений возможно самостоятельно запрограммировать необходимые режимы: ±250, ±500, ±1000, ±2000°/сек для гироскопа, а также ±2g, ±4g, ±8g, ±16g для акселерометра.

Микросхема MPU-6050

Принципиальная схема модуля GY-521 на базе микросхемы MPU-6050

НАЖАТЬ и посмотреть схему модуля GY-521 =>>В основе модуля RKP-GY-521-MPU6050 заложен чип MPU-6050, что позволяет сразу интегрировать шести осевую обработку движения проектируемого робота.

Схема подключения модуля GY-521 к контроллеру Arduino Uno R3.

Спецификация и характеристики модуля GY-521

Микросхема: MPU-6050 (гироскоп 3-осевой + акселерометр на три координаты)Напряжение питания модуля: от 3,3V до 5V (DC);Чип MPU-6050: 16 битный АЦП, 16-ти битный вывод данных;Гироскоп диапазон: ± 250 500 1000 2000 ° / сАкселерометр диапазон: ± 2 ± 4 ± 8 ± 16gСвязь c контроллером по стандартному коммуникационному протоколу IIC (I2C) Размеры модуля: 15х20 мм.Вес модуля: 5 граммДиаметр отверстий (2 шт.) для монтажа датчика GY-521: 3 ммШаг распиновки: 2,54 ммДатчик GY-521 отлично подходит для любых DIY проектовКомплектация:Модуль GY-521 – 1 шт.Линейки с контактами (пинами) – 2 шт.

Статья с примерами подключения модуля GY-521 на микросхеме MPU6050 к Ардуино ( Arduino ). Здесь =>>

Источник: http://robot-kit.ru/product_info.php/info/p587_Modul-GY-521-yeto-

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}