Руководство по Arduino для датчика акселерометра и гироскопа MPU-6050

Узнайте, как использовать модуль акселерометра и гироскопа MPU-6050 с платой Arduino. MPU-6050 IMU (инерциальный измерительный модуль) – это 3-осевой акселерометр и 3-осевой гироскоп. Акселерометр измеряет гравитационное ускорение, а гироскоп измеряет угловую скорость вращения. Кроме того, этот модуль также измеряет температуру. Этот датчик идеально подходит для определения ориентации движущегося объекта.

Плата Arduino с модулем MPU6050 - акселерометр, гироскоп, датчик температуры

У нас есть аналогичное руководство для плат ESP32 и ESP8266:

В этом руководстве мы рассмотрим два примера:

  1. Получение показаний гироскопа, ускорения и температуры (Serial Monitor)

  2. Отображение показаний MPU-6050 на Serial Plotter

  3. Отображение показаний MPU-6050 на OLED-дисплее

Знакомство с датчиком акселерометра и гироскопа MPU-6050

MPU-6050 – это модуль с 3-осевым акселерометром и 3-осевым гироскопом.

Модуль MPU-6050 - акселерометр, гироскоп, датчик температуры

Гироскоп измеряет угловую скорость вращения (рад/с). Это изменение углового положения во времени по осям X, Y и Z (крен, тангаж и рыскание). Это позволяет нам определять ориентацию объекта.

Углы крена, тангажа и рыскания

Акселерометр измеряет ускорение (скорость изменения скорости объекта). Он воспринимает статические силы, такие как гравитация (9,8 м/с2), или динамические силы, такие как вибрации или движение. MPU-6050 измеряет ускорение по осям X, Y и Z. В идеале, для неподвижного объекта ускорение по оси Z равно силе тяжести, а по осям X и Y оно должно быть равно нулю.

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

Мы можем комбинировать информацию от обоих датчиков, чтобы получить более точные данные об ориентации датчика.

Распиновка MPU-6050

Вот распиновка модуля датчика MPU-6050.

Вывод

Описание

VCC

Питание датчика (3,3 В или 5 В)

GND

Общая земля

SCL

Вывод SCL для I2C-связи (A5)

SDA

Вывод SDA для I2C-связи (A4)

XDA

Используется для подключения других I2C-датчиков к MPU-6050

XCL

Используется для подключения других I2C-датчиков к MPU-6050

AD0

Используйте этот вывод для изменения I2C-адреса

INT

Вывод прерывания – может использоваться для индикации наличия новых данных измерений

Установка библиотек

Существуют различные способы получения данных с датчика. В этом руководстве мы будем использовать библиотеку Adafruit MPU6050. Для использования этой библиотеки вам также необходимо установить библиотеку Adafruit Unified Sensor и библиотеку Adafruit Bus IO.

Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Должен открыться Менеджер библиотек.

Введите «adafruit mpu6050» в поле поиска и установите библиотеку.

Установка библиотеки Adafruit MPU6050 для гироскопа и акселерометра в Arduino IDE

Затем найдите «Adafruit Unified Sensor». Прокрутите вниз, чтобы найти библиотеку, и установите её.

Установка библиотеки Adafruit Unified Sensor в Arduino IDE

Наконец, найдите «Adafruit Bus IO» и установите её.

Установка библиотеки Adafruit Bus IO в Arduino IDE

После установки библиотек перезапустите Arduino IDE.

Получение показаний гироскопа, ускорения и температуры (Serial Monitor)

В этом разделе вы узнаете, как получить показания датчика MPU-6050: ускорение (x, y, z), угловую скорость (x, y, z) и температуру.

Необходимые компоненты

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

Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

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

Подключите Arduino к датчику MPU-6050, как показано на следующей схеме: подключите вывод SCL к A5, а вывод SDA к A4.

Схема подключения Arduino с MPU-6050 акселерометром и гироскопом Fritzing

Код – Получение показаний датчика MPU-6050: акселерометр, гироскоп и температура

Библиотека Adafruit предоставляет несколько примеров для этого датчика. В этом разделе мы рассмотрим базовый пример, который выводит показания датчика в Serial Monitor.

Перейдите в File > Examples > Adafruit MPU6050 > basic_readings. Должен загрузиться следующий код.

Он получает угловую скорость (гироскоп) по осям x, y и z, ускорение по осям x, y и z, а также температуру.

// Basic demo for accelerometer readings from Adafruit MPU6050

// ESP32 Guide: https://RandomNerdTutorials.com/esp32-mpu-6050-accelerometer-gyroscope-arduino/
// ESP8266 Guide: https://RandomNerdTutorials.com/esp8266-nodemcu-mpu-6050-accelerometer-gyroscope-arduino/
// Arduino Guide: https://RandomNerdTutorials.com/arduino-mpu-6050-accelerometer-gyroscope/

#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>

Adafruit_MPU6050 mpu;

void setup(void) {
  Serial.begin(115200);
  while (!Serial)
    delay(10); // will pause Zero, Leonardo, etc until serial console opens

  Serial.println("Adafruit MPU6050 test!");

  // Try to initialize!
  if (!mpu.begin()) {
    Serial.println("Failed to find MPU6050 chip");
    while (1) {
      delay(10);
    }
  }
  Serial.println("MPU6050 Found!");

  mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
  Serial.print("Accelerometer range set to: ");
  switch (mpu.getAccelerometerRange()) {
  case MPU6050_RANGE_2_G:
    Serial.println("+-2G");
    break;
  case MPU6050_RANGE_4_G:
    Serial.println("+-4G");
    break;
  case MPU6050_RANGE_8_G:
    Serial.println("+-8G");
    break;
  case MPU6050_RANGE_16_G:
    Serial.println("+-16G");
    break;
  }
  mpu.setGyroRange(MPU6050_RANGE_500_DEG);
  Serial.print("Gyro range set to: ");
  switch (mpu.getGyroRange()) {
  case MPU6050_RANGE_250_DEG:
    Serial.println("+- 250 deg/s");
    break;
  case MPU6050_RANGE_500_DEG:
    Serial.println("+- 500 deg/s");
    break;
  case MPU6050_RANGE_1000_DEG:
    Serial.println("+- 1000 deg/s");
    break;
  case MPU6050_RANGE_2000_DEG:
    Serial.println("+- 2000 deg/s");
    break;
  }

  mpu.setFilterBandwidth(MPU6050_BAND_5_HZ);
  Serial.print("Filter bandwidth set to: ");
  switch (mpu.getFilterBandwidth()) {
  case MPU6050_BAND_260_HZ:
    Serial.println("260 Hz");
    break;
  case MPU6050_BAND_184_HZ:
    Serial.println("184 Hz");
    break;
  case MPU6050_BAND_94_HZ:
    Serial.println("94 Hz");
    break;
  case MPU6050_BAND_44_HZ:
    Serial.println("44 Hz");
    break;
  case MPU6050_BAND_21_HZ:
    Serial.println("21 Hz");
    break;
  case MPU6050_BAND_10_HZ:
    Serial.println("10 Hz");
    break;
  case MPU6050_BAND_5_HZ:
    Serial.println("5 Hz");
    break;
  }

  Serial.println("");
  delay(100);
}

void loop() {
  /* Get new sensor events with the readings */
  sensors_event_t a, g, temp;
  mpu.getEvent(&a, &g, &temp);

  /* Print out the values */
  Serial.print("Acceleration X: ");
  Serial.print(a.acceleration.x);
  Serial.print(", Y: ");
  Serial.print(a.acceleration.y);
  Serial.print(", Z: ");
  Serial.print(a.acceleration.z);
  Serial.println(" m/s^2");

  Serial.print("Rotation X: ");
  Serial.print(g.gyro.x);
  Serial.print(", Y: ");
  Serial.print(g.gyro.y);
  Serial.print(", Z: ");
  Serial.print(g.gyro.z);
  Serial.println(" rad/s");

  Serial.print("Temperature: ");
  Serial.print(temp.temperature);
  Serial.println(" degC");

  Serial.println("");
  delay(500);
}

Просмотреть исходный код

Как работает код

Начните с подключения необходимых библиотек для датчика MPU-6050: Adafruit_MPU6050 и Adafruit_Sensor.

#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>

Создайте объект Adafruit_MPU6050 с именем mpu для работы с датчиком.

Adafruit_MPU6050 mpu;
setup()

В функции setup() инициализируйте последовательный монитор на скорости 115200 бод.

Serial.begin(115200);

Инициализируйте датчик MPU-6050.

if (!mpu.begin()) {
  Serial.println("Sensor init failed");
  while (1)
    yield();
}

Установите диапазон измерения акселерометра:

mpu.setAccelerometerRange(MPU6050_RANGE_8_G);

Установите диапазон измерения гироскопа:

mpu.setGyroRange(MPU6050_RANGE_500_DEG);

Установите полосу пропускания фильтра:

mpu.setFilterBandwidth(MPU6050_BAND_5_HZ);
loop()

В функции loop() мы получаем показания датчика и отображаем их в Serial Monitor.

Сначала вам нужно получить новые события датчика с текущими показаниями.

sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);

Наконец, выведите показания. Для ускорения:

  • a.acceleration.x: получает ускорение по оси x;

  • a.acceleration.y: получает ускорение по оси y;

  • a.acceleration.z: получает ускорение по оси z.

Ускорение измеряется в метрах в секунду в квадрате (м/с2).

Serial.print("Acceleration X: ");
Serial.print(a.acceleration.x);
Serial.print(", Y: ");
Serial.print(a.acceleration.y);
Serial.print(", Z: ");
Serial.print(a.acceleration.z);
Serial.println(" m/s^2");

Для получения показаний гироскопа:

  • g.gyro.x: получает угловую скорость по оси x;

  • g.gyro.y: получает угловую скорость по оси y;

  • g.gyro.z: получает угловую скорость по оси z.

Угловая скорость измеряется в радианах в секунду (рад/с).

Serial.print("Rotation X: ");
Serial.print(g.gyro.x);
Serial.print(", Y: ");
Serial.print(g.gyro.y);
Serial.print(", Z: ");
Serial.print(g.gyro.z);
Serial.println(" rad/s");

Наконец, выведите температуру – она измеряется в градусах Цельсия. Для доступа к показаниям температуры используйте temp.temperature.

Serial.print("Temperature: ");
Serial.print(temp.temperature);
Serial.println(" degC");

Новые показания датчика отображаются каждые 500 миллисекунд.

delay(500);

Демонстрация

Загрузите код на плату Arduino.

Затем откройте Serial Monitor на скорости 115200 бод, нажмите кнопку RST на плате. Показания датчика будут отображены.

Перемещайте датчик в разных направлениях и наблюдайте, как изменяются значения.

Показания датчика MPU-6050 в Serial Monitor Arduino IDE
Калибровка датчика

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

  • x: 0,06 рад/с

  • y: -0,02 рад/с

  • z: 0,00 рад/с

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

То же самое происходит с значениями ускорения. Ускорение по оси Z должно быть ближе к силе тяжести (9,8 м/с2), а по осям X и Y оно должно быть ближе к нулю. В нашем случае приблизительные значения, которые мы получаем при неподвижном датчике:

  • x: 0,71 м/с2

  • y: 0,28 м/с2

  • z: 9,43 м/с2


Отображение показаний MPU-6050 на Serial Plotter

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

Загрузите следующий код на вашу плату:

// Basic demo for accelerometer readings from Adafruit MPU6050

// Arduino Guide: https://RandomNerdTutorials.com/arduino-mpu-6050-accelerometer-gyroscope/

#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>

Adafruit_MPU6050 mpu;

void setup(void) {
  Serial.begin(115200);
  while (!Serial) {
    delay(10); // will pause Zero, Leonardo, etc until serial console opens
  }

  // Try to initialize!
  if (!mpu.begin()) {
    Serial.println("Failed to find MPU6050 chip");
    while (1) {
      delay(10);
    }
  }

  mpu.setAccelerometerRange(MPU6050_RANGE_16_G);
  mpu.setGyroRange(MPU6050_RANGE_250_DEG);
  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
  Serial.println("");
  delay(100);
}

void loop() {

  /* Get new sensor events with the readings */
  sensors_event_t a, g, temp;
  mpu.getEvent(&a, &g, &temp);

  /* Print out the values */
  Serial.print(a.acceleration.x);
  Serial.print(",");
  Serial.print(a.acceleration.y);
  Serial.print(",");
  Serial.print(a.acceleration.z);
  Serial.print(", ");
  Serial.print(g.gyro.x);
  Serial.print(",");
  Serial.print(g.gyro.y);
  Serial.print(",");
  Serial.print(g.gyro.z);
  Serial.println("");

  delay(10);
}

Просмотреть исходный код

После загрузки кода в Arduino IDE перейдите в Tools > Serial Plotter.

Serial Plotter отображает показания акселерометра и гироскопа по осям X, Y и Z во времени. Перемещайте датчик различными способами и наблюдайте, как изменяются значения.

Пример Serial Plotter с данными акселерометра и гироскопа Arduino MPU-6050

Отображение показаний MPU-6050 на OLED-дисплее

Плата Arduino с модулем MPU6050 и OLED-дисплеем - необходимые компоненты

Библиотека Adafruit MPU6050 предоставляет пример, который отображает показания гироскопа и акселерометра MPU-6050 на OLED-дисплее.

Необходимые компоненты

Вот компоненты, необходимые для выполнения этого примера:

Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Схема подключения – Arduino с MPU-6050 и OLED-дисплеем

Подключите все компоненты, как показано на следующей схеме. Поскольку OLED-дисплей и датчик MPU-6050 используют разные I2C-адреса, мы можем подключить их к одной шине I2C (к одним и тем же выводам на плате Arduino).

Схема подключения Arduino с гироскопом-акселерометром MPU-6050 и OLED-дисплеем Fritzing

Подробнее об использовании OLED-дисплея с Arduino: Руководство по I2C OLED-дисплею с Arduino

Код – Отображение показаний датчика MPU-6050 на OLED-дисплее

Для использования этого примера убедитесь, что у вас установлена библиотека Adafruit SSD1306. Эту библиотеку можно установить через Менеджер библиотек Arduino.

Перейдите в Sketch > Library > Manage Libraries и найдите «SSD1306», затем установите библиотеку SSD1306 от Adafruit.

Установка библиотеки I2C OLED-дисплея SSD1306 в Arduino IDE

Для этого примера скопируйте следующий код или перейдите в File > Examples > Adafruit MPU6050 > MPU6050_oled.

// Basic OLED demo for accelerometer readings from Adafruit MPU6050

// ESP32 Guide: https://RandomNerdTutorials.com/esp32-mpu-6050-accelerometer-gyroscope-arduino/
// ESP8266 Guide: https://RandomNerdTutorials.com/esp8266-nodemcu-mpu-6050-accelerometer-gyroscope-arduino/
// Arduino Guide: https://RandomNerdTutorials.com/arduino-mpu-6050-accelerometer-gyroscope/

#include <Adafruit_MPU6050.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>

Adafruit_MPU6050 mpu;
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);

void setup() {
  Serial.begin(115200);
  // while (!Serial);
  Serial.println("MPU6050 OLED demo");

  if (!mpu.begin()) {
    Serial.println("Sensor init failed");
    while (1)
      yield();
  }
  Serial.println("Found a MPU-6050 sensor");

  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for (;;)
      ; // Don't proceed, loop forever
  }
  display.display();
  delay(500); // Pause for 2 seconds
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setRotation(0);
}

void loop() {
  sensors_event_t a, g, temp;
  mpu.getEvent(&a, &g, &temp);

  display.clearDisplay();
  display.setCursor(0, 0);

  Serial.print("Accelerometer ");
  Serial.print("X: ");
  Serial.print(a.acceleration.x, 1);
  Serial.print(" m/s^2, ");
  Serial.print("Y: ");
  Serial.print(a.acceleration.y, 1);
  Serial.print(" m/s^2, ");
  Serial.print("Z: ");
  Serial.print(a.acceleration.z, 1);
  Serial.println(" m/s^2");

  display.println("Accelerometer - m/s^2");
  display.print(a.acceleration.x, 1);
  display.print(", ");
  display.print(a.acceleration.y, 1);
  display.print(", ");
  display.print(a.acceleration.z, 1);
  display.println("");

  Serial.print("Gyroscope ");
  Serial.print("X: ");
  Serial.print(g.gyro.x, 1);
  Serial.print(" rps, ");
  Serial.print("Y: ");
  Serial.print(g.gyro.y, 1);
  Serial.print(" rps, ");
  Serial.print("Z: ");
  Serial.print(g.gyro.z, 1);
  Serial.println(" rps");

  display.println("Gyroscope - rps");
  display.print(g.gyro.x, 1);
  display.print(", ");
  display.print(g.gyro.y, 1);
  display.print(", ");
  display.print(g.gyro.z, 1);
  display.println("");

  display.display();
  delay(100);
}

Просмотреть исходный код

Как работает код

Начните с подключения необходимых библиотек для датчика MPU-6050 и OLED-дисплея.

#include <Adafruit_MPU6050.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>

Создайте объект Adafruit_MPU6050 с именем mpu для работы с датчиком.

Adafruit_MPU6050 mpu;

Создайте объект Adafruit_SSD1306 с именем display для работы с OLED-дисплеем. Это для дисплея с разрешением 128x64 пикселя.

Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
setup()

В функции setup() инициализируйте последовательный монитор на скорости 115200 бод.

Serial.begin(115200);

Инициализируйте датчик MPU-6050.

if (!mpu.begin()) {
  Serial.println("Sensor init failed");
  while (1)
    yield();
}

Инициализируйте OLED-дисплей.

// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x64
  Serial.println(F("SSD1306 allocation failed"));
  for (;;)
    ; // Don't proceed, loop forever
}
display.display();

Установите размер шрифта и цвет для дисплея.

display.setTextSize(1);
display.setTextColor(WHITE);
display.setRotation(0);
loop()

В функции loop() мы получаем показания датчика и отображаем их на OLED-дисплее.

Начните с создания событий для каждого измерения: акселерометра, гироскопа и температуры.

sensors_event_t a, g, temp;

Получите новые показания датчика.

mpu.getEvent(&a, &g, &temp);

Очистите дисплей в каждом цикле loop() для записи новых показаний.

display.clearDisplay();

Установите курсор дисплея в позицию (0,0) – верхний левый угол. Текст будет выводиться начиная с этой позиции.

display.setCursor(0, 0);

Следующие строки выводят показания акселерометра в Serial Monitor.

Serial.print("Accelerometer ");
Serial.print("X: ");
Serial.print(a.acceleration.x, 1);
Serial.print(" m/s^2, ");
Serial.print("Y: ");
Serial.print(a.acceleration.y, 1);
Serial.print(" m/s^2, ");
Serial.print("Z: ");
Serial.print(a.acceleration.z, 1);
Serial.println(" m/s^2");

Следующие строки отображают значения ускорения x, y и z на OLED-дисплее.

display.println("Accelerometer - m/s^2");
display.print(a.acceleration.x, 1);
display.print(", ");
display.print(a.acceleration.y, 1);
display.print(", ");
display.print(a.acceleration.z, 1);
display.println("");

Отображение показаний гироскопа в Serial Monitor.

Serial.print("Gyroscope ");
Serial.print("X: ");
Serial.print(g.gyro.x, 1);
Serial.print(" rps, ");
Serial.print("Y: ");
Serial.print(g.gyro.y, 1);
Serial.print(" rps, ");
Serial.print("Z: ");
Serial.print(g.gyro.z, 1);
Serial.println(" rps");

Наконец, выведите показания гироскопа на дисплей.

display.println("Gyroscope - rps");
display.print(g.gyro.x, 1);
display.print(", ");
display.print(g.gyro.y, 1);
display.print(", ");
display.print(g.gyro.z, 1);
display.println("");

В завершение вызовите display.display(), чтобы фактически отобразить показания на OLED.

display.display();

Новые показания отображаются каждые 100 миллисекунд.

delay(100);

Демонстрация

Загрузите код на плату Arduino.

Откройте Serial Monitor на скорости 115200 бод, нажмите кнопку RST на плате. Показания датчика будут отображены как в Serial Monitor, так и на OLED-дисплее.

Плата Arduino с модулем MPU6050 - демонстрация акселерометра, гироскопа и датчика температуры

Перемещайте датчик и наблюдайте за изменением значений.

Показания датчика MPU-6050 в Serial Monitor - пример с OLED

Заключение

MPU-6050 – это акселерометр и гироскоп. Он измеряет ускорение по осям X, Y и Z, а также угловую скорость. Этот модуль также измеряет температуру.

Этот модуль датчика взаимодействует через протокол I2C. Поэтому подключение очень простое. Просто подключите датчик к выводам I2C на Arduino.

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