AI Journey/혼자 공부하는 아두이노

아두이노의 디지털 신호와 논리값에 대해... (+프로그래밍 연습)

보눔비스타 2025. 5. 20. 19:01

아두이노를 처음 공부하다 보니 HIGH/LOW, 5V/0V과 같은 값과 논리값 1/0과 True/False와 같은 용어가 자주 등장한다. 이것들은 모두 아두이노의 디지털 신호와 관련이 있다.
참고로 이 글은 최대한 쉽게 아두이노를 이해해보려는 내 노력의 과정을 기록한 두서 없는 메모일 뿐이라는 점을 먼저 말해둔다. 

아두이노의 디지털 신호 : HIGH와 LOW란? 

아두이노는 디지털 출력 핀을 통해 전기 신호를 보낸다. 이 신호는 HIGH 또는 LOW 두 가지 상태만 가질 수 있다.

  • HIGH : 5V의 전압, "켜짐(ON)" 상태
  • LOW : 0V의 전압, "꺼짐(OFF)" 상태

5V 핀과 GND 핀의 역할

아두이노 보드에는 5V 핀과 GND(접지) 핀이 있다.

  • 5V핀: 5V핀은 항상 5V를 출력한다. 이 전압은 LED나 센서 같은 부품을 작동시키는 전기 에너지의 원천이 된다. 
  • LED를 예로 들어보면, 5V핀은 이 LED가 켜지도록 전원 공급을 해주는 역할이다. 
  • GND 핀: GND핀은 항상 0볼트의 전압을 출력하며, 회로에서 전류가 흐를 수 있도록 기준점 역할을 한다.
  • 예를 들어 LED가 켜지려면 전류가 5V 핀에서 나와서 GND 핀으로 돌아가야 한다. 즉, GND핀은 전류가 돌아오는 "통로"인 셈이다. 

따라서 이 두 핀이 있어야 전류가 흘러 회로가 완성된다. 

 
💡 전류와 기준점의 개념

전류란 전기가 회로 안에서 흐르는 것을 말한다. 물이 파이프를 통해 흐르듯이 전류는 전선과 부품을 통해 흐르는 전자의 움직임이다. 전류가 흐르려면 시작점과 끝점이 필요한다. 물이 높은 곳에서 낮은 곳으로 흐르는 것처럼, 전류는 높은 전압(5V)에서 낮은 전압(0V)으로 흐른다. 

5V 핀은 5V 전압을 제공해 전류가 시작되도록 하며, GND 핀은 0V를 제공해 전류가 돌아올 기준점을 만든다.
여기서 기준점(GND)은 회로에서 전류가 어디로 돌아갈지 알려주는 귀환 지점이다. 예를 들어, LED를 켜려면 전류가 5V 핀에서 나와, LED를 지나 GND 핀으로 돌아가야 한다. GND 핀이 없으면 전류가 갈 곳을 잃기 때문에 회로가 작동하지 않는다. 

결론적으로, 5V 핀과 GND 핀은 전류가 흐를 수 있는 전압 차이와 경로를 만들어 회로를 완성한다. 

 

아두이노의 디지털 신호와 컴퓨터 논리 값의 연결

아두이노의 디지털 신호는 컴퓨터의 논리 값과 연결된다. 수학적으로 논리값은 참(TRUE)거짓(FALSE)라는 개념을 사용하며, 이를 컴퓨터에서 사용하는 이진 숫자로 표현하면 다음과 같다. 

  • TRUE = 1
  • FALSE = 0

이제 아두이노의 디지털 신호와 논리 값을 하나로 묶어보면 다음과 같은 관계가 성립한다. 

전압 아두이노 상태 논리 값 논리 상태 상태
5V HIGH 1 True 켜짐(ON)
0V LOW 0 False 꺼짐(OFF)

 
이 관계가 아두이노 프로그래밍의 기본이다. 예를 들어, LED를 켜고 싶으면 디지털 핀에 HIGH를 설정하고, 끄고 싶다면 LOW를 설정하는 것이다. 
 

TinkerCAD 실습 예제 2 : LED 깜빡이기

간단하게 LED를 1초 간격으로 깜빡이도록 하는 실습을 해 봄으로써 위 내용을 체득해보려고 한다. 지난 번 글에서 소개했던 TinkerCAD에서 실습한 내용을 조금 자세히 설명해 보기로 한다. 
 

✅ 준비 재료 

  • 아두이노 보드 (ex. Uno)
  • LED
  • 220Ω 저항(레지스터)
  • 와이어 (팅커캐드에서는 와이어가 따로 없고, 직접 마우스로 클릭해서 연결하면 된다.)

🟩 회로 연결

  1. LED의 양극(긴 다리)을 아두이노의 디지털 핀 13번에 연결한다.
  2. LED의 음극(짧은 다리)을 GND 핀에 연결한다.
    • LED 다리에 마우스 커서를 가져다 대면 양극, 음극이 표시된다. (그림 1-1 참조)
  3. 레지스터(저항)은 LED와 달리 극성이 없다. 따라서 레지스터의 다리들은 전압의 양극과 음극 중 어디에 연결해도 상관 없다.
    • 레지스터의 경우 다리에 마우스 커서를 가져다 대면 터미널 1, 터미널 2로만 표시된다. (그림 1-1 참조)
 

그림 1-1

 
위 단계에 따라 TinkerCAD에서 회로를 연결하면 그림 1-2와 같이 된다.
 

그림 1-2

 
 

💡 왜 디지털 핀 13번을 사용할까?

아두이노 Uno에서 디지털 핀 13번은 특별한 점이 있다. 이 핀에는 내장 LED가 연결되어 있어서 외부 LED를 연결하지 않더라도 코드를 테스트할 수 있다. 프로그래밍을 할 때 디지털 핀 13번에 HIGH를 설정하면 보드에 있는 작은 LED가 켜지고, LOW를 설정하면 꺼진다. 이 때문에 초보자 실습에서는 디지털 핀 13번을 자주 사용한다. 다른 디지털 핀(예: 2번, 3번)도 사용할 수 있지만, 13번은 내장 LED가 있어 보다 편리하다.

 
💡 왜 5V 핀이 아닌 디지털 핀을 사용할까?

앞에서 5V 핀은 항상 5V 전압을 출력한다고 했다. 하지만 5V 핀은 "항상 켜져 있는" 전원 공급원이기 때문에 프로그램으로 제어할 수 없다. 반면, 디지털 핀은 프로그램으로 HIGH(5V)와 LOW(0V)를 자유롭게 전환할 수 있다.
이번 실습의 목적인 LED를 깜빡이게 하려면 전압을 켰다 껐다 해야 하므로, 디지털 핀이 적합하다. 디지털 핀은 마치 프로그래밍 가능한 스위치처럼 동작한다.

- digitalWrite(13, HIGH) : 디지털 핀 13번이 5V를 출력해 LED를 켠다. (5V 핀과 같은 역할. 즉, 13번 핀과 GND 핀 사이에 전압 차이가 생겨 전류가 흐르면서 LED가 켜짐.)
- digitalWrite(13, LOW) : 디지털 핀 13번이 0V를 출력해 LED를 끈다. (GND 핀과 같은 역할. 즉, 13번 핀이 0V가 되어 GND와 전압이 같아지므로 전류가 흐르지 않아 LED가 꺼짐.)

즉, 5V 핀은 "항상 켜진 전원"을 제공하지만, 디지털 핀은 "제어 가능한 전원"을 제공해 LED를 깜빡이거나 조건부로 켜고 끌 수 있다.

 

🟩 아두이노 코드 작성

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

void loop() {
  digitalWrite(13, HIGH); // LED 켜기 (5V = HIGH)
  delay(1000);            // 1초 대기
  digitalWrite(13, LOW);  // LED 끄기 (0V = LOW)
  delay(1000);            // 1초 대기
}

 

🔑코드 설명

  • pinMode(13, OUTPUT): 13번 핀을 출력 모드로 설정한다.
  • digitalWrite(13, HIGH): 13번 핀에 5V 전압(=HIGH)을 출력해 LED를 켠다.
  • digitalWrite(13, LOW): 13번 핀에 0V 전압(=LOW)을 출력해 LED를 끈다.
  • delay(1000): 1초 동안 대기한다.

이 코드를 실행하면 LED가 1초마다 깜빡이는 것을 볼 수 있다. 이는 디지털 핀이 HIGH(5V)와 LOW(0V)를 번갈아 출력하기 때문이다.
 

TinkerCAD 실습 예제 2 : 디지털 신호를 논리 값으로 처리하여 버튼이 눌렸는지 확인하기

아두이노 프로그래밍에서는 디지털 신호를 논리 값으로 처리할 때도 많다.
이번에는 버튼을 누르면(HIGH) LED가 켜지고, 버튼을 놓으면(LOW) LED가 꺼지도록 회로를 구성해보도록 한다. 
 

✅ 준비 재료 

  • 아두이노 보드 (ex. Uno)
  • 4핀 푸시 버튼
  • LED
  • 10kΩ 저항
  • 와이어

4핀 버튼의 핀 구조

4핀 버튼은 내부적으로 대각선으로 마주보는 두 쌍의 핀이 연결되어 있다. 버튼의 핀을 시계방향으로 1, 2, 3, 4로 번호를 매기면 각각의 핀은 다음과 같이 연결된다. (그림 2-1 참조)

  • 핀1과 핀3이 내부적으로 연결됨
  • 핀2와 핀4가 내부적으로 연결됨
  • 버튼을 누르면 핀 1-3쌍과 핀 2-4쌍이 연결되어 핀1과 핀2가 전기적으로 연결된다. 

그림 2-1

 

🟩 회로 연결

 
버튼의 상태를 안정적으로 읽으려면 풀다운 저항(10kΩ)을 사용해 버튼이 눌리지 않을 때 디지털 핀이 명확히 LOW(0V)를 읽도록 해야 한다. 풀다운 저항은 버튼이 눌리지 않을 때 전류가 GND로만 흐르도록 기본 경로를 세팅해주는 역할을 한다.

  1. 버튼 핀1(또는 핀3)과 5V 연결:
    버튼의 핀1에 와이어를 연결하고 이 와이어의 다른 끝을 아두이노의 5V 핀에 연결한다. (또는 핀 3을 사용해도 1-3이 내부적으로 연결되기 때문에 동일하다.)
  2. 버튼 핀2(또는 핀4)와 디지털 핀 2번, 풀다운 저항 연결:
    • 버튼의 핀2에 와이어와 10kΩ 저항을 함께 연결한다. 납땜을 한다고 가정하면, 버튼 핀2에 두 개의 부품, 즉 와이어와 저항 다리를 한꺼번에 겹쳐 납땜하는 것과 같다. 이렇게 하면 버튼의 핀2가 하나의 노드로 아두이노의 디지털 핀 2번과 풀다운 저항에 동시에 연결된다.
    • 와이어의 다른 끝은 아두이노의 디지털 핀 2번에 연결한다. (또는 핀 4를 사용해도 2-4가 내부적으로 연결되기 때문에 동일하다.)
    • 풀다운 저항 연결:
      버튼의 핀2(또는 핀 4)에 연결된 풀다운 저항의 다른 쪽 끝을 아두이노의 GND핀에 연결한다.  
  3. LED 회로와 함께 구성
    버튼 회로와 함께 LED 회로(디지털 핀 13번, 220Ω 저항, GND)를 연결한다. 두 회로는 독립적이지만 다른 GND 핀을 쓰든 같은 GND 핀을 공유하든 상관 없다. 

위 단계에 따라 TinkerCAD에서 회로를 연결하면 그림 2-2와 같이 된다.

그림 2-2

🟩 회로 동작

  • 버튼을 안 누르면 : 핀2(or 핀 4)는 풀다운 저항을 통해 GND(0V)에 연결되어 디지털 핀 2번이 LOW(0)을 읽는다. 풀다운 저항은 버튼이 열려 있을 때 디지털 핀이 불안정한 상태(떠 있는 상태)를 방지한다. (그림 2-3)
  • 버튼을 누르면 : 핀 1-3쌍(5V)과 핀 2-4쌍이 연결되어 디지털 핀 2번이 5V를 받아 HIGH(1)를 읽는다. 풀다운 저항은 저항이 크기 때문에 대부분의 전류가 디지털 핀 2번으로 흐른다. (그림 2-4)
    * 디지털 핀 2번이 HIGH(1)를 읽으면, 코드의 if (buttonState == HIGH) 조건문이 참이 되어 digitalWrite(ledPin, HIGH)를 실행한다. 이 명령은 디지털 핀 13번에 5V를 출력해 LED 회로(디지털 핀 13번 → 220Ω 저항 → LED → GND)로 전류를 흘려 LED를 켠다.

그림 2-3 버튼을 누르지 않았을 때
그림 2-4 버튼을 눌렀을 때

🟩 아두이노 코드 작성

int buttonPin = 2; // 버튼이 연결된 핀
int ledPin = 13;   // LED가 연결된 핀

void setup() {
  pinMode(buttonPin, INPUT);  // 버튼 핀을 입력으로 설정
  pinMode(ledPin, OUTPUT);    // LED 핀을 출력으로 설정
}

void loop() {
  int buttonState = digitalRead(buttonPin); // 버튼 상태 읽기
  if (buttonState == HIGH) {                // 버튼이 눌림 (5V = 1)
    digitalWrite(ledPin, HIGH);             // LED 켜기
  } else {                                  // 버튼이 안 눌림 (0V = 0)
    digitalWrite(ledPin, LOW);              // LED 끄기
  }
}

 
이 코드에서 digitalRead(buttonPin)는 버튼 핀의 상태를 읽어 HIGH(1) 또는 LOW(0)를 반환한다. 논리 값으로 보면:

  • 버튼이 눌리면 TRUE(1) → LED 켜짐
  • 버튼이 안 눌리면 FALSE(0) → LED 꺼짐

🔑코드 설명

  • pinMode(buttonPin, INPUT): 디지털 핀 2번을 입력 모드로 설정해 버튼 상태를 읽는다.
  • pinMode(ledPin, OUTPUT): 디지털 핀 13번을 출력 모드로 설정해 LED를 제어한다.
  • digitalRead(buttonPin): 버튼 상태를 읽어 HIGH(1, 버튼 눌림) 또는 LOW(0, 버튼 안 눌림)를 반환한다.
  • if (buttonState == HIGH): 버튼이 눌리면 디지털 핀 13번에 HIGH(5V)를 출력해 LED를 켠다.
  • else: 버튼이 눌리지 않으면 디지털 핀 13번에 LOW(0V)를 출력해 LED를 끈다.

이 코드를 실행하면 버튼을 누를 때 LED(와 아두이노의 내장 LED)가 켜지고, 놓으면 꺼진다.

 

정리: 아두이노 디지털 신호의 핵심

아두이노 디지털 신호의 핵심 포인트를 정리하면 다음과 같다.

  • HIGH(5V)는 "켜짐", 논리 값 1, TRUE를 의미한다.
  • LOW(0V)는 "꺼짐", 논리 값 0, FALSE를 의미한다.
  • 5V 핀은 5V 전압을 공급하고, GND 핀은 0V 기준점을 제공해 회로를 완성한다.
  • 프로그래밍에서는 digitalWritedigitalRead로 신호를 제어하고 읽는다.

이 개념은 LED 제어뿐 아니라 센서, 모터, 디스플레이 등 다양한 아두이노 프로젝트에 적용이 가능하다.