움직임에 따라 저항값이 변하는 가변저항이 달려있어서 그 값을 이용해 움직임이나 방향등 표현에 활용 할 수 있는 모듈을 말한다.
90도 각도로 가변저항이 달려있고, Z축에 택트 스위치가 달려있어서 2축 + 1온/오프 제어가 가능한 모듈이다.
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);
}