아두이노 조이스틱 제어 마우스: 정밀 커서 네비게이션
부품 및 소모품
| 부품 | 수량 |
| Arduino UNO | 1 |
| 듀얼 축 조이스틱 | 1 |
앱 및 온라인 서비스
- Arduino IDE
- IDLE (Python GUI)
프로젝트 소개
마우스나 트랙패드 대신 조이스틱으로 컴퓨터 커서를 제어하는 프로젝트입니다. 조이스틱은 X, Y축으로 커서를 움직일 수 있으며, 내장된 스위치로 클릭 기능도 수행합니다.
기본 원리
조이스틱은 기본적으로 X, Y 방향으로 배치된 두 개의 가변저항(포텐쇼미터)으로 구성됩니다. 아두이노는 조이스틱에서 0~1023 범위의 아날로그 값을 읽습니다. 조이스틱이 중앙(기본 위치)에 있을 때 값은 512(0~1023 사이) 부근이 됩니다.
아두이노 스케치는 조이스틱이 중앙에서 벗어나면 -감도 ~ +감도 범위(기본값 10)의 값을 출력하도록 프로그래밍되어 있습니다. 극단으로 밀면 10, 반대쪽이면 -10이 출력됩니다.
X, Y 방향 값을 구분하기 위해 : 구분자를 사용합니다. 예: 5:-3:0 (X=5, Y=-3, 스위치=0). 조이스틱 버튼(SW) 상태(1/0)는 X, Y 값 뒤에 출력됩니다.
컴퓨터가 이 값을 인식하려면 Python의 mouse 모듈(구 pyautogui)이 필요합니다.
Python 프로그래밍
준비 사항: Python 3가 설치되어 있어야 합니다. 설치 후 Python 실행 파일 경로를 복사해 두세요.
명령 프롬프트에서 실행:
cd <Python 파일 경로>
py -m pip install --upgrade pip
py -m pip install mouse
py -m pip install pyserial
mouse 모듈은 마우스 동작을, pyserial은 아두이노와 시리얼 통신을 담당합니다.
Python 프로그램은 아두이노가 출력한 데이터를 읽어 X, Y 방향 값과 스위치 상태를 파싱합니다. 현재 커서 좌표는 mouse.get_position()으로 얻고, 조이스틱 이동량만큼 더해 mouse.move(X+x, Y+y)로 커서를 이동시킵니다. 스위치가 눌리면(z == 1) mouse.click(button="left")로 좌클릭을 수행합니다.
최종 실행
- 아두이노 스케치를 업로드하고 회로도대로 조이스틱을 연결합니다.
- Python 스케치를 메모장에 복사해
ArduinoSerial = serial.Serial('COM3', 9600) 부분의 COM 포트를 장치 관리자에서 확인한 아두이노 포트로 수정 후 .py로 저장합니다.
- IDLE(Python GUI)에서 파일을 열고 Run → Run Module(F5)을 실행합니다.
- 오류가 없으면 조이스틱을 움직여 커서가 따라오는지 확인합니다. 오류 시 IDLE 재시작 후 COM 포트 재확인하세요.
코드
아두이노 코드
//////////////////////////////////
// Joystick controlled mouse
// by Shubham Santosh
/////////////////////////////////
void setup() {
Serial.begin(9600);
pinMode(9, INPUT); // SW 핀
digitalWrite(9, HIGH);
}
int prev_state = 0; // 스위치 이전 상태
void loop() {
int z = 0, xpos = 0, ypos = 0;
int x = analogRead(A0);
int y = analogRead(A1);
int sensitivity = 10; // 편의에 따라 조절
if (x >= 550) xpos = map(x, 550, 1023, 0, sensitivity); // 위
if (x <= 450) xpos = map(x, 450, 0, 0, -sensitivity); // 아래
if (y >= 550) ypos = map(y, 550, 1023, 0, sensitivity); // 오른쪽
if (y <= 450) ypos = map(y, 450, 0, 0, -sensitivity); // 왼쪽
int curr_state = digitalRead(9);
if (curr_state == 1 && prev_state == 0) z = 1; // 스위치 눌림 감지
else z = 0;
if (xpos != 0 || ypos != 0 || z == 1) {
Serial.print(xpos); Serial.print(":");
Serial.print(ypos); Serial.print(":");
Serial.println(z);
}
prev_state = curr_state;
delay(10);
}
Python 코드
# Joystick controlled mouse
# By Shubham Santosh
# last edited 12/11/2020
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 = mouse.get_position()
x, y = int(x), int(y)
mouse.move(X + x, Y - y) # Y축 반전 주의
if '1' in z:
mouse.click(button="left")
회로도
조이스틱 VCC → 5V, GND → GND, VRx → A0, VRy → A1, SW → D9 (풀업 저항 내부 사용)