Чтение, сбор и анализ данных с датчика 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)…