project_inertial-control/imu_module/imu_reader.py

92 lines
2.4 KiB
Python
Raw Normal View History

import smbus2
2026-04-19 10:39:13 +00:00
import time
import sqlite3
import signal
import sys
2026-04-19 10:39:13 +00:00
# Константы
MPU_ADDRESS = 0x68
I2C_BUS = 2
DB_PATH = '../inertial_data.db'
2026-04-19 10:39:13 +00:00
# Регистры MPU-9250
PWR_MGMT_1 = 0x6B
ACCEL_XOUT_H = 0x3B
GYRO_XOUT_H = 0x43
2026-04-19 10:39:13 +00:00
# Масштабные коэффициенты
ACCEL_SCALE = 16384.0
GYRO_SCALE = 131.0
# Глобальные переменные для завершения
running = True
conn = None
bus = None
def shutdown(signum, frame):
"""Обработчик сигнала завершения"""
global running
print("Завершение IMU модуля...")
running = False
# Перехватываем сигналы завершения
signal.signal(signal.SIGTERM, shutdown)
signal.signal(signal.SIGINT, shutdown)
def init_db():
conn = sqlite3.connect(DB_PATH)
conn.execute('''CREATE TABLE IF NOT EXISTS imu_data (
timestamp REAL,
ax REAL, ay REAL, az REAL,
gx REAL, gy REAL, gz REAL
)''')
conn.execute('DELETE FROM imu_data')
conn.commit()
return conn
2026-04-19 10:39:13 +00:00
def init_mpu(bus):
bus.write_byte_data(MPU_ADDRESS, PWR_MGMT_1, 0x00)
time.sleep(0.1)
def read_raw(bus, reg):
high = bus.read_byte_data(MPU_ADDRESS, reg)
low = bus.read_byte_data(MPU_ADDRESS, reg + 1)
value = (high << 8) | low
if value > 32767:
value -= 65536
return value
def read_imu(bus):
ax = read_raw(bus, ACCEL_XOUT_H) / ACCEL_SCALE
ay = read_raw(bus, ACCEL_XOUT_H + 2) / ACCEL_SCALE
az = read_raw(bus, ACCEL_XOUT_H + 4) / ACCEL_SCALE
gx = read_raw(bus, GYRO_XOUT_H) / GYRO_SCALE
gy = read_raw(bus, GYRO_XOUT_H + 2) / GYRO_SCALE
gz = read_raw(bus, GYRO_XOUT_H + 4) / GYRO_SCALE
return ax, ay, az, gx, gy, gz
def save_to_db():
global conn, bus, running
conn = init_db()
2026-04-19 10:39:13 +00:00
bus = smbus2.SMBus(I2C_BUS)
init_mpu(bus)
print("Запись данных IMU...")
t = 0.0
try:
while running:
2026-04-19 10:39:13 +00:00
ax, ay, az, gx, gy, gz = read_imu(bus)
conn.execute(
'INSERT INTO imu_data VALUES (?, ?, ?, ?, ?, ?, ?)',
(round(t, 3), round(ax, 4), round(ay, 4), round(az, 4),
round(gx, 4), round(gy, 4), round(gz, 4))
)
conn.commit()
2026-04-19 10:39:13 +00:00
t += 0.01
time.sleep(0.01)
finally:
bus.close()
conn.close()
print("IMU модуль остановлен")
2026-04-19 10:39:13 +00:00
save_to_db()