본문 바로가기

아두이노/아두이노 공부하기!

5. [Tutorial] 아두이노 스위치 회로와 동작 설명

이번에는 스위치에 대한 설명을 진행하도록 하겠다.


스위치란 ?? 보통 여러종류의 스위치가 존재하지만 스위치는 크게 2 타입으로 나뉜다.


1. 스위치가 동작했을 때, 전류가 흐르는 타입.

2. 스위치가 동작했을 때, 전류가 끊어지는 타입.


이 중 범용적으로 많이 사용되는 것이 1번 스위치가 동작했을 때 전류가 흐르는 타입이다.


스위치는 전자기기를 조작할 때 많이 사용된다.


보통 예제에서는 푸쉬(Push)버튼 타입의 스위치를 많이 사용한다. 이를 TACT SW라고도 표현한다.


스위치는 위 사진과 같이 크게 4-pin SW 와 2-pin SW가 있다.

동작은 동일하다. 단지 4핀이냐 2핀이냐의 차이이다.


위 회로는 스위치 회로이다. 

D2에 스위치와 저항이 부착되어 있는 것을 볼 수 있다.

동작을 설명하자면,

1. D2에 연결되어 있는 스위치는 push 타입의 스위치이다. 즉, 눌러야지 연결되어 전류가 흐르는 타입이다.

2. 그래서 스위치를 누르지 않으면 R1 저항에 의해 5V가 D2에 공급된다.

3. 그래서 디지털 값인 '1'이 D2에 인가된다.

4. 그러다 스위치를 누르게 되면 선이 연결되어 D2에 인가되었던 5V가 스위치를 타고 0V로 흐르게 된다.

5. 그래서 스위치를 누르면 D2는 '0'이 된다.


여기서의 Key point는 스위치를 연결할 때 GPIO(D2)는 INPUT으로 동작한다.


왜냐면, 스위치를 사용하기 위해서는 사용자가 스위치를 눌렀을 때, 눌렸는지 안눌렸는지 알아야 한다.

근데, D2를 LED와 같이 OUTPUT으로 설정을 하면 D2는 계속 1 또는 0을 내보낼 테니 스위치가 눌렸는지 안눌렸는지 확인이 불가능하다.

따라서 INPUT으로 설정해주고 스위치가 눌리면 '0'을 읽고, 스위치가 안눌리면 '1'을 읽게 설정한 것이다.


그래서 스위치는 INPUT으로 설정한다.

이 이론을 토대로 예제를 실행해보자.


아두이노를 실행하고 예제 -> Digital -> Button을 실행하자.


그럼 위 사진과 같이 Button예제가 실행될 것이다.

이제 위 코드를 분석해보자.


----------------------------------------------------------------------------------------

const int buttonPin = 2; // 스위치를 D2 핀으로 설정한다.

const int ledPin =  13;  // LED를 D13핀으로 설정한다.


int buttonState = 0;  // 스위치 값을 받아 변수에 저장한다.


void setup() {

  pinMode(ledPin, OUTPUT); // LED(D13)를 OUTPUT으로 설정한다.

  pinMode(buttonPin, INPUT); // 스위치(D2)를 INPUT으로 설정한다.

}


void loop() {

  buttonState = digitalRead(buttonPin); // 스위치의 값을 읽어서 buttonState 변수에 저장한다.


  if (buttonState == HIGH) { // 만약, 스위치의 값이 1(5V)라면 !

    digitalWrite(ledPin, HIGH); // LED는 1(5V)를 출력한다.

  }

  else { // 만약, 스위치 값이 1이 아니라면 !!

    digitalWrite(ledPin, LOW); // LED는 0(0V)를 출력한다.

  }

}

----------------------------------------------------------------------------------------


**** 혹시 LED코드와 다른점이 혹시 보이는가??? ****

LED코드는 digitalWrite(13,HIGH); 이렇게 했다.

근데 위 코드는 digitalWrite(ledPin, HIGH); 로 되어있다 ! (번호가 아니라 문자가 들어가 있다.)

실제 코딩을 할 때 digitalWrite(ledPin, HIGH); 이렇게 코딩하는 것이 좋다.


왜냐?? digitalWrite(13,HIGH); 이렇게 하면, 13번 핀에서 14번 핀으로 바꾸려면 위 함수를 사용하는 것은 전부 13을 14로 바꿔줘야 한다.


근데, digitalWrite(ledPin,HIGH); 이렇게 하면 맨 위에 const int ledPin =  13;  라고 설정한 부분만 14로만 바꿔주면 되니깐 훨씬 좋다 !!


----------------------------------------------------------------------------------------


그리고 const int ledPin =  13; 중에서 "const" 라고 선언되어 있는데 !! 이 의미는!!


const로 정의하면 상수의 값이 변하지 않는다 !! 이다.


그냥 int ledPin = 13; 이라고하면, 나중에 loop() 코드에서 ledPin = 14; 라고 코딩을 하게되면 실제로 14값이 ledPin으로 들어간다.

그러면 D13이 아니라 D14으로 동작을 한다.

즉, 그러면 내가 원하는 동작을 안할 가능성이 있다. !!


그래서 이를 방지하기 위해서 const 라는 것을 붙여준다. 그러면 무조건 13으로만 사용한다. 라는 의미이다.

정확하게 말하면 상수를 바꾸지 않는다. 는 의미이다.


** 아래 const의 설명은 구글에서 검색한 결과이다.

const 키워드는 변수가 상수로서 읽을 수는 있지만 값을

변경할 수 없음을 나타내는 키워드이다. 이 변수에 값을
저장하려고 하면 컴파일할 때 에러가 발생한다.

const로 정의된 상수는 변수의 범위 규칙에 따라 전역변수
또는 지역변수가 될 수 있기 때문에 같은 역할을 하는 #define을
사용하는 것보다 낫다고 할 수 있다. 배열의 경우에는 const를 사용해야 한다.

----------------------------------------------------------------------------------------


다시 코드 설명으로 돌아가서, LED 코드의 설명과 동일하게 스위치도 pinMode(buttonPin, INPUT); 를 이용하여 GPIO 설정을 해준다.


그리고 buttonState = digitalRead(buttonPin);  이 부분에서 buttonPin(D2)의 값을 digitalRead 함수로 읽어서 buttonState 에 저장한다.


다음으로는 if 문이 나오게 되는데요. if문은 "조건문"이다.


if의 경우, 만약 내가 설정한 조건이 맞다면(참이라면) digitalWrite(ledPin, HIGH); 을 실행하고.

else의 경우, 만약 if의 조건이 아니라면 digitalWrite(ledPin, LOW); 이 실행한다.


만약, 중간에 다른 조건을 하나 더 넣고 싶다면, else if를 사용하면 된다.

스위치 예제에서 else if를 사용하기 위해서는 else를 대체해서 사용하는 수밖에 없을 것 같다.

조건을 설정하여 동작해야 하는데, 조건을 부여할 것이 스위치밖에 없으니깐...

그래서 else if 를 사용한 조건문은 아래와 같다 !!

else와 비교해보는 것을 추천한다 !

----------------------------------------------------------------------------------------

  if (buttonState == HIGH) { // 만약, 스위치의 값이 1(5V)라면 !

    digitalWrite(ledPin, HIGH); // LED는 1(5V)를 출력한다.

  }

  else if (buttonState == LOW) { // 만약, 스위치 값이 1이 아니라면 !!

    digitalWrite(ledPin, LOW); // LED는 0(0V)를 출력한다.

  }

----------------------------------------------------------------------------------------


이렇게 스위치 동작도 끝이났다 !!


이 것으로 디지털의 설명은 끝 !! LED와 스위치의 설명을 정확하게 이해했다면, 디지털은 다한 것이다.

이제 다음으로 아날로그 설명으로 넘어가도록 하겠다.