Модуль GY-9250 на базе одноименной микросхемы MPU9250 включает в себя трёхосевой гироскоп, трёхосевой акселерометр и трёхосевой магнитометр (магниторезистивный компас). Такая связка позволяет отслеживать положение в пространстве.
Модуль GY-9250 может, к примеру, применяться в системах управления различных мобильных роботов и БПЛА.
Характеристики:
- Питание: 3,3 … 5 В постоянного тока
- Интерфейсы подключения: I2C, SPI
- Диапазон измерений акселерометра: +/- 2G, +/- 4G, +/- 8G, +/- 16G
- Диапазон измерений гироскопа: +/- 250, +/- 500, +/- 1000, +/- 2000°/с
- Чувствительность гироскопа: 131, 65,5, 32,8, 16,4 LSB/°/c
- Диапазон измерений компаса магнитометра: +/- 4800 мкТл
- Рабочий ток: гироскоп – 3,2 мА, акселерометр – 450 мкА, магнитометр – 280 мкА
Модуль имеет 10 выводов, но для подключения по интерфейсу I2C нам необходимо использовать лишь 4 из них:
VCC – Питание
GND – ”Земля”
SCL – Шина данных I2C
SDA – Шина данных I2C
Подключение к Arduino:
Для подключения и работы с модулем нам необходимы:
- Любая Arduino-совместимая плата
- Компьютер с установленной средой Arduino IDE.
- USB кабель для подключения Arduino к персональному компьютеру
Для демонстрации работы модуля соберем на макетной плате схему с использованием графического модуля LCD1602 для наглядного представления показаний.
Подробнее узнать о модуле LCD1602 и его подключении можно здесь.
Принципиальная схема подключения компонентов:
Скетч для Arduino:
Для считывания показаний с датчиков и подключения дисплея необходимо использовать библиотеки*:
LiquidCrystal_I2C.h
Wire.h
Если их нет в вашей среде ArduinoIDE, загрузить их можно в разделе “Менеджер библиотек”.
*Библиотека Arduino – программный код, хранящийся не в скетче, а во внешних файлах, которые можно подключить к вашему проекту. Библиотека содержит в себе различные методы и структуры данных, которые нужны для упрощения работы с датчиками, индикаторами, модулями и другими электронными компонентами.
Код:
#include <LiquidCrystal_I2C.h> // Подключение необходимых библиотек #include <MPU9250.h> // #include <Wire.h> // LiquidCrystal_I2C lcd(0x27, 16, 2); // задание параметров дисплея,
//адрес I2C-конвертера 0х27 или 0х3f MPU9250 mpu; // Объявляем переменную для датчика void setup() { Serial.begin(115200); //Запускаем монитор порта Wire.begin(); //Запускаем работу с шиной I2C delay(2000); mpu.setup(0x68); //Адрес датчика на шине I2C mpu.setMagneticDeclination(11.2); //в скобках необходимо указать магнинтное отклонение //местности, в которой вы находитесь http://www.magnetic-declination.com/ delay(5000);
//Калибровка датчика. Запускаем монитор по последовательному соединению
//и следуем инструкции Serial.println("Accel Gyro calibration will start in 5sec."); Serial.println("Please leave the device still on the flat plane."); mpu.verbose(true); delay(5000); mpu.calibrateAccelGyro(); Serial.println("Mag calibration will start in 5sec."); Serial.println("Please Wave device in a figure eight until done."); delay(5000); mpu.calibrateMag(); print_calibration(); mpu.verbose(false); //экран lcd.init(); // запуск дисплея lcd.backlight(); // включение подсветки дисплея lcd.setCursor(0, 0); // установка курсора в ячейку на дисплее lcd.print("x"); // вывод на экран lcd.setCursor(6, 0); lcd.print("y"); lcd.setCursor(11, 0); lcd.print("z"); lcd.setCursor(0, 1); lcd.print("ax:"); lcd.setCursor(8, 1); lcd.print("ay:"); } void loop() { static uint32_t prev_ms = millis(); if ((millis() - prev_ms) > 100) { mpu.update(); prev_ms = millis(); lcd.setCursor(1, 0);
// выводим на экран округленное значение по оси X lcd.print(int(mpu.getRoll())); lcd.print(" "); lcd.setCursor(7, 0);
// выводим на экран округленное значение по оси Y lcd.print(int(mpu.getPitch())); lcd.print(" "); lcd.setCursor(12, 0);
// выводим на экран округленное значение по оси Z lcd.print(int(mpu.getYaw())); lcd.print(" "); lcd.setCursor(3, 1);
// задаем переменную для ускорения по оси X
// выводим на экран округленное значение ускорения в размерности g*1000 float ux = mpu.getAcc(0) * 1000; lcd.print(int(ux)); lcd.print(" ");
// задаем переменную для ускорения по оси Y
// выводим на экран округленное значение ускорение в размерности g*1000 lcd.setCursor(11, 1); float uy = mpu.getAcc(1) * 1000; lcd.print(int(uy)); lcd.print(" "); delay(50); } } void print_calibration() { Serial.println("< calibration parameters >"); Serial.println("accel bias [g]: "); Serial.print(mpu.getAccBiasX() * 1000.f / (float)MPU9250::CALIB_ACCEL_SENSITIVITY); Serial.print(", "); Serial.print(mpu.getAccBiasY() * 1000.f / (float)MPU9250::CALIB_ACCEL_SENSITIVITY); Serial.print(", "); Serial.print(mpu.getAccBiasZ() * 1000.f / (float)MPU9250::CALIB_ACCEL_SENSITIVITY); Serial.println(); Serial.println("gyro bias [deg/s]: "); Serial.print(mpu.getGyroBiasX() / (float)MPU9250::CALIB_GYRO_SENSITIVITY); Serial.print(", "); Serial.print(mpu.getGyroBiasY() / (float)MPU9250::CALIB_GYRO_SENSITIVITY); Serial.print(", "); Serial.print(mpu.getGyroBiasZ() / (float)MPU9250::CALIB_GYRO_SENSITIVITY); Serial.println(); Serial.println("mag bias [mG]: "); Serial.print(mpu.getMagBiasX()); Serial.print(", "); Serial.print(mpu.getMagBiasY()); Serial.print(", "); Serial.print(mpu.getMagBiasZ()); Serial.println(); Serial.println("mag scale []: "); Serial.print(mpu.getMagScaleX()); Serial.print(", "); Serial.print(mpu.getMagScaleY()); Serial.print(", "); Serial.print(mpu.getMagScaleZ()); Serial.println(); }
Комментарии
MPU connection failed. Please check your connection with `connection_check` example.
А пример connection_check - не компилируется, дает ошибку :
connection_check:7: error: variable or field 'scan_mpu' declared void
connection_check:7: error: 'WireType' was not declared in this scope
connection_check:7: error: 'wire' was not declared in this scope