본문 바로가기
Study/Coding

ITS-1500S를 사용하여 핀하나로 조이스틱 버튼 구성하기

by LovEnable 2020. 12. 21.

 

ITS-1500 시리즈 버튼은 디지털 버튼으로 5개의 스위치가 연결되어있는 버튼입니다.

형태는 일반 스위치가 아니라 조이스틱 버튼 모양으로 생겼는데, 디지털 신호로 출력됩니다.

아날로그 값으로 출력이 되지 않으므로 조이스틱으로는 사용이 어렵지만, 메뉴 선택등의 용도로는 적당한 형태입니다.

그렇지만 일반적인 조이스틱모듈이 X, Y축 혹은 X, Y축 + 버튼으로 구성되어있는 것에 비해 X상, X하, Y상, Y하, 버튼으로 구성되어 있어서 더 많은 핀이 사용됩니다.

이것을 전압분배에 따라 스위치의 값이 다르게 나오도록 저항을 구성하면 하나의 핀으로 5개의 입력을 받을 수 있습니다. 대신 입력을 받을때는 아날로그 값으로 받아야 합니다.

출처 : https://www.instructables.com/How-to-access-5-buttons-through-1-Arduino-input/

다음과 같은 방식으로 회로를 구성하면 하나의 핀으로 입력을 받을 수 있습니다. 이 버튼외에도 핀이 부족한 경우에 응용이 가능한 방식입니다.

 

#define VALUE_BUT_TRIM_LEFT   255   //← 255
#define VALUE_BUT_TRIM_RIGHT  63    //→ 63
#define VALUE_BUT_TRIM_UP     50    //↑ 50
#define VALUE_BUT_TRIM_DOWN   84    //↓ 84
#define VALUE_BUT_TRIM_PUSH   127   //○ 127

#define STATE_BUT_TRIM_NONE   0
#define STATE_BUT_TRIM_LEFT   1
#define STATE_BUT_TRIM_RIGHT  2
#define STATE_BUT_TRIM_UP     3
#define STATE_BUT_TRIM_DOWN   4
#define STATE_BUT_TRIM_PUSH   5

#define butTrimPin  A7

int butTrimOffset = 5;

int trimInputADC = 0;
int trimMapADC = 0;

int butState = 0;
int oldButState = 0;

int trimPitch = 0;
int trimRoll  = 0;


void setup()
{
  Serial.begin(9600);
}

void loop()
{
  trimInputADC = analogRead(butTrimPin);
  trimMapADC =  map(trimInputADC, 0, 1023, 0, 255);

  if (trimMapADC < 0 + butTrimOffset)                                                                                   butState = STATE_BUT_TRIM_NONE;
  else if ((trimMapADC < VALUE_BUT_TRIM_LEFT + butTrimOffset) && (trimMapADC > VALUE_BUT_TRIM_LEFT - butTrimOffset))    butState = STATE_BUT_TRIM_LEFT;
  else if ((trimMapADC < VALUE_BUT_TRIM_RIGHT + butTrimOffset) && (trimMapADC > VALUE_BUT_TRIM_RIGHT - butTrimOffset))  butState = STATE_BUT_TRIM_RIGHT;
  else if ((trimMapADC < VALUE_BUT_TRIM_UP + butTrimOffset) && (trimMapADC > VALUE_BUT_TRIM_UP - butTrimOffset))        butState = STATE_BUT_TRIM_UP;
  else if ((trimMapADC < VALUE_BUT_TRIM_DOWN + butTrimOffset) && (trimMapADC > VALUE_BUT_TRIM_DOWN - butTrimOffset))    butState = STATE_BUT_TRIM_DOWN;
  else if ((trimMapADC < VALUE_BUT_TRIM_PUSH + butTrimOffset) && (trimMapADC > VALUE_BUT_TRIM_PUSH - butTrimOffset))    butState = STATE_BUT_TRIM_PUSH;

  if (butState != oldButState)
  {
    if (butState == STATE_BUT_TRIM_UP)
    {
      trimPitch = trimPitch + 10 ;
    }
    else if (butState == STATE_BUT_TRIM_DOWN)
    {
      trimPitch = trimPitch - 10 ;
    }
    else if (butState == STATE_BUT_TRIM_LEFT)
    {
      trimRoll = trimRoll + 10 ;
    }
    else if (butState == STATE_BUT_TRIM_RIGHT)
    {
      trimRoll = trimRoll - 10 ;
    }
    else if (butState == STATE_BUT_TRIM_PUSH)
    {
      trimRoll = 0;
      trimRoll = 0;
    }
    oldButState = butState;
  }


  Serial.print(trimInputADC);
  Serial.print("\t");
  Serial.print(trimMapADC);
  Serial.print("\t");
  Serial.print(butState);
  Serial.print("\t");
  Serial.print(trimPitch);
  Serial.print("\t");
  Serial.print(trimRoll);
  Serial.println("");
}

 

코드는 이런식으로 작성해보았습니다.

입력된 값을 피치와 롤값으로 구분하고 계속 누르고 있으면 유지되는 만큼 계속 증가되도록 하였습니다.