Введение
IMU (Inertial Measurement Unit) на базе MPU6050 — один из самых популярных датчиков в робототехнике, дронах и носимой электронике. Он даёт 6 степеней свободы: акселерометр (ускорение по X, Y, Z) и гироскоп (угловую скорость). Обычно разработчик пишет код фильтрации (комплементарный фильтр, Mahony/Madgwick) и логику распознавания жестов вручную. Что, если эту рутину возьмёт на себя AI-агент?
ASI Biont — это промышленный AI-агент, который подключается к любому устройству через диалог в чате. Пользователь просто описывает задачу: «Подключись к ESP32 с MPU6050 по MQTT, распознавай наклон, поворот и встряхивание, при горизонтальном положении включай сервопривод». AI сам генерирует код, настраивает протоколы и начинает управление. Никаких панелей, кнопок «добавить устройство» — только чат.
В этой статье — два реальных способа интеграции MPU6050 с ASI Biont: через MQTT (ESP32) и через COM-порт (Arduino + Hardware Bridge). Разберём схемы, код, калибровку и правила для жестового управления.
Почему MPU6050 и AI — это синергия
MPU6050 «сырые» данные (raw accel/gyro) малоинформативны без обработки. Чтобы получить угол наклона, нужно:
- удалить смещение (bias) гироскопа;
- скомпенсировать дрейф;
- применить фильтр.
ASI Biont автоматизирует этот пайплайн. AI-агент:
- запрашивает у пользователя калибровочные данные (датчик неподвижен) и вычисляет смещения;
- пишет Python-скрипт для real-time фильтрации (например, комплементарный фильтр);
- определяет пороговые значения для жестов (встряхивание — резкое изменение акселерометра);
- связывает распознанный жест с командой (поворот сервопривода, движение робота, отправка уведомления).
Всё это — без написания кода разработчиком. Пользователь только описывает логику на естественном языке.
Способ 1: ESP32 + MPU6050 + MQTT (рекомендуемый для real-time)
Этот сценарий идеален, если нужно управлять роботом или сервоприводами дистанционно. ESP32 подключается к Wi-Fi, публикует данные MPU6050 в MQTT-брокер (например, Mosquitto или HiveMQ Cloud). ASI Biont подписывается на топик через execute_python (sandbox) и анализирует данные.
Прошивка ESP32
Скетч на MicroPython (можно и Arduino C++):
import network
import time
import json
from machine import Pin, I2C
import ustruct
import umqtt.simple as mqtt
# I2C настройки для MPU6050
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000)
MPU6050_ADDR = 0x68
# Инициализация MPU6050
def init_mpu():
i2c.writeto_mem(MPU6050_ADDR, 0x6B, b'\x00') # вывести из sleep
i2c.writeto_mem(MPU6050_ADDR, 0x1B, b'\x00') # гироскоп ±250°/s
i2c.writeto_mem(MPU6050_ADDR, 0x1C, b'\x00') # акселерометр ±2g
def read_raw():
data = i2c.readfrom_mem(MPU6050_ADDR, 0x3B, 14)
ax = ustruct.unpack('>h', data[0:2])[0]
ay = ustruct.unpack('>h', data[2:4])[0]
az = ustruct.unpack('>h', data[4:6])[0]
gx = ustruct.unpack('>h', data[8:10])[0]
gy = ustruct.unpack('>h', data[10:12])[0]
gz = ustruct.unpack('>h', data[12:14])[0]
return ax, ay, az, gx, gy, gz
# Wi-Fi
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('SSID', 'PASSWORD')
while not wlan.isconnected():
time.sleep(0.5)
# MQTT
client = mqtt.MQTTClient('esp32_mpu', 'broker.hivemq.com')
client.connect()
init_mpu()
while True:
raw = read_raw()
payload = {
'ax': raw[0], 'ay': raw[1], 'az': raw[2],
'gx': raw[3], 'gy': raw[4], 'gz': raw[5]
}
client.publish('sensors/mpu6050', json.dumps(payload))
time.sleep(0.05) # 20 Гц
Подключение ASI Biont
Пользователь пишет в чат ASI Biont:
«Подпишись на топик sensors/mpu6050 брокера broker.hivemq.com, получай данные MPU6050 от ESP32. Откалибруй гироскоп: если датчик неподвижен, запиши средние gx,gy,gz как bias. Реализуй комплементарный фильтр с alpha=0.96 для вычисления угла наклона по оси X. При наклоне >30° отправляй команду servo/setpoint = 90, при наклоне <-30° — 0. При резком всплеске энергии акселерометра (сумма квадратов >3000) распознай встряхивание и опубликуй shake/trigger = 1.»
AI-агент анализирует запрос, пишет Python-скрипт с paho-mqtt, numpy и запускает его в execute_python:
import paho.mqtt.client as mqtt
import numpy as np
import json
import time
# Калибровка (в реальности AI получит данные от пользователя или запустит калибровочный период)
bias_gx, bias_gy, bias_gz = 0.0, 0.0, 0.0 # будут вычислены на старте
alpha = 0.96
angle_x = 0.0
broker = 'broker.hivemq.com'
def on_message(client, userdata, msg):
global angle_x
data = json.loads(msg.payload)
ax, ay, az = data['ax'], data['ay'], data['az']
gx, gy, gz = data['gx'] - bias_gx, data['gy'] - bias_gy, data['gz'] - bias_gz
# Комплементарный фильтр (упрощённо, только угол X)
dt = 0.05
acc_angle_x = np.arctan2(ay, az) * 180 / np.pi
angle_x = alpha * (angle_x + gx * dt) + (1 - alpha) * acc_angle_x
# Наклон
if angle_x > 30:
client.publish('servo/setpoint', '90')
elif angle_x < -30:
client.publish('servo/setpoint', '0')
# Встряхивание
energy = ax**2 + ay**2 + az**2
if energy > 3000:
client.publish('shake/trigger', '1')
client = mqtt.Client()
client.on_message = on_message
client.connect(broker)
client.subscribe('sensors/mpu6050')
client.loop_forever()
AI тут же запускает этот код в sandbox. Теперь каждые 50 мс он получает данные, фильтрует, распознаёт жесты и публикует команды. ESP32 (или отдельный контроллер сервоприводов) подписан на топики servo/setpoint и shake/trigger — и управляет роботом.
Метрики
| Параметр | Значение |
|---|---|
| Задержка от жеста до команды | ~150 мс (MQTT + обработка) |
| Точность распознавания наклона | ±2° (после калибровки) |
| Частота обновления | 20 Гц |
Способ 2: Arduino + MPU6050 + Hardware Bridge (прямое подключение по COM-порту)
Если нет Wi-Fi или нужна работа в изолированной сети — используем Hardware Bridge. bridge.py — приложение, которое пользователь запускает на своём ПК. Оно соединяется с ASI Biont через WebSocket и обеспечивает доступ к локальным COM-портам.
Скетч Arduino
Arduino Uno (или Nano) подключает MPU6050 по I2C и отправляет данные через Serial в формате HEX-строки:
#include <Wire.h>
#include <MPU6050.h>
MPU6050 mpu;
void setup() {
Serial.begin(115200);
Wire.begin();
mpu.initialize();
}
void loop() {
int16_t ax, ay, az, gx, gy, gz;
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
// Формат: ACCELX ACCELY ACCELZ GYROX GYROY GYROZ\n
char buf[64];
sprintf(buf, "%d %d %d %d %d %d\n", ax, ay, az, gx, gy, gz);
Serial.print(buf);
delay(50);
}
Запуск bridge.py
Пользователь скачивает bridge.py из дашборда ASI Biont (Devices → Create API Key → скачать bridge). Запускает:
pip install pyserial requests websockets
python bridge.py --token=ВАШ_ТОКЕН --ports=COM3 --baud=115200 --rate=20
Теперь bridge подключён к облаку, и AI может отправлять команды на COM-порт.
Команда от AI
Пользователь в чате: «Прочитай с Arduino по COM3 данные MPU6050, откалибруй и определяй наклон влево/вправо.»
AI вызывает industrial_command с протоколом serial:
industrial_command(protocol='serial', command='serial_write_and_read', data='4745540a')
(0x4745540a = 'GET\n' — код запроса данных). Arduino на GET отвечает строкой с 6 числами. Bridge возвращает ответ в виде hex-строки, AI парсит его.
AI может настроить циклический опрос (polling) с помощью серии команд или попросить bridge отправлять данные автоматически. Для этого AI пишет Python-скрипт на execute_python, который через WebSocket (websockets) подключается к bridge и организует цикл чтения. Но поскольку bridge не имеет HTTP API, а единственный канал — WebSocket к облаку, прямое подключение из sandbox к bridge невозможно (sandbox изолирован). Поэтому оптимальный путь — использовать MQTT или Modbus, если устройство их поддерживает. Для Arduino без Ethernet — только polling через bridge, что ограничивает частоту.
Тем не менее, для низкочастотных сценариев (управление светом, простые жесты) этого достаточно. AI анализирует каждый ответ и при превышении порога отправляет команду на другой COM-порт (например, на сервопривод через вторую пару bridge).
Настройка правил распознавания через диалог
ASI Biont не требует жёстко заданных правил. Пользователь может в любой момент уточнить:
«Сделай порог наклона не 30°, а 45° и добавь жест «поворот вокруг Z» — если гироскоп >200°/с в течение 0.5 сек, то публикуй rotate_right.»
AI переписывает фильтр и пороги на лету. Более того, AI может сам обучиться на примерах: пользователь показывает несколько движений, AI запоминает паттерны и в дальнейшем классифицирует их с помощью машинного обучения (scikit-learn, доступный в sandbox).
Результаты интеграции
- Скорость разработки: то, что раньше занимало дни (код фильтра, отладка, тестирование), теперь делается за минуты диалога.
- Гибкость: не нужно перепрошивать микроконтроллер — AI меняет логику на лету через перезапуск скрипта.
- Надёжность: AI автоматически проверяет, приходят ли данные, и при пропадании связи уведомляет пользователя.
Заключение
MPU6050 — отличный датчик для экспериментов с жестовым управлением, но его потенциал раскрывается только в связке с умным анализом. ASI Biont берёт на себя всю рутину: от калибровки до распознавания и управления. Подключение возможно двумя способами: через MQTT (для ESP32) и через COM-порт (для Arduino). Вам не нужно писать код — просто опишите задачу в чате, и AI сделает всё сам.
Попробуйте сами: создайте API-ключ на asibiont.com, скачайте bridge.py, подключите Arduino или ESP32 и скажите AI: «Управляй сервоприводом через MPU6050: наклон вперёд — вперёд, назад — назад, встряхивание — стоп». Увидите, как AI за секунды напишет и запустит интеграцию.
Комментарии