ESP8266 NodeMCU с MPU-6050: акселерометр, гироскоп и датчик температуры (Arduino)

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

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

У нас есть аналогичное руководство для ESP32: ESP32 с MPU-6050: акселерометр, гироскоп и датчик температуры (Arduino).

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

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

  2. Отображение показаний гироскопа и акселерометра на OLED-дисплее

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

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

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

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

Углы крена, тангажа и рыскания (Roll, Pitch, Yaw)

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

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

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

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

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

Вывод

Описание

VCC

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

GND

Общий GND

SCL

Вывод SCL для связи по I2C (GPIO 5)

SDA

Вывод SDA для связи по I2C (GPIO 4)

XDA

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

XCL

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

AD0

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

INT

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

Подготовка Arduino IDE

Мы будем программировать плату ESP8266 NodeMCU с помощью Arduino IDE. Поэтому убедитесь, что у вас установлено дополнение ESP8266. Следуйте следующему руководству:

Если вы предпочитаете использовать VS Code + PlatformIO IDE, следуйте следующему руководству:

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

Существуют различные способы получения показаний датчика. В этом руководстве мы будем использовать библиотеку 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.

Если вы используете VS Code с PlatformIO, скопируйте следующие строки в файл platformio.ini.

lib_deps = adafruit/Adafruit MPU6050 @ ^2.0.3
    adafruit/Adafruit Unified Sensor @ ^1.1.4

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

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

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

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

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

Схема подключения — ESP8266 NodeMCU с MPU-6050

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

Схема подключения акселерометра-гироскопа MPU6050 к ESP8266 NodeMCU

Код — получение показаний датчика 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() инициализируйте Serial Monitor на скорости 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.

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

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);

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

Загрузите код на вашу плату ESP8266. Перейдите в Tools > Board и выберите используемую плату ESP8266. Перейдите в Tools > Port и выберите порт, к которому подключена ваша плата. Затем нажмите кнопку «Загрузить» (Upload).

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

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

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

Калибровка датчика

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

  • x: 0,06 рад/с

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

  • z: 0,00 рад/с

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

То же самое происходит и со значениями ускорения. Ускорение по оси z должно быть ближе к гравитационному ускорению (9,8 м/с²), а по осям x и y оно должно быть ближе к нулю. В нашем случае приблизительные значения, которые мы получаем, когда датчик неподвижен, следующие:

  • x: 0,71 м/с²

  • y: 0,28 м/с²

  • z: 9,43 м/с²


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

Демонстрация модуля ESP8266 NodeMCU MPU6050 — акселерометр, гироскоп, датчик температуры, Arduino

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

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

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

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

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

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

Схема подключения ESP8266 NodeMCU с MPU6050 и OLED-дисплеем

Подробнее об использовании OLED-дисплея с ESP8266: ESP8266 NodeMCU OLED-дисплей с Arduino IDE.

Код — отображение показаний датчика 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() инициализируйте Serial Monitor на скорости 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);

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

Загрузите код на вашу плату ESP8266. Перейдите в Tools > Board и выберите используемую плату ESP8266. Перейдите в Tools > Port и выберите порт, к которому подключена ваша плата. Затем нажмите кнопку «Загрузить» (Upload).

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

Демонстрация модуля MPU-6050 — акселерометр, гироскоп, датчик температуры, OLED, ESP8266 NodeMCU

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

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

Вы можете посмотреть видеодемонстрацию:

Заключение

MPU-6050 — это акселерометр и гироскоп. Он измеряет ускорение по осям x, y и z, а также угловую скорость. Этот модуль также измеряет температуру.

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

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

Узнайте больше о ESP8266 из наших ресурсов: