우리의 세계가 어떻게 몰입 형 현실을 향해 가고 있는지 궁금한 적이 있습니다. 우리는 가상 현실, 혼합 현실, 증강 현실 등을 사용하여 주변과 상호 작용할 수있는 새로운 방법과 방법을 지속적으로 찾고 있습니다. 이러한 빠른 속도 기술을 사용하는 새로운 장치는 매일 새로운 대화 형 기술로 우리에게 깊은 인상을주고 있습니다.
이러한 몰입 형 기술은 게임, 대화 형 활동, 엔터테인먼트 및 기타 여러 응용 프로그램에 사용됩니다. 이 튜토리얼에서는 지루한 마우스를 사용하는 대신 시스템과 상호 작용할 수있는 새로운 방법을 제공하는 이러한 대화 형 방법에 대해 알아 봅니다. 게임 괴짜들은 몇 년 전 게임 회사 인 Nintendo가 Wii 컨트롤러로 알려진 핸드 헬드 컨트롤러의 도움을 받아 콘솔과 상호 작용하는 3D 대화 형 방법에 대한 아이디어를 매각했다는 사실을 알고 있어야합니다. 가속도계를 사용하여 게임에 대한 제스처를 찾아 무선으로 시스템에 보냅니다. 이 기술에 대해 더 알고 싶다면 특허 EP1854518B1을 확인하면이 기술이 어떻게 작동하는지에 대한 완전한 아이디어를 얻을 수 있습니다.
이 아이디어에서 영감을 받아 "에어 마우스" 를 만들어 콘솔을 공중에서 움직 이기만하면 시스템과 상호 작용할 수 있지만 3 차원 좌표 참조를 사용하는 대신 2 차원 좌표 참조 만 사용합니다. 마우스가 X와 Y의 2 차원에서 작동하기 때문에 컴퓨터 마우스의 동작을 모방 할 수 있습니다.
이 무선 3D Air Mouse 의 개념 은 매우 간단합니다. 가속도계를 사용하여 x 및 y 축을 따라 "에어 마우스"의 동작 및 동작 가속 값을 얻은 다음 값을 기반으로합니다. 가속도계는 마우스 커서를 제어하고 컴퓨터에서 실행되는 파이썬 소프트웨어 드라이버의 도움으로 특정 작업을 수행합니다.
전제 조건
- Arduino Nano (모든 모델)
- 가속도계 ADXL335 모듈
- 블루투스 HC-05 모듈
- 푸시 버튼
- Python이 설치된 컴퓨터
컴퓨터에 Python을 설치하는 방법에 대해 자세히 알아 보려면 Arduino-Python LED 제어에 대한 이전 자습서를 따르십시오.
회로도
손의 움직임으로 컴퓨터 를 제어 하려면 X 축과 Y 축을 따라 가속도를 제공하고 전체 시스템을 무선으로 블루투스 모듈을 사용하여 시스템에 무선으로 전송하는 가속도계가 필요합니다.
여기에는 ADXL335 가속도계가 사용되며 X, Y 및 Z 축을 따라 가속도를 출력하는 MEMS 기반 3 축 모듈이지만 마우스를 제어하기 위해 이전에 언급했듯이 X 및 Y 축을 따라 가속 만 필요합니다.. 이전 프로젝트에서 Arduino 와 함께 ADXL335 가속도계를 사용하는 방법에 대해 자세히 알아보십시오.
- GPS, GSM 및 가속도계를 사용한 Arduino 기반 차량 사고 경보 시스템
- Arduino 및 가속도계를 사용하는 탁구 게임
- Arduino를 사용하는 가속도계 기반 손 제스처 제어 로봇
- Arduino를 사용한 지진 감지기 경보
여기서 가속도계 의 Xout 및 Yout 핀은 Arduino의 Analog, A0 및 A1 핀에 연결되고 Arduino에서 시스템으로 신호를 전송하기 위해 Bluetooth 모듈 HC-05 가 여기에 사용됩니다. Bluetooth가 Tx 및 Rx를 통해 작동하기 때문입니다. 핀 연결이므로 소프트웨어 직렬 핀 D2 및 D3을 사용합니다. Bluetooth를 하드웨어 직렬로 연결하고 Python 콘솔을 통해 판독 값을 얻기 시작하면 Bluetooth가 자체 전송 속도로 Python과 통신하므로 불일치 전송 속도에 대한 오류가 표시되기 때문에 소프트웨어 직렬을 사용하여 연결됩니다. Arduino를 포함한 다양한 마이크로 컨트롤러를 사용하는 다양한 Bluetooth 기반 프로젝트를 통해 Bluetooth 모듈 사용에 대해 자세히 알아보십시오.
여기에서는 아래 이미지와 같이 세 개의 푸시 버튼을 사용했습니다. 하나는 에어 마우스 트리거 용이고 다른 두 개는 왼쪽 및 오른쪽 클릭 용입니다.
Air Mouse의 프로세스 흐름
순서도는 Arduino 기반 Air Mouse의 프로세스 흐름을 보여줍니다.
1. 시스템은 컴퓨터 마우스로 정상적으로 작동 할 수있을 때까지 눌러야하는 기계적 트리거를 지속적으로 확인합니다.
2. 시스템이 버튼 누름을 감지하면 마우스 컨트롤이 에어 마우스로 전송됩니다.
3. 트리거 버튼을 누르면 시스템이 마우스 판독 값을 컴퓨터로 전송하기 시작합니다. 시스템 판독 값은 가속도계 판독 값과 왼쪽 및 오른쪽 클릭에 대한 판독 값으로 구성됩니다.
4. 시스템 판독 값은 1 바이트 또는 8 비트의 데이터 스트림으로 구성되며, 처음 3 비트는 X 좌표로 구성되고, 두 번째 3 비트는 Y 좌표로 구성되며, 두 번째 마지막 비트는 가져 오기를위한 상태 비트입니다. 마우스 왼쪽 클릭의 상태와 마지막 비트는 오른쪽 클릭의 상태를 얻기위한 상태 비트입니다.
5. 처음 세 비트의 값, 즉 X 좌표의 범위는 100 <= Xcord <= 999 인 반면 Y 좌표의 값은 100 <= Ycord <= 800의 범위 일 수 있습니다. 오른쪽 클릭과 왼쪽 클릭에 대한 값은 0 또는 1의 이진 값으로, 1은 클릭이 이루어 졌음을 나타내고 0은 사용자가 클릭하지 않음을 나타냅니다.
6. 버튼의 바운싱이 커서 위치에 영향을주지 않도록 마우스의 트리거 버튼을 클릭 할 때마다 알려진 4 초의 지연 시간이 유지됩니다.
7. 에어 마우스의 오른쪽 및 왼쪽 클릭은 먼저 왼쪽 또는 오른쪽 푸시 버튼을 눌러야하고 그 후 트리거 버튼을 눌러 원하는 에어 마우스의 위치로 이동해야합니다.
Air Mouse 용 Arduino 프로그래밍
Arduino는 X 및 Y 축의 가속 값을 읽도록 프로그래밍해야합니다. 전체 프로그램은 마지막에 주어, 아래의 코드에서 중요한 조각이다.
전역 변수 설정
이전에 언급했듯이 Bluetooth 모듈을 소프트웨어 직렬 핀과 연결합니다. 따라서 소프트웨어 직렬을 설정하려면 소프트웨어 직렬 라이브러리를 선언하고 Tx 및 Rx에 대한 핀을 설정해야합니다. Arduino Nano 및 Uno Pin 2 및 3에서 소프트웨어 직렬로 작동 할 수 있습니다. 다음으로 소프트웨어 직렬 라이브러리에서 Bluetooth 개체를 선언하여 Tx 및 Rx에 대한 핀을 설정합니다.
#포함
무효 설정 ()
에서 설정 기능, 우리는 그들이 입력 또는 출력으로 작동할지 여부를 프로그램에게 변수를 설정하는 것입니다. 트리거 버튼은 입력 풀업으로 설정되고 왼쪽 및 오른쪽 클릭은 입력으로 선언되고 높음으로 설정되어 입력 풀업으로 작동합니다.
또한 직렬 및 Bluetooth 통신의 전송 속도를 9600으로 설정합니다.
void setup () { pinMode (x, INPUT); pinMode (y, INPUT); pinMode (trigger, INPUT_PULLUP) pinMode (lclick, INPUT); pinMode (rclick, INPUT); pinMode (led, OUTPUT); digitalWrite (lclick, HIGH); digitalWrite (rclick, HIGH); Serial.begin (9600); bluetooth.begin (9600); }
보이드 루프 ()
시스템에 데이터 스트림을 보내야 할 때를 알려주 는 트리거 버튼 이 필요 하므로 풀업 트리거의 디지털 상태를 지속적으로 모니터링하는 while 루프 내부에 전체 코드를 설정했습니다. 처리를 위해 더 전달하십시오.
우리는 우리가 트리거 버튼을 누를 때의 시스템의 상태를 알 수 있도록하기 위해 LED를 부착 한, 우리는 처음에 외부 낮은 주도 설정 하는 동안 내부 그것의 기본 조건과 높은로 루프 동안 것 루프 는 LED를 점등 트리거 버튼을 누를 때마다.
왼쪽 및 오른쪽 클릭 버튼 의 상태 를 읽기 위해 처음에 값이 0으로 설정된 두 개의 변수 lclick 및 rclick을 전역 적으로 선언 했습니다.
그리고 루프 에서 좌우 클릭 버튼의 디지털 상태에 따라 해당 변수의 값을 설정하여 버튼이 눌 렸는지 확인합니다.
우리는 analogRead 함수를 사용하여 가속도계의 X 및 Y 출력 핀 값을 읽고 해당 값을 화면 크기에 매핑하여 전체 화면에서 마우스 포인터를 이동하게합니다. 화면 크기는 화면의 픽셀이므로 적절하게 설정해야하며 출력 값이 3 자리 여야하므로 의도적으로 X의 범위를 100 <= X <= 999로 설정했습니다. Y 값은 100 <= Y <= 800입니다. 픽셀은 왼쪽 상단 모서리에서 읽습니다. 즉, 왼쪽 상단 모서리에는 값 (0,0)이 있지만 x와 y에 대해 세 자리를 선언 했으므로 값은 점 (100,100)에서 읽습니다.
또한 Serial.print 및 bluetooth.print 기능을 사용 하여 직렬 및 Bluetooth를 통해 좌표 값과 클릭 상태를 인쇄하면 직렬 모니터 및 Bluetooth를 통해 시스템에서 값을 가져 오는 데 도움이됩니다.
마지막으로 버튼이 튀기 때문에 단일 값이 반복되어 마우스 커서가 단일 위치에 머 무르도록 할 수 있습니다. 따라서이 지연을 제거하려면이 지연을 추가해야합니다.
void loop () { digitalWrite (led, LOW); while (digitalRead (trigger) == LOW) { digitalWrite (led, HIGH); lstate = digitalRead (lclick); rstate = digitalRead (rclick); xh = analogRead (x); yh = analogRead (y); xcord = map (xh, 286,429,100,999); ycord = map (yh, 282,427,100,800); Serial.print (xcord); Serial.print (ycord); if (lstate == LOW) Serial.print (1); 그렇지 않으면 Serial.print (0); if (rstate == LOW) Serial.print (1); 그렇지 않으면 Serial.print (0); bluetooth.print (xcord); bluetooth.print (ycord); if (lstate == LOW) bluetooth.print (1); 그밖에 bluetooth.print (0); if (rstate == LOW) bluetooth.print (1); 그렇지 않으면 bluetooth.print (0); 지연 (4000); }}
Python 드라이버 스크립트
지금까지 하드웨어 및 펌웨어 부분을 완료했습니다. 이제 에어 마우스가 작동하도록하려면 에어 마우스의 신호를 커서 움직임으로 디코딩 할 수있는 드라이버 스크립트가 필요합니다. 파이썬. Python 은 스크립팅 언어이며 여기에서 스크립팅하면 마우스 커서를 제어하는 것처럼 다른 프로그램을 제어하는 데 도움이됩니다.
따라서 Python 셸을 열고 아래 명령을 사용하여 다음 라이브러리를 설치하십시오.
pip 설치 직렬 pip 설치 pyautogui
직렬 등의 COM 포트와 시리얼 인터페이스에서 데이터를 얻을하는 데 도움이 또한 반면에 우리가 그것을 조작 할 수 있습니다 파이썬을위한 라이브러리입니다 pyautogui는 파이썬이,이 경우, 마우스를 GUI 기능을 제어 할 수 있습니다 취득하는 라이브러리입니다.
이제 드라이버에 대한 코드를 살펴 보겠습니다. 가장 먼저해야 할 일은 직렬 및 pyautogui 라이브러리를 가져 오는 것입니다. 그런 다음 직렬 라이브러리에서 통신을위한 com 포트를 9600의 전송 속도로 설정해야합니다. Bluetooth.serial 이 작동하는 것과 동일합니다. 이를 위해 Bluetooth 모듈을 시스템에 연결 한 다음 시스템 설정에서 연결된 COM 포트를 확인해야합니다.
다음은 블루투스에서 시스템으로 직렬 통신을 읽고 while 1의 도움으로 나머지 코드를 연속 루프로 계속 유지하는 것입니다.
앞서 언급했듯이 Arduino는 8 비트, 처음 6 비트는 좌표, 마지막 2 비트는 클릭 버튼 상태를 전송합니다. 따라서 ser.read 의 도움으로 모든 비트를 읽고 길이를 8 비트로 설정하십시오.
다음으로 커서 좌표에 대한 비트를 분할하고 클릭하여 클릭 한 다음 커서 비트를 X 및 Y 좌표로 별도로 분할합니다. 왼쪽 및 오른쪽 클릭도 동일합니다.
이제 통신에서 바이트 문자열을 얻고이를 좌표에 맞출 수 있도록 정수로 변환해야합니다.이를 디코딩 한 다음 정수로 형변환합니다.
이제 커서를 이동하기 위해 pyautogui moveto 함수를 사용합니다.이 함수는 정수 좌표를 인수로 받아 커서를 해당 위치로 이동합니다.
다음으로 클릭 수를 확인합니다. 마지막 2 비트와 pyautogui의 클릭 기능을 사용하여이를 수행합니다. 기본 클릭은 왼쪽 클릭이지만 오른쪽에 버튼 값을 선언하여 오른쪽으로 설정할 수 있습니다. 또한 클릭 수를 정의 할 수 있습니다. clicks 매개 변수를 2로 설정하여 두 번 클릭으로 설정합니다.
다음은 컴퓨터에서 실행할 완전한 Python 코드입니다.
import serial import pyautogui ser = serial.Serial ('com3', 9600) while 1: k = ser.read (8) cursor = k click = k x = cursor y = cursor l = click r = click xcor = int (x.decode ('utf-8')) ycor = int (y.decode ('utf-8')) pyautogui.moveTo (xcor, ycor) if l == 49: pyautogui.click (clicks = 2) elif r = = 49: pyautogui.click (button = 'right', 클릭 수 = 2)
Arduino Air Mouse 테스트
따라서 Air Mouse를 작동하려면 전원을 연결하십시오. Arduino Nano USB 슬롯 또는 7805 IC를 사용하는 5v 조정 전원 공급 장치에서 가져올 수 있습니다. 그런 다음 Bluetooth가 연결된 com 포트를 설정하여 Python 드라이버 스크립트를 실행하십시오. 스크립트가 실행되면 Bluetooth가 깜박이는 시간이 지연되는 것을 볼 수 있습니다. 이는 시스템에 연결되어 있음을 의미합니다. 그런 다음 작동을 위해 트리거 버튼을 클릭하면 좌표의 위치가 변경되는 것을 볼 수 있으며 왼쪽 또는 오른쪽 클릭을 원할 경우 먼저 왼쪽 또는 오른쪽 푸시 버튼과 트리거 버튼을 함께 누르면 클릭의 동작을 볼 수 있습니다. 커서의 변경된 위치.
아래 의 자세한 작동 비디오를 확인하십시오.