본문 바로가기
아두이노

[Do it! 아두이노] 5. 디지털 출력으로 아두이노 작동하기

by Lizardee 2023. 8. 19.
1. LED로 불을 반짝이는 아두이노 만들기

▶ LED란?

  • 다이오드(diode): 전류를 한쪽으로만 흐르게 하고 반대쪽으로는 흐르지 못하게 하는 전자 부품
  • LED(light emitting diode): 발광 다이오드, 전류가 흐를 때 빛을 낸다.

 

LED의 작동 원리

불이 들어오는 LED

LED는 두 개의 다리와 모자로 구성된다.

- 다리: 전류가 흐르는 길, 긴 다리는 양(+), 짧은 다리는 음(-)의 극성을 나타낸다.

- 모자: 빛을 내는 전구

--> 전류는 양극에서 음극으로, 높은 전압에서 낮은 전압으로 흐른다. 아두이노 보드에서는 전압이 높은 쪽이 전원(5V)이고, 전압이 낮은 쪽이 접지(0V)이다. 따라서 LED의 양극을 아두이노 보드의 전원(5V)에, 음극을 접지(GND)에 연결하고 아두이노 보드를 작동하면 LED에 전류가 흘러 빛이 난다.

양극 --> 전원(5V), 음극 --> 접지(GND)

 

Do it! 실습 5-1. LED 깜빡이기

  • LED의 양극을 전원(5V)이 아니라 디지털 13번 핀에 연결하는 이유?
    LED의 양극에 전원(5V) 핀을 연결하고 음극에 접지(0V)를 연결하면 전류가 할상 흐르기 때문에 빛이 꺼지지 않는다. 하지만 LED를 깜빡이게 하려면 전류를 흐르게 했다 끊었다를 반복해야 한다. 따라서 아두이노의 디지털 핀(13번 핀)에 LED를 연결하고, 전압을 변경해서 전류의 흐름을 제어한다.
    예를 들어, 디지털 핀에 5V 전압을 걸면 전류가 흐르고, 0V 전압을 걸면 전류가 흐르지 않기 때문에 LED를 깜빡이게 만들 수 있다.
// C++ code
//
void setup()                    //전원이 들어오면 가장 먼저 한 번만 실행
{
	pinMode(13, OUTPUT);        // 13번 핀을 출력 모드로 선언
}

void loop()                     //수 마이크로초 주기로 반복 실행
{
	digitalWrite(13, HIGH);     //13번째 핀에 HIGH 신호를 보냄
	delay(1000);                //1000ms(1초)동안 지연
	digitalWrite(13, LOW);      //13번째 핀에 LOW 신호를 보냄
	delay(1000);                //1000ms(1초)동안 지연
}

▶ setup(): 전원이 들어오면 가장 먼저 한 번만 실행된다.

  • pinMode(핀 번호, 사용 목적)
    예) pinMode(13, OUTPUT): 13번 핀을 출력 모드로 선언한다.

▶ loop(): 함수 안에 들어 있는 명령을 반복해서 실행한다.

  • digitalWrite(핀 번호, 신호값)
    예) digitalWrite(13, HIGH): 13번핀에 5V 전압을 보낸다.
    예) digitalWrite(10, LOW): 10번 핀에 0V 전압을 보낸다.
  • delay(지연 시간)
    예) delay(1000): 1000ms(1초) 동안 지연한다.

 


2. 저항을 추가해 회로 완성하기

▷ 저항은 방향성이 없다.
저항은 LED와 달리 방향성이 없다. 그러므로 전원(5V)과 접지(GND)에 연결할 단자를 구분하지 않아도 된다.
예를 들어, 저항 양끝 단자를 A와 B라고 한다면, A를 전원에 연결하고 B를 접지에 연결하거나, A를 접지에 연결하고 B를 전원에 연결하더라도 똑같이 동작한다.

 

▶ 저항값을 읽는 방법

  • 저항의 단위: 옴(Ω)

저항의 값이 클수록 적은 양의 전류가 흐르고, 저항의 값이 작을수록 더 많은 양의 전류가 흐른다.

 

Do it! 실습 5-2. LED 회로에 저항 추가하기

LED 회로에 저항 추가하기

  • 전압 = 5V
  • LED = 0.02A
  • 저항 = 5/0.02 = 250Ω

 

 

3. 직렬 모니터로 아두이노 작동 상태 살펴보기
Do it! 실습 5-3. 직렬 모니터로 오류 발견하기

직렬 모니터로 오류 발견하기

▶ Serial.begin() 함수
: 직렬 통신(serial communication)을 시작하기 전 통신 속도를 초기화하는 함수

--> Serial.begin() 함수의 매개변수는 통신 속도를 설정한다. 예를 들어, 통신 속도를 9600으로 설정하면 아두이노가 직렬 모니터로 초당 9,600bit 크기의 데이터를 전송한다. 아두이노에서 사용할 수 있는 속도는 다양하지만 서킷에서는 9600만 지원한다.

 

▶ Serial.println() 함수

: 데이터를 모니터에 출력하는 함수

- Serial.print(): 줄바꿈x

- Serial.println(): 줄바꿈o

// C++ code
//
void setup()
{
  pinMode(13, OUTPUT);
  Serial.begin(9600); //초당 9,600bit를 전송하도록 직렬 통신 속도를 초기화
}

void loop()
{
  digitalWrite(13, HIGH);
  Serial.println(HIGH); //직렬 모니터에 HIGH값 출력하고 줄 바꿈
  delay(1000); 
  digitalWrite(13, LOW);
  Serial.println(LOW); //직렬 모니터에 LOW값 출력하고 줄 바꿈
  delay(1000); 
}

 


도전: LED 두 개를 번갈아 깜빡여 봐요!

LED 두 개를 번갈아 깜빡여 봐요!

// C++ code
//
void setup()
{
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  digitalWrite(12, LOW);
  digitalWrite(13, HIGH); //13 HIGH
  Serial.println(HIGH);
  delay(1000); 
  
  digitalWrite(13, LOW);
  digitalWrite(12, HIGH); //12 HIGH
  Serial.println(HIGH);
  delay(1000);
}