Files

8.0 KiB
Raw Permalink Blame History

README: BLE Mouse/Keyboard on MPU6050 (fire_extinguisher_1)

Описание проекта

Этот скетч превращает ESP32 (или другую плату с BLE) в беспроводную мышь и клавиатуру, управляемую движением головы. Датчик MPU6050 (гироскоп + акселерометр) отслеживает повороты и наклоны, преобразуя их в перемещение курсора. Две кнопки позволяют имитировать клик мыши и ставить движение на паузу. Устройство подключается к компьютеру или смартфону как BLE-устройство с именем fire_extinguisher_1.

Подключение компонентов

Компонент Пин ESP32 Примечание
MPU6050 (SDA) 21 I²C
MPU6050 (SCL) 22 I²C
Кнопка основная 4 Нажатие на массу (GND)
Кнопка паузы 5 Нажатие на массу (GND)
Светодиод 2 Анод через резистор ~220 Ом

Внимание: кнопки подключаются с использованием внутреннего подтягивающего резистора (INPUT_PULLUP), поэтому второй контакт кнопки должен идти на GND.

Принцип работы

  1. Калибровка при старте автоматически собираются 250 отсчётов с гироскопа и акселерометра для определения нулевых смещений. После успешной калибровки светодиод загорается постоянно (при подключении BLE).
  2. Расчёт углов:
    • Yaw (поворот головы влево-вправо) интегрируется сигнал с гироскопа по оси Z.
    • Pitch (наклон вперёд-назад) вычисляется из акселерометра по оси X с использованием арксинуса. Применяется фильтр низких частот и механизм сброса в ноль при возвращении в нейтральное положение.
  3. Преобразование в движение мыши:
    • Изменение углов за короткий промежуток времени умножается на коэффициенты скорости (YAW_SPEED_GAIN, PITCH_SPEED_GAIN), масштабируется и преобразуется в пиксели.
    • Оси инвертированы: поворот влево → курсор вправо, наклон вперёд → курсор вверх.
    • Применяется экспоненциальное сглаживание и мёртвая зона для подавления дрожания.
  4. Кнопки:
    • Основная кнопка (пин 4) при нажатии: зажимается левая кнопка мыши и отправляется нажатие клавиши 1 на клавиатуре. При отпускании левая кнопка мыши отпускается.
    • Кнопка паузы (пин 5) однократное нажатие временно замораживает движение мыши (повторное нажатие возобновляет). Состояние отображается в Serial Monitor.
  5. Индикация:
    • Светодиод мигает с периодом 500 мс, пока BLE не подключено.
    • После подключения горит постоянно.
    • При калибровке светодиод гаснет на время сбора данных.

Управление через Serial (скорость 115200 бод)

Во время работы можно отправлять команды для настройки параметров:

Команда Описание
y<значение> Установить множитель скорости по горизонтали (YAW). Пример: y1.4
Допустимый диапазон: 0.5 … 3.0
p<значение> Установить множитель скорости по вертикали (PITCH). Пример: p1.6
Допустимый диапазон: 0.5 … 3.0
cal Запустить калибровку заново
reset Сбросить все углы и фильтры в ноль (полезно при смещении нуля)

Примечание: команды вводятся без пробелов и завершаются переводом строки.

Редактируемые параметры в коде

В начале скетча можно изменить следующие константы:

  • YAW_SPEED_GAIN множитель скорости вращения (по умолчанию 1.4)
  • PITCH_SPEED_GAIN множитель скорости наклона (по умолчанию 1.6)
  • MAX_SPEED максимальное абсолютное значение перемещения мыши за один отчёт (по умолчанию 50)
  • smoothing коэффициент экспоненциального сглаживания (0.4 = сильное сглаживание)
  • MIN_MOVEMENT_THRESHOLD минимальное изменение угла, которое учитывается (по умолчанию 0.8°)
  • PITCH_DEADZONE мёртвая зона для наклона (1.2°)
  • PITCH_RESET_THRESHOLD порог сброса наклона в ноль при возвращении (1.0°)
  • CALIB_SAMPLES количество отсчётов при калибровке (250)

Также можно изменить имя BLE-устройства в строке: BleCompositeHID compositeHID("fire_extinguisher_1", "Misfit", 100);

Зависимости

Для компиляции необходимы библиотеки:

  • MPU6050 (или аналогичная)
  • BleCompositeHID (или другая реализация составного HID-устройства)

Установите их через менеджер библиотек Arduino.

Примечания

  • Устройство работает как составное HID (клавиатура + мышь). При подключении может потребоваться подтверждение на ПК.
  • Для стабильной работы рекомендуется питание от 3.3 В (общий GND с ESP32).
  • При первом запуске обязательно дождитесь окончания калибровки (около 1 секунды). Не двигайте датчик в это время.

Версия

Последние изменения: улучшена обработка наклона, добавлена защита от «залипания», инверсия осей, точная настройка фильтров.


Если у вас возникли вопросы или предложения, вы можете доработать параметры под свои нужды, изменяя константы в коде.