Управление ПК жестами: Arduino + Python — бесконтактное управление
Компоненты и материалы
| Компонент | Количество |
|---|---|
| Arduino UNO | 1 |
| Ультразвуковой датчик HC-SR04 | 2 |
| Перемычки | 1 набор |
Приложения и библиотеки
- Arduino IDE
- Python IDLE
- Библиотека PySerial (коммуникация с последовательным портом)
- Библиотека PyAutoGUI (автоматизация GUI)
О проекте
В этом проекте мы создадим жестовое управление ноутбуком/компьютером на базе Arduino и Python.
Вместо клавиатуры, мыши или джойстика используются жесты рук для управления функциями: воспроизведение/пауза видео, перелистывание слайдов, прокрутка веб-страниц и др. В качестве примера управляется VLC Media Player.
Идея: два ультразвуковых датчика HC-SR04 на Arduino измеряют расстояние до рук. Данные передаются в Python через последовательный порт. Python-скрипт на компьютере интерпретирует их и выполняет действия.
Аппаратные компоненты
- Arduino
- 2 × Ультразвуковой датчик HC-SR04
- Провода
Программное обеспечение
- Arduino IDE
- Python IDLE
- PySerial
- PyAutoGUI
Предполагается, что Python и PySerial уже установлены и базовые проекты работают. Если нет — см. предыдущее руководство «Programming Arduino Using Python». С датчиком HC-SR04 можно ознакомиться здесь.
Шаг 1: Видео-обзор
(Ссылка на видео в оригинале)
Шаг 2: Назначение жестов
Запрограммированы 5 жестов:
- Play/Pause — обе руки перед левым/правым датчиком на дальнем расстоянии.
- Rewind (назад) — рука перед левым датчиком на дальнем расстоянии.
- Forward (вперёд) — рука перед правым датчиком на дальнем расстоянии.
- Громкость + — рука перед левым датчиком на дальнем расстоянии, затем движение от датчика.
- Громкость − — рука перед левым датчиком на дальнем расстоянии, затем движение к датчику.
Шаг 3: Схема подключения
У каждого датчика 4 пина:
- Vcc → 5 В
- Trig → задаётся в коде
- Echo → задаётся в коде
- GND → земля
Шаг 4: Программирование Python
1. Установка Python IDLE
Если уже установлен — пропустите. Иначе: скачайте с python.org, установите с настройками по умолчанию. Примечание: даже на 64-битной ОС можно использовать 32-битный Python из-за совместимости с Arduino-библиотеками.
2. Установка PySerial
PySerial — модуль для чтения/записи последовательного порта. На Windows: скачайте со страницы загрузки, установите с дефолтными настройками. Проверка: в Python введите import serial — ошибок не должно быть.
3. Установка PyAutoGUI
Кроссплатформенная автоматизация GUI. В командной строке Windows:
cd C:\Python27
python -m pip install --upgrade pip
python -m pip install pyautogui
Проверка: import pyautogui — без ошибок.
Шаг 5: Код для Arduino
Сначала определите COM-порт Arduino (в Arduino IDE).
const int trigger1 = 2;
const int echo1 = 3;
const int trigger2 = 4;
const int echo2 = 5;
long time_taken;
int dist, distL, distR;
void setup() {
Serial.begin(9600);
pinMode(trigger1, OUTPUT);
pinMode(echo1, INPUT);
pinMode(trigger2, OUTPUT);
pinMode(echo2, INPUT);
}
void calculate_distance(int trigger, int echo) {
digitalWrite(trigger, LOW);
delayMicroseconds(2);
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger, LOW);
time_taken = pulseIn(echo, HIGH);
dist = time_taken * 0.034 / 2;
if (dist > 60) dist = 60;
}
void loop() {
calculate_distance(trigger1, echo1);
distL = dist;
calculate_distance(trigger2, echo2);
distR = dist;
// Play/Pause — обе руки на расстоянии 40-60 см
if ((distL > 40 && distR > 40) && (distL < 60 && distR < 60)) {
Serial.println("Play/Pause");
delay(500);
}
calculate_distance(trigger1, echo1);
distL = dist;
calculate_distance(trigger2, echo2);
distR = dist;
// Left Lock — контроль громкости
if (distL >= 13 && distL <= 17) {
delay(100);
calculate_distance(trigger1, echo1);
distL = dist;
if (distL >= 13 && distL <= 17) {
Serial.println("Left Locked");
while (distL <= 40) {
calculate_distance(trigger1, echo1);
distL = dist;
if (distL < 10) { Serial.println("Volume Increased"); delay(300); }
if (distL > 20) { Serial.println("Volume Decreased"); delay(300); }
}
}
}
// Right Lock — перемотка
if (distR >= 13 && distR <= 17) {
delay(100);
calculate_distance(trigger2, echo2);
distR = dist;
if (distR >= 13 && distR <= 17) {
Serial.println("Right Locked");
while (distR <= 40) {
calculate_distance(trigger2, echo2);
distR = dist;
if (distR < 10) { Serial.println("Rewind"); delay(300); }
if (distR > 20) { Serial.println("Forward"); delay(300); }
}
}
}
delay(200);
}
Шаг 6: Код для Python
import serial
import time
import pyautogui
ArduinoSerial = serial.Serial('com15', 9600) # замените на свой COM-порт
time.sleep(2)
while True:
incoming = str(ArduinoSerial.readline())
print(incoming)
if 'Play/Pause' in incoming:
pyautogui.typewrite(['space'], 0.2)
if 'Rewind' in incoming:
pyautogui.hotkey('ctrl', 'left')
if 'Forward' in incoming:
pyautogui.hotkey('ctrl', 'right')
if 'Volume Increased' in incoming:
pyautogui.hotkey('ctrl', 'down')
if 'Volume Decreased' in incoming:
pyautogui.hotkey('ctrl', 'up')
incoming = ""
Важно: в Python-коде исправлена опечатка оригинала: Volume Incresaed → Volume Increased.
Производственный процесс
- Создание потрясающей системы Ambilight для монитора на Arduino
- Универсальный Android-пульт на Arduino, 1Sheeld и ИК-управлении
- Умный вольтметр на Arduino и смартфоне — простое DIY-проект
- Удаленное IoT-управление самодельной манипулятором
- Точное измерение частоты и коэффициента заполнения на Arduino UNO
- Управление Arduino-роботом через Firmata и геймпад Xbox One
- Умный водяной пистолет с датчиком движения на Arduino Nano
- Бесшовное управление яркостью светодиодов с помощью Bolt IoT и Arduino UNO
- Умная робо-рука на Arduino: простое DIY-руководство
- Управление телевизором через Alexa и Arduino IoT Cloud — пошаговое руководство