아두이노 핀 모드 풀업 - adu-ino pin modeu pul-eob

[Digital I/O]

설명

특정 핀을 입력 또는 출력으로 동작하도록 설정합니다. (digital pins)의 설명을 보면 핀들의 기능이 자세히 나옵니다.

아두이노 1.0.1부터, INPUT_PULLUP 모드를 통해 내부 풀업 저항을 활성화할 수 있습니다. 덧붙여, INPUT 모드는 명시적으로 내부 풀업을 비활성화합니다.

문법

pinMode(pin, mode)

매개변수

pin: 모드를 설정하려는 핀 번호

mode: INPUT, OUTPUT, 또는 INPUT_PULLUP. ((digital pins) 페이지를 보면 더 자세한 기능 설명이 있습니다.)

반환

없음

예제 코드

이 코드는 디지털 핀 13을 OUTPUT 으로 만들고 HIGHLOW 를 전환합니다.

void setup() {
  pinMode(13, OUTPUT);          // 디지털 핀 13 을 출력으로 설정
}

void loop() {
  digitalWrite(13, HIGH); // sets the digital pin 13 on
  delay(1000);            // waits for a second
  digitalWrite(13, LOW);  // sets the digital pin 13 off
  delay(1000);            // waits for a second
}

주의와 경고

A0, A1 등으로 아날로그 입력 핀을 디지털 핀으로 사용할 수 있습니다.

아두이노의 digital I/O핀을 사용하려면 먼저 pinMode() 함수로 각각의 핀을 입력 또는 출력 모드로 사용하겠다고 먼저 선언해 줘야 한다.
그런데 입력으로 사용하는 경우 'INPUT'과 'INPUT_PULLUP' 두가지를 선택할 수 있다.
INPUT_PULLUP의 경우 프로세서 내부에 있는 pull-up 저항을 사용하겠다는걸 알려주는 것이다.

일반적으로 아두이노에 스위치를 연결하는 경우를 생각해 보자. 보통 아래 그림과 같이 외부에 pull-up 저항을 연결해 주는것이 보통이다. 하지만 ATmega168/328의 각 I/O 핀에는 노란색 부분의 회로가 들어있다. 하지만 디폴트는 노란색 부분을 사용하지 않게 되어 있다.

pinMode(7, INPUT); 

아두이노 핀 모드 풀업 - adu-ino pin modeu pul-eob

그래서 INPUT 대신 INPUT_PULLUP을 사용하면 녹색 부분을 사용하게 되어 외부에 별도의 pull-up 저항을 붙이지 않아도 된다. (그림을 보면 알겠지만 아두이노 바깥쪽에 있던 저항이 아두이노 안쪽으로 들어간 것 뿐이다.)

pinMode(7, INPUT_PULLUP);

아두이노 핀 모드 풀업 - adu-ino pin modeu pul-eob

이렇게 하면 외부에 연결해야 하는 부품이 줄어들고 배선도 간단해진다.

아래는 INPUT_PULLUP으로 두개의 스위치를 연결해 LED 깜빡이는 속도를 조절하는 예제이다.

사진에서 볼 수 있는것 처럼 외부 저항이 없어 케이블이 훨씬 간편해졌다.

#define SW1  8
#define SW2  9
#define LED  13

boolean gLedStat = HIGH;
int gSpd = 500;

void setup() {
  pinMode(SW1, INPUT_PULLUP);
  pinMode(SW2, INPUT_PULLUP);
  pinMode(LED, OUTPUT);
  Serial.begin(115200);
}

void loop() {
  static unsigned long last = 0;
  static unsigned long lastSw = 0;
  unsigned long now = millis();
  static boolean prev1 = HIGH;
  static boolean prev2 = HIGH;
  boolean cur;

  if ((now - lastSw) >= 10) {   // Check switch for every 10ms
    cur = digitalRead(SW1);
    if ((HIGH == prev1) && (LOW == cur)) {
      gSpd -= 100;
      gSpd = constrain(gSpd, 100, 2000);
      Serial.print("Delay up to ");
      Serial.println(gSpd);
      prev1 = LOW;
    } else if ((LOW == prev1) && (HIGH == cur)) {
      prev1 = HIGH;
    }
    cur = digitalRead(SW2);
    if ((HIGH == prev2) && (LOW == cur)) {
      gSpd += 100;
      gSpd = constrain(gSpd, 100, 2000);
      Serial.print("Delay down to ");
      Serial.println(gSpd);
      prev2 = LOW;
    } else if ((LOW == prev2) && (HIGH == cur)) {
      prev2 = HIGH;
    }
    lastSw = now;
  }
  if ((now - last) >= gSpd) {
    gLedStat = !gLedStat;
    digitalWrite(LED, gLedStat);
    last = now;
  }
}

아두이노의 선택된 디지털핀을 입력으로 할지 출력으로 설정할지 구성하는 함수인 pinMode()에 대해 알아보겠습니다.

정의

지정된 핀이 입력 또는 출력으로 작동하도록 구성합니다. 

Arduino 1.0.1부터는 모드로 내부 풀업 저항을 활성화할 수 있습니다 INPUT_PULLUP. 또한이 INPUT모드는 내부 풀업을 명시 적으로 비활성화합니다.

사용 예

pinMode(pin, mode)

매개변수

pin: Arduino 핀 번호로 모드를 설정합니다.
mode: INPUT, OUTPUT또는 INPUT_PULLUP.

예제

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

void setup() {

// put your setup code here, to run once:

Serial.begin(9600);

pinMode(3,OUTPUT);

pinMode(4,INPUT);

}

void loop() {

// put your main code here, to run repeatedly:

int val;

digitalWrite(3,HIGH);

val = digitalRead(4);

Serial.print("입력 값:");

Serial.println(val);

delay(5000);

}

위의 예제 코드를 보시면 pinMode(3,OUTPUT); , pinMode(4,INPUT); 으로 각각 3번핀을 출력, 4번핀을 입력으로 설정한 것을 확인하실 수 있습니다.

당연히 결과는 HIGH로 출력하였으니 1(HIGH)가 나오게 됩니다

아두이노 핀 모드 풀업 - adu-ino pin modeu pul-eob
출력 결과

그런데 위에서 명시했듯 "Arduino 1.0.1부터는 모드로 내부 풀업 저항을 활성화할 수 있습니다 INPUT_PULLUP. 또한이 INPUT모드는 내부 풀업을 명시 적으로 비활성화합니다."라는 말이 있습니다.

입력 모드에서 저희가 풀업, 풀다운을 설정할 수 있다는 것이죠.  풀업 풀다운은 아래 그림을 참고하시면 됩니다.

아두이노 핀 모드 풀업 - adu-ino pin modeu pul-eob
풀업 풀다운 설정

쉽게 설명하자면 저항이 그라운드 위쪽이면 Pull - UP 아래면 Pull - Down 이라고 생각하시면 됩니다. 풀업의 경우 스위치가 off상태(이번 예제에서는 write(LOW))에서 1(HIGH)를 출력하며 풀다운의 경우 스위치가 off상태에서 0(LOW)를 출력합니다.

아두이노의 입력 모드에서는 기본적으로 풀다운이지만 pinMode설정을 통해 풀업을 설정할 수 있습니다. 

풀업은 pinMode(4,INPUT_PULLUP);를 통해 설정할 수 있습니다.