IMU сенсор GY-86

Сенсор GY-86 представляет собой многофункциональный модуль, включающий в себя трехосевой акселерометр, трехосевой гироскоп, трехосевой магнитометр и барометр. Этот сенсор часто используется в проектах, связанных с авиационными и робототехническими решениями, например, для стабилизации дронов и других летательных аппаратов.

Ключевые характеристики и возможности сенсора GY-86:

  • Трехосевой акселерометр: обеспечивает данные о линейном ускорении в трёх измерениях, что помогает в определении ориентации и движения объекта.

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

  • Трехосевой магнитометр: функционирует как компас, предоставляя информацию о магнитной ориентации устройства относительно земного магнитного поля.

  • Барометр: измеряет атмосферное давление, что позволяет оценивать высоту над уровнем моря, что особенно полезно в авиационных приложениях.

GY-86 имеет компактные размеры и предоставляет высокую точность измерений, что делает его идеальным для интеграции в различные мобильные устройства и системы. Также модуль часто используется в образовательных и хоббийных проектах, где требуется слежение за положением и движением объектов. Это устройство совместимо с большинством микроконтроллеров, включая Orange pi, что делает его доступным и простым в использовании для широкого круга разработчиков и энтузиастов.

Пример кода

import smbus2
import time

# Адрес MPU6050
MPU6050_ADDRESS = 0x68

# Регистры MPU6050
PWR_MGMT_1 = 0x6B
ACCEL_XOUT_H = 0x3B

# Инициализация I2C
bus = smbus2.SMBus(1)

def init_mpu6050():
    # Пробуждение MPU6050
    bus.write_byte_data(MPU6050_ADDRESS, PWR_MGMT_1, 0)

def read_raw_data(addr):
    # Чтение двух байт данных из регистра
    high = bus.read_byte_data(MPU6050_ADDRESS, addr)
    low = bus.read_byte_data(MPU6050_ADDRESS, addr+1)
    # Комбинирование в одно значение
    value = (high << 8) | low
    # Преобразование в signed 16-bit
    if value > 32768:
        value = value - 65536
    return value

def read_accelerometer():
    # Чтение данных акселерометра
    acc_x = read_raw_data(ACCEL_XOUT_H)
    acc_y = read_raw_data(ACCEL_XOUT_H + 2)
    acc_z = read_raw_data(ACCEL_XOUT_H + 4)
    return acc_x, acc_y, acc_z

init_mpu6050()

try:
    while True:
        acc_x, acc_y, acc_z = read_accelerometer()
        print(f"Accelerometer: X={acc_x}, Y={acc_y}, Z={acc_z}")
        time.sleep(1)
except KeyboardInterrupt:
    pass
finally:
    bus.close()

Описание кода

Импорт библиотек

import smbus2
import time
  • smbus2: Библиотека для работы с I2C на Python.

  • time: Библиотека для работы с временем, используется для задержек.

Константы

MPU6050_ADDRESS = 0x68
PWR_MGMT_1 = 0x6B
ACCEL_XOUT_H = 0x3B
  • MPU6050_ADDRESS: I2C адрес сенсора MPU6050.

  • PWR_MGMT_1: Регистр управления питанием. Используется для пробуждения сенсора.

  • ACCEL_XOUT_H: Начальный регистр для чтения данных акселерометра по оси X.

Инициализация I2C

bus = smbus2.SMBus(1)
  • Создаем объект bus для взаимодействия с I2C. Номер 1 указывает на первый I2C интерфейс.

Функция инициализации MPU6050

def init_mpu6050():
    bus.write_byte_data(MPU6050_ADDRESS, PWR_MGMT_1, 0)
  • Пробуждает MPU6050, записывая 0 в регистр PWR_MGMT_1.

Функция чтения сырых данных

def read_raw_data(addr):
    high = bus.read_byte_data(MPU6050_ADDRESS, addr)
    low = bus.read_byte_data(MPU6050_ADDRESS, addr+1)
    value = (high << 8) | low
    if value > 32768:
        value = value - 65536
    return value
  • Читает два байта данных из заданного регистра.

  • Объединяет их в одно 16-битное число.

  • Преобразует в signed 16-битное число, если необходимо.

Функция чтения акселерометра

def read_accelerometer():
    acc_x = read_raw_data(ACCEL_XOUT_H)
    acc_y = read_raw_data(ACCEL_XOUT_H + 2)
    acc_z = read_raw_data(ACCEL_XOUT_H + 4)
    return acc_x, acc_y, acc_z
  • Читает данные по осям X, Y и Z из регистров акселерометра.

Основной цикл

init_mpu6050()

try:
    while True:
        acc_x, acc_y, acc_z = read_accelerometer()
        print(f"Accelerometer: X={acc_x}, Y={acc_y}, Z={acc_z}")
        time.sleep(1)
except KeyboardInterrupt:
    pass
finally:
    bus.close()
  • Инициализирует сенсор.

  • В бесконечном цикле читает и выводит данные акселерометра каждую секунду.

  • Обработка KeyboardInterrupt для выхода из цикла.

  • Закрывает I2C соединение в блоке finally.

Last updated