2026-04-29 05:31:56 +00:00
|
|
|
import smbus2
|
2026-04-19 10:39:13 +00:00
|
|
|
import time
|
2026-04-29 05:31:56 +00:00
|
|
|
import sqlite3
|
|
|
|
|
import signal
|
|
|
|
|
import sys
|
2026-04-19 10:39:13 +00:00
|
|
|
|
|
|
|
|
# Константы
|
|
|
|
|
MPU_ADDRESS = 0x68
|
2026-04-29 05:31:56 +00:00
|
|
|
I2C_BUS = 2
|
|
|
|
|
DB_PATH = '../inertial_data.db'
|
2026-04-19 10:39:13 +00:00
|
|
|
|
|
|
|
|
# Регистры MPU-9250
|
2026-04-29 05:31:56 +00:00
|
|
|
PWR_MGMT_1 = 0x6B
|
|
|
|
|
ACCEL_XOUT_H = 0x3B
|
|
|
|
|
GYRO_XOUT_H = 0x43
|
2026-04-19 10:39:13 +00:00
|
|
|
|
2026-04-29 05:31:56 +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
|
|
|
|
|
|
2026-04-29 05:31:56 +00:00
|
|
|
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)
|
|
|
|
|
|
2026-04-29 05:31:56 +00:00
|
|
|
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)
|
2026-04-29 05:31:56 +00:00
|
|
|
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)
|
2026-04-29 05:31:56 +00:00
|
|
|
finally:
|
|
|
|
|
bus.close()
|
|
|
|
|
conn.close()
|
|
|
|
|
print("IMU модуль остановлен")
|
2026-04-19 10:39:13 +00:00
|
|
|
|
2026-04-29 05:31:56 +00:00
|
|
|
save_to_db()
|