> For the complete documentation index, see [llms.txt](https://dh-organization.gitbook.io/droneshub-rover-kontakt/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://dh-organization.gitbook.io/droneshub-rover-kontakt/opisanie-elektronnykh-komponentov/sensory/imu-sensor-gy-86.md).

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