조이스틱은 직관적인 인터페이스 덕분에 활용성이 높으면서도 복잡하지 않아
여러가지 응용 작품을 만들때 자주 사용된다.
주로 움직임 동작이 필요한 RC카 제어나, 드론, 게임기 제어 등에 사용된다.
따라서 조이스틱의 기본 사용법을 익혀보면 여러가지 프로젝트에 도움이 많이 될 것이다.
이번 시간은 조이스틱 모듈의 기본적인 동작원리에 대해 다루어보도록 하겠다.
JoyStick Specification
1. 동작전압 : DC 5V
2. X, Y, Z : X & Y (0 ~ 5V), Z(0 or 1)
3. 특징: 스틱의 움직임에 따라 아날로그 전압값을 출력하는 모듈로서,
스틱이 가운데 있을 때는 VRx, VRy 모두 2.5V의 중간 전압값이 출력 된다.
스틱을 상하좌우로 움직임에 따라, VRx, VRy 단자로 각각 0V ~ 5V 사이의 아날로그 전압을 출력한다.
(** 따라서, 아두이노의 A0 ~ A6 포트로 입력 받아 처리한다.)
** 조이스틱은 사실 Potentiometer 라고 말할 수 있다.
입력된 전압 값을 기계적인 스틱의 위치 변화(저항값)로 인해 조절하여 출력해주기 때문이다.
그래서 아두이노에서는 아날로그 포트(A0 ~ A6)를 통해서 입력받아야 조이스틱으로서의
기능적인 부분들을 처리할 수 있다. 왜냐하면 조이스틱의 경우 상하좌우 끝 점의 값(디지털 1, 0)만
사용되는 것이 아니라, 조이스틱이 움직이는 중간 값들이 존재하고, 또 그 값들이 필요하기 때문이다.
아날로그 출력 값은 조이스틱에 연결된 전압값(5V)를 기준으로 최소값(0V)와 최대값(5V)이 출력되는데
조이스틱을 움직이지 않은 상태에서 정 가운데 위치하기 때문에 VRx와 VRy 출력 값이 약 2.5V가 출력된다.
(스틱의 기계적인 부분이 있어, 약간의 오차가 있을 수 있다.)
상 (+X)
하 (-X)
좌 (-Y)
우 (+Y)
즉, 조이스틱 모듈의
1. VRx 단자 출력값: 0V(최하단) ~ 2.5V(중간) ~ 5V(최상단)
2. VRy 단자 출력값: 0V(최상단) ~ 2.5V(중간) ~5V(최하단)
형태로 전압이 출력이 된다. (물론, 상하좌우나 대각선 등의 중간(전압)값도 존재한다.)
이런 전압을 아두이노에서 아날로그 포트로(A0 ~ A6) 값을 입력받으며
아날로그 전압값을 디지털 수치값으로 변환시켜주는 ADC(컨버터)로 인해,
0 ~ 5V 전압이 0 ~ 1023 수치값으로 변환된다. (analogRead() 함수 사용)
그러면, 아두이노에서 쉽게 데이터 처리가 가능해지는 것이다.
>> 실습 목표:
1. 조이스틱 모듈의 구조와 동작원리에 대해 이해할 수 있다.
2. 조이스틱 모듈에서 사용하는 함수에 대해 이해하고 활용할 수 있다.
3. 기본 회로를 연결하여 조이스틱의 움직임에 따른 데이터 값을 시리얼 모니터로 확인할 수 있다.
>> 실습 회로도면
[회로 1] - SW를 아날로그 단자에 연결
스위치 눌림에 따라 값이 입력되도록 하였으며, 따라서 눌림의 정도가 일정하지 않음
(일반적으로 SW는 디지털 단자로 연결해서 사용하면 되는데,
아날로그 단자로 연결해서 digitalRead()로 읽어서, 누르는 정도에 따라 HIGH, LOW 인식이 되도록 하기 위해
회로상 아날로그 단자로 연결해 본 것임. 활용하기에 따라서 디지털 단자 연결에 비해 HIGH, LOW 구분이 안될 수 있음
제대로 된 처리를 위해서 풀업저항이 필요하며 4.7kΩ 을 연결하였는데, 풀업저항은 1kΩ ~ 10kΩ 사이값을 사용할 수 있음)
/*조이스틱의 SW를 아날로그 입력으로 처리*/
void setup()
{
Serial.begin(9600);
}
void loop()
{
// 입력 값을 -100 ~ 100 사이의 값으로 매핑(치환) 한다.
int JoX = map(analogRead(A0), 0, 1023, -100, 100);
int JoY = map(analogRead(A1), 0, 1023, -100, 100);
Serial.print("Jo X : ");
Serial.print(JoX);
Serial.print("Jo Y : ");
Serial.Println(JoY);
// 조이스틱의 스위치 기능에 대한 정의
if (digitalRead(A2))
{
Serial.println("Off");
}
else
{
Serial.println("On");
}
delay(500); //0.5sec
}
[회로 1] - SW를 디지털 단자 D2에 연결
스위치를 디지털 단자에 연결하여 입력의 HIGH / LOW 신호값 구분을 확실하게 하였음.
단 1kΩ ~ 10kΩ 사이의 풀업 저항 연결이 필요함
/*조이스틱의 SW를 디지털 입력으로 처리*/
#define SW 2
void setup()
{
Serial.begin(9600);
pinMode(SW, INPUT);
}
void loop()
{
// 입력 값을 -100 ~ 100 사이의 값으로 매핑(치환) 한다.
int JoX = map(analogRead(A0), 0, 1023, -100, 100);
int JoY = map(analogRead(A1), 0, 1023, -100, 100);
Serial.print("Jo X : ");
Serial.print(JoX);
Serial.print("Jo Y : ");
Serial.Println(JoY);
// 조이스틱 SW에서는 눌렀을 때 0, 떼었을 때 1이 출력되나,
// 반대가 되도록 '!'로 반전
Serial.println(!digitalRead(SW));
delay(300); // 0.3sec
}
>> 실습 절차:
1. 부품을 준비하여 위와 같은 회로를 구성한다.
2. 아래 코드를 작성하고 프로그램을 업로드후 실행
3. 시리얼 모니터 창을 띄운 후 조이스틱을 움직여보면서 데이터 값이 올바르게 출력이 되는지 확인
4. 이러한 구성으로 응용 제어 아이디어 구상
int x = A0;
int y = A1;
void setup()
{
Serial.begin(9600);
}
void loop()
{
int x_val = analogRead(x);
int y_val = analogRead(y);
Serial.print("x: ");
Serial.print(x_val);
Serial.print(" / ");
Serial.print("y : ");
Serial.println(y_val);
delay(500);
}
Analog -> 1024
default -> middle value (512)
Minimum : 0 // Maximum : 1023
'Firmware & Embedded > Components' 카테고리의 다른 글
DC Motor (0) | 2022.11.16 |
---|---|
L9110S (Motor Driver Module) (0) | 2022.11.16 |
Stepping Motor (0) | 2022.11.08 |
Arduino Serial (to Python) (0) | 2022.10.31 |
Sequential Brightness LED using Button (0) | 2022.10.14 |