최근 제스처 제어 노트북 또는 컴퓨터 가 매우 유명 해지고 있습니다. 이 기술을 Leap 모션이라고하며 컴퓨터 / 노트북의 특정 기능을 제어 할 수 있습니다. 그것을하는 것은 매우 시원하고 재미 있지만,이 노트북은 가격이 매우 비싸다. 따라서이 프로젝트 에서는 Power of Arduino와 Python을 결합하여 자체 제스처 제어 랩톱 / 컴퓨터를 구축해 보겠습니다.
두 개의 초음파 센서 를 사용하여 손의 위치를 결정하고 위치에 따라 미디어 플레이어 (VLC)를 제어합니다. 저는 이것을 데모 용으로 사용했지만 프로젝트를 이해 한 후에는 몇 줄의 코드 만 변경하면 무엇이든 할 수 있고 좋아하는 방식으로 좋아하는 애플리케이션을 제어 할 수 있습니다.
전제 조건:
우리는 이미 Arduino와 Python을 결합한 몇 가지 프로젝트를 다루었습니다. 따라서 이미 Python과 직렬 라이브러리를 설치했으며 LED 깜박임과 같은 몇 가지 기본 프로젝트를 성공적으로 시도했다고 가정합니다. 그렇지 않다면이 Arduino-Python Led Controlling 튜토리얼로 돌아가서 함께 할 수 있습니다. 따라서 계속하기 전에 Python 및 pyserial 라이브러리를 설치했는지 확인하십시오.
프로젝트의 개념:
프로젝트의 개념은 매우 간단합니다. 모니터 위에 초음파 (US) 센서 두 개를 놓고 Arduino를 사용하여 모니터와 손 사이의 거리를 읽습니다.이 거리 값을 기반으로 특정 작업을 수행합니다. 컴퓨터에서 작업을 수행하기 위해 Python pyautogui 라이브러리를 사용 합니다. Arduino의 명령은 직렬 포트 (USB)를 통해 컴퓨터로 전송됩니다. 이 데이터는 컴퓨터에서 실행되는 파이썬에 의해 읽히고 읽은 데이터를 기반으로 작업이 수행됩니다.
회로도:
손 제스처로 PC 를 제어 하려면 두 개의 초음파 센서를 Arduino에 연결하기 만하면됩니다. 우리는 미국 센서가 5V로 작동하므로 Arduino의 온보드 전압 조정기에 의해 전원이 공급된다는 것을 알고 있습니다. Arduino는 모듈에 전원을 공급하고 직렬 통신을 위해 PC / 노트북에 연결할 수 있습니다. 연결이 완료되면 아래와 같이 모니터에 배치합니다. 나는 양면 테이프를 사용하여 내 모니터에 붙 였지만 자신의 창의력을 사용할 수 있습니다. 장소에 고정한 후 프로그래밍을 진행할 수 있습니다.
Arduino 프로그래밍:
Arduino는 US 센서에서 손의 거리를 읽도록 프로그래밍해야합니다. 전체 프로그램은 이 페이지의 마지막에 제공됩니다; 바로 아래에 프로그램에 대한 설명이 있습니다. 초음파 센서를 처음 사용하는 경우 Arduino 및 초음파 센서 기반 거리 측정을 수행하십시오.
거리 값을 읽으면 제스처로 제어 할 특정 동작에 도달 할 수 있습니다. 예를 들어이 프로그램에서는 5 가지 동작 을 데모로 프로그래밍했습니다.
조치 1: 특정 먼 거리에서 센서 앞에 양손을 올리면 VLC 플레이어의 비디오가 재생 / 일시 중지됩니다.
작업 2: 특정 먼 거리에서 오른손을 센서 앞에 올려 놓으면 비디오가 한 단계 빨리 감기를해야합니다.
조치 3: 특정 먼 거리에서 센서 앞에 왼손을 올리면 비디오가 한 단계 되감기해야합니다.
조치 4: 특정 가까운 거리에서 오른손을 센서 앞에 올린 다음 센서쪽으로 이동하면 비디오가 빨리 감기고 멀리 이동하면 비디오가 되감기되어야합니다.
조치 5: 왼손을 특정 가까운 거리에서 센서 앞에 올린 다음 센서쪽으로 이동하면 비디오의 볼륨이 증가하고 멀리 이동하면 볼륨이 감소합니다.
위의 작업을 수행하기 위해 프로그램이 어떻게 작성되었는지 살펴 보겠습니다. 따라서 모든 프로그램과 마찬가지로 아래와 같이 I / O 핀을 정의하는 것으로 시작 합니다. 두 개의 US 센서는 디지털 핀 2,3,4 및 5에 연결되어 있으며 + 5V 핀으로 전원이 공급됩니다. 트리거 핀은 출력 핀이고 에코 핀은 입력 핀입니다.
Arduino와 Python 간의 직렬 통신은 9600의 전송 속도로 이루어집니다.
const int trigger1 = 2; // 첫 번째 Sesnor의 트리거 핀 const int echo1 = 3; // 첫 번째 Sesnor의 에코 핀 const int trigger2 = 4; // 두 번째 Sesnor의 트리거 핀 const int echo2 = 5; // 두 번째 Sesnor의 에코 핀 void setup () {Serial.begin (9600); pinMode (trigger1, OUTPUT); pinMode (echo1, INPUT); pinMode (trigger2, OUTPUT); pinMode (echo2, INPUT); }
어떤 행동을하기 전에 매번 센서와 손 사이의 거리 를 계산 해야합니다. 그래서 우리는 이것을 여러 번해야합니다. 이것은이 코드가 함수로 사용되어야한다는 것을 의미합니다. 센서와 손 사이의 거리를 반환하는 calculate_distance () 라는 함수를 작성했습니다.
/ * ### 거리 계산 함수 ### * / void calculate_distance (int trigger, int echo) {digitalWrite (trigger, LOW); delayMicroseconds (2); digitalWrite (트리거, HIGH); delayMicroseconds (10); digitalWrite (트리거, LOW); time_taken = pulseIn (에코, HIGH); dist = 소요 시간 * 0.034 / 2; if (dist> 50) dist = 50; }
우리의 주요 내부 루프 우리는 거리의 값을 확인하고 작업을 수행 위에서 언급한다. 그 전에 현재 거리 값으로 업데이트되는 두 개의 변수 distL 및 distR 을 사용 합니다.
계산 _ 거리 (트리거 1, 에코 1); distL = dist; // 왼쪽 센서의 거리를 얻습니다. compute_distance (trigger2, echo2); distR = 거리; // 오른쪽 센서의 거리 얻기
두 센서 사이의 거리를 알고 있으므로 이제 미리 정의 된 값과 비교하여 특정 동작에 도달 할 수 있습니다. 예를 들어 양손이 40mc 거리에 있으면 비디오를 재생 / 일시 중지합니다. 여기서 "Play / Pause" 라는 단어 가 직렬 포트를 통해 전송됩니다.
if ((distL> 40 && distR> 40) && (distL <50 && distR <50)) // 양손 감지 {Serial.println ("Play / Pause"); 지연 (500);}
오른손 만 모듈 앞에 놓으면 비디오를 한 단계 빨리 감고 왼손이면 한 단계 되감습니다. 동작에 따라 "되감기"또는 "앞으로" 라는 단어 가 직렬 포트를 통해 전송됩니다.
if ((distL> 40 && distL <50) && (distR == 50)) // 왼손 감지 {Serial.println ("Rewind"); 지연 (500);} if ((distR> 40 && distR <50) && (distL == 50)) // 오른손 감지 {Serial.println ("Forward"); 지연 (500);}
볼륨과 트랙을 세부적으로 제어하려면 잘못된 트리거를 방지하기 위해 다른 방법을 사용합니다. 음량 을 조절 하려면 왼손을 약 2 배 정도 올려야합니다. 15cm 거리에서 센서쪽으로 이동하여 볼륨을 줄이면 볼륨을 높이기 위해 센서에서 멀리 이동할 수 있습니다. 동일한 코드는 아래와 같습니다. 동작에 따라 여기에서 "Vup"또는 "Vdown"이라는 단어가 직렬 포트를 통해 전송됩니다.
// 왼쪽 잠금-제어 모드 if (distL> = 13 && distL <= 17) {delay (100); // 핸드 홀드 시간 calculate_distance (trigger1, echo1); distL = dist; if (distL> = 13 && distL <= 17) {Serial.println ("왼쪽 잠금"); while (distL <= 40) {calculate_distance (trigger1, echo1); distL = dist; if (distL <10) //{Serial.println ("Vup"); delay (300);} if (distL> 20) // 손이 뽑혔습니다 {Serial.println ("Vdown"); 지연 (300);}}}}
오른쪽 센서에 대해서도 동일한 방법을 사용 하여 비디오의 트랙 을 제어 할 수 있습니다. 즉, 오른손을 센서쪽으로 움직이면 동영상이 빨리 감기고 센서에서 멀어지면 동영상을 되감습니다. 동작에 따라 "되감기"또는 "앞으로"라는 단어가 직렬 포트를 통해 전송됩니다.
이제 페이지 끝에 제공된이 제스처 제어 PC에 대한 전체 코드를 읽고 전체적으로 절제 한 다음 Arduino IDE에 복사 할 수 있습니다.
Python 프로그래밍:
이 프로젝트의 파이썬 프로그램은 매우 간단합니다. 올바른 전송 속도를 통해 Arduino와 직렬 통신을 설정 한 다음 몇 가지 기본적인 키보드 동작을 수행하면됩니다. 파이썬의 첫 번째 단계는 p yautogui 모듈 을 설치하는 것 입니다. 프로그램이 pyautogui 모듈 없이는 작동하지 않으므로이 단계를 따르십시오.
Windows 용 pyautogui 모듈 설치:
Windows 용 pyautogui 를 설치하려면 아래 단계를 따르십시오. 다른 플랫폼을 사용하는 경우 단계도 다소 비슷합니다. 컴퓨터 / 노트북이 인터넷에 연결되어 있는지 확인하고 아래 단계를 진행하십시오.
1 단계: Windows 명령 프롬프트를 열고 디렉토리를 Python을 설치 한 폴더로 변경합니다. 기본적으로 명령은
cd C: \ Python27
2 단계: python 디렉토리 내에서 python –m pip install –upgrade pip 명령을 사용 하여 pip 를 업그레이드합니다. Pip은 파이썬 모듈을 쉽게 설치할 수 있도록 도와주는 파이썬 도구입니다. 이 모듈이 업그레이드되면 (아래 그림 참조) 다음 단계로 진행합니다.
python –m pip install –upgrade pip
3 단계: “ python –m pip install pyautogui ” 명령 을 사용하여 pyautogui 모듈을 설치합니다. 프로세스가 성공하면 아래와 비슷한 화면이 표시됩니다.
python –m pip install –upgrade pip
이제 pyautogui 모듈과 pyserial 모듈 (이전 튜토리얼에서 설치됨)이 python과 함께 성공적으로 설치 되었으므로 python 프로그램을 진행할 수 있습니다. 전체 파이썬 코드는 튜토리얼의 끝에 주어진 하지만 다음과 같은에 대한 설명입니다.
이 프로젝트에 필요한 세 가지 모듈을 모두 가져 오겠습니다. 그들은 pyautogui, 직렬 파이썬 및 시간입니다.
import serial # 직렬 통신을 위해 가져온 직렬 가져 오기 시간 # 지연 기능을 사용하기 위해 필요합니다 import pyautogui
다음으로 COM 포트를 통해 Arduino와의 연결을 설정합니다. 내 컴퓨터에서 Arduino는 COM 18에 연결되어 있습니다. 장치 관리자를 사용하여 Arduino가 연결된 COM 포트를 찾고 그에 따라 다음 줄을 수정하십시오.
ArduinoSerial = serial.Serial ('com18', 9600) # arduinoSerialData라는 직렬 포트 개체 생성 time.sleep (2) # 통신이 설정 될 때까지 2 초 동안 기다립니다.
무한 while 루프 내에서 반복적으로 COM 포트를 듣고 키워드를 사전 정의 된 작업 과 비교하고 그에 따라 키보드를 누릅니다.
while 1: incoming = str (ArduinoSerial.readline ()) # 직렬 데이터를 읽고 'Play / Pause'인 경우 들어오는 라인 인쇄로 인쇄: pyautogui.typewrite (, 0.2) if 'Rewind'in incoming: pyautogui. hotkey ('ctrl', 'left') if 'Forward'in incoming: pyautogui.hotkey ('ctrl', 'right') if 'Vup'in incoming: pyautogui.hotkey ('ctrl', 'down') if ' 들어오는 Vdown ': pyautogui.hotkey ('ctrl ','up ')
보시다시피 키 를 누르려면 0.2 초 동안 키 공간을 누르는 "pyautogui.typewrite (, 0.2)" 명령을 사용하면 됩니다. ctrl + S와 같은 핫키가 필요한 경우 핫키 명령 "pyautogui.hotkey ('ctrl', 's')"를 사용할 수 있습니다.
VLC 미디어 플레이어에서 작동하기 때문에 이러한 조합을 사용했습니다. 제스처로 컴퓨터의 모든 것을 제어 할 수있는 자신 만의 응용 프로그램을 만들고 싶은 방식으로 조정할 수 있습니다.
동작중인 제스처 제어 컴퓨터:
위에 정의 된대로 연결하고 Arduino 보드에 Arduino 코드를 업로드합니다. 그런 다음 아래의 python 스크립트를 사용하고 랩톱 / 컴퓨터에서 프로그램을 시작합니다.
이제 VLC 미디어 플레이어를 사용 하여 컴퓨터에서 모든 영화를 재생할 수 있으며 아래 비디오 와 같이 손으로 영화를 제어 할 수 있습니다.
프로젝트를 이해하고 즐겁게 놀았기를 바랍니다. 이것은 데모 일 뿐이며 창의력을 발휘하여 더 멋진 제스처 제어 기능을 만들 수 있습니다. 이것이 유용했는지 그리고 이것을 사용하여 댓글 섹션에서 무엇을 만들 것인지 알려 주시면 기꺼이 알게 될 것입니다.