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

이번에 강좌할 내용은 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);
  }
}

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




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

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