Bluetooth-мышь под управлением смартфона: виртуальный джойстик своими руками
Компоненты и материалы
| Arduino UNO | ×1 |
| Bluetooth-модуль HC-05 | ×1 |
| Перемычки | ×1 набор |
Приложения и сервисы
- Arduino IDE
- IDLE (Python GUI)
- MIT App Inventor — Bluetooth Mouse Control (готовое приложение)
О проекте
Проект похож на мою прошлую работу с джойстиком для управления курсором ПК. Ключевое отличие — создано смартфон-приложение с двумя виртуальными джойстиками: один двигает курсор, второй — прокручивает экран, плюс кнопки левого/правого клика как на тачпаде.
Принцип работы
Приложение на смартфоне передает по Bluetooth (HC-05) данные осей джойстиков, статус скролла и кликов на Arduino Uno. Arduino пересчитывает текущие координаты курсора (X: 0–1279, Y: 0–799 — получены через mouse.get_position() в Python) с учетом смещения от джойстика и формирует выходной пакет. Python-скрипт на компьютере принимает данные по Serial и выполняет действия мыши через модуль mouse.
Об приложении (MIT App Inventor)
Главный экран: два виртуальных джойстика, кнопки кликов, скролл. Протокол передачи (каждые 20 мс):
- Байт старта:
255 - 1 байт — X-ось джойстика
- 1 байт — Y-ось джойстика
- 1 байт — статус: левый клик, правый клик, скролл
Сторона Arduino
Принимает байты, парсит пакет (ожидает стартовый 255). Значения осей маппятся в смещение курсора с настройкой чувствительности (sensitivity=20):
- X > 110 — вправо, X < 70 — влево
- Y > 110 — вниз, Y < 60 — вверх
Обработка кликов/скролла с защитой от дребезга (фиксируется предыдущее состояние). Результат выводит в Serial в формате: X:Y:clicks (например, 640:400:1).
Python-программирование
Требуется Python 3. Установка модулей через командную строку:
cd <путь_к_python>
py -m pip install --upgrade pip
py -m pip install mouse
py -m pip install pyserial
- mouse — эмуляция действий мыши
- pyserial — обмен данными с Arduino
Запуск
- Установите приложение Bluetooth Mouse Control на смартфон.
- Загрузите скетч в Arduino, соберите схему (см. раздел Schematics).
- Python: скопируйте код в блокнот, укажите правильный COM-порт (например,
COM3), сохраните как.py. - Откройте файл в IDLE и запустите (F5).
- В приложении на смартфоне подключитесь к HC-05 — курсор начнет двигаться за джойстиком.
Код
Arduino (C++)
int datareceived[5] = {0,0,0,0};
int in_byte = 0, array_index = 0;
int l_prev=0, r_prev=0;
void setup() { Serial.begin(9600); }
void loop() {
int clicks=0, sensitivity=20, xpos=0, ypos=0;
static int height=0, width=0;
if (Serial.available() > 0) {
in_byte = Serial.read();
if (in_byte == 255) array_index = 0;
datareceived[array_index] = in_byte;
array_index++;
if (datareceived[1] >= 110) xpos = map(datareceived[1], 110, 172, 0, sensitivity);
if (datareceived[1] <= 70) xpos = map(datareceived[1], 60, 1, 0, -sensitivity);
if (datareceived[2] >= 110) ypos = map(datareceived[2], 110, 255, 0, sensitivity);
if (datareceived[2] <= 60) ypos = map(datareceived[2], 70, 1, 0, -sensitivity);
if (datareceived[3]==1 && l_prev==0) clicks=1;
else if (datareceived[3]==2 && r_prev==0) clicks=2;
else if (datareceived[3]==3 || datareceived[3]==4) clicks=datareceived[3];
l_prev = datareceived[3];
r_prev = datareceived[3];
if (xpos!=0 || ypos!=0 || clicks!=0) {
height += ypos; width += xpos;
height = constrain(height, 0, 799);
width = constrain(width, 0, 1279);
Serial.print(width); Serial.print(":");
Serial.print(height); Serial.print(":");
Serial.println(clicks);
}
}
}
Python
import mouse, sys, time, serial
mouse.FAILSAFE = False
ArduinoSerial = serial.Serial('com3', 9600) # Укажите свой COM-порт
time.sleep(1)
while True:
data = str(ArduinoSerial.readline().decode('ascii'))
x, y, z = data.split(":")
x, y = int(x), int(y)
mouse.move(x, y)
if '1' in z: mouse.click(button="left")
elif '2' in z: mouse.click(button="right")
elif '3' in z: mouse.wheel(delta=-1)
elif '4' in z: mouse.wheel(delta=1)
Схема подключения
См. раздел Schematics в исходнике (изображение схемы). HC-05 подключается к аппаратному Serial (пины 0/1) или SoftwareSerial — в коде используется аппаратный Serial на 9600 бод.
Производственный процесс
- Создание Bluetooth-робота на Raspberry Pi с аудио-обратной связью
- Настольная RGB-лампа с управлением жестами – Интерактивное беспроводное освещение
- Умный вольтметр на Arduino и смартфоне — простое DIY-проект
- Управление светодиодами через Alexa с помощью Raspberry Pi – простое пошаговое руководство
- Превращаем старую радиоуправляемую машину в джойстик-контролируемый болид на Arduino
- Управление светодиодом по Bluetooth с Arduino: простой DIY-гид
- Роботизированная рука 6 степеней свободы на Arduino Mega с управлением через Nunchuk
- Голосовой робот на Arduino Nano: Управление речью через Bluetooth
- MobBob: Самостоятельная сборка Arduino-робота под управлением Android-смартфона
- Голосовое управление бытовыми приборами: Bluetooth-управление через Google Assistant