[매드정] 아두이노 강좌 - 05.Multi-Function Shield PUSH SWITCH 동작


안녕하세요~ 매드 입니다.

이번에 강좌할 내용은 PUSH SWITCH 입니다~

지난 시간까지 LED ON/OFF 를 해봤는데요. 이번 시간에는 PUSH SWITCH를 이용하여 입력값을 받아보고 LED를 ON/OFF 시켜 보도록 하겠습니다.

그럼 먼저 스위치가 무엇인지부터 알아보고 가죠~


5-1. 스위치란?

스위치는 접점을 붙였다 때였다를 할 수 있는 것을 스위치라고 하는데요.

이 스위치는 수 많은 종류가 있습니다~

<구글 펌>

정말 수많은 종류들이 있지요?~ 저기 있는 스위치들은 주로 기계접점 스위치들인데요. 내부에서 기계적으로 붙였다 떨어졌다 하면서 동작하는 것들이지요~
이런 일반적인 스위치가 아닌 전기적으로 스위치 동작을 할 수 있는 것들이 있는데 우리가 가장 잘 알고 있는 TR(BJT)과 FET가 되겠습니다~ ㅎㅎ 요것들에 대해서는 나중에 차차 알아가도록 하구요~ 이번시간에는 기계 접점 스위치를 사용해 보도록 하죠.

이런 기계 접점 스위치는 문제점을 하나 가지고 있는데요. 우리 눈에는 보이지 않지만 이 스위치가 기계적으로 접점이 발생하면서 내부적으로 스파크 또는 타타탁 하면서 수번에서 수십번 정도의 붙였다 떨어졌다 동작이 발생하게 됩니다. 이것이 사실 우리 눈에는 보이지 않지만 우리가 사용하는 아두이노 또는 속도가빠른 칩에서는 굉장히 민감하게 반응할 수 가 있습니다. 이것을 좀 유식한 말로 바꾸면 '채터링' 이라고 합니다~

<구글 펌>

그림으로 보니까 이해가 좀 더 잘 되시나요?~ ㅎ
이 채터링을 없애기 위한 것이 스위치 외부에 디바운싱 캐패시터를 달아준다거나 소프트웨어 필터링을 통해서 제거하기도 하니 참조하시면 될 것 같네요~


5-2. Multi-function Shield PUSH SWITCH 회로

그럼 이제 저희가 사용한 멀티펑션 보드의 채터링에 대해서 알아보도록 하죠.


위 그림은 멀티펑션 보드의 회로를 캡쳐한 부분인데요~ 스위치의 반대편에는 그라운드에 연결되어 있고 다른 부분은 아두이노의 A1, A2, A3, RESET 핀에 연결되어 있는 것을 알 수 있습니다.

그런데 신기한게 하나 있네요~? 10K 저항들이 A1, A2, A3 핀들에 +5V를 볼 수 있는데요?~ 이것을 우리는 Pull-Up 저항이라고 합니다.

이 Pull-Up과 Pull-Down은 굉장히 중요한 내용이므로 나중에 자세히 설명하기로 하고 이 회로에서 왜? 쓰여졌는지만 설명드리겠습니다.

저기 보면 스위치가 있지요?~ 어떻게 생겼나요?~ 양쪽의 접점이 떨어져있죠? 저걸 누르면 양쪽의 선이 연결되면서 A1, A2, A3, RESET 선으로 GND가 연결되어 0V(LOW) 신호를 아두이노에서 받게 될겁니다.

그런데? 만약 스위치가 떨어져있으면 선은 어떤 상태가 될까요? 아두이노 쪽에서는 선이 떨어져있는 상태를 0V(LOW)로 받아들일까요? 5V(HIGH)로 받아들일까요?
정답은 모른다(unknown) 입니다.

따라서 저기에 Pull-Up을 달아줌으로써 스위치가 떨어져 회로가 OPEN 상태가 되더라도 아두이노에서 헤깔리지 않도록 스위치가 눌리면 0V(LOW)가 들어가고 스위치가 떨어지면 Pull-Up에 의해서 5V(HIGH)가 아두이노로 들어가게 되는 것입니다.

왜 저항을 달았는지는 전시간에 설명한대로 물과 같이 생각하시면 됩니다. 높은 곳에서 물이 흘러내리는데 두갈래로 갈라지게 됩니다. 그런데 만약 한쪽 길이 돌로 막혀 있다면 물은 대부분 어디로 흐르게 될까요~? 당연히 돌이 없는 쪽으로 대부분 흐르겠죠~?

대략 이 정도까지만 설명하고! 이제 지겨운 이론 버리고 실습으로 가봅시다!

5-3. 펌웨어 코드

const int button1 = A1;
const int button2 = A2;
const int button3 = A3;

const int led1 =  13;
const int led2 =  12;
const int led3 =  11;

int buttonState1 = 0;
int buttonState2 = 0;
int buttonState3 = 0;

void setup() {
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(button3, INPUT);
}

void loop() {
  buttonState1 = digitalRead(button1);
  buttonState2 = digitalRead(button2);
  buttonState3 = digitalRead(button3);

  if (buttonState1 == HIGH) {
    digitalWrite(led1, HIGH);
  }
  else {
    digitalWrite(led1, LOW);
  }

  if (buttonState2 == HIGH) {
    digitalWrite(led2, HIGH);
  }
  else {
    digitalWrite(led2, LOW);
  }

  if (buttonState3 == HIGH) {
    digitalWrite(led3, HIGH);
  }
  else {
    digitalWrite(led3, LOW);
  }
}

코드 설명 및 실습 방법은 동영상 강좌로 대체하겠습니다!




블로그 먼저 보신 분들은 뒷부분부터 시청하시면 될 것 같네요~

다음주에~~~~ 보아요~~~~ ^^

댓글 쓰기

14 댓글

  1. 작성자가 댓글을 삭제했습니다.

    답글삭제
  2. 저항없이 하다가 강의의 INPUT_PULLUP을 하니
    스위치로 연결하면 0값(LOW)가 나오고, 스위치로 끊어지면 1값(HIGH)값이 나오는 것 같은데 이게 맞는 거죠?

    답글삭제
    답글
    1. 연결되면 0, 끊어지면 1 이라고 하는데 헷갈리는데 혹시 연결되면 1, 끊어지면 0으로 할 수는 없나요?

      삭제
    2. 반대로 해주시면 됩니다. 스위치 반대편을 그라운드 대신 5V로 연결하시고 풀업 저항 대신에 풀다운 저항으로 연결해주시면 원하시는 동작이 됩니다~

      삭제
    3. 아하 그렇군요...풀다운 저항은 INPUT_PULLDOWN이라고 적어야 하나요? 근데 글자가 다른 색으로 안 바뀌던데 ㅎㅎ

      삭제
    4. 아두이노 같은 경우(정확히 말하면 AVR) IC 내부에 풀업이 가능한 회로가 내장되어 있어서 펌웨어로 가능했던 것이구요. 반대로 하려면 저항을 이용하여 회로로 연결하셔야 합니다~

      삭제
  3. 이번 강좌에서 코드는 버튼 A1을 누르고 있어야지만 led1 이 불이 들어오는데
    누르고 있을때 말고 스위치를 한번 누르면 led가 켜진상태로 계속 되고
    다시 그 스위치를 누르면 led가 꺼진상태로 되는 코드는 어떻게 작성하면 되나요??
    스스로 해볼려고 했는데 잘 안되네요 ㅠㅠ

    답글삭제
    답글
    1. 안녕하세요~ ㅎㅎ 공부중이신가 보군요.
      가장 간단하게는 토글 방식으로 사용하시면 될 것 같네요.
      테스트는 안해봤지만 아래 코드처럼 작성하시면 됩니다.
      const int button1 = A1;
      const int led1 = 13;
      int buttonState1 = 0;
      int ledState1 = 0;

      void setup() {
      pinMode(led1, OUTPUT);
      pinMode(button1, INPUT);
      }

      void loop() {
      buttonState1 = digitalRead(button1);

      if (buttonState1 == LOW) {
      ledState1 = ~ledState1;
      digitalWrite(led1, ledState1);
      }
      delay(500);
      }

      핵심은
      ledState1 = ~ledState1;

      이 부분이네요. 누를 때 마다 0이면 1로 1이면 0으로 변경되는 것이죠.
      ㅎㅎ
      화이팅입니다.

      삭제
    2. 작성자가 댓글을 삭제했습니다.

      삭제
    3. 항상 친절한 답변 감사합니다 ^^
      지금 아두이노 공부하고 있는데 강좌가 많이 도움되네요 ㅎㅎ
      좋은 하루 보내세요~

      삭제
    4. 혹시 죄송한데 강좌 처음부터 끝까지 정리한 파일 pdf 로 가지고 계신다면
      저에게 보내주실수 있나요??
      강좌 정주행 할 생각이라서 같이 보면서 공부하고 싶네요 ㅠㅠ
      만약 보내주실수 있으시면 tjddns2180@gmail.com 이쪽으로 보내주시면 정말 감사하겠습니다 ^^

      삭제
    5. 아 넘 어려워용

      삭제