아두이노 조이스틱 인터랙티브 게임 - LED 피드백으로 방향 감지
부품 및 소모품
| 브레드보드 |
1개 |
| 점퍼 와이어 |
1세트 |
| LED (일반) |
1개 |
| 아두이노 우노 |
1개 |
| USB A-B 케이블 |
1개 |
| 아날로그 조이스틱 (제네릭) |
1개 |
프로젝트 개요
일반적인 아날로그 조이스틱의 X/Y축 아날로그 값과 버튼 입력을 읽어, 5개의 LED로 방향을 시각화하는 간단한 프로젝트입니다.
조이스틱 핀아웃 (일반적인 모듈 기준)
- VRx → 아날로그 핀 A0 (X축)
- VRy → 아날로그 핀 A1 (Y축)
- SW → 디지털 핀 2 (버튼, 풀업 저항 내장/외부 필요)
- VCC → 5V
- GND → GND
LED 매핑 (방향 표시)
| 핀 10 |
왼쪽 (X 최소, Y 중앙) |
| 핀 11 |
아래 (X 중앙, Y 최소) |
| 핀 9 |
오른쪽 (X 최대, Y 중앙) |
| 핀 8 |
위 (X 중앙, Y 최대) |
| 핀 7 |
버튼 눌림 (SW) |
코드
#define joyX A0
#define joyY A1
int button = 2;
int buttonState = 0;
void setup() {
pinMode(7, OUTPUT); // 버튼 LED
pinMode(button, INPUT_PULLUP); // 내부 풀업 사용
Serial.begin(9600);
pinMode(8, OUTPUT); // 위
pinMode(9, OUTPUT); // 오른쪽
pinMode(10, OUTPUT); // 왼쪽
pinMode(11, OUTPUT); // 아래
}
void loop() {
int xValue = analogRead(joyX); // 0~1023
int yValue = analogRead(joyY); // 0~1023
Serial.print(xValue);
Serial.print("\t");
Serial.println(yValue);
buttonState = digitalRead(button);
Serial.println(buttonState);
// 방향 판정 (임계값 기반, 중앙 부근은 모두 OFF)
// 왼쪽: X 매우 작음, Y 중앙 부근
if (xValue <= 10 && yValue >= 500 && yValue <= 520) {
digitalWrite(10, HIGH);
} else {
digitalWrite(10, LOW);
}
// 아래: Y 매우 작음, X 중앙 부근
if (yValue <= 10 && xValue >= 500 && xValue <= 520) {
digitalWrite(11, HIGH);
} else {
digitalWrite(11, LOW);
}
// 오른쪽: X 매우 큼, Y 중앙 부근
if (xValue >= 1010 && yValue >= 500 && yValue <= 520) {
digitalWrite(9, HIGH);
} else {
digitalWrite(9, LOW);
}
// 위: Y 매우 큼, X 중앙 부근
if (yValue >= 1010 && xValue >= 500 && xValue <= 520) {
digitalWrite(8, HIGH);
} else {
digitalWrite(8, LOW);
}
// 대각선 영역에서 양쪽 LED 켜짐 방지 (코너 케이스 처리)
if (xValue >= 1010 && yValue >= 1010) {
digitalWrite(9, LOW);
digitalWrite(8, LOW);
}
// 버튼 눌림 (LOW 액티브)
if (buttonState == LOW) {
Serial.println("Switch = Pressed");
digitalWrite(7, HIGH);
} else {
digitalWrite(7, LOW);
}
delay(100);
}
회로도
첨부 이미지 참조 (브레드보드 배선도)
개선 제안
- 임계값을 상수로 정의해 가독성 향상
- 데드존(Dead zone) 설정으로 중앙 부근 진동 방지
- 조이스틱 보정 루틴 추가 (시작 시 중앙값 자동 측정)
- 시리얼 플로터로 X/Y 파형 실시간 관찰 가능