Mpu 6050 как совместить гироскоп и акселерометр

от admin

MPU-6050 gyroscope and accelerometer

When compiling your build add the following to user_config_override.h :

The MPU-6050 combines a 3-axis gyroscope and a 3-axis accelerometer on the same silicon die, together with an onboard Digital Motion Processor™ (DMP™), which processes complex 6-axis MotionFusion algorithms.

Configuration

Wiring

MPU-6050 ESP
GND GND
VCC 3.3V
SDA GPIOx
SCL GPIOy
XDA
XCL
AD0
INT

Tasmota Settings

In the Configuration -> Configure Module page assign:

  1. GPIOx to I2C SDA
  2. GPIOy to I2C SCL

After a reboot the driver will detect MCU-69050 automatically and display measurements.

Урок 12. Управление сервоприводами с помощью гироскопа MPU6050 Gy-521

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

В этом примере мы научимся управлять двумя серво приводами с помощью акселерометра, когда мы будем отклонять акселерометр Gy-521 (MPU6050) по координате X и Y сервоприводы будут поворачиваться на отклоненный угол.

В данном уроке нам понадобится:

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

Сборка:

1) Подключаем Акселерометр Gy-521

Gy-521 (mpu6050) Arduino (Uno)
VCC 3.3 V
GND GND
SCL A5
SDA A4

Для питания модуля необходимо использовать строго 3.3V! Для этого можно использовать преобразователь напряжения на 3.3V.

2) Сервоприводы подключаем следующим образом:

Arduino (uno) Servo 1 Servo 2
5V Красный (Центральный) Красный (Центральный)
GND Черный или Коричневый (Левый) Черный или Коричневый (Левый)
Pin8 — для servo 1
Pin9 — для servo 2
Белый или Оранжевый (Правый) Белый или Оранжевый (Правый)

Сервопривод рекомендуется питать от внешнего источника питания, если запитать сервопривод от ардуины, то могут возникнуть помехи и перебои в работе arduino. Организовать это можно с помощью источника питания 9V и комбинированного стабилизатора 5V ,3.3V.

Подключение гироскопа-акселерометра MPU6050 к Wemos d1

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

Основные характеристики MPU6050:
— 16-битный АЦП
— Напряжение питания 3-5В
— Поддержка протокола I2C
— Диапазон ускорений: ± 2 ± 4 ± 8 ± 16g
— Диапазон «гиро»: ± 250 500 1000 2000 °/s

Подключение MPU6050 к Wemos d1
Модуль работает по I2C, поэтому подключить его весьма просто, соединим акселерометр с платой Wemos D1: VCC -> 3V3, GND -> GND, SCL -> D1, SDA -> D2.

Для проверки давайте зальём в плату следующий скетч:
#include <wire.h>

const int MPU_addr = 0x68; // I2C address of the MPU-6050
int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;

void setup() <
Serial.begin(115200);
Wire.begin();
Wire.beginTransmission(MPU_addr);
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0); // set to zero (wakes up the MPU-6050)
Wire.endTransmission(true);
>

void loop() <
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr, 14, true); // request a total of 14 registers

AcX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
AcY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
AcZ = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
Tmp = Wire.read() << 8 | Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
GyX = Wire.read() << 8 | Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
GyY = Wire.read() << 8 | Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
GyZ = Wire.read() << 8 | Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)

Serial.print("AcX = "); Serial.print(AcX);
Serial.print(" | AcY = "); Serial.print(AcY);
Serial.print(" | AcZ = "); Serial.print(AcZ);
Serial.print(" | Tmp = "); Serial.print(Tmp / 340.00 + 36.53); // temperature in degrees C from datasheet
Serial.print(" | GyX = "); Serial.print(GyX);
Serial.print(" | GyY = "); Serial.print(GyY);
Serial.print(" | GyZ = "); Serial.println(GyZ);

delay(500);
>

Скачать архив со скетчем: MPU6050.zip
Теперь, если вы откроете терминал com порта, то увидите примерно следующую картину: ускорение по трём осям, температура, углы положения по трем осям.

Из даташита, мы знаем, что при настройке чувствительности акселерометра до 2g на каждую единицу g приходится 16384 единиц измерения датчика. Самые наблюдательные наверно уже заметили по фото, что лежа на столе датчик почему-то показывает ускорения по горизонтальным осям, а по вертикальной показывает значение больше 16384 (я надеюсь все помнят со школы, что на все объекты на земле действует сила тяжести в 1g). Это проблема всех подобных акселерометров – они очень шумят. Их обязательно нужно калибровать и фильтровать получаемые данные.

Фильтр Калмана MPU6050
Давайте добавим в скетч упрощенный фильтр Калмана, для того чтобы сгладить шумы датчика.
#include <wire.h>

const int MPU_addr = 0x68; // I2C address of the MPU-6050
int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;

// переменные для Калмана
float varVolt = 78.9; // среднее отклонение (ищем в excel)
float varProcess = 0.5; // скорость реакции на изменение (подбирается вручную)
float Pc = 0.0, G = 0.0, P = 1.0, Xp = 0.0, Zp = 0.0, Xe = 0.0;
// переменные для Калмана

// Функция фильтрации
float filter(float val) <
Pc = P + varProcess;
G = Pc / (Pc + varVolt);
P = (1 — G) * Pc;
Xp = Xe;
Zp = Xp;
Xe = G * (val — Zp) + Xp; // "фильтрованное" значение
return (Xe);
>

void setup() <
Serial.begin(115200);
Wire.begin();
Wire.beginTransmission(MPU_addr);
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0); // set to zero (wakes up the MPU-6050)
Wire.endTransmission(true);
>

void loop() <
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr, 6, true); // request a total of 14 registers
AcX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
AcY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
AcZ = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)

Serial.print(AcZ); Serial.print(" "); Serial.println((int)filter(AcZ));
delay(100);
>

Скачать архив со скетчем: MPU6050Kalman.zip

Для фильтра нам необходимо подобрать два значения:
1) varVolt — это среднее отклонение, его можно либо высчитать самостоятельно либо забить значения в файл excel который я положил в архив со скетчем
2) varProcess — это время реакции, чем меньше это число, тем плавнее будут меняться значения.
Попробуйте поиграться с этими параметрами.
Теперь зайдем в меню «Инструменты – Плоттер по последовательному соединению», откроется вот такое окно:

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

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

Прежде чем приступить к рассмотрению модуля гироскопа и акселерометра, думаю, будет не лишним коротко разобраться что это такое. Гироскоп представляет собой устройство, реагирующее на изменение углов ориентации контролируемого тела. В классическом представлении это какой-то инерционный предмет, который быстро вращается на подвесах. Как результат вращающийся предмет всегда будет сохранять свое направление, а по положению подвесов можно определить угол отклонения. На самом же деле электронные гироскопы построены по другой схеме и устроены немного сложнее (вращающийся волчок впихнуть в микросхему было бы не просто). Акселерометр — это устройство, которое измеряет проекцию кажущегося ускорения, то есть разницы между истинным ускорением объекта и гравитационным ускорением. На простом примере такая система представляет собой некоторую массу, закрепленную на подвесе, обладающим упругостью (пружина для хорошего примера). Так вот если такую систему повернуть под каким-то углом, или бросить, или предать линейное ускорение, то упругий подвес отреагирует на движение под действием массы и отклонится и вот по этому отклонению определяется ускорение. Таким образом, гироскоп реагирует на изменение в пространстве независимо от направление движения, с помощью акселерометра же может измерять линейные ускорения предмета, а так же и искусственно рассчитываемое расположение предмета в пространстве. Каждое устройство имеет свои достоинства и недостатки.

Микросхема 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 для подключения к микросхеме дополнительного датчика
  • регистры данных датчиков
  • FIFO
  • прерывания
  • температурный сенсор
  • самопроверка гироскопа и акселерометра
  • регистр идентификации устройства

Внешний вид модуля 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. углы отклонения по данным акселерометра (рассчитаны ресурсами микроконтроллера), 5. поворот по оси Z по данным гироскопа (также путем подсчета микроконтроллером). В первом и втором пункте данные имеют мгновенный характер — то есть именно то, что считывается из регистров хранения, это значит, что для гироскопа это скорость, в состоянии покоя все значения будут равны нулю.

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

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

Собранное устройство на макетной плате:

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

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

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

К статье прилагается прошивка микроконтроллера, исходный код AVR Studio4, документация на MPU6050 и видео работы датчика в схеме.

Читать:
Чем качать шины электросамоката

Похожие публикации