DIY 아두이노 USB 게임 컨트롤러 - 나만의 고성능 게임패드 만들기
부품 및 소모품
| 스파크펀 Pro Micro - 5V/16MHz |
×1 |
아두이노 레오나르도 Pro Micro 또는 Atmega32U 기반 보드면 모두 가능 |
×1 |
| 스파크펀 푸시버튼 스위치 12mm (택트 스위치) |
×12 |
| 저항 10kΩ |
×1 |
커스텀 에칭 PCB 첨부된 PCB PDF 파일로 직접 제작 가능 |
×1 |
UTSOURCE 전자 부품 본 프로젝트용 모든 전자 부품 공급 |
×1 |
필요 도구 및 장비
- 염화 제2철 분말 (PCB 에칭용)
- 3D 프린터
- 무선 드릴/드라이버
앱 및 온라인 서비스
- 아두이노 IDE
- 오토데스크 퓨전 360 (케이스 설계용)
프로젝트 소개
영상
프로젝트 영상을 먼저 보시길 권장합니다.
소개
ElectroPunkz Labs에서 최근 작업한 "DIY 게이밍 USB 컨트롤러" 프로젝트입니다.
아이디어: 버튼과 아날로그 조이스틱을 갖춘 저렴한 Atmega32U 기반 USB 컨트롤러를 만들어 NFS, GTA, 하프라이프, 리틀 파이터 2 같은 게임을 즐기기.
두 가지 폼팩터로 제작: 첫 번째는 PS1/SNES 스타일, 두 번째는 아날로그 스틱과 버튼을 갖춘 정통 Xbox 스타일 USB 컨트롤러(아직 미완성).
이 글에선 V1인 PS1 레이아웃 컨트롤러를 만듭니다.
재료
하드웨어는 간단하고 구하기 쉽습니다(PCB 제외, 첨부된 PDF로 직접 제작 가능).
- 아두이노 레오나르도 / Pro Micro / Atmega32U 기반 보드
- 버튼 (택트 스위치)
- 커스텀 에칭 PCB (버튼 매트릭스 PDF 첨부)
- 10kΩ 저항
- 점퍼 와이어
UTSOURCE.net에서 본 프로젝트용 전자 부품 후원받았습니다. UTSOURCE.net에서 다양한 전자 부품 구매 가능합니다.
제작 과정 (배선, 조립 등)
기본 셋업 준비: 12개 푸시버튼을 Pro Micro와 풀다운 구성으로 연결. 회로도는 위와 같습니다.
브레드보드에서 테스트 후 위 회로도대로 PCB 제작.
OrCAD 캔던스로 PCB 설계 후 탑 레이어 PDF를 광택지에 출력.
광택지를 PCB 모양대로 잘라 동판 위에 올리고 열을 가해 잉크를 동판에 전사 (기본 토너 전사법, 제 영상 참고).
에칭액에 담가 PCB 에칭, 부품용 구멍 뚫으면 DIY 게임 컨트롤러 PCB 완성!
회로도에 맞춰 부품 실장하면 회로 완성.
회로 완성 후 퓨전 360으로 PCB 하우징/케이스 설계 및 3D 프린팅.
이제 코드 업로드하고 게임 즐기기만 남았습니다.
코드
Pro Micro에 제공된 코드 업로드.
조언: 보드/셋업 철저히 테스트하세요. PCB 트레이스의 저항과 연결성 확인 필수. 그라운드 라인 누락 시 핀에 불규칙 신호가 가 Pro Micro가 랜덤 키를 계속 누르게 돼 재프로그래밍이 매우 어려워집니다.
테스트
메모장 열고 컨트롤러 키 눌러 할당된 문자가 제대로 나오는지 확인. 또는 키보드 테스트 앱/웹앱 활용.
코드대로 잘 작동하면 아무 게임이나 실행해 DIY 게이밍 콘솔로 플레이!
영상 참고하세요.
향후 개선 사항
아날로그 조이스틱 추가해 마우스로 플레이어 이동하는 게임(엑스박스 원 컨트롤러 스타일) 제대로 즐길 수 있게 할 예정.
V2는 엑스박스 원 컨트롤러 레이아웃의 제대로 된 PCB로 제작 예정. 기대해주세요.
문제 있으면 댓글 남겨주세요!
코드
CODE C/C++
#include
int WPin = 2; // UP
int SPin = 3; // DOWN
int APin = 4; // LEFT
int DPin = 5; // RIGHT
int UPLpin = 7; // upper left Q
int UPRpin = 9; // upper right E
int Xpin = 14; // X
int Apin = 10; // I
int Ypin = 15; // Y
int Bpin = 16; // B
void setup() {
pinMode(WPin, INPUT);
pinMode(SPin, INPUT);
pinMode(APin, INPUT);
pinMode(DPin, INPUT);
pinMode(UPLpin, INPUT);
pinMode(UPRpin, INPUT);
pinMode(Xpin, INPUT);
pinMode(Apin, INPUT);
pinMode(Ypin, INPUT);
pinMode(Bpin, INPUT);
digitalWrite(WPin, HIGH);
digitalWrite(SPin, HIGH);
digitalWrite(APin, HIGH);
digitalWrite(DPin, HIGH);
digitalWrite(UPLpin, HIGH);
digitalWrite(UPRpin, HIGH);
digitalWrite(Xpin, HIGH);
digitalWrite(Apin, HIGH);
digitalWrite(Ypin, HIGH);
digitalWrite(Bpin, HIGH);
Keyboard.begin();
}
void loop() {
if (digitalRead(WPin) == 0) { Keyboard.write('W'); delayMicroseconds(1); }
if (digitalRead(SPin) == 0) { Keyboard.write('S'); delayMicroseconds(1); }
if (digitalRead(APin) == 0) { Keyboard.write('A'); delayMicroseconds(1); }
if (digitalRead(DPin) == 0) { Keyboard.write('D'); delayMicroseconds(1); }
if (digitalRead(UPLpin) == 0) { Keyboard.write('q'); delayMicroseconds(1); }
if (digitalRead(UPRpin) == 0) { Keyboard.write('e'); delayMicroseconds(1); }
if (digitalRead(Xpin) == 0) { Keyboard.write('x'); delayMicroseconds(1); }
if (digitalRead(Apin) == 0) { Keyboard.write('i'); delayMicroseconds(1); }
if (digitalRead(Ypin) == 0) { Keyboard.write('y'); delayMicroseconds(1); }
if (digitalRead(Bpin) == 0) { Keyboard.write('b'); delayMicroseconds(1); }
}
커스텀 파트 및 인클로저
퓨전 360 설계 파일 등
회로도
회로도 파일들