Имея ограниченный бюджет и страсть к DIY‑проектам, я решил создать что‑то полезное, используя те компоненты, которые уже были у меня под рукой. Порывшись в своих запасах, я наткнулся на гироскопический датчик, ESP32-C3 и ёмкостные сенсоры, оставшиеся от предыдущих проектов — и тут меня осенило! Почему бы не собрать воздушную мышь с мультимедийными функциями? Вооружившись этими компонентами и щепоткой креативности, я поставил перед собой цель — собрать Bluetooth HID‑устройство с управлением движением, которое позволит буквально взмахами руки перемещаться по меню, наслаждаясь удобным управлением мультимедиа.
Но и это ещё не всё! Этот мини‑гаджет подходит не только для телевизоров, ПК и Android‑устройств — он также может управлять радиоуправляемыми моделями, роботизированными манипуляторами и другими умными устройствами с плавным управлением движением. А так как у меня не было 3D‑принтера, корпус я сделал из пенокартона. Но если у вас он есть, я подготовил также STL и CAD‑файлы, так что вы сможете распечатать свой собственный корпус.
Статья включает:
-
Сборка воздушной мыши
-
Клавиши мультимедийного управления
-
Полностью программируемые клавиши
-
Файлы для 3D‑печати корпуса
-
Код и шаблоны
Итак, приступаем к сборке.
Необходимые материалы
Версия с пенокартоном:
-
Пенокартон 2,5 мм
-
Суперклей
-
Малярный скотч
-
Виниловая плёнка под карбон
-
Серебряная аэрозольная краска
-
Миниатюрный ползунковый переключатель [Длина: 8.5–8.6 мм, ширина: 3.7–3.8 мм, длина ножек: 3 мм, шаг: 2.54 мм (0.1»)](Pololu‑mini slide switch / SS‑SPDT‑Mini-100 / …)
-
Медная лента
-
XIAO ESP32 C3
-
MPU6050
-
Ёмкостный сенсор MPR121
-
Светодиод 3 мм
-
Литий‑ионный аккумулятор 3.7 В [Размер: 20×20×5.5 мм]
-
Прочие материалы (провода, паяльные принадлежности, макетный нож, наждачная бумага и т. д.)
Версия с 3D-печатью:
-
3D‑принтер и филамент
-
Виниловая плёнка под карбон
-
Миниатюрный ползунковый переключатель [Длина: 8.5–8.6 мм, ширина: 3.7–3.8 мм, длина ножек: 3 мм, шаг: 2.54 мм (0.1»)](Pololu‑mini slide switch / SS‑SPDT‑Mini-100 / …)
-
Медная лента
-
XIAO ESP32 C3
-
MPU6050
-
Ёмкостный сенсор MPR121
-
Светодиод 3 мм
-
Литий‑ионный аккумулятор 3.7 В [Размер: 20×20×5.5 мм — 25×20×6.5 мм]
-
Прочие материалы (провода, паяльные принадлежности, макетный нож, наждачная бумага и т. д.)
Шаг 1: Вырезаем шаблоны


Используя готовый шаблон как ориентир, обведите его контур на пенокартоне (2.5 мм) и аккуратно вырежьте соответствующие детали. Затем склейте их суперклеем, как показано на изображениях.
-
Шаблоны.pdf [Скачать]
Шаг 2: Контактные точки для мультимедийных клавиш
Теперь нарежем полоски медной ленты, которые будут служить контактными точками для мультимедийных клавиш, и разместим их в предназначенные для этого слоты, как показано на изображениях.



Шаг 3: Подключение схемы



Схема этого устройства довольно проста. В её основе — гироскопический датчик MPU6050, который определяет ориентацию устройства, и ёмкостный сенсор MPR121, выполняющий роль сенсорных клавиш. В качестве «мозга» устройства используется Xiao ESP32-C3, который координирует все входные и выходные сигналы.
Так как MPU6050 и MPR121 используют интерфейс I2C, они подключаются к микроконтроллеру через линии SDA и SCL.
Я настроил сенсорные клавиши MPR121 на следующие функции:
-
Касание 0 — перемещение курсора
-
Касание 1 — левый клик
-
Касание 2 — правый клик
-
Касание 3 — перемотка назад
-
Касание 4 — перемотка вперёд
-
Касание 5 — увеличение громкости
-
Касание 6 — следующий трек
-
Касание 7 — воспроизведение/пауза
-
Касание 8 — предыдущий трек
-
Касание 9 — уменьшение громкости
-
Касание 10 — выключение звука
-
Касание 11 — динамическая горизонтальная/вертикальная прокрутка на основе наклона
Назначение сенсорных клавиш не жёстко задано — его всегда можно изменить в коде. Мы использовали лишь несколько пинов микроконтроллера, так что остаётся достаточно свободных линий для дополнительных кнопок и расширения функционала.
Для питания я использую компактный литий‑ионный аккумулятор на 3.7 В (размер 20×20×5.5 мм), который обеспечивает достаточную автономность для длительного использования.
Теперь, ориентируясь на схему, аккуратно припаяйте соединения и завершите сборку.
Шаг 4: Крепление верхней и нижней крышек




Прикрепляем верхнюю и нижнюю крышки корпуса — это финальный этап сборки. В идеале их стоило зафиксировать ещё на первом шаге, но… похоже, я упустил этот момент. Но ничего страшного, лучше поздно, чем никогда. Фиксирую их суперклеем — так корпус станет прочным и надёжным.
Края шлифуем наждачкой, чтобы сделать их гладкими и аккуратными.
Шаг 5: Бесполезный эксперимент с LED-рассеивателем



Сначала я не планировал добавлять отдельный светодиод для индикации состояния BLE‑подключения устройства. Поэтому, чтобы проверить, включено ли устройство, в голову пришла (сомнительная) идея сделать LED‑рассеиватель с использованием 5-мм светодиода. Почему я вообще решил это сделать — до сих пор не понимаю!
Идея заключалась в том, чтобы направить свет от встроенного светодиода датчика MPU6050, который указывал бы на то, что питание включено.
Но в итоге этот шаг оказался бесполезным — лучше просто его пропустить, так как в финальной версии я добавил отдельный светодиод, который корректно показывает как статус питания, так и статус BLE‑подключения. Теперь всё работает, как должно!
Разработать своё первое устройство (от идеи до производства) можно на онлайн-курсе «Электроника и электротехника».
Шаг 6: Сборка корпуса



Теперь, когда схема полностью собрана, а корпус готов, пора объединить всё воедино.
Для крепления верхней и нижней частей корпуса я выбрал суперклей. Но, если честно, этот метод не идеален — он не позволяет легко открыть устройство в будущем для диагностики или ремонта, если что‑то пойдёт не так.
Конечно, можно было бы использовать изоленту, но… честно? Это было бы некрасиво.
Поэтому я выбрал компромиссный вариант: наносил небольшие капли суперклея локально, а не размазывал его по всей поверхности. Так, если мне когда‑нибудь понадобится открыть корпус, я просто аккуратно срежу эти точки склейки без особых проблем.
Финальный штрих — оборачиваю корпус в виниловую плёнку под карбон для стильного вида. Макетным ножом подрезаю лишнее — теперь всё выглядит аккуратно и профессионально.
Шаг 7: Добавление маркировки клавиш



Теперь, когда виниловая плёнка на месте, пора обозначить клавиши.
Аккуратно вырезал трафареты из малярной ленты для маркировки клавиш. Затем нанёс слой серебряной аэрозольной краски поверх замаскированных областей.
После высыхания краски снял малярную ленту — обозначения клавиш получились чёткими и аккуратными.
Аппаратная часть полностью готова! Теперь осталось только загрузить код и оживить нашу мышь.
Шаг 8: Код



Для загрузки кода будем использовать Arduino IDE.
Прежде чем продолжить, убедитесь, что в Arduino IDE установлен пакет плат ESP32. Для этого перейдите в Tools → Board → Board Manager, найдите «ESP32» и установите пакет от Espressif Systems.
Если в Board Manager отсутствует ESP32, добавьте следующий URL в File → Preferences → Additional Board Manager URLs: https://dl.espressif.com/dl/package_esp32_index.json
Библиотеки, используемые в проекте:
-
Wire (Версия 2.0.0) — базовая библиотека для I²C‑коммуникации (уже предустановлена).
-
MPU6050 (Версия 1.4.1) — библиотека для работы с MPU6050 (гироскоп и акселерометр).
-
Adafruit MPR121 (Версия 1.1.3) — библиотека для работы с MPR121 (ёмкостный сенсор).
-
Adafruit BusIO (Версия 1.17.0) — зависимость для библиотек Adafruit.
-
SPI (Версия 2.0.0) — библиотека для SPI‑коммуникации (уже предустановлена).
-
ESP32-BLE‑CompositeHID (Версия 0.3.0) — библиотека для добавления BLE HID‑функциональности в ESP32. Её необходимо скачать вручную в виде ZIP‑файла и установить в Arduino IDE, так как она отсутствует в стандартном поиске библиотек. Ссылка на библиотеку Mystfit/ESP32-BLE‑CompositeHID
-
NimBLE‑Arduino (Версия 2.2.1) — лёгкий стек BLE для ESP32.
-
Callback (Версия 1.1) — библиотека для обработки обратных вызовов в проекте.
Я столкнулся с проблемой выбора подходящей BLE‑библиотеки, так как существует несколько вариантов. Сначала попробовал blackketter/ESP32-BLE‑Combo, и при первом подключении всё работало отлично. Однако после повторного соединения мультимедийные клавиши перестали работать, хотя клавиши мыши продолжали функционировать.
Сначала я решил, что проблема в коде, но после нескольких попыток его исправить, решил сменить библиотеку. Именно тогда я нашёл Mystfit/ESP32-BLE‑CompositeHID, и это полностью решило проблему — всё стало работать без сбоев, даже при повторном подключении.
Осталось установить библиотеки, скачать код (MISFIT‑AIRMOUSE‑FINAL.ino) и залить его на устройство.
-
MISFIT‑AIRMOUSE‑FINAL.ino [Скачать]
Шаг 9: Файлы для 3D-печати
Также делюсь STL и CAD‑файлами корпуса устройства. Если у вас есть 3D‑принтер, вы можете напечатать корпус самостоятельно. Я добавил зазор 0,2 мм для точного соединения частей.
-
air‑media‑mouse.f3d [Скачать]
-
air‑media‑mouse v2.step [Скачать]
-
Top case.stl [Скачать]
-
Bottom case.stl [Скачать]
Шаг 10: Устройство готово к подключению


Вот так, с парой компонентов и каплей креативности, у вас готова воздушная мышь с мультимедийным управлением!
Теперь вы можете:
-
Легко перемещаться по меню, просто двигая запястьем
-
Управлять мультимедиа без лишних кнопок
-
Исследовать новые возможности, включая управление роботами и RC‑устройствами
Этот проект — не просто гаджет, а увлекательный эксперимент с DIY‑решениями и инновациями. От разработки корпуса до устранения проблем с BLE‑библиотеками — каждая сложность стала возможностью изучить что‑то новое и улучшить результат.
Лучшее в этом проекте — его гибкость: вы можете настроить устройство под себя! Так как мы использовали не все пины микроконтроллера, можно добавить дополнительные физические кнопки и расширить функциональность. Я также включил файлы для 3D‑печати, чтобы вы могли легко создать свою собственную версию устройства.
Лучшие практики программирования и тестирования можно изучить под руководством экспертов на онлайн-курсах Otus. На открытые уроки всех курсов можно записаться в календаре.
Также всем DIY-энтузиастам рекомендую обратить внимание на онлайн-курс «Электроника и электротехника».
Автор: kmoseenk