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