2015년 4월 19일 일요일

[아두이노] 택스위치를 이용한 디지털 포트 실험

 택스위치(tact switch)는 기계적인 접점을 가지는 스위치로서 누르면 접점이 닫히고 누르지 않은 상태에서는 접점이 열려있는 소자이다.
[그림 1] 택(tact) 스위치
택스위치는 다리가 2개인 것과 4개인 것이 있다. (왜 궂이 다리가 4개가 필요할까 의아하겠지만 스위치 배열 회로를 꾸밀때 유용하다.)

 다음과 같이 아두이노의 디지털핀과 연결하여 접점의 상태를 읽을 수 있다. 일단 2번 핀에 스위치의 한 쪽 다리를 연결하고 GND에 다른 쪽 다리를 연결해야 한다.

[그림 2] 택스위치 결선도
아두이노 우노는 2번 핀이 INT0 이고 3번 핀이 INT1 으로서 외부 인터럽트를 사용할 수 있다.

 이렇게 회로가 구성되었다면 pinMode() 함수를 이용하여 스위치가 연결된 핀을 입력으로 설정해야 하는데 다음과 같이 두 가지 방법이 있다.

pinMode(2, INPUT ) ;     // 2번 핀을 입력으로 설정
pinMode(2, INPUT_PULLUP);// 2번 핀을 입력 + 내부 풀업 저항 연결

첫 번째 방법은 단순히 2번 핀을 입력으로 설정하는 것이다. 두 번째 방법은 2번 핀을 입력으로 설정한 후 내부 풀업(pull-up)저항까지 연결하도록 하는 것이다.

 기계적인 스위치를 핀에 연결할 때는 보통 내부 풀업저항을 연결해서 사용한다. [그림 2]의 회로 동작은 간단하다. 내부에 풀업 저항이 연결되어 있으므로 안 눌렸다면 2번 핀으로 HIGH신호가 나오고, 눌렸다면 LOW 신호가 나온다. 따라서 이 디지털 신호를 읽으면 택스위치가 눌렸는지 아닌지를 판별할 수 있다.

  • 스위치가 눌렸다면 LOW 신호
  • 스위치가 안 눌렸다면 HIGH 신호

이 핀값을 읽을 때는 digitalRead()함수를 사용하면 된다.

digitalRead(2); // 2번 핀의 값을 읽는다

예를 들어서 이 값을 변수에 저장할 수도 있다.

byte bySwitchIn = digitalRead(2);

 첫 예제로 버튼을 누르고 있으면 내장된 LED가 켜지는 간단한 기능을 구현해 보자. 누르고 있는 동안에만 켜져 있고 누르지 않고 있다면 꺼지도록 하는 것이다.

#define SW 2
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(SW, INPUT_PULLUP); // 내부 풀업 저항을 연결한다.
}
void loop() {
 digitalWrite(LED_BUILTIN, !digitalRead(SW));
}

여기서 digitalRead()함수 앞에 논리 not (!) 연산자가 붙어있다. 이렇게 해서 스위치가 누르면 digitalRead() 은 0값이 나오는데  !digitalRead() 은 1이 되어 LED에 불이 켜지게 된다.


댓글 없음:

댓글 쓰기