아두이노2016. 6. 14. 12:53

스위치(Switch)는 거의 모든 전자제품에 필수적으로 들어가는 부품 입니다. 전원을 ON/OFF 하거나 사용하고자 하는 기능의 ON/OFF 에 주로 쓰이죠. 아래 위로 내리거나 올려서 작동하는 스위치, 한 번 누르면 ON 상태가 유지되고 다시 한 번 누르면 OFF 되는 스위치 등 수 많은 종류의 스위치가 있습니다. 아두이노 우노 자체에도 Reset 기능을 하는 스위치가 붙어 있기도 하죠. 이번에는 손으로 누르면 ON 되고 떼면 OFF 되는 가장 일반적인 택트 스위치 (Tact Switch) 2개로 각각 LED를 제어해 보도록 하겠습니다. 


이번에 사용할 스위치 입니다. 위와 같이 4개의 다리(Lead)가 있고 가운데 누르는 버튼이 있습니다. 다리는 스위치를 누를 시에 각각 대각선 방향으로 전류가 통하게 됩니다. 이번에는 한 쌍의 Lead 만 필요하므로 녹색으로 표시한 Lead 한 쌍은 펴주어서 브레드보드에 끼우지 않을 것입니다. 대각선 방향의 주황색 스위치 Lead 또는 녹색 Lead 한 쌍만 사용하게 됩니다. 


■ 연결


_2xSwitch_2xLED_ON_OFF.fzz


위와 같이 연결하면 됩니다. 스위치는 D10, D11에 각각 연결되어서 누르게 되면 D6, D7에 연결된 LED에 신호를 주게 되는 구조 입니다.


실제 연결한 모습 입니다. fritzing 회로도에는 LED가 고장나는 걸 방지하기 위해서 220Ω의 저항을 달아 주었으나 저는 그냥 연결 했습니다. 테스트 겸 잠시 사용하는 회로에서는 LED가 잘 고장이 나지 않는데 장시간 사용하는 회로를 만든다고 하면 반드시 LED 보호를 위해 저항을 달아 주어야 합니다. 안 그러면 LED가 고장날 수 있습니다.


■ 소스


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*****************************
2016.06.14 deneb21
2 Led Control by 2 Switch 
http://deneb21.tistory.com/377
******************************/
 
//LED 핀설정
int led1 = 6;
int led2 = 7;
 
//스위치 핀설정
int sw1 = 10;
int sw2 = 11;
 
void setup() {
  //시리얼 모니터
  Serial.begin(9600); 
  //LED 1,2를 OUTPUT 으로 설정
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  //SW 1,2를 설정, 아두이노 풀업저항 사용
  pinMode(sw1,INPUT_PULLUP);
  pinMode(sw2,INPUT_PULLUP);
}
 
void loop() {
  //SW1 ON, SW2 OFF => LED1 ON, LED2 OFF
  if(digitalRead(sw1)==LOW && digitalRead(sw2)==HIGH) {
    digitalWrite(led1,HIGH);
    digitalWrite(led2,LOW);
    Serial.println("SW1 ON");
  //SW1 OFF, SW2 ON => LED1 OFF, LED2 ON  
  } else if(digitalRead(sw1)==HIGH && digitalRead(sw2)==LOW) {
    digitalWrite(led1,LOW);
    digitalWrite(led2,HIGH);
    Serial.println("SW2 ON");
  //SW1 ON, SW2 ON => LED1 ON, LED2 ON  
  } else if(digitalRead(sw1)==LOW && digitalRead(sw2)==LOW) {
    digitalWrite(led1,HIGH);
    digitalWrite(led2,HIGH);
    Serial.println("SW1,2 ON");
  //SW1 OFF, SW2 OFF => LED1 OFF, LED2 OFF    
  } else {
    digitalWrite(led1,LOW);
    digitalWrite(led2,LOW);
    Serial.println("NO SW");
  }
}
cs


주석에 자세하게 써 놓았지만 해당 스위치를 누르게 되면 LOW 가 됩니다. LOW가 되는 스위치가 어떤 스위치인지 판단해서 해당 LED를 켜주거나 꺼주게 됩니다. 두 개의 SW 는 위의 경우의 수 이외에는 눌리는 패턴이 없겠죠?


그리고 Setup() 에 보시면 pinMode(sw1,INPUT_PULLUP); 이런 부분이 있는데 여기서 INPUT_PULLUP 이라는 설정이 보입니다. 그냥 INPUT 하면 되지 INPUT_PULLUP 은 무엇일까요?


스위치가 눌리지 않았을 때 디지털 핀의 Floating 상태(HIGH 와 LOW가 번갈아 바뀌는 현상)를 방지하여 HIGH 상태로 유지하기 위해서 원래는 위의 그림과 같이 스위치 입력 부분에 저항을 달아 주어야 합니다. 이것을 풀업저항(Pullup Resistor)이라고 하는데 아두이노에는 자체적으로 이 저항이 내장되어 있습니다. 곧 INPUT_PULLUP 은 아두이노의 내장된 저항을 사용하겠다는 뜻 입니다. 아두이노에 기능이 내장이 되어 있는데 굳이 따로 저항을 연결할 필요는 없겠죠?


만약 스위치 입력 소스 부분에 INPUT_PULLUP 을 이용하지 않고 INPUT 을 이용한다면 위의 그림과 같이 10KΩ 정도의 풀업 저항을 스위치에 연결해 주면 됩니다.

 

 

동작하는 장면을 동영상으로 찍어 봤습니다. 하나씩 눌러 보고 두 개를 동시에 눌러도 보고... 누르는 대로 잘 작동 하네요.  이런 식으로 더 많은 스위치와 LED를 달아서 갯수를 늘려갈 수도 있습니다. 그리고 당연히 LED가 아니더라도 릴레이 같은 부품도 제어가 가능 하겠죠?!



반응형
Posted by 대네브 (deneb)

댓글을 달아 주세요