프로그래밍 / C++ / 언리얼

Programming/Arduino

[Arduino] 아두이노 조이스틱을 이용해서 쉽게 LED를 다루어 보자

아트성 2020. 7. 10. 21:46

 

 

 

 

   조이스틱모듈의 개요

 

어릴적 오락실에 다들 한번씩은 가봤을것이다. 게임기 화면을 쳐다보면서 문득 생각한다.

게임속에 있는 캐릭터는 어떻게 움직이는걸까?

조이스틱을 이용해 현란하게 캐릭터를 잘 움직여서 게임을 잘하는 친구들이 한명씩은 꼭 있었는데, 가끔가다 오락실 게임기 안에 캐릭터가 움직이면서 어떤방식으로 움직이는지 궁금해해본적이 있을것이다.

 

그럼 아두이노보드와 조이스틱 모듈을 통해서 게임기의 원리에 대해서 한번 알아보도록 하자.

 

 

   예제실습 - 조이스틱 모듈 작동확인

 

처음 핀 연결은 위와같이 연결시켜주면된다.

 

조이스틱 - 아두이노UNO 연결을 할때 VCC - 5V, GND - GND, VRX - A0, VRY - A1 각 포트에 맞게 연결시켜주면 된다. 나머지 하나 남은 핀은 스위치 핀인데, 이번시간에는 좌표값만 다룰것이기 때문에 4개의 선만 연결시켜준다.

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

void loop() {
  int val_0 = analogRead(A0);
  int val_1 = analogRead(A1);
  Serial.print("VRx : ");
  Serial.print(val_0);
  Serial.print("    ");
  Serial.print("VRy : ");
  Serial.println(val_1);
  delay(200);
}

 

코드는 위와같다. setup에 통신값을 9600으로 설정을 해준다.

 

그리고 조이스틱에서 받아들이는 아날로그값을을 시리얼모니터를 통해서 우리가 눈으로 확인을 해야되기 때문에 loop문에서 val_0, val_1이라고 되어있는 정수형타입을설정해 주도록 한다.

 

그 뒤로 print문을 이용해서 시리얼모니터로 불러오면된다.

 

 

컴파일 까지 마치고 조이스틱을 좌우, 위아래로 움직여 주면 시리얼 모니터의 x, y값이 바뀌는것을 확인할 수 있다.

 

근데 한가지 시리얼 모니터를 보게되면 문제점이 나타난다.

바로 조이스틱을 원위치로 돌려놓았을때 0의값을 가지지 않는다는것인데, 이 조이스틱은 흔하지 않는 좌표를 가지게 된다.

 

시리얼 모니터를 보면 별 탈 없이 움직이는것처럼 보이지만, 사실 조이스틱이 방향이 표시가 되어있지 않기때문에 어디로 움직여야 원하는 값을 도출 할 수있는지 알기란 쉽지가 않다.

 

이 조이스틱 좌표는 우리가 흔히 보는 데카르트 좌표계와는 좀 다른 특이한 좌표를 가진다.

 

그래서 우리가 기준을 정해둘 필요가 있다.

 

위의 사진을 보게되면 우측 상단에 조이스틱 표시가 되어있다. 조이스틱의 오른쪽으로 핀이 가도록 기준을 잡게되면

좌표값이 4사분면에서 2사분면으로 갈수록 0~1023(가운데는 500~520의 값을 가진다) 범위의 점점 커지는 모양의 좌표를 만들어 낼 수가있다.

 

 

 

   예제실습 - 조이스틱의 좌표에따라 바뀌는 LED

 

방금까지 시리얼 모니터로만 신호를 주고받았는데, 이번에는 이 신호를 가지고 LED로 표현해 보도록 하자.

회로 구성은 위와같다. 

 

붉은색 LED 2EA, 파란색 LED 2EA, 220Ω 4EA를 각각 준비한다.

그리고 왼쪽 LED부터 6, 5, 4, 3번핀에 순차적으로 연결시켜주고, GND끼리 연결시켜준다.

void setup() {
  Serial.begin(9600);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);  
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
}

void loop() {
  int val_0 = analogRead(A0);
  int val_1 = analogRead(A1);
  Serial.print("VRx : ");
  Serial.print(val_0);
  Serial.print("    ");
  Serial.print("VRy : ");
  Serial.println(val_1);
  delay(200);
  if (val_0 < 300) {
    digitalWrite(6, HIGH);
  }
  else if (val_0 > 700) {
    digitalWrite(5, HIGH);
  }
  else {
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
  }
  
  if (val_1 < 300) {
    digitalWrite(3, HIGH);
  }
  else if (val_1 > 700) {
    digitalWrite(4, HIGH);
  }
  else {
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
  }
}

코드는 위와 같은데, 아까 실험과 동일하게 val_0, val_1의 변수를 설정하고 시리얼 모니터를 통해 값을 확인한다.

 

조건은 x값이 300이하일때 붉은색 첫번째 LED(6번핀)가 켜지게되고, 700이상일때 두번째 LED(5번핀)가 켜지게 된다.

y값도 마찬가지로 700이상일때 첫번째 LED(4번핀)가, 300이하일때 파란색 두번째 LED(3번핀)이 켜지게 된다.

조이스틱을 원위치로 돌리게 되면 모든 전구가 꺼지는 조건식 또한 만들어 주도록 한다.

 

컴파일을 끝내게 되면 위와 같은 실험결과를 얻을 수 있다.

 

조이스틱은 아까 말한 오락실 뿐만아니라, 휴대용 게임기, RC카or 드론조종기 등 다양하게 쓰이고 있어서 가변저항기와 더불어서 활용도가 높다.

반응형