본문 바로가기

아두이노로 장난하기

아두이노 기초지식_디지털 입력



안녕하세요 고군입니다

이번 시간에는 아두이노를 사용한 디지털 입력에 대해 알아 보겠습니다.


▶ 풀다운(Pull-Down) 저항이 연결된 버튼 입력


그림 1. D2에 택트 스위치와 저항을, D13에 정항과 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
//버튼을 연결한 핀 번호
const int buttonPin = 2;
//LED를 연결한 핀 번호
const int ledPin = 13;
//버튼의 상태를 나타내는 변수
int buttonState = 0;
 
void setup()
{
    //LED에 연결한 핀의 모드를 출력으로 설정
    pinMode(ledPin, OUTPUT);
    //버튼에 연결한 핀의 모드를 입력으로 설정
    pinMode(buttonPin, INPUT);
}
 
void loop()
{
    //버튼에 연결한 핀의 상태를 읽는다.
    buttonState = digitalRead(buttonPin);
 
    //버튼상태가 HIGH면
    if (buttonState == HIGH)
    {
        digitalWrite(ledPin, HIGH);
    }
    //그렇지 않으면(=버튼 상태가 LOW면)
    else
    {
        //LED에 연결한 핀의 값을 LOW로 설정하고 LED를 끈다.
        digitalWrite(ledPin, LOW);
    }
}
cs


그림1과 같이 회로를 구성하고 맞게 업로드했다면 택트 스위치를 누르고 있는 동안에만 LED가 켜질 것입니다. 택스 스위치에 저항이 연결 되어 있는데 이것은 어떤 역할을 하고 있을까요? 그럼 시험 삼아 스위치에 연결한 저항을 제거해 봅시다. 저항을 제거한 상태에서 스위치를 켜고 끄면 LED의 상태는 어떻게 될까요? 처음과 마찬가지로 켜지고 꺼지는 경우도 있고, 켜진 채로 있는 경우도 있을 것입니다. 또 손가락으로 가까이 가져가는 것만으로 LED의 상태가 변할지도 모릅니다.


그림2. 택트 스위치의 저항을 제거하고, D13에 저항과 LED를 연결한 배선도와 회로도, 스위치를 누르는 동안에만 LED가 커진다. 


  그림2. 회로를 잘 보고 왜 이런 일이 생기는 생각해 봅시다. 우선 스위치를 켠 경우, D2 스위치를 경유해서 +5V에 연결됩니다. 이로 인해 D2의 전압은 +5V가 되고 DigitalRead의 값이 H로 안정됩니다. 반면에 스위치를 끈 경우, D2의 끝에는 스위치의 다리가 있지만 그 앞에는 아무것도 연결되어 있지 않습니다. 이것은 주변의 전기장 상태에 따라 입력값이 불안정하게 들어오는(부정전압이라고 함)상태가 됩니다. 스위치에 붙인 저항은 스위치가 꺼졌을 때 GND에 연결되어 안정시키기 위해서 붙어 있었던 것입니다. 이것을 함축하는 의미로 풀다운이라고 합니다.

▶ 풀업(Pull-Up) 저항이 연결된 버튼 입력

이번에는 스위치에 연결된 저항을 아래 그림 같이 바꿔 보겠습니다. 스위치를 ON/OFF해서 어떤 변화가 있는지 확인해 봅시다.
 

그림3. D2에 스위치와 풀업용 저항을 연결하고, D13에 저항과 LED를 연결한 배선도와 회로도

  
  앞에서와 마찬가지로 스위치의 ON/OFF에 따라 LED의 ON/OFF도 변하기 때문에 이번에는 스위치를 눌렀을 때 LED가 꺼지고 스위치가 꺼졌을 때 LED가 켜질 것입니다. 이것은 풀다운의 반대인 풀업이라고 불리는 저항입니다. 스위치가 꺼졌을 때 D2의 전압이 0V가 됩니다. 디지털 회로에서는 이처럼 논리가 반전하는 경우가 자주 있습니다.

▶ 싱크(Sink) 전류와 소스(Source) 전류

그림4. D2에 스위치와 풀다운용 저항을 연결하고, D13에 저항과 LED를 +5V에 연결한 배선도와 회로도


이번에는 그림4.와 같이 회로를 바꿔 봅시다. 풀업에서 풀다운으로 바꾸었는데도 스위치가 켜졌을 때 LED꺼지고 스위치가 켜졌을 때 LED가 켜질 것입니다. 이 연결에서는 스위치가 켜졌을 때, D13의 전압이 +5V가 되면 연결부의 +5V 전압이 같아져 전류가 흐르지 않습니다. 반대로 스위치를 꺼서 D13의 전압이 0V가 되면 +5V에서 D13을 향해서 전류가 흘러 LED가 켜집니다.
  이처럼 LED를 +5V를 연결하여 외부에서 아두이노 핀(D13)으로 전류를 흐르게 하는 연결 방벙을 싱크(Sink:빨아들임)라고 합니다. 그림 1에서 처럼 LED를 GND에 연결하여 아두이노 핀(D13)에서 외부를 향해 전류를 흐르게 하는 방법을 소스(Source:토해냄)라고 합니다.

▶ 함수 설명


● pinMode

 void pinMode(uint8_t pin, uint8_t mode)

    매개변수

      pin: 설정하고자 하는 핀 번호

      mode: INPUT, OUTPUT, INPUT_PULLUP 중 하나

    반환값: 없음

pinMode 함수는 지정한 핀이 입력 또는 출력으로 동작하도록 설정한다. mode에 INPUT_PULLUP을 지정하면 내부 풀업 저항을 사용하도록 설정되며, mode에 INPUT을 지정하면 내부 풀업 저항이 사용되지 않는다. 아날로그 입력 핀도 디지털 입력 핀으로 사용될 수 있으며, 이때 아날로그 입력 핀은 A0=14, A1=15등으로 정의되어 있어 A0, A1 등으로 참조 할 수도 있고 14, 15번으로 등으로 참조할 수도 있다.


● digitalWrite

 void digitalWrite(uint8_t pin, uint8_t value)

    매개변수

      pin: 설정하고자 하는 핀 번호

      value: High 또는 Low

    반환값: 없음


출력으로 설정한 디지철 핀에 HIGH 또는 LOW 값을 출력한다. 디지털 핀이 pinMode함수로 OUTPUT으로 설정된 경우 HIGH는 5V를, Low의 경우 0V(ground)을 출력한다. 핀이 입력으로 설정된 경우 digitalWrite 함수로 HIGH 값을 출력하면 20k옴 내부 풀업 저항이 연결되며, Low 값을 출력하면 풀업 저항이 연결이 해제된다.