예전에 학생시절에는 PSP를 참 갖고 싶어했습니다. 지하철에서 플레이 하는 사람들을 보면 참 부러웠었지요.
그리고 세월이 지나 지금. PSP는 과거의 유물이 되었고 지금은 다들 스마트폰을 들고 다닙니다. 그리고 PPSSPP란 에뮬레이터가 나와서 PSP게임을 굴릴 수 있게 되었습니다.
하지만 터치인터페이스는 무진장 게임하기 불편했습니다. 그래서 스마트폰용 조이패드를 차던중 이런 녀석이 있더군요.
로지텍 파워쉘입니다. 문제는 이놈은 아이폰 전용이었고 범용성은 내다 버린 것이 문제였습니다. 사실 전 이런놈이 있는 줄도 몰랐는데 누가 컨셉 겹친다고 해서 찾아봤더니 있더군요. 결국 덤핑했다는 후문이 있지만...
어쨌거나 저는 대충 연구실에서 시간 나는대로 게임용 컨트롤러를 만들기로 했습니다.
그래서 만든 것이 바로 위의 물건입니다. 아직 하우징은 만들어지지 않았고 동작만 되는 형편입니다.
일단 제작을 위한 준비물은...
일단 준비물은 아두이노를 썼으니 아두이노가 필요하겠지요. 크기가 크면 문제가 많으므로 작은 모델이 필요합니다. 그리고 조이패드로 인식 시켜야 했으므로 Leonardo와 호환되어야 했지요. 그래서 찾은 모델이 이 모델입니다. 위의 것은 SparkFun 정품이고 아래의 물건은 그것의 호환 제품입니다. 어떤 것을 써도 상관없습니다. 개인적으로 호환품도 크게 문제는 없었습니다.
(프로 마이크로 입니다. 프로 미니, 나노 아니에요!)
버튼도 SparkFun제품을 사용했습니다. 이런 식을 나온 버튼이 상당히 누르는 것이 좋더군요. 하우징 설계할 때도 편리합니다. 뭣하면 다른 스위치를 써도 그만입니다.
조이패드도 SparkFun 호환품으로 구입. 사실 아두이노 키트사면 들어있어요.
그리고 대망의 스마트폰 고정 가이드는 없는 것 빼고 다 판다는 Coms의 제품입니다. 진짜 이 회사의 내부가 궁금합니다. 매번 있을까? 라고 생각하면 있습니다. 우리나라에서 이런 회사가 있다는 것이 자랑스럽습니다.
그외에 준비물로는 부품 고정용 만능 기판 PCB(대충 사서 톱으로 썰어야 합니다.)와 USB OTG케이블, 그리고 USB micro B 케이블(스마트폰 데이터 케이블도 상관없습니다.) 다 Coms에서 팔아요....
음...배선을 깜빡했네요. 배선은.... 그냥 아두이노 책을 보시고 해주시길 바랍니다.(...)
버튼들은 GND와 각 디지털 핀.(Tact스위치는 4개의 다리 중 대각선으로 해주시는 것이 정신건강에 좋습니다. 2개씩은 사실 하나의 다리라 헷갈리면 X되요.
// Simple example application that shows how to read four Arduino // digital pins and map them to the USB Joystick library. // // The digital pins 9, 10, 11, and 12 are grounded when they are pressed. // // NOTE: This sketch file is for use with Arduino Leonardo and // Arduino Micro only. // // by Matthew Heironimus // 2015-11-20 //--------------------------------------------------------------------
이렇게 지원합니다. 즉, 엑스박스 패드의 형식을 그대로 지원하고 엑스박스 패드를 지원하는 게임에서 정상적으로 작동되게 할 수 있습니다.
제가 만든 구조는
왼쪽 4개의 버튼은 방향키로
아래의 아날로그는 HAT으로
오른쪽은 버튼으로 인식되게 했습니다.
하지만 마음을 먹으면 아날로그 스틱을 2개 달고 엑스박스 패드처럼 만들 수도 있는 것이지요.
그래서 이번에 수정한 소스를 공개합니다.
#include <Joystick.h>
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,JOYSTICK_TYPE_GAMEPAD, 5, 1, // Button Count, Hat Switch Count true, true, false, // X and Y, but no Z Axis false, false, false, // No Rx, Ry, or Rz false, false, // No rudder or throttle false, false, false); // No accelerator, brake, or steering
int lastDpadState[]={0,0,0,0}; int lastButtonState[]={0,0,0,0,0,0,0}; int lastSWState=0;