- Датчик положения в пространстве 3 в 1 (gy-86)
- Комплектация
- На плате имеется 8 контактов:
- Несколько идей/заданий:
- Обзор датчика пространства gy-521 (mpu6050)
- Общие сведения
- Общие сведения.
- Питание
- Подключение
- Подключение gy-521 к arduino
- Подключение mpu6050 к ардуино
- Подключение к arduino
- Подключение к плате arduino
- Подробнее о сенсоре
- Получение показаний датчика mpu6050
- Пример использования
- Программа для вычисления угла наклона акселерометра mpu6050
- Программа для получения сырых данных с акселерометра mpu6050
- Тестирование
- Тестовая установка
- Технические параметры.
- Точность измерения ускорения в mpu6050
- Характеристики
- Характеристики:
- Часто задаваемые вопросы
- Калибровка компаса и вывод значений осей в монитор порта.
- Заключение
Датчик положения в пространстве 3 в 1 (gy-86)
Комплектация
- 1х сенсор MPU-9250;
- 1х СОединитель типа “ПАПА-ПАПА”;
На плате имеется 8 контактов:
- VCC — положительный контакт питания;
- GND — земля;
- SDA — линия данных I2C;
- SCL — линия синхроимпульсов I2C;
- INT — настраиваемое прерывание;
- AD0 — I2C адрес; по-умолчанию AD0 подтянут к земле, поэтому адрес устройства — 0x68; если соединить AD0 к контактом питания, то адрес изменится на 0x69;
- XCL, XDA — дополнительный I2C интерфейс для подключения внешнего магнитометра.
Несколько идей/заданий:
- Детектор стука, он же детектор попадания пули в мишень. Программа должна обнаружить всплеск показаний датчика по одной из осей и сигнализировать об этом, например, с помощью зуммера.
- Кодовый замок, открывающийся по определенной последовательности стука. То же, что и в предыдущем задании, только нужно считать паузы между стуками и сверять их с эталонной последовательностью.
- Детектор свободного падения. Если значения акселерометра по всем трем осям близки к нулю, значит тело находится в состоянии свободного падения.
- Пульт управления роботом. Можно прикрепить датчик на перчатку и отслеживать наклоны ладони по двум осям. Передавать значения датчика через Bluetooth роботу.
Обзор датчика пространства gy-521 (mpu6050)
GY-521 (рис. 1) – модуль с гироскопом, акселерометром и термометром на базе микросхемы MPU-6050 используется в любительской робототехнике для определения положения в пространстве.
Рисунок 1. Модуль GY521.
Модуль GY-521 построен на базе микросхемы MPU6050. На плате модуля также расположена необходимая обвязка MPU6050, включая подтягивающие резисторы интерфейса I 2 C. Гироскоп используется для измерения линейных ускорений, а акселерометр – угловых скоростей. Совместное использование акселерометра и гироскопа позволяет определить движение тела в трехмерном пространстве.
Общие сведения
9-осевой сенсор MPU-9250 9DOF — сенсор второго поколения компании InvenSense для определения положения в пространстве, включающий в себя 3-осевой Гироскоп, 3-осевой Акселерометр и 3-осевой Компас (Магнетометр).
Общие сведения.
Основная микросхема модуль GY-521 чип MPU-6050 , который содержит в себе акселерометр и гироскоп, а так же датчик температуры. Обработка данных осуществляется с помощью 16-битное АЦП (Аналого-цифровой преобразователь) на каждый канал, поэтому он обрабатывает значение x, y и z одновременно.
Встроенный датчик температуры предназначен для измерения температуры и имеет диапазон измерений от -40 ° С до 85 ° С.Для взаимодействия с Arduino используется шина I2C и датчик MPU-6050 всегда выступает в качестве подчиненного устройства. Но кроме обычной шины I2C, есть собственный контроллер I2C, в котором MPU-6050 ведомый, выводы SDAи XDA и с помощью это шины можно управлять например магнитометром и передавать данные на Arduino.
Датчика MPU-6050 работает от напряжение ~2.4 — 3.5 В и чтобы стабилизировать питание, на модуле GY-521 добавили стабилизатор напряжения на 3.3 В с малым падением напряжении, поэтому модуль можно подключить к напряжению 5 В и 3.3 В.
Назначение выводов:► VCC – « » питание модуля 3.3 В до 5 В ► GND – «-» питание модуля► SCL – линия синхронизации для протокола I2C► SDA – линия передачи данных протокола I2C► XDA – линия передачи данных протокола при работе в режиме мастера► XCL – линия синхронизации для протокола I2C при работе в режиме мастера► AD0 – если вывод лог «0» адрес I2C будет 0x68, если вывод лог «1» адрес I2C будет 0x69► INT – прерывание
Питание
Для удобства подключения к Arduino воспользуйтесь Trema Shield, Trema Power Shield, Motor Shield или Trema Set Shield.
Входное напряжение питания 3,3 В или 5 В постоянного тока, подаётся на выводы VCC и GND модуля.
Подключение
Подключить сенсор к микроконтроллеру Вы можете одним из 2 способов:
- по шине I2C: используя 4 контакта VCC, GNG, SCL, SDA
- по шине SPI: используя 5 контактов VCC, GND, SCL, SDA, CS, SDO
Подключение gy-521 к arduino
Необходимые детали:► Arduino UNO R3 x 1 шт.► Провод DuPont, 2,54 мм, 20 см x 1 шт.► Кабель USB 2.0 A-B x 1 шт.► 3-осевой гироскоп акселерометр GY-521 x 1 шт.
Подключение:В примере будем использовать только первые четыре контакта VCC, GND, SDA и SCL. Сначала подключаем VCC и GND модуля GY-521 к 5V и GND. Далее нужно установить соединение I2C между модулем GY-521 и Arduino, для этого подключите вывод SCL модуля к выводу А4 Arduino и вывод модуля SCL к выводу A5 Arduino. Для удобства приведу схему подключение.
Подключение mpu6050 к ардуино
Соединим контакты датчика с Ардуино Уно согласно стандартной схеме для интерфейса I2C:
MPU6050 ROC | GND | VCC | SDA | SCL |
Ардуино Уно | GND | 5V | A4 | A5 |
Подключение к arduino
Для интерфейса
I2C
у Ардуино имеются контакты A4 (SDA) и A5 (SCL), да-а, это те, которые расположены чёрти-где (на одной плате у меня они были справа от контроллера, на другой с левого края). В коде нужно использовать библиотеку Wire, прочитать о ней можно
. Минимальная схема во Fritzing такая:
… а значит у нас уже не 8 лишних штырьков, а целых двенадцать!
Подключение к плате arduino
Подключение к плате Arduino по интерфейсу I2C. Схема подключения показана на рис. 2.
Загрузив на плату Arduino скетч сканирования I2C-устройств (Листинг 1), в мониторе последовательного порта увидим I2C-адрес модуля MPU6050 – 0x68 (рис. 3).
Подробнее о сенсоре
Микросхема сенсора MPU-9250 9DOF состоит из 2 чипов: MPU-6500 — чип, включающий в себя 3-осевой гироскоп и акселерометр и AK8963 — чип, включающий в себя 3-осевой компас и интегрированный Digital Motion Processor (DMP).
Данный сенсор является одним из самых миниатюрных в мире (3мм*3мм*1мм). Используется в смартфонах, планшетах, носимых датчиках и других устройствах. Если к модулю добавить барометр, получится сенсор на 10 степеней свободы.
Может использоваться для создания дронов, роботов, 3-мерных контроллеров, а так же в системах, поддерживающих управление жестами.
Обратите внимание, что в микросхеме MPU9250 определение осей у Гироскопа и Акселерометра одно, а у Магнитометра другое!
Для работы с сенсором вам понадобится библиотека IMU_10DOF. При необходимости Вы так же можете ознакомиться с DataSheet’ом.
Получение показаний датчика mpu6050
Для работы с датчиком MPU6050 будем использовать библиотеки I2Cdev и MPU6050. После установки библиотек загрузим на плату Arduino скетч для отображения показаний акселерометра по одной из осей – оси x. Содержимое скетча показано в листинге 2.
Для отображения данных выбираем в настройках Плоттер по последовательному соединению (рис. 4). Смотрим показания вращая датчик по оси x в одну и другую стороны.
Библиотека MPU6050 по умолчанию настраивает датчик на диапазон ±8g (возможные значения ±2g, 4g, 8g и 16g). для 16 разрядного АЦП датчика это значения от -2 15 до 2 15 , поэтому возможные значения на графике ±2 15 /16*8 (-16384 до 16384).
Скетч из листинга 3 преобразует сырые показания датчика MPU6050 в угол наклона датчика относительно оси x.
И смотрим показания угла наклона, вращая датчик по оси x в одну и другую стороны (рис. 5).
Пример использования
В качестве примера рассмотрим проект по созданию пульта на MPU6050 для удаленного управления движущейся платформой.
Нам потребуются следующие компоненты. Для пульта управления:
Плата Arduino Nano – 1;
Плата прототипирования – 1;
Модуль MPU6050 – 1;
передатчик FS1000A – 1;
Для движущейся платформы:
Плата Arduino Nano – 1;
Двухколесная движущаяся платформа – 1;
Модуль драйвера L298N – 1;
приемник MX-RM-5V – 1;
Блок батарей 18650 – 1;
Схема соединения элементов пульта управления показана на рис. 6.
Схема соединений для компонентов для движущейся платформы показана на рис. 7.
Приступим к написанию скетчей. Передатчик отправляет 3 значения – начальный байт отправки B11111111 и 2 значения наклона датчика – по оси x и по оси y.
Содержимое скетча показано в листинге 4.
Плата Arduino на движущейся платформе должна получать данные и преобразовывать их в команды установки скорости для двух моторов.
Содержимое скетча показано в листинге 5.
Рисунок 8. Пульт
Рисунок 9. Движущаяся платформа
Программа для вычисления угла наклона акселерометра 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<minv ) return minv; return v;
}
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; float ay,gx; t_next = t T_OUT; accel.getMotion6(&ax_raw, &ay_raw, &az_raw, &gx_raw, &gy_raw, &gz_raw); // сырые данные акселерометра нужно преобразовать в единицы гравитации // при базовых настройках 1G = 4096 ay = ay_raw / 4096.0; // на случай, если на акселерометр действуют посторонние силы, которые могут // увеличить ускорение датчика свыше 1G, установим границы от -1G до 1G ay = clamp(ay, -1.0, 1.0); // функция acos возвращает угол в радианах, так что преобразуем // его в градусы при помощи коэффициента TO_DEG if( ay >= 0){ angle_ax = 90 - TO_DEG*acos(ay); } else { angle_ax = TO_DEG*acos(-ay) - 90; } Serial.println(angle_ax); // вывод в порт угла поворота вокруг оси X }
}
Загружаем программу в Ардуино и снова пробуем вращать датчик. Теперь на графике отображается угол наклона в градусах!
Ну вот, мы получили уже что-то пригодное для дальнейшего использования. Видно, что датчик поворачивался сначала на 30 с лишним градусов в одну сторону, потом примерно на 60 в другую. Работает!
Программа для получения сырых данных с акселерометра 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 вертикально, акселерометр выдает значения близкие к четырём тысячам. Откуда берется это число?
Тестирование
Термометр тестировать проще всего: залил скетч
, открыл монитор порта, выставил скорость на 9600, —
Вследствие нагревания феном для волос, значение
Tmp =
взлетело до 80. Далее покрутили в пространстве платкой — другие показания тоже изменяются, но это не наглядно.
Данные, выводимые вторым скетчем
InvenSense MPU-6050
June 2023
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, -2023, -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,
Более приятный глазу пример описан
Тестовая установка
, о котором
, был пересмотрен, урезан и сокращён (кстати, на этом фото заметно отличие в качестве металлизации отверстий обозреваемой платы и дешевой платы Ардуино):
если отсоединить
тентакли
шлейф от креплений, то откроются два ряда контактов, у которых нужно «поотламывать половинки», — в результате получится разъем, удобно вставляющийся в отверстия макетной платы. Для пущей надёжности, нужно проклеить корпус, т.к. держаться на одних контактах конструкция не будет.
всё ещё может напугать, но на самом деле бояться нечего:
спаял с обратной стороны контакты, прозвонил их тестером — и можно подключать. Лично моя практика показывает, что лучше потратить пару секунд на предварительную проверку, чем ткнуть «не туда» и спалить девайс… Я так спалил Orange Pi PC =)
Товар предоставлен для написания обзора магазином. Обзор опубликован в соответствии с п.18 Правил сайта.
Технические параметры.
► Основная микросхема: MPU-6050 ► Напряжение питания: 3.3 и 5 В► Режимы для акселерометра: ±2g, ±4g, ±6g, ±8g, ±16g;► Режимы для гироскопа: ±250°, ±500°, ±1000°, ±2000°;► Ширина шины IIC: 16 бит;
Точность измерения ускорения в mpu6050
Дело в том, что датчик MPU6050 позволяет настраивать точность измерений. Можно выбрать один из четырех классов точности: ±2G, 4G, 8G и 16G, где 1G — это одна земная гравитация. Используемая нами библиотека по-умолчанию настраивает датчик на диапазон ±8G (прим. по ссылке внизу статьи библиотека по-умолчанию устанавливает ±2G).
С другой стороны, MPU6050 имеет 16 разрядный АЦП. 2 в степени 16 даст нам число 65 536. Поскольку датчик может измерять и отрицательное и положительное ускорение, то он будет выдавать нам числа от -32768 до 32768.
Сложив эти два факта вместе получаем, что при таких настройках 1G будет равен числу 4096 (ну а -1G равен числу -4096). Это вполне совпадает с наблюдаемыми на графике значениями!
Следующий шаг — преобразование этих странных чисел в привычные нам углы, измеряемые в градусах.
Характеристики
- Микросхема : MPU9250
- Интерфейс: I2C (400кГц) / SPI (1 МГц)
- Буфер: FIFO 512B
- Рабочие диапазоны гироскопа: ±250, ±500, ±1000, ±2000 °/с;
- Рабочие диапазоны акселерометра: ±2, ±4, ±8, ±16 g;
- Рабочий диапазон магнитометра: ±4800 мкТл;
- Напряжение питания: 2,4–3,6 В;
- Рабочий ток: гироскоп – 3,2 мА, акселерометр – 450 мкА, магнитометр – 280 мкА;
- Размер: 15мм х 25мм
Характеристики:
— 16-битный АЦП,
— напряжение питания 3-5В,
— поддержка протокола «IIC» (может, I2C ?),
— диапазон ускорений: ± 2 ± 4 ± 8 ± 16g,
— диапазон «гиро»: ± 250 500 1000 2000 ° / s,
— покрытие иммерсионным золотом вместо лужения,
— ток при работе последнего примера составил 5.3 мА и 1.2 мА когда устройство не успело стартовать (питание на модуль было подано после выполнения setup() контроллером)
Часто задаваемые вопросы
1. Нет данных с датчика MPU6050
- Проверьте правильность подключения датчика к плате Arduino.
Калибровка компаса и вывод значений осей в монитор порта.
Подключим сенсор через I2C.
При старте происходит калибровка компаса, а далее в монитор порта выводятся значения каждой оси для акселерометра, гироскопа и магнетометра.
#include <Wire.h> #include <I2Cdev.h> #include <MPU9250.h> // По умолчанию адрес устройства на шине I2C - 0x68 MPU9250 accelgyro; I2Cdev I2C_M; uint8_t buffer_m[6]; int16_t ax, ay, az; int16_t gx, gy, gz; int16_t mx, my, mz; float heading; float tiltheading; float Axyz[3]; float Gxyz[3]; float Mxyz[3]; // время выполнения предварительной калибровки #define sample_num_mdate 5000 volatile float mx_sample[3]; volatile float my_sample[3]; volatile float mz_sample[3]; static float mx_centre = 0; static float my_centre = 0; static float mz_centre = 0; volatile int mx_max = 0; volatile int my_max = 0; volatile int mz_max = 0; volatile int mx_min = 0; volatile int my_min = 0; volatile int mz_min = 0; void setup() { //подключаемся к шине I2C (I2Cdev не может сделать это самостоятельно) Wire.begin(); // инициализация подключения в Мониторе порта // ( 38400бод выбрано потому, что стабильная работа наблюдается и при 8MHz и при 16Mhz, поэтому // в дальнейшем выставляйте скорость согласно ваших требований) Serial.begin(38400); // Инициализация устройства Serial.println("Initializing I2C devices..."); accelgyro.initialize(); // Подтверждение подключения Serial.println("Testing device connections..."); Serial.println(accelgyro.testConnection() ? "MPU9250 connection successful" : "MPU9250 connection failed"); delay(1000); Serial.println(" "); // Предварительная калибровка магнитометра Mxyz_init_calibrated (); } void loop() { getAccel_Data(); // Получение значений Акселерометра getGyro_Data(); // Получение значений Гироскопа getCompassDate_calibrated(); // В этой функции происходит калибровка магнитометра getHeading(); // после чего мы получаем откалиброванные значения углов поворота getTiltHeading(); // и наклона Serial.println("calibration parameter: "); Serial.print(mx_centre); Serial.print(" "); Serial.print(my_centre); Serial.print(" "); Serial.println(mz_centre); Serial.println(" "); Serial.println("Acceleration(g) of X,Y,Z:"); Serial.print(Axyz[0]); Serial.print(","); Serial.print(Axyz[1]); Serial.print(","); Serial.println(Axyz[2]); Serial.println("Gyro(degress/s) of X,Y,Z:"); Serial.print(Gxyz[0]); Serial.print(","); Serial.print(Gxyz[1]); Serial.print(","); Serial.println(Gxyz[2]); Serial.println("Compass Value of X,Y,Z:"); Serial.print(Mxyz[0]); Serial.print(","); Serial.print(Mxyz[1]); Serial.print(","); Serial.println(Mxyz[2]); Serial.println("The clockwise angle between the magnetic north and X-Axis:"); // "Угол поворота" Serial.print(heading); Serial.println(" "); Serial.println("The clockwise angle between the magnetic north and the projection of the positive X-Axis in the horizontal plane:"); // "Угол наклона" Serial.println(tiltheading); Serial.println(" "); Serial.println(); delay(1000); } void getHeading(void) { heading = 180 * atan2(Mxyz[1], Mxyz[0]) / PI; if (heading < 0) heading = 360; } void getTiltHeading(void) { float pitch = asin(-Axyz[0]); float roll = asin(Axyz[1] / cos(pitch)); float xh = Mxyz[0] * cos(pitch) Mxyz[2] * sin(pitch); float yh = Mxyz[0] * sin(roll) * sin(pitch) Mxyz[1] * cos(roll) - Mxyz[2] * sin(roll) * cos(pitch); float zh = -Mxyz[0] * cos(roll) * sin(pitch) Mxyz[1] * sin(roll) Mxyz[2] * cos(roll) * cos(pitch); tiltheading = 180 * atan2(yh, xh) / PI; if (yh < 0) tiltheading = 360; } void Mxyz_init_calibrated () { Serial.println(F("Before using 9DOF,we need to calibrate the compass first. It will takes about 1 minute.")); // Перед использованием сенсора необходимо произвести калибровку компаса. Это займёт около минуты. Serial.print(" "); Serial.println(F("During calibrating, you should rotate and turn the 9DOF all the time within 1 minute.")); // На протяжении всего времени калибровки Вам необходимо вращать сенсор во все стороны. Serial.print(" "); Serial.println(F("If you are ready, please sent a command data 'ready' to start sample and calibrate.")); // Если Вы готовы, для начала калибровки отправьте в Мониторе Порта "ready". while (!Serial.find("ready")); Serial.println(" "); Serial.println("ready"); Serial.println("Sample starting......"); Serial.println("waiting ......"); get_calibration_Data (); Serial.println(" "); Serial.println("compass calibration parameter "); Serial.print(mx_centre); Serial.print(" "); Serial.print(my_centre); Serial.print(" "); Serial.println(mz_centre); Serial.println(" "); } void get_calibration_Data () { for (int i = 0; i < sample_num_mdate; i ) { get_one_sample_date_mxyz(); /* Serial.print(mx_sample[2]); Serial.print(" "); Serial.print(my_sample[2]); // здесь Вы можете увидеть полученные "сырые" значения. Serial.print(" "); Serial.println(mz_sample[2]); */ if (mx_sample[2] >= mx_sample[1])mx_sample[1] = mx_sample[2]; if (my_sample[2] >= my_sample[1])my_sample[1] = my_sample[2]; // Поиск максимального значения if (mz_sample[2] >= mz_sample[1])mz_sample[1] = mz_sample[2]; if (mx_sample[2] <= mx_sample[0])mx_sample[0] = mx_sample[2]; if (my_sample[2] <= my_sample[0])my_sample[0] = my_sample[2]; // Поиск минимального значения if (mz_sample[2] <= mz_sample[0])mz_sample[0] = mz_sample[2]; } mx_max = mx_sample[1]; my_max = my_sample[1]; mz_max = mz_sample[1]; mx_min = mx_sample[0]; my_min = my_sample[0]; mz_min = mz_sample[0]; mx_centre = (mx_max mx_min) / 2; my_centre = (my_max my_min) / 2; mz_centre = (mz_max mz_min) / 2; } void get_one_sample_date_mxyz() { getCompass_Data(); mx_sample[2] = Mxyz[0]; my_sample[2] = Mxyz[1]; mz_sample[2] = Mxyz[2]; } void getAccel_Data(void) { accelgyro.getMotion9(&ax, &ay, &az, &gx, &gy, &gz, &mx, &my, &mz); Axyz[0] = (double) ax / 16384; Axyz[1] = (double) ay / 16384; Axyz[2] = (double) az / 16384; } void getGyro_Data(void) { accelgyro.getMotion9(&ax, &ay, &az, &gx, &gy, &gz, &mx, &my, &mz); Gxyz[0] = (double) gx * 250 / 32768; Gxyz[1] = (double) gy * 250 / 32768; Gxyz[2] = (double) gz * 250 / 32768; } void getCompass_Data(void) { I2C_M.writeByte(MPU9150_RA_MAG_ADDRESS, 0x0A, 0x01); // активируем магнетометр delay(10); I2C_M.readBytes(MPU9150_RA_MAG_ADDRESS, MPU9150_RA_MAG_XOUT_L, 6, buffer_m); mx = ((int16_t)(buffer_m[1]) << 8) | buffer_m[0] ; my = ((int16_t)(buffer_m[3]) << 8) | buffer_m[2] ; mz = ((int16_t)(buffer_m[5]) << 8) | buffer_m[4] ; Mxyz[0] = (double) mx * 1200 / 4096; Mxyz[1] = (double) my * 1200 / 4096; Mxyz[2] = (double) mz * 1200 / 4096; } void getCompassDate_calibrated () { getCompass_Data(); Mxyz[0] = Mxyz[0] - mx_centre; Mxyz[1] = Mxyz[1] - my_centre; Mxyz[2] = Mxyz[2] - mz_centre; }
Заключение
На этом уроке мы получили с датчика MPU6050 сначала сырые данные, а потом и угол его наклона в градусах. Это большое достижение. Но впереди еще немного математики и еще более крутые результаты! Будем делать комплементарный фильтр, который позволит работать с датчиком даже в условиях вибрации и тряски.