조종기에 해당하는 글 1

[아두이노] 게임 조종기 아두이노

IOT/아두이노|2019. 7. 3. 09:00

[아두이노] 게임 조종기 아두이노



오늘은 모바일 게임을 모모앱플레이어로 했을 때 PC에서 조정이 가능합니다. 이 때 게임 조정키를 키보드로 세팅해놓으면 이전 시간에 아두이노 키보드를 이용하면 모바일 게임을 조정할 수 있게 됩니다. 여기서, 키보드 방향 조정을 조이스틱으로 표현하면 좀 더 조정기 다운 표현이 되겠죠.


아두이노 마이크로에서 게임 조정기를 만들어 볼까요.

1. 방향키 제어 복습



사전학습에 가시면 조이스틱을 방향키를 조절하는 방법에 대해 나와 있습니다.

[기본소스]

  if(analogRead(AXIS_X)<=300){
    Serial.println('a');
  }
  else if(analogRead(AXIS_X)>=700){
    Serial.println('d');   
  }
  //Y축 방향값
  if(analogRead(AXIS_Y)<=300){
    Serial.println('w');      
  }
  else if(analogRead(AXIS_Y)>=700){
    Serial.println('s');
  }

X축과 Y축의 아날로그 신호값을 나눠서 X축 방향으로 300이하면 왼쪽(a)키이고 700이상은 오른쪽(d)키이다. Y축 방향으로 300이하면 위쪽(w)키이고 700이상이면 아래쪽(s) 키이다 라고 정의해 놓았으면 아두이노 마이크로에서 키보드 라이브러리로 이용하면 아래와 같이 코딩하면 됩니다.

  //X축 방향값
  if(AXIS_X<=300){
     Keyboard.press('a');
     delay(50);
  }
  else if(AXIS_X>=700){
     Keyboard.press('d');
     delay(50);
  }
  else{
    Keyboard.release('a');
    Keyboard.release('d');  
  }
  //Y축 방향값
  if(AXIS_Y<=300){
    Keyboard.press('w');
    delay(50);
  }
  else if(AXIS_Y>=700){
    Keyboard.press('s');
    delay(50);    
  }
  else{
    Keyboard.release('w');
    Keyboard.release('s');
  }

비슷한데 좀 차이가 있죠. 키고 눌름 press()함수를 키 누름을 표현하지만 조이스틱이 키누름 값을 갖지 않을 때에만 해제 release() 함수로 표현 했습니다. 왜! 이렇게 표현했을까요.

Keyboard.press('a');
delay(100);
Keyboard.release('a');

가 한쌍으로 키 클릭을 표현했었죠. 이렇게 하면 0.1초간 눌러지고 키가 해제해 버립니다. 즉 순간 찰라에 키가 누르고 해제되면 조이스틱의 조정 방향으로 움찍하다가 끝나버리게 됩니다. 지속성이 사라져버리는 것이죠. 그렇기 때문에 조정키가 계속 지속성을 조이스틱의 키 누름 상태를 계속 유지해야 합니다. 그러면 release()함수를 쓰지 말아야 합니다. 이때 해제 함수를 안쓰면 계속 특정 키가 눌러지니깐 이때 문제가 생기기 때문에 조이스틱 방향으로 움직일 때는 키 누름을 하고 움직이지 않을 때는 키 누름을 해제하게 코딩을 하면 되겠죠. else 이하문에서 키누름을 해제하는 함수를 표현하여 조정 안하고 있을 때 키누름의 문제가 해결 됩니다.

좀 코딩이 약간 길어 졌지만 이렇게 표현하면 조이스틱으로 좀 더 자연스럽게 조정이 됩니다. 이방법은 문득 떠오른 생각을 코딩한 거라 최근 일이 있어서 집중을 못하고 그냥 대충 표현한 코딩이네요. 이 방법이 아닌 더 좋은 방볍으로 조이스틱을 방향키로 조절을 해보세요.

2. 아두이노 조이스틱 게임 조정기 회로도


  • 준비물 : 조이스틱 1개, 스위치버턴 1개, LED 1개, 저항 220옴 1개, 스위치버턴 5개, 아두이노 마이크로
  • 내용 : 조이스틱 xAxis, yAxis축은 A0, A1 핀에 연결하고 방향스위치버턴은 3,4,5,6번에 연결하시오. 인터럽트스위치버턴은 2번에 연결하고 LED 7번에 연결하면 됩니다.


조이스틱은 X,Y축값만 사용합니다. 스위치버턴은 사용하지 않았습니다. 위 그림에서 스위치버턴중 노란전선색의 스위치버턴은 인터럽트스위치로 아두이노 조이스틱 게임 조정기의 사용 가능/불가를 나타내고 나머지 스위치는 스킬키버턴으로 사용됩니다. Green LED은 게임 조정기의 사용 가능/불가 상태를 시각적으로 표현는데 사용합니다.

3. 코딩



**설계 : **

  • 조이스틱 방향키(위쪽-w, 아래쪽-s, 왼쪽-a, 오른쪽-d)로 조정
  • 스킬키 4개의 키보드 키는 "u,i,o,p"로 조정(스위치버턴의 한계로 스킬장 전환은 못함)
  • 실험 게임(검사 모바일)

[검사모바일] - 아두이노 게임 조정기를 만들어 단순히 게임을 컨트롤 해보기 위해서 1회 실험 목적으로 사용함.


대충 가상 키들을 방향키와 스킬키로 나누어 배치해 놓았습니다.

다음으로는 코딩인데 스킬키는 스위치버턴으로 키보드 키값을 누름을 표현했던 아두이노 키보드 제어편의 내용을 그대로 적용하면 되고 조이스틱 방향키만 위에서 복습한 내용을 아두이노 키보드 제어편 소스를 합치면 됩니다.

종합해보면,

#include <Keyboard.h>

const byte interruptPin = 2;
boolean state = true;

const byte xAxis = A0;         //X axis
const byte yAxis = A1;         //Y axis
const byte Pin_U = 3;
const byte Pin_I = 4;
const byte Pin_O = 5;
const byte Pin_P = 6;
const int ledPin = 7;         // Mouse control LED 

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(Pin_U, INPUT_PULLUP); 
  pinMode(Pin_I, INPUT_PULLUP);
  pinMode(Pin_O, INPUT_PULLUP);
  pinMode(Pin_P, INPUT_PULLUP);
  
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), exchange, FALLING);  //인터럽트 발생 시 호출
  
  Keyboard.begin();
}

void loop() {
  
  if(state==false){ //인터럽트스위치 버턴에 의해서 열림/닫힘
    int AXIS_X = analogRead(xAxis);
    int AXIS_Y = analogRead(yAxis);
     
  //X축 방향값
  if(AXIS_X<=300){
     Keyboard.press('a');
     delay(50);
  }
  else if(AXIS_X>=700){
     Keyboard.press('d');
     delay(50);
  }
  else{
    Keyboard.release('a');
    Keyboard.release('d');  
  }
  //Y축 방향값
  if(AXIS_Y<=300){
    Keyboard.press('w');
    delay(50);
  }
  else if(AXIS_Y>=700){
    Keyboard.press('s');
    delay(50);    
  }
  else{
    Keyboard.release('w');
    Keyboard.release('s');
  }
    
  //스킬키 제어
  if(digitalRead(Pin_U) == LOW){
    Keyboard.press('u');
    delay(100);
    Keyboard.release('u');
  }
  if(digitalRead(Pin_I) == LOW){
    Keyboard.press('i');
    delay(100);
    Keyboard.release('i');      
  }
  if(digitalRead(Pin_O) == LOW){
    Keyboard.press('o');
    delay(100);
    Keyboard.release('o');      
  }
  if(digitalRead(Pin_P) == LOW){
    Keyboard.press('p');
    delay(100);
    Keyboard.release('p');      
  }     
 }  
}
void exchange() { //인터럽트스위치버턴  이벤트
 state=!state;
 digitalWrite(ledPin, !state);
}

방향키 IF문과 스킬키 스위치버턴 IF문 두개만 자세히 보시면 그렇게 어렵지 않을꺼에요.

4. 결과



아래 실험영상은 우선 인터럽트 스위치 버턴은 게임조성기를 활성화 하는 버턴입니다. 불이 들어오면 게임조정기를 조정할 수 있고 불이 안들어오면 게임 조정기를 사용할 수 없습니다. 한손으로 촬영하고 한손으로 조정하다 보니 케릭터 방향조정 따로 스킬키 동작 따로 단순한 동작만 실험했네요. 감안하시고 대충 이런 느낌으로 아두이노 조정기로 게임을 조정할 수 있구나 정도로 이해하시면 됩니다.


실험하려고 잠깐 검사모바일 게임 케릭터를 하나 만들어서 테스트 해 봤네요.

마무리


며칠 바빠서 post를 작성 할 시간도 스팀잇 접속도 어려웠네요. 오늘도 겨우 짬내서 급하게 코딩을 만들고 실험을 했네요. 코딩해 놓은게 별로 맘에 들지 않네요. 원하는 스타일도 아니고 대충 느낌만 전달하고자 간단히 실험했습니다.


댓글()