조이스틱 이란?


움직임에 따라 저항값이 변하는 가변저항이 달려있어서 그 값을 이용해 움직임이나 방향등 표현에 활용 할 수 있는 모듈을 말한다.

90도 각도로 가변저항이 달려있고, Z축에 택트 스위치가 달려있어서 2축 + 1온/오프 제어가 가능한 모듈이다.

Untitled

실습


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

  pinMode(2, INPUT_PULLUP);

  for(int i=3;i<11;i++)
  pinMode(i, OUTPUT);

}

void loop() {
  int push = digitalRead(2);
  int x = analogRead(A0);
  int y = analogRead(A1);

  Serial.printf("push: %d\\nx: %d\\ny: %d\\n\\n", push, x, y);

  led(x,y);

  delay(100);
}

void led_all_Setup(bool b){
  for(int i=3; i<11; i++)
  digitalWrite(i, b);
}

void led(int x, int y){
  led_all_Setup(LOW);

  if(x == 505 && y == 512)
    return;

  if(x <= 0 && y<= 0)
  digitalWrite(3, HIGH);
  else if(x == 505 && y == 0)
  digitalWrite(4, HIGH);
  else if(x == 1023 && y == 0)
  digitalWrite(5, HIGH);
  else if(x == 0 && y == 512)
  digitalWrite(6, HIGH);
  else if(x == 1023 && y == 512)
  digitalWrite(7, HIGH);
  else if(x ==  && y == 1023)
  digitalWrite(8, HIGH);
  else if(x == 505 && y == 1023)
  digitalWrite(9, HIGH);
  else if(x == 1023 && y == 1023 )
  digitalWrite(10, HIGH);
}

PPT에 있는 코드는 위와 같지만, 이 코드에는 2가지 문제가 있다.

첫번 째 문제는, 아두이노의 표준 Serial 라이브러리는 printf 함수를 지원하지 않으므로, Serial.print나 Serial.println 함수를 이용해야 한다.

두번 째 문제는, LED를 ON하는 조건의 저항값이 정수로 딱 떨어지게 되어있어, 같은 모델이라도 장치마다 저항값에 오차범위가 조금씩 있는 조이스틱으로는 조작하기 쉽지않다. 따라서 if(else if)문의 조건을 조금 더 덜 엄격(?)하게 수정할 필요가 있다.

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

  pinMode(2, INPUT_PULLUP);

  for(int i = 3; i < 11; i++)
    pinMode(i, OUTPUT);
}

void loop() {
  int push = digitalRead(2);
  int x = analogRead(A0);
  int y = analogRead(A1);

  // Serial.printf를 Serial.print와 Serial.println으로 대체
  Serial.print("push: ");
  Serial.println(push);
  Serial.print("x: ");
  Serial.println(x);
  Serial.print("y: ");
  Serial.println(y);
  Serial.println();

  led(x, y);

  delay(100);
}

void led_all_Setup(bool b) {
  for(int i = 3; i < 11; i++)
    digitalWrite(i, b);
}

void led(int x, int y) {
  led_all_Setup(LOW);

  if(x == 505 && y == 512)
    return;

  if(x <= 0 && y <= 0)
    digitalWrite(3, HIGH);
  else if(x <= 509 && y == 0)
    digitalWrite(4, HIGH);
  else if(x == 1023 && y == 0)
    digitalWrite(5, HIGH);
  else if(x == 0 && y <= 509)
    digitalWrite(6, HIGH);
  else if(x >= 1020 && y >= 509 && y<= 520)
    digitalWrite(7, HIGH);
  else if(x == 0 && y >= 1020)
    digitalWrite(8, HIGH);
  else if(x == 510 && y >= 1020)
    digitalWrite(9, HIGH);
  else if(x == 1023 && y == 1023)
    digitalWrite(10, HIGH);
}

Untitled

시연 영상


https://dsm.leeyoonho.com/mo/sharing/x6wTY5QGA