ITS-1500 시리즈 버튼은 디지털 버튼으로 5개의 스위치가 연결되어있는 버튼입니다.
형태는 일반 스위치가 아니라 조이스틱 버튼 모양으로 생겼는데, 디지털 신호로 출력됩니다.
아날로그 값으로 출력이 되지 않으므로 조이스틱으로는 사용이 어렵지만, 메뉴 선택등의 용도로는 적당한 형태입니다.
그렇지만 일반적인 조이스틱모듈이 X, Y축 혹은 X, Y축 + 버튼으로 구성되어있는 것에 비해 X상, X하, Y상, Y하, 버튼으로 구성되어 있어서 더 많은 핀이 사용됩니다.
이것을 전압분배에 따라 스위치의 값이 다르게 나오도록 저항을 구성하면 하나의 핀으로 5개의 입력을 받을 수 있습니다. 대신 입력을 받을때는 아날로그 값으로 받아야 합니다.
다음과 같은 방식으로 회로를 구성하면 하나의 핀으로 입력을 받을 수 있습니다. 이 버튼외에도 핀이 부족한 경우에 응용이 가능한 방식입니다.
#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("");
}
코드는 이런식으로 작성해보았습니다.
입력된 값을 피치와 롤값으로 구분하고 계속 누르고 있으면 유지되는 만큼 계속 증가되도록 하였습니다.
'Study > Coding' 카테고리의 다른 글
아두이노 float 값을 byte 배열로 저장하기 (0) | 2020.12.22 |
---|---|
nRF52DK 보드를 디버거로 사용하기 (0) | 2020.12.21 |
UART 간단하게 스위치하기 (0) | 2020.12.18 |
8MHz 이하의 아두이노 보드에서 WS2812(네오픽셀) 사용하기 (0) | 2020.12.18 |
여러 아날로그 센서값 출력 (1) | 2016.01.19 |