코딩교육-아두이노

아두이노 디지털 핀 (푸쉬 버튼 입력) - Arduino Digtal Pin - Push Button, PullDown, PullUp, INPUT_PULLUP

carrotweb 2022. 3. 26. 19:16
728x90
반응형

푸시 버튼은 버튼을 누르면 전류가 흐르고 버튼을 누르지 않으면 전류가 흐르지 않습니다.

 

푸시 버튼은 4개의 핀으로 구성되어 있고 그중에서 거리가 먼 핀과 핀은 내부적으로 서로 연결되어 있습니다. 알기 쉽게 핀에 번호를 부여했습니다. 1번과 3번, 2번과 4번이 내부적으로 연결되어 있습니다.

그래서 버튼이 눌러지면 연결된 2개의 라인이 연결되어 전류가 흐릅니다. 전류가 흐르기 때문에 디지털 신호로 1(HIGH)이 됩니다.

그러면 디지털 핀에 어떻게 입력으로 처리되게 할 수 있을까요?

당연히 전류를 흐르게 하면 됩니다.

디지털 핀에 입력 신호 주기 - 전류 흐르게 하기

1. 우선 디지털 핀에 입력 신호가 들어오는지 확인하기 위해서 디지털 핀을 입력 모드로 설정해야 합니다.

2번 디지털 핀을 입력 모드로 제어하기 위해서는 pinMode() 함수를 사용합니다.

pinMode() 함수의 첫 번째 파라미터에 디지털 핀 번호 2를, 두 번째 파라미터는 입력 모드로 INPUT으로 설정합니다.

그리고 디지털 입력 신호를 시리얼 통신으로 출력하기 위해서 Serial.begin() 함수를 사용하여 설정합니다.

void setup() {
  pinMode(2, INPUT);
  Serial.begin(9600);
  while(!Serial) {
  }
  Serial.println("Serial Port Connected.");
}

 

2. 2번 디지털 핀을 1초마다 읽어 시리얼 통신으로 입력 신호 값을 출력하게 합니다.

입력 모드로 된 디지털 핀에서 입력 신호를 받기 위해서는 digitalRead() 함수를 사용합니다. digitalRead() 함수의 파라미터는 디지털 핀 번호입니다. 전류가 흐르면 입력 신호는 1(HIGH)이 들어오고 전류가 흐르지 않으면 0(LOW)이 들어옵니다.

void loop() {
  int buttonState = digitalRead(2);
  Serial.println(buttonState);
  delay(1000);
}

 

3. 컴파일하고 업로드한 후 아두이노 IDE에서 시리얼 모니터를 실행시킵니다.

시리얼 모니터를 보면 1초마다 0(LOW)이 들어옵니다.

4. 아두이노 우노 보드의 3.3V나 5V 전원 핀에 빨간색 M-M 점퍼 와이어를 꼽고 2번 디지털 핀에 잠깐 연결해 봅니다.

시리얼 모니터를 보면 입력 신호가 0(LOW)이었다가 연결된 후 1(HIGH)이 되는 것을 확인할 수 있습니다.

 

 

디지털 핀 입력 제어 - 푸시 버튼

1. 브레드 보드에 푸시 버튼을 d열 3번, g열 3번, d열 5번, g열 5번에 꼽습니다.

아두이노 우노 보드의 3.3V나 5V 전원 핀에 연결된 빨간색 M-M 점퍼 와이어를 브레드 보드 a열 3에 꼽습니다. 그리고 2번 디지털 핀에 검은색 M-M 점퍼 와이어를 꼽고 브레드 보드 j열 5번에 꼽습니다.

 

2. 시리얼 모니터를 실행시키고 푸시 버튼을 눌러보면 입력 신호가 0(LOW)이었다가 연결된 후 1(HIGH)이 되는 것을 확인할 수 있습니다.

 

그렇지만, delay() 함수를 제거하면 푸시 버튼을 누를 때는 정확하게 1(HIGH)이 출력되지만 버튼을 누르지 않을 때는 0(LOW)과 1(HIGH)이 번갈아 가면서 출력됩니다. 정확하게 0만 나오지 않습니다.

 

 

이런 현상을 Floating(플로팅)이라고 합니다. Floating(플로팅)은 0V가 아닌 낮은 전류가 흐르고 있는 상태입니다. 그래서 0(LOW)과 1(HIGH)이 번갈아 가면서 출력됩니다.

그럼 어떻게 0(LOW)이 나오게 할 수 있을까요?

2번 디지털 핀이 Floating(플로팅) 되지 않게 GND로 가게 하면 됩니다. 그러면 0V가 됩니다.

아두이노 우노 보드의 GND 핀에 흰색 M-M 점퍼 와이어 꼽고 브레드 보드 i열 5에 꼽습니다. 시리얼 모니터를 실행시켜 보면 0만 나오는 것을 확인할 수 있습니다.

그러나 2번 디지털 핀을 GND와 바로 연결하면 버튼을 눌러도 전류가 흐르지 않습니다.

그럼 푸시 버튼을 누르면 전류가 흘러 1(HIGH)이 되고 푸시 버튼을 누르지 않으면 GND로 연결되어 0(LOW)이 되게 할 수 있을까요?

네, 바로 저항을 사용하여 버튼을 누르지 않으면 GND로 연결되게 하면 됩니다. 전류가 저항이 있는 쪽으로 흐르기 때문에 GND로 가게 됩니다. 그래서 0V가 됩니다.

이런 방식을 PullDown(풀다운) 저항이라고 합니다.

 

 

PullDown(풀다운) 저항 연결

220옴 저항을 i열 5번과 i열 11번에 꼽습니다. 그리고 아두이노 우노 보드의 GND 핀과 연결된 흰색 M-M 점퍼 와이어를 j열 11번에 꼽습니다. 저항의 크기는 상관없습니다. 키트를 가지고 있으시면 220 옴이나 10K 옴을 사용 하시면 됩니다.

 

시리얼 모니터를 실행시키고 확인하면 0만 나오는 것을 확인할 수 있습니다.

 

 

 

그럼 푸시 버튼을 눌러 테스트해 보겠습니다.

시리얼 모니터로 푸시 버튼이 눌러지면 1이 나오고 그렇지 않으면 0이 나오는 것을 확인할 수 있습니다.

 

 

아두이노 IDE에서는 푸시 버튼으로 처리하는 방법을 예제로 제공하고 있습니다.

다음은 아두이노 IDE에서 제공하는 푸시 버튼의 예제 소스입니다.

메뉴 : 파일 > 예제 > 02. Digital > Button

예제는 푸시 버튼을 클릭하면 내장된 LED(13번 디지털 핀)에 입력 신호를 주어 LED가 불을 켜지도록 하게 되어있습니다.

// constants won't change. They're used here to set pin numbers:
const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
}

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    // turn LED on:
    digitalWrite(ledPin, HIGH);
  } else {
    // turn LED off:
    digitalWrite(ledPin, LOW);
  }
}

 

반대로 저항을 GND 핀이 아닌 3.3V나 5V 전원 핀에 연결하면 PullUp(풀업) 저항이라고 합니다.

푸시 버튼을 누르지 않으면 바로 저항을 타고 2번 디지털 핀으로 전류가 흐르고 푸시 버튼을 누르면 2번 디지털 핀은 GND와 연결되어 됩니다.

PullUP(풀업) 저항 연결

아두이노 우노 보드의 GND 핀에 연결된 흰색 M-M 점퍼 와이어를 브레드 보드 a열 3에 꼽습니다.

220옴 저항을 b열 5번과 b열 11번에 꼽습니다. 그리고 아두이노 우노 보드의 3.3V나 5V 전원 핀에 연결된 빨간색 M-M 점퍼 와이어를 c열 11번에 꼽습니다.

 

시리얼 모니터를 실행시키고 확인하면 푸시 버튼을 누르지 않으면 1로 나오는 버튼을 누르면 0이 나오는 것을 확인할 수 있습니다.

 

 

PullUp(풀업) 저항은 PullDown(풀다운) 저항과 반대로 동작합니다.

그럼 매번 디지털 핀으로 입력 신호를 보낼 때 저항을 사용해야 할까요?

그렇지 않습니다.

아두이노 우노 보드에서는 소프트웨어에서 액세스 할 수 있는 게 Atmega 칩에 20K PullUp(풀업) 저항이 내장되어 있습니다. 내장된 20K PullUp(풀업) 저항을 pinMode() 함수에서 입력 모드를 INPUT_PULLUP으로 설정만 하면 액세스 하게 됩니다. 그래서 저항을 사용하지 않고 사용할 수 있습니다. 그러나 PullUp(풀업)이 됨으로 푸시 버튼을 누르지 않으면 1(HIGH)이 되고 누르면 0(LOW)이 됩니다. 개발할 때 고려하셔야 합니다.

자세한 설명은 https://www.arduino.cc/en/Tutorial/Foundations/DigitalPins에서 확인하시기 바랍니다.

디지털 핀 입력 제어 - 푸시 버튼 (INPUT_PULLUP)

1. setup() 함수에서 2번 디지털 핀의 입력 모드를 INPUT_PULLUP으로 변경합니다.

void setup() {
  pinMode(2, INPUT_PULLUP);
  Serial.begin(9600);
  while(!Serial) {
  }
  Serial.println("Serial Port Connected.");
}

 

2. PullUp(풀업) 저항으로 연결 상태에서 연결된 220옴 저항과 빨간색 M-M 점퍼 와이어를 뽑습니다.

 

3. 컴파일하고 업로드한 후 아두이노 IDE에서 시리얼 모니터를 실행시킵니다.

그럼 시리얼 모니터에서 항상 1이 나옵니다. 푸시 버튼을 누르면 0이 나오는 것을 확인할 수 있습니다.

디지털 핀의 입력 모드를 INPUT_PULLUP으로 사용하면 전원 핀 연결과 저항 없이 처리할 수 있어 좋습니다.

728x90
반응형