Оглавление:

Гироскоп MPU 6050, связь акселерометра с Arduino (Atmega328p): 5 шагов
Гироскоп MPU 6050, связь акселерометра с Arduino (Atmega328p): 5 шагов

Видео: Гироскоп MPU 6050, связь акселерометра с Arduino (Atmega328p): 5 шагов

Видео: Гироскоп MPU 6050, связь акселерометра с Arduino (Atmega328p): 5 шагов
Видео: Балансирующий робот своими руками на ардуино и шаговых двигателях 2024, Ноябрь
Anonim
MPU 6050 Гироскоп, связь акселерометра с Arduino (Atmega328p)
MPU 6050 Гироскоп, связь акселерометра с Arduino (Atmega328p)
MPU 6050 Гироскоп, связь акселерометра с Arduino (Atmega328p)
MPU 6050 Гироскоп, связь акселерометра с Arduino (Atmega328p)
MPU 6050 Гироскоп, связь акселерометра с Arduino (Atmega328p)
MPU 6050 Гироскоп, связь акселерометра с Arduino (Atmega328p)

MPU6050 IMU имеет 3-осевой акселерометр и 3-осевой гироскоп, интегрированные в один чип.

Гироскоп измеряет скорость вращения или скорость изменения углового положения во времени по осям X, Y и Z.

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

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

3-осевой гироскоп MPU-6050 состоит из 3-осевого гироскопа, который может определять скорость вращения по осям x, y, z с помощью технологии микромеханических систем (MEMS). Когда датчик вращается вдоль любой оси, возникает вибрация из-за эффекта Кориолиса, который обнаруживается МЭМС. 16-битный АЦП используется для оцифровки напряжения для выборки каждой оси. +/- 250, +/- 500, +/- 1000, +/- 2000 - это полный диапазон выходного сигнала. Угловая скорость измеряется по каждой оси в градусах в секунду.

Полезная ссылка: …………….

Плата Arduino:. ……….

MPU6050 IMU ……………

Шаг 1: модуль MPU-6050

Модуль MPU-6050
Модуль MPU-6050

Модуль MPU-6050 имеет 8 контактов,

INT: вывод цифрового выхода прерывания.

AD0: вывод LSB адреса ведомого устройства I2C. Это 0-й бит в 7-битном подчиненном адресе устройства. При подключении к VCC он считывается как логическая единица, и адрес подчиненного устройства изменяется.

XCL: контакт вспомогательного последовательного тактового сигнала. Этот вывод используется для подключения вывода SCL других датчиков с интерфейсом I2C к MPU-6050.

XDA: вспомогательный вывод последовательных данных. Этот вывод используется для подключения других датчиков с интерфейсом I2C, вывод SDA, к MPU-6050.

SCL: вывод последовательного тактового сигнала. Подключите этот вывод к контакту SCL микроконтроллера. SDA: вывод последовательных данных. Подключите этот вывод к выводу SDA микроконтроллера.

GND: контакт заземления. Подключите этот контакт к заземлению.

VCC: вывод источника питания. Подключите этот контакт к источнику + 5В постоянного тока. Модуль MPU-6050 имеет адрес Slave (когда AD0 = 0, т.е. он не подключен к Vcc) как, Адрес записи ведомого устройства (SLA + W): 0xD0

Адрес чтения ведомого устройства (SLA + R): 0xD1

Шаг 2: расчеты

Расчеты
Расчеты

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

Данные датчика температуры модуля MPU6050 состоят из 16-битных данных (не в виде дополнения до 2).

Теперь предположим, что мы выбрали,

  • - Полный диапазон шкалы акселерометра +/- 2g с масштабным коэффициентом чувствительности 16, 384 LSB (Count) / g.
  • - Полный диапазон шкалы гироскопа +/- 250 ° / с с масштабным коэффициентом чувствительности 131 LSB (счет) / ° / с. тогда,

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

Значения акселерометра в г (g-сила)

  • Ускорение по оси X = (Исходные данные оси X акселерометра / 16384) g.
  • Ускорение по оси Y = (Исходные данные оси Y акселерометра / 16384) g.
  • Ускорение по оси Z = (Исходные данные оси Z акселерометра / 16384) g.

Значения гироскопа в ° / с (градус в секунду)

  • Угловая скорость по оси X = (Исходные данные оси X гироскопа / 131) ° / с.
  • Угловая скорость по оси Y = (Исходные данные оси Y гироскопа / 131) ° / с.
  • Угловая скорость по оси Z = (Исходные данные оси Z гироскопа / 131) ° / с.

Значение температуры в ° / c (градус на градус Цельсия)

Температура в градусах C = ((данные датчика температуры) / 340 + 36,53) ° / c.

Например, Предположим, после дополнения на 2 мы получаем исходное значение оси X акселерометра = +15454

Тогда Ax = +15454/16384 = 0,94 г.

Более,

Итак, мы знаем, что работаем с чувствительностью +/- 2G и +/- 250 градусов / с, но как наши значения соответствуют этим ускорениям / углам.

Это оба прямолинейных графика, и мы можем понять из них, что для 1G мы будем читать 16384, а для 1 градуса / сек мы будем читать 131,07 (хотя 0,07 будет проигнорирован из-за двоичного кода), эти значения были просто вычислены путем рисования прямой график с 2G при 32767 и -2G при -32768 и 250 / -250 при тех же значениях.

Итак, теперь мы знаем наши значения чувствительности (16384 и 131,07), нам просто нужно вычесть смещения от наших значений, а затем разделить на чувствительность.

Они будут работать нормально для значений X и Y, но поскольку Z была записана на 1 Гбит / с, а не на 0, нам нужно будет вычесть 1 Гбит / с (16384), прежде чем мы разделим на нашу чувствительность.

Шаг 3: Подключения MPU6050-Atmega328p

Соединения MPU6050-Atmega328p
Соединения MPU6050-Atmega328p
Соединения MPU6050-Atmega328p
Соединения MPU6050-Atmega328p
Соединения MPU6050-Atmega328p
Соединения MPU6050-Atmega328p

Просто подключите все, как показано на схеме…

Подключения представлены следующим образом: -

MPU6050 Arduino Nano

Выходной вывод VCC 5 В

GND Контакт заземления

SDA A4 pin // последовательные данные

SCL A5 pin // последовательные часы

Расчет тангажа и крена: крен - это вращение вокруг оси x, а тангаж - это вращение по оси y.

Результат выражается в радианах. (преобразовать в градусы умножением на 180 и делением на пи)

Шаг 4: коды и пояснения

Коды и пояснения
Коды и пояснения

/*

Учебное пособие по датчикам акселерометра и гироскопа Arduino и MPU6050 от Dejan, https://howtomechatronics.com * / #include const int MPU = 0x68; // Адрес I2C MPU6050 float AccX, AccY, AccZ; поплавок GyroX, GyroY, GyroZ; float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; плавающий крен, тангаж, рыскание; 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 шестнадцатеричный) Wire.write (0x10); // Устанавливаем биты регистра как 00010000 (диапазон полной шкалы +/- 8g) Wire.endTransmission (true); // Настроить чувствительность гироскопа - полный диапазон шкалы (по умолчанию +/- 250 градусов / с) Wire.beginTransmission (MPU); Wire.write (0x1B); // Обращаемся к регистру GYRO_CONFIG (1B шестнадцатеричный) Wire.write (0x10); // Устанавливаем биты регистра как 00010000 (полная шкала 1000 градусов / с) Wire.endTransmission (true); задержка (20); * / // Вызовите эту функцию, если вам нужно получить значения ошибок IMU для вашего модуля calculate_IMU_error (); задержка (20); } void loop () {// === Чтение данных акселерометра === // Wire.beginTransmission (MPU); Wire.write (0x3B); // Начинаем с регистра 0x3B (ACCEL_XOUT_H) Wire.endTransmission (false); Wire.requestFrom (MPU, 6, истина); // Считываем всего 6 регистров, каждое значение оси сохраняется в 2-х регистрах // Для диапазона + -2g нам нужно разделить необработанные значения на 16384 в соответствии с таблицей данных AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; // значение оси X AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; // значение оси Y AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Значение оси Z // Расчет крена и тангажа по данным акселерометра accAngleX = (atan (AccY / sqrt (pow (AccX, 2) + pow (AccZ, 2))) * 180 / PI) - 0,58; // AccErrorX ~ (0.58) Подробнее см. Пользовательскую функцию calculate_IMU_error () accAngleY = (atan (-1 * AccX / sqrt (pow (AccY, 2) + pow (AccZ, 2))) * 180 / PI) + 1,58; // AccErrorY ~ (-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, истина); // Считываем всего 4 регистра, значение каждой оси сохраняется в 2 регистрах GyroX = (Wire.read () << 8 | Wire.read ()) / 131.0; // Для диапазона 250 градусов / с мы должны сначала разделить необработанное значение на 131.0, в соответствии с таблицей данных GyroY = (Wire.read () << 8 | Wire.read ()) / 131.0; GyroZ = (Wire.read () << 8 | Wire.read ()) / 131.0; // Корректируем выходы с вычисленными значениями погрешности 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; // Дополнительный фильтр - объединить значения угла акселерометра и гироскопа roll = 0,96 * gyroAngleX + 0,04 * accAngleX; pitch = 0,96 * gyroAngleY + 0,04 * accAngleY; // Распечатать значения на серийном мониторе Serial.print (roll); Serial.print ("/"); Serial.print (шаг); Serial.print ("/"); Serial.println (рыскание); } void calculate_IMU_error () {// Мы можем вызвать эту функцию в разделе настройки, чтобы вычислить ошибку данных акселерометра и гироскопа. Отсюда мы получим значения ошибок, используемые в приведенных выше уравнениях, напечатанные на Serial Monitor. // Обратите внимание, что мы должны расположить IMU ровно, чтобы получить правильные значения, чтобы затем мы могли правильные значения // Считать значения акселерометра 200 раз while (c <200) {Wire.beginTransmission (MPU); Wire.write (0x3B); Wire.endTransmission (ложь); Wire.requestFrom (MPU, 6, истина); AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Суммируем все показания AccErrorX = AccErrorX + ((atan ((AccY) / sqrt (pow ((AccX), 2) + pow ((AccZ), 2))) * 180 / PI)); AccErrorY = AccErrorY + ((atan (-1 * (AccX) / sqrt (pow ((AccY), 2) + pow ((AccZ), 2))) * 180 / PI)); c ++; } // Разделим сумму на 200, чтобы получить значение ошибки AccErrorX = AccErrorX / 200; AccErrorY = AccErrorY / 200; c = 0; // Считываем значения гироскопа 200 раз while (c <200) {Wire.beginTransmission (MPU); Wire.write (0x43); Wire.endTransmission (ложь); Wire.requestFrom (MPU, 6, истина); GyroX = Wire.read () << 8 | Wire.read (); GyroY = Wire.read () << 8 | Wire.read (); GyroZ = Wire.read () << 8 | Wire.read (); // Суммируем все показания GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroY / 131,0); GyroErrorZ = GyroErrorZ + (GyroZ / 131.0); c ++; } // Разделим сумму на 200, чтобы получить значение ошибки GyroErrorX = GyroErrorX / 200; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // Распечатать значения ошибок на последовательном мониторе 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); } ------------------------------------------------- ---------------------------------------------- Результаты: - X = Y = Z = --------------------------------------------- ----------------------------------------------- Важная заметка: - ----------------

В разделе цикла мы начинаем с чтения данных акселерометра. Данные для каждой оси хранятся в 2 байтах или регистрах, и мы можем видеть адреса этих регистров из таблицы данных датчика.

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

Шаг 5: понимание угла наклона

Акселерометр

Сила тяжести Земли - это постоянное ускорение, при котором сила всегда направлена вниз к центру Земли.

Когда акселерометр параллелен силе тяжести, измеренное ускорение будет 1G, когда акселерометр перпендикулярен силе тяжести, он будет измерять 0G.

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

θ = sin-1 (Измеренное ускорение / ускорение свободного падения)

GyroGyro (он же датчик скорости) используется для измерения угловой скорости (ω).

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

ω = dθ / dt, θ = ∫ ω dt

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

Ссылка для лучшего понимания: Нажмите здесь

Рекомендуемые: