Удивительный управляющий компьютер с использованием движения руки и Arduino
Компоненты и расходные материалы
![]() |
| × | 1 | |||
![]() |
| × | 2 | |||
![]() |
| × | 1 |
Приложения и онлайн-сервисы
![]() |
| |||
| ||||
| ||||
|
Об этом проекте
В этом проекте мы узнаем, как создавать ноутбуки или компьютеры с жестами. Он основан на использовании комбинации Arduino и Python.
Вместо клавиатуры, мыши или джойстика мы можем использовать жесты рук для управления определенными функциями компьютера, такими как воспроизведение / пауза видео, перемещение влево / вправо в слайд-шоу фотографий, прокрутка вверх / вниз на веб-странице и многие другие. более. Вот почему я решил управлять VLC Media Player как проектом жестов рук.
Идея проекта довольно проста, если использовать два ультразвуковых датчика (HC-SR04) с Arduino. Мы разместим два датчика в верхней части экрана ноутбука и рассчитаем расстояние между рукой и датчиком. Рассчитывая на информацию от Arduino, которая отправляется на Python через последовательный порт, эта информация затем будет считана Python, который работает на компьютере, для выполнения определенных действий.
Компоненты оборудования:
- Ардуино
- Два ультразвуковых датчика (HC-SR04)
- Некоторые провода
Программные приложения:
- IDE Arduino
- Python IDLE
- Библиотека PySerial (мы будем использовать для связи с последовательными портами).
- Библиотека PyAutogui (мы будем использовать для выполнения действий).
Итак, я предполагаю, что вы уже установили библиотеки Python и PySerial и успешно выполнили несколько базовых проектов. Если нет, не волнуйтесь; Советую следовать моему предыдущему руководству (Программирование Arduino с использованием Python). Также, если вы хотите познакомиться с ультразвуковым датчиком, вы можете взглянуть (здесь).
Шаг 1. Посмотрите видео, чтобы узнать больше
Шаг 2. Цель жестов рук
Ниже приведены 5 жестов, которые я запрограммировал для демонстрационных целей.
- Жест из первых рук:он позволяет нам "воспроизвести / приостановить" VLC, поместив две руки перед правым / левым ультразвуковым датчиком на определенном расстоянии.
- Второй жест:он позволяет нам «перемотать» видео, поместив руку перед левым датчиком на определенном расстоянии.
- Третий жест:он позволяет нам «пересылать» видео, помещая руку перед правым датчиком на определенном расстоянии.
- Четвертый жест:он позволяет «увеличить громкость» видео, поместив руку перед левым датчиком на определенном расстоянии и отодвинувшись от датчика.
- Пятый жест:он позволяет нам «уменьшить громкость» видео, поместив руку перед левым датчиком на определенном расстоянии и приблизившись к датчику.
Шаг 3. Схема



Схема довольно проста, вам просто нужно следовать приведенным ниже инструкциям. Итак, каждый датчик имеет 4 контакта:
- Vcc - этот вывод подключен к 5 В +.
- Триггер - вам необходимо определить этот контакт в своей программе.
- Echo - этот пин такой же, как Trig, его также необходимо определить.
- GND - этот вывод подключен к земле.
Шаг 4. Программирование на Python



1. Установите Python IDLE
Вы можете пропустить этот шаг, если вы уже установили Python IDLE на свой компьютер. Если да, переходите к шагу 2 или следуйте приведенным ниже инструкциям.
- Перейдите на веб-сайт Python и загрузите его (здесь).
- После того, как вы закончите, вы переходите к установке, сохраняя каталог, в котором python устанавливается по умолчанию.
ПРИМЕЧАНИЕ. Даже если ваш компьютер работает в 64-разрядной версии, вы можете использовать сам 32-разрядный Python из-за отсутствия совместимости с библиотеками Arduino.
2. Установите библиотеку PySerial
PySerial - это модуль Python API, который используется для чтения и записи последовательных данных в Arduino или любой другой микроконтроллер. Для установки в Windows просто посетите страницу загрузки PySerial и выполните следующие действия:
- Загрузите PySerial по ссылке выше.
- Установите его, оставив настройку по умолчанию. Убедитесь, что Pyserial работает правильно. Сделать это; вы вводите:
импорт серийного номера
Если вы не столкнулись ни с одной ошибкой, все в порядке. В противном случае я советую вам проверить вашу установку и расширение Python IDLE.
3. Установите библиотеку PyAutogui
Цель PyAutoGUI - предоставить кроссплатформенный модуль Python для автоматизации графического интерфейса пользователя для людей. API спроектирован так, чтобы быть максимально простым с разумными значениями по умолчанию. Выполните следующие шаги, чтобы установить pyautogui для Windows. (Чтобы выполнить эти шаги, у вас уже должен быть установлен Python IDLE.)
Если вы используете другие платформы, советую посмотреть здесь.
- Открыть команду Windows
- Введите следующую команду.
cd C:\ Python27
- Затем вы вводите:
python –m pip install –upgrade pip
- Последняя команда:
python –m pip install pyautogui
ПРИМЕЧАНИЕ. Чтобы убедиться, что pyautogui работает правильно, просто введите:
импортировать pyautogui
Если вы не столкнулись ни с одной ошибкой, все в порядке.
Шаг 5. Код Arduino

Чтобы инициировать соединение с Arduino из Python, мы сначала должны выяснить, на каком COM-порту находится Arduino. Эта задача просто выполняется средой программирования Ardunio, как я отметил на картинке выше.
const int trigger1 =2; // Триггерный вывод 1-го Sesnorconst int echo1 =3; // Эхо-вывод 1-го Sesnorconst int trigger2 =4; // Триггерный вывод 2-го Sesnorconst int echo2 =5; // Вывод эха 2-го Sesnorlong time_taken; int dist, distL, distR; void setup () {Serial.begin (9600); pinMode (триггер1, ВЫХОД); pinMode (echo1, ВХОД); pinMode (триггер2, ВЫХОД); pinMode (echo2, ВХОД); } / * ### Функция для вычисления расстояния ### * / 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 () {// бесконечный циклpycalculate_distance (trigger1, echo1); distL =расстояние; // получить расстояние от левого сенсораcalculate_distance (trigger2, echo2); distR =dist; // получение расстояния до правого датчика // Режимы паузы -Holdif ((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; // Режимы управления // Заблокировать влево - Режим управленияif (distL> =13 &&distL <=17) {задержка (100); // Время удержания руки calculate_distance (trigger1, echo1); distL =dist; if (distL> =13 &&distL <=17) {Serial.println ("Заблокировано влево"); в то время как (distL <=40) {вычислить_дистанцию (триггер1, эхо1); distL =dist; if (distL <10) // Рука нажата {Serial.println ("Объем увеличился"); delay (300);} if (distL> 20) // Рука вытащена {Serial.println ("Volume Decreased"); delay (300);}}}} // Заблокировать вправо - режим управленияif (distR> =13 &&distR <=17) {delay (100); // Время удержания руки calculate_distance (trigger2, echo2); distR =dist; если (distR> =13 &&distR <=17) {Serial.println ("заблокировано справа"); в то время как (distR <=40) {вычислить_дистанцию (триггер2, эхо2); distR =dist; if (distR <10) // Правая рука нажата {Serial.println ("Rewind"); delay (300);} if (distR> 20) // Правая рука вытащила {Serial.println ("Вперед"); delay (300);}}}} задержка (200);}
Если вы прочитаете код Arduino, вы увидите 5 команд, которые управляют определенными функциями клавиатуры для достижения требуемой задачи.
arduino_pythogui.ino Загрузить
arduino_pythogui.ino
Шаг 6. Код Python

Во-первых, нам нужна простая программа, чтобы заставить Python отправлять данные через последовательный порт.
import serial #Serial import for Serial communicationimport time # Требуется для использования функций задержкиimport pyautogui # Требуется для выполнения действий ArduinoSerial =serial.Serial ('com15', 9600) # Создание объекта последовательного порта с именем arduinoSerialDatatime.sleep (2 ) # подождите 2 секунды, пока установится связь, пока 1:incoming =str (ArduinoSerial.readline ()) # считайте последовательные данные и распечатайте их как входящую строку, если 'Play / Pause' в входящих:pyautogui.typewrite ([ 'space'], 0.2) если 'Rewind' во входящем:pyautogui.hotkey ('ctrl', 'left') если 'Forward' во входящем:pyautogui.hotkey ('ctrl', 'right') if 'Volume Incresaed' во входящем:pyautogui.hotkey ('ctrl', 'down'), если 'Volume Decreased' во входящем:pyautogui.hotkey ('ctrl', 'up') incoming ="";
Код
- Фрагмент кода № 5
- Фрагмент кода №6
Фрагмент кода № 5 Обычный текст
const int trigger1 =2; // Триггерный вывод 1-го Sesnorconst int echo1 =3; // Эхо-вывод 1-го Sesnorconst int trigger2 =4; // Триггерный вывод 2-го Sesnorconst int echo2 =5; // Вывод эха 2-го Sesnorlong time_taken; int dist, distL, distR; void setup () {Serial.begin (9600); pinMode (триггер1, ВЫХОД); pinMode (echo1, ВХОД); pinMode (триггер2, ВЫХОД); pinMode (echo2, ВХОД); } / * ### Функция для вычисления расстояния ### * / 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 () {// бесконечный циклpycalculate_distance (trigger1, echo1); distL =расстояние; // получить расстояние от левого сенсораcalculate_distance (trigger2, echo2); distR =dist; // получение расстояния до правого датчика // Режимы паузы -Holdif ((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; // Режимы управления // Заблокировать влево - Режим управленияif (distL> =13 &&distL <=17) {задержка (100); // Время удержания руки calculate_distance (trigger1, echo1); distL =dist; if (distL> =13 &&distL <=17) {Serial.println ("Заблокировано влево"); в то время как (distL <=40) {вычислить_дистанцию (триггер1, эхо1); distL =dist; if (distL <10) // Рука нажата {Serial.println ("Объем увеличился"); delay (300);} if (distL> 20) // Рука вытащена {Serial.println ("Volume Decreased"); delay (300);}}}} // Заблокировать вправо - режим управленияif (distR> =13 &&distR <=17) {delay (100); // Время удержания руки calculate_distance (trigger2, echo2); distR =dist; если (distR> =13 &&distR <=17) {Serial.println ("заблокировано справа"); в то время как (distR <=40) {вычислить_дистанцию (триггер2, эхо2); distR =dist; if (distR <10) // Правая рука нажата {Serial.println ("Rewind"); delay (300);} if (distR> 20) // Правая рука вытащила {Serial.println ("Вперед"); delay (300);}}}} задержка (200);}
Фрагмент кода №6 Обычный текст
import serial #Serial import for Serial communicationimport time # Требуется для использования функций задержкиimport pyautogui # Требуется для выполнения действий ArduinoSerial =serial.Serial ('com15', 9600) # Создать объект последовательного порта с именем arduinoSerialDatatime.sleep (2) #wait в течение 2 секунд для установления связи, пока 1:incoming =str (ArduinoSerial.readline ()) # Прочтите последовательные данные и распечатайте их как входящую строку, если 'Play / Pause' в входящих:pyautogui.typewrite (['space' ], 0.2) если 'Rewind' во входящем:pyautogui.hotkey ('ctrl', 'left'), если 'Forward' во входящем:pyautogui.hotkey ('ctrl', 'right'), если 'Volume Incresaed' во входящем:pyautogui.hotkey ('ctrl', 'down'), если 'Volume Decreased' во входящих:pyautogui.hotkey ('ctrl', 'up') incoming ="";
Производственный процесс
- Создание монитора Ambilight с помощью Arduino
- Универсальный пульт дистанционного управления с использованием Arduino, 1Sheeld и Android
- Вольтметр своими руками с использованием Arduino и смартфона
- Использование Интернета вещей для удаленного управления манипулятором
- Измерение частоты и рабочего цикла с использованием Arduino
- Управление Arduino Rover с помощью Firmata и контроллера Xbox One
- Водяной пистолет с датчиком движения
- Управление яркостью светодиода с помощью Bolt и Arduino
- Простая и умная роботизированная рука с использованием Arduino
- Полный контроль над вашим телевизором с помощью Alexa и Arduino IoT Cloud