Подключение mpu 6050 к ардуино

Датчик Arduino MPU6050 представляет собой 6-осевое устройство отслеживания движения, которое сочетает в себе 3-осевой акселерометр и 3-осевой гироскоп. Он может измерять ускорение и угловую скорость во всех трех измерениях, позволяя определять движение и ориентацию. Датчик небольшой и маломощный, что делает его идеальным для портативных проектов и проектов с батарейным питанием. Он связывается с хост-устройством, таким как Arduino. Микроконтроллер , через интерфейс I2C. MPU6050 также включает в себя встроенный цифровой процессор движения (DMP), который может выполнять сложные вычисления с данными датчиков, например, объединение датчиков.

Чтобы настроить среду разработки Arduino, вы должны установить программное обеспечение Arduino (IDE) на свой компьютер. Ардуино IDE можно бесплатно скачать с официального сайта Arduino веб-сайт . После того, как вы загрузили и установили Arduino IDE, вы должны выбрать правильную плату и порт в настройках IDE. Выбор платы будет зависеть от типа используемой вами платы Arduino (например, Arduino Uno, Arduino Nano и т. д.). Выбор порта необходим для подключения вашего компьютера и платы Arduino. Далее вам нужно будет установить все необходимые библиотеки для Arduino. Датчик MPU6050 . Библиотеку MPU6050 можно найти в менеджере библиотек Arduino IDE или загрузить с официального Сайт Ардуино . Наконец, вы должны подключить плату Arduino к компьютеру через USB-кабель. Плата Arduino должна быть включена, и перед загрузкой скетча необходимо выбрать правильный порт в Arduino IDE. После выполнения этих шагов вы должны быть готовы начать писать код и загружать его на плату Arduino.

Подключение MPU6050 к Arduino

  • Подключите контакт VCC на датчике к контакту 3.3 В на Arduino.
  • Подключите контакт GND датчика к контакту GND Arduino.
  • Подключите контакт SDA на датчике к контакту A4 на Arduino.
  • Подключите контакт SCL на датчике к контакту A5 на Arduino.

После подключения вы можете использовать библиотеку I2C в Arduino IDE для связи с датчиком. Библиотека предоставляет функции для чтения и записи данных в регистры датчика.

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

Ардуино и MPU6050

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

Arduino и MPU6050

gy-521 mpu 6050 гироскоп для arduino обзор

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

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

#include const int MPU = 0x68; // MPU6050 I2C адрес float AccX, AccY, AccZ; float GyroX, GyroY, GyroZ; float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; float roll, pitch, yaw; float AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ; float elapsedTime, currentTime, previousTime; int c = 0; void setup() < Serial.begin(19200); Wire.begin(); // Инициализировать связь Wire.beginTransmission(MPU); // Начать связь с MPU6050 // MPU = 0x68 Wire.write(0x6B); // обращаемся к регистру 6B Wire.write(0x00); // сброс — поместите 0 в регистр 6B Wire.endTransmission(true); //закончить передачу /* // Настройка чувствительности акселерометра — полный диапазон шкалы (по умолчанию +/- 2g) Wire.beginTransmission(MPU); Wire.write(0x1C); //обращаемся к регистру ACCEL_CONFIG (1C hex) Wire.write(0x10); //Установить биты регистра как 00010000 (диапазон полной шкалы +/- 8g) Wire.endTransmission(true); // Настроить чувствительность гироскопа — полный диапазон шкалы (по умолчанию +/- 250 град / с) Wire.beginTransmission(MPU); Wire.write(0x1B); // Обращаемся к регистру GYRO_CONFIG (1B hex) Wire.write(0x10); // Установить биты регистра как 00010000 (полная шкала 1000 град / с) Wire.endTransmission(true); delay(20); */ // Вызов этой функции, покажет значения ошибок IMU для вашего модуля calculate_IMU_error(); delay(20); >void loop() < // === Считать данные акселерометра === // Wire.beginTransmission(MPU); Wire.write(0x3B); // Начинаем с регистра 0x3B (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU, 6, true); // Чтение всех 6 регистров, значение каждой оси сохраняется в 2 регистрах // Для диапазона + -2g нам нужно разделить необработанные значения на 16384 в соответствии с datasheet AccX = (Wire.read() void calculate_IMU_error() < // Мы можем вызвать эту функцию в разделе setup(), чтобы вычислить ошибку данных акселерометра и гироскопа. Отсюда мы получим значения ошибок, используемые в приведенных выше уравнениях, напечатанные на последовательном мониторе. // Обратите внимание, что мы должны разместить датчик плоско, чтобы получить правильные значения, чтобы затем мы могли считать правильные значения // Считываем значения акселерометра 200 раз while (c < 200) < Wire.beginTransmission(MPU); Wire.write(0x3B); Wire.endTransmission(false); Wire.requestFrom(MPU, 6, true); AccX = (Wire.read() // Разделим сумму на 200, чтобы получить значение ошибки AccErrorX = AccErrorX / 200; AccErrorY = AccErrorY / 200; c = 0; // Считываем значения гироскопа 200 раз while (c < 200) < Wire.beginTransmission(MPU); Wire.write(0x43); Wire.endTransmission(false); Wire.requestFrom(MPU, 6, true); GyroX = Wire.read() // Разделим сумму на 200, чтобы получить значение ошибки GyroErrorX = GyroErrorX / 200; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // Выводим значения ошибок на Serial Monitor Serial.print(«AccErrorX: «); Serial.println(AccErrorX); Serial.print(«AccErrorY: «); Serial.println(AccErrorY); Serial.print(«GyroErrorX: «); Serial.println(GyroErrorX); Serial.print(«GyroErrorY: «); Serial.println(GyroErrorY); Serial.print(«GyroErrorZ: «); Serial.println(GyroErrorZ); >

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

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

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

// Настройка чувствительности акселерометра — полный диапазон шкалы (по умолчанию +/- 2g) Wire.beginTransmission(MPU); Wire.write(0x1C); //обращаемся к регистру ACCEL_CONFIG (1C hex) Wire.write(0x10); //Установить биты регистра как 00010000 (диапазон полной шкалы +/- 8g) Wire.endTransmission(true); // Настроить чувствительность гироскопа — полный диапазон шкалы (по умолчанию +/- 250 град / с) Wire.beginTransmission(MPU); Wire.write(0x1B); // Обращаемся к регистру GYRO_CONFIG (1B hex) Wire.write(0x10); // Установить биты регистра как 00010000 (полная шкала 1000 град / с) Wire.endTransmission(true); delay(20);

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

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

// === Считать данные акселерометра === // Wire.beginTransmission(MPU); Wire.write(0x3B); // Начинаем с регистра 0x3B (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU, 6, true); // Чтение всех 6 регистров, значение каждой оси сохраняется в 2 регистрах // Для диапазона + -2g нам нужно разделить необработанные значения на 16384 в соответствии с datasheet AccX = (Wire.read()

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

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

// Расчет крена и тангажа по данным акселерометра accAngleX = (atan(AccY / sqrt(pow(AccX, 2) + pow(AccZ, 2))) * 180 / PI) — 0.58; accAngleY = (atan(-1 * AccX / sqrt(pow(AccY, 2) + pow(AccZ, 2))) * 180 / PI) + 1.58;

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

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

// === Считываем данные гироскопа === // previousTime = currentTime; // Предыдущее время сохраняется до фактического чтения currentTime = millis(); // Текущее время Фактическое время чтения elapsedTime = (currentTime — previousTime) / 1000; // Разделим на 1000, чтобы получить секунды Wire.beginTransmission(MPU); Wire.write(0x43); // Адрес первого регистра данных гироскопа 0x43 Wire.endTransmission(false); Wire.requestFrom(MPU, 6, true); // Чтение всех 4 регистров, значение каждой оси сохраняется в 2 регистрах GyroX = (Wire.read()

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

// Корректируем выходы с вычисленными значениями ошибок GyroX = GyroX + 0.56; // GyroErrorX ~(-0.56) GyroY = GyroY — 2; // GyroErrorY ~(2) GyroZ = GyroZ + 0.79; // GyroErrorZ ~ (-0.8) // В настоящее время необработанные значения выражаются в градусах в секунду, град / с, поэтому нам нужно умножить на sendonds (s), чтобы получить угол в градусах gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deg gyroAngleY = gyroAngleY + GyroY * elapsedTime; yaw = yaw + GyroZ * elapsedTime;

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

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

// Дополнительный фильтр — объединить значения угла акселерометра и гироскопа roll = 0.96 * gyroAngleX + 0.04 * accAngleX; pitch = 0.96 * gyroAngleY + 0.04 * accAngleY;

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

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

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

void calculate_IMU_error() < // Мы можем вызвать эту функцию в разделе setup(), чтобы вычислить ошибку данных акселерометра и гироскопа. Отсюда мы получим значения ошибок, используемые в приведенных выше уравнениях, напечатанные на последовательном мониторе. // Обратите внимание, что мы должны разместить датчик плоско, чтобы получить правильные значения, чтобы затем мы могли считать правильные значения // Считываем значения акселерометра 200 раз while (c < 200) < Wire.beginTransmission(MPU); Wire.write(0x3B); Wire.endTransmission(false); Wire.requestFrom(MPU, 6, true); AccX = (Wire.read() // Разделим сумму на 200, чтобы получить значение ошибки AccErrorX = AccErrorX / 200; AccErrorY = AccErrorY / 200; c = 0; // Считываем значения гироскопа 200 раз while (c < 200) < Wire.beginTransmission(MPU); Wire.write(0x43); Wire.endTransmission(false); Wire.requestFrom(MPU, 6, true); GyroX = Wire.read() // Разделим сумму на 200, чтобы получить значение ошибки GyroErrorX = GyroErrorX / 200; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // Выводим значения ошибок на Serial Monitor Serial.print(«AccErrorX: «); Serial.println(AccErrorX); Serial.print(«AccErrorY: «); Serial.println(AccErrorY); Serial.print(«GyroErrorX: «); Serial.println(GyroErrorX); Serial.print(«GyroErrorY: «); Serial.println(GyroErrorY); Serial.print(«GyroErrorZ: «); Serial.println(GyroErrorZ); >

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

Наконец, с помощью функции Serial.print мы можем распечатать значения Roll, Pitch и Yaw на последовательном мониторе и посмотреть, правильно ли работает датчик.

Программа для получения сырых данных с акселерометра 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(ay_raw, gx_raw, gz_raw); Serial.println(ay_raw); // вывод в порт проекции ускорения на ось Y >>

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

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

Сырые данные с акселерометра MPU6050

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

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

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

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

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

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

Взаимодействие MPU-6050 с Arduino

Для сопряжения MPU-6050 с Arduino понадобятся библиотека разработки I2C Джеффа Роуберга и библиотека MPU-6050. Эти библиотеки будут загружены в формате .ZIP, и можете напрямую добавить эти папки в свою среду разработки Arduino IDE.

  • Откройте среду разработки Arduino.
  • Перейдите в меню Sketch из верхней строки меню.
  • Выберите “Включить библиотеку”.
  • Выберите параметр “Добавить библиотеку ZIP”.
  • Перейдите в папку загрузок или любую другую, в которой сохранили библиотеку .ZIP, и выберите ее.
  • В нижней части Arduino IDE появится сообщение о том, что библиотека добавлена в ваш список.
  • Повторите шаги, чтобы добавить вторую библиотеку.

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

Технические параметры.

► Основная микросхема: MPU-6050
► Напряжение питания: 3.3 и 5 В
► Режимы для акселерометра: ±2g, ±4g, ±6g, ±8g, ±16g;
► Режимы для гироскопа: ±250°, ±500°, ±1000°, ±2000°;
► Ширина шины IIC: 16 бит;

Основная микросхема модуль GY-521 чип MPU-6050 , который содержит в себе акселерометр и гироскоп, а так же датчик температуры. Обработка данных осуществляется с помощью 16-битное АЦП (Аналого-цифровой преобразователь) на каждый канал, поэтому он обрабатывает значение x, y и z одновременно. Встроенный датчик температуры предназначен для измерения температуры и имеет диапазон измерений от -40 ° С до + 85 ° С.
Для взаимодействия с Arduino используется шина I2C и датчик MPU-6050 всегда выступает в качестве подчиненного устройства. Но кроме обычной шины I2C, есть собственный контроллер I2C, в котором MPU-6050 ведомый, выводы SDA и XDA и с помощью это шины можно управлять например магнитометром и передавать данные на Arduino.
Гироскоп – инструмент, который позволяет измерить реакцию тела на перемещение углов и вообще ориентации. Акселерометр же служит измерителем проекции ускорения, которое только кажется.

Обзор модуля GY-521 (MPU-6050)

Датчика MPU-6050 работает от напряжение ~2.4 — 3.5 В и чтобы стабилизировать питание, на модуле GY-521 добавили стабилизатор напряжения на 3.3 В с малым падением напряжении, поэтому модуль можно подключить к напряжению 5 В и 3.3 В.

Обзор модуля GY-521 (MPU-6050)

На плате установлен один ряд разъема, шагом 2,54 мм, назначение каждого можно посмотреть ниже.

Назначение выводов:
► VCC – «+» питание модуля 3.3 В до 5 В
► GND – «-» питание модуля
► SCL – линия синхронизации для протокола I2C
► SDA – линия передачи данных протокола I2C
► XDA – линия передачи данных протокола при работе в режиме мастера
► XCL – линия синхронизации для протокола I2C при работе в режиме мастера
► AD0 – если вывод лог «0» адрес I2C будет 0x68, если вывод лог «1» адрес I2C будет 0x69
► INT – прерывание

Подключение 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. Для удобства приведу схему подключение.

Обзор модуля GY-521 (MPU-6050)

Программа:
Чтобы протестировать модуль GY-521 сначала необходимо установить библиотеку «MPU6050» , скачать ее можно в конце статьи. Если все сделали правильно, при открытии Arduino IDE вы можете увидеть «MPU6050» в «Файл» -> «Примеры».

Характеристики модуля GY-521 (MPU6050)

  • Питание (В): 3.5 – 6
  • Ток потребления (мкА): 500
  • Акселерометр диапазон измерений: ± 2 ± 4 ± 8 ± 16g
  • Гироскоп диапазон измерений: ± 250 500 1000 2000 ° / s
  • ​Интерфейс: I2C

Подключение к плате Arduino по интерфейсу I2C. Схема подключения

Модуль GY521 подключение к Ардуино

Загрузив на плату Arduino скетч сканирования I2C-устройств, в мониторе последовательного порта увидим I2C-адрес модуля MPU6050 – 0x68

#include «Wire.h» //#define MY_SERIAL // void setup() < // put your setup code here, to run once: Serial.begin(9600); Serial.println(«nI2C Scanner»); Wire.begin(); >void loop() < int nDevices; byte error, address; Serial.println(«Scanning I2C bus. n»); nDevices = 0; Serial.print(» 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F»); for(address = 0; address < 128; address++ ) < if((address % 0x10) == 0) < Serial.println(); if(address < 16) Serial.print(‘0’); Serial.print(address, 16); Serial.print(» «); >// The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(address);error = Wire.endTransmission(); if (error == 0) < if (address<16) Serial.print(«0»); Serial.print(address, HEX); nDevices++; >else < Serial.print(«—»); >Serial.print(» «); delay(1); > Serial.println(); if (nDevices == 0) Serial.println(«No I2C devices foundn»); else < Serial.print(«Found «); Serial.print(nDevices); Serial.println(» device(s) «); >delay(2500); // wait 5 seconds for next scan >

I2C-адрес модуля MPU6050

Получение показаний датчика MPU6050

Для работы с датчиком MPU6050 будем использовать библиотеки I2Cdev и MPU6050. После установки библиотек загрузим на плату Arduino скетч для отображения показаний акселерометра по одной из осей – оси x. Содержимое скетча показано ниже.

#include «I2Cdev.h» #include «MPU6050.h» #define TIME_OUT 20 MPU6050 accgyro; unsigned long int t1; void setup() < Serial.begin(9600); accgyro.initialize(); >void loop() < long int t = millis(); if( t1 < t )< int16_t ax, ay, az, gx, gy, gz; t1 = t + TIME_OUT; accgyro.getMotion6(ay, gx, gz); Serial.println(ax); >>

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

Получение показаний датчика MPU6050

Библиотека MPU6050 по умолчанию настраивает датчик на диапазон ±8g (возможные значения ±2g, 4g, 8g и 16g). для 16 разрядного АЦП датчика это значения от -2 15 до 2 15 , поэтому возможные значения на графике ±2 15 /16*8 (-16384 до 16384).
Скетч из листинга преобразует сырые показания датчика MPU6050 в угол наклона датчика относительно оси x.

#include «I2Cdev.h» #include «MPU6050.h» #define TO_DEG 57.2957f #define TIME_OUT 20 MPU6050 accgyro; float anglex; long int t1; void setup() < Serial.begin(9600); // инициализация датчика accgyro.initialize(); >void loop() < long int t = millis(); if( t1 < t )< int16_t ax, ay, az, gx, gy, gz; float accy,gyrox; t1 = t + TIME_OUT; accgyro.getMotion6(ay, gx, gz); // преобразование в единицы гравитации при настройках 1G accy = ax /4096.0; // границы от -1G до +1G accy = clamp(accy, -1.0, 1.0); // получить значение в градусах if( accy >= 0) < anglex = 90 — TO_DEG*acos(accy); >else < anglex = TO_DEG*acos(-ay) — 90; >Serial.println(anglex); > >

И смотрим показания угла наклона, вращая датчик по оси x в одну и другую стороны.

Получение показаний датчика MPU6050

Пример использования

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

  • Плата Arduino Nano – 1
  • Плата прототипирования – 1
  • Модуль MPU6050 – 1
  • Передатчик FS1000A – 1
  • Провода

Для движущейся платформы:

  • Плата Arduino Nano – 1
  • Двухколесная движущаяся платформа – 1
  • Модуль драйвера L298N – 1
  • приемник MX-RM-5V – 1
  • Блок батарей 18650 – 1
  • ​Провода

Схема соединения элементов пульта управления.

Схема соединения элементов пульта управления.

Схема соединений для компонентов для движущейся платформы.

Схема соединений для компонентов для движущейся платформы.

Приступим к написанию скетчей. Передатчик отправляет 3 значения – начальный байт отправки B11111111 и 2 значения наклона датчика – по оси x и по оси y.

#include «I2Cdev.h» #include «MPU6050.h» #include #define TO_DEG 57.2957f #define TIME_OUT 20 MPU6050 accgyro; RCSwitch mySwitch = RCSwitch(); float anglex; float angley; long int t1; void setup() < Serial.begin(9600); // инициализация датчика accgyro.initialize(); mySwitch.enableTransmit(2); >void loop() < long int t = millis(); if( t1 < t )< int16_t ax, ay, az, gx, gy, gz; float accy,gyrox; t1 = t + TIME_OUT; accgyro.getMotion6(ay, gx, gz); // преобразование в единицы гравитации при настройках 1G = 4096 accx = ax/4096.0; accy = ax/4096.0; // границы от -1G до +1G accx = clamp(accx, -1.0, 1.0); accy = clamp(accy, -1.0, 1.0); // получить значение в градусах if( accy >= 0) < anglex = 90 — TO_DEG*acos(accy); >else < anglex = TO_DEG*acos(-accy) — 90; >if( accx >= 0) < angley = 90 — TO_DEG*acos(accx); >else < angley = TO_DEG*acos(-accx) — 90; >// отправка данных mySwitch.send(B11111111, 8); delay(50); mySwitch.send((byte)anglex, 8); delay(50); mySwitch.send((byte)angley, 8); delay(100); > >

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

// подключение библиотеки #include // создание объекта RCSwitch mySwitch = RCSwitch(); int motor=0; void setup() < pinMode(10,OUTPUT); pinMode(9,OUTPUT); pinMode(8,OUTPUT); pinMode(5,OUTPUT); pinMode(7,OUTPUT); pinMode(6,OUTPUT); // запуск приемника mySwitch.enableReceive(0); >void loop() < if( mySwitch.available() )< // получить данные int value = mySwitch.getReceivedValue(); if( value == B11111111 ) else < if(motor==1) < go(10,9,8,value); >else if(motor==2) < go(5,7,6,value); >motor++; > mySwitch.resetAvailable(); > > // запуск двигателей void go(int pina,int pin1,int pin2,int val) < analogWrite(pina,map(abs(val),0,90,0,255)); if(val<=0) < digitalWrite(pin1,0); digitalWrite(pin2,1); >else < digitalWrite(pin1,1); digitalWrite(pin2,0); >>

Пульт

Движущаяся платформа

Что делать если

Нет данных с датчика MPU6050

  • Проверьте правильность подключения датчика к плате Arduino.

Компоненты

  • Плата Arduino Uno
  • USB кабель
  • Модуль MPU6050
  • Макетная плата

Используем выводы A4 (SDA) и A5 (SCL) платы Arduino Uno для связи с модулем MPU6050.

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

#include «Wire.h» #include «I2Cdev.h» #include «MPU6050.h» MPU6050 accelgyro; int16_t ax, ay, az; int16_t gx, gy, gz; #define LED_PIN 13 bool blinkState = false; void setup() < Serial.begin(9600); Serial.println(«Initializing I2C devices. «); Wire.begin(); accelgyro.initialize(); Serial.println(«Testing device connections. «); if (accelgyro.testConnection()) < Serial.println(«MPU6050 connection successful»); >else < Serial.println(«MPU6050 connection failed»); while (1); >// Calibrate the gravity acceleration // accelgyro.setXAccelOffset(-1200); // accelgyro.setYAccelOffset(-2500); // accelgyro.setZAccelOffset(1988); Serial.print(«X.Y.Z offset :t»); Serial.print(accelgyro.getXAccelOffset()); Serial.print(«t»); Serial.print(accelgyro.getYAccelOffset()); Serial.print(«t»); Serial.print(accelgyro.getZAccelOffset()); Serial.print(«n»); // initialize LED port pinMode(LED_PIN, OUTPUT); > void loop() < accelgyro.getMotion6(ay, gx, gz); Serial.print(«a/g:t»); Serial.print(ax); Serial.print(«t»); Serial.print(ay); Serial.print(«t»); Serial.print(az); Serial.print(«t»); Serial.print(gx); Serial.print(«tt»); Serial.print(gy); Serial.print(«tt»); Serial.println(gz); // Convert acceleration to g and the gyroscope unit to dps (degree per second) Serial.print(«a/g:t»); Serial.print((float)ax / 16384); Serial.print(«gt»); Serial.print((float)ay / 16384); Serial.print(«gt»); Serial.print((float)az / 16384); Serial.print(«gt»); Serial.print((float)gx / 131); Serial.print(«d/s t»); Serial.print((float)gy / 131); Serial.print(«d/s t»); Serial.print((float)gz / 131); Serial.print(«d/s n»); delay(300); blinkState = !blinkState; digitalWrite(LED_PIN, blinkState); >

Подключаем библиотеки, необходимые для работы скетча.

#include «Wire.h» #include «I2Cdev.h» #include «MPU6050.h»

Создаём объект accelgyro.

MPU6050 accelgyro;

Инициализируем шину I2C, а затем модуль MPU6050.

Wire.begin(); accelgyro.initialize();

Проверим связь с модулем.

if (accelgyro.testConnection()) < Serial.println(«MPU6050 connection successful»); >else

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

// accelgyro.setXAccelOffset(-1200); // accelgyro.setYAccelOffset(-2500); // accelgyro.setZAccelOffset(1988);

Выводим значения в монитор последовательного порта.

Serial.print(«X.Y.Z offset :t»); Serial.print(accelgyro.getXAccelOffset()); Serial.print(«t»); Serial.print(accelgyro.getYAccelOffset()); Serial.print(«t»); Serial.print(accelgyro.getZAccelOffset()); Serial.print(«n»);

В функции loop() считываем параметры акселерометра и параметры гироскопа.

accelgyro.getMotion6(ay, gx, gz);

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

Оцените статью
TutShema
Добавить комментарий