Чтение, сбор и анализ данных с датчика MPU6050.

Датчики MEMS (микроэлектромеханические системы) широко используются в различных приложениях: от игровых контроллеров и смартфонов до беспилотных летательных аппаратов. В этой статье я покажу, как подключить гироскоп и датчик акселерометра, какие данные можно с них получить и как эти данные можно обработать и визуализировать.

Давайте начнем.

Аппаратное обеспечение

MPU-6050 — это 6-осевой датчик, сочетающий в себе 3-осевой гироскоп, 3-осевой акселерометр и интерфейс I2C. Как написано в даташите, он широко используется для планшетов и смартфонов. Когда наш смартфон или умные часы подсчитывают шаги и калории во время тренировки, фактически используются данные датчиков MEMS. Но подобные датчики можно использовать не только для занятий спортом. Я решил разместить датчик у себя в квартире на несколько дней и выяснить, смогу ли я обнаруживать и анализировать различные вибрации в доме, где живу.

Если мы хотим собрать данные в течение нескольких дней, Raspberry Pi — хорошее решение для этого. Raspberry Pi — дешевый (30–50 долларов) одноплатный компьютер; он имеет низкое энергопотребление и множество контактов для подключения различных типов оборудования. Макетную плату MPU-6050 можно заказать на Amazon за 3–5$. Сам датчик для передачи данных использует шину I2C, а к Rasberry Pi его можно подключить всего с помощью 4 проводов:

Перед использованием датчика необходимо включить шину I2C в ОС Raspbian (инструкций по подключению MPU6050 к Raspberry Pi достаточно, поэтому подробности «аппаратного обеспечения» здесь я пропущу). После подключения датчика я создал простое приложение Python, которое считывает данные датчика и записывает их «как есть» в файлы журналов:

from datetime import datetime
import smbus
import math
import time


# MPU6050 Registers
PWR_MGMT_1   = 0x6B
SMPLRT_DIV   = 0x19
CONFIG       = 0x1A
GYRO_CONFIG  = 0x1B
INT_ENABLE   = 0x38
ACCEL_XOUT_H = 0x3B
ACCEL_YOUT_H = 0x3D
ACCEL_ZOUT_H = 0x3F
GYRO_XOUT_H  = 0x43
GYRO_YOUT_H  = 0x45
GYRO_ZOUT_H  = 0x47

bus = smbus.SMBus(1)
address = 0x68

def device_init():
    """ Init the MPU-6050 """
    bus.write_byte_data(address, SMPLRT_DIV, 0x4)…