# IMU сенсор GY-86

<figure><img src="/files/GMOaWnEueUcbp53jav4Z" alt=""><figcaption></figcaption></figure>

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

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

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

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

## Пример кода

```python
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()

```

## Описание кода&#x20;

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

```python
import smbus2
import time
```

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

#### Константы

```python
MPU6050_ADDRESS = 0x68
PWR_MGMT_1 = 0x6B
ACCEL_XOUT_H = 0x3B
```

* `MPU6050_ADDRESS`: I2C адрес сенсора MPU6050.
* `PWR_MGMT_1`: Регистр управления питанием. Используется для пробуждения сенсора.
* `ACCEL_XOUT_H`: Начальный регистр для чтения данных акселерометра по оси X.

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

```python
bus = smbus2.SMBus(1)
```

* Создаем объект `bus` для взаимодействия с I2C. Номер `1` указывает на первый I2C интерфейс.

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

```python
def init_mpu6050():
    bus.write_byte_data(MPU6050_ADDRESS, PWR_MGMT_1, 0)
```

* Пробуждает MPU6050, записывая `0` в регистр `PWR_MGMT_1`.

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

```python
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-битное число, если необходимо.

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

```python
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 из регистров акселерометра.

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

```python
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`.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://dh-organization.gitbook.io/droneshub-rover-kontakt/opisanie-elektronnykh-komponentov/sensory/imu-sensor-gy-86.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
