이 문서는 아두이노 보드를 사용하기 위해 필요한 프로그래밍 기초 지식이 없는 분들을 위한 가이드 문서입니다. 따라서 이미 프로그래밍에 대한 경험이 있다면 이 강좌 시리즈는 넘어가셔도 좋습니다.

=============================================================

.

인간의 생물학적 근원을 쫓아가다보면 결국 단순한 4개의 염기의 배열로 나타낼 수 있듯 프로그램도 분해하다보면 변수와 조건문, 반복문의 조합이란 것을 알 수 있습니다. 그만큼 조건문과 반복문은 소스코드의 흐름을 분석하는데 중요한 요소입니다. 이번 강좌에서는 그 중 조건문에 대해서 살펴볼겁니다.

1. LED 밝기조절 예제

아두이노에서 제공하는 기본 예제 중 하나인 Fade 예제를 보겠습니다. 

http://arduino.cc/en/Tutorial/Fade

이 예제는 LED 를 아두이노의 PWM 핀에 연결해서 밝기를 원하는대로 조정하는 예제입니다. LED의 밝기를 조정하려면 어떻게 해야 하죠? 아두이노 핀으로 출력되는 5V 전압을 적당히 낮춰주면 됩니다. 그런데 아두이노는 핀으로 출력되는 전압 자체를 조절하는 능력은 없습니다. 대신에 PWM 이란 방법을 사용합니다. (예제 이해를 위해 PWM 설명을 덧붙였지만 프로그래밍 자체에 대한 이해가 목적이므로 아래는 무시하셔도 좋습니다.)

PWM(Pulse Width Modulation, 펄스 폭 변조) 이란?  PWM은 5V출력을 on/off 상태로 유지하는 것으로 출력하는게 아니라 빠르게 on/off 를 반복하는 것입니다. 아래 그림처럼요. 

pwm1

이걸 매우 빠르게 반복하는 겁니다. 그러면 위 예시처럼 on/off 간격(Pulse Width)에 따라 평균전압이 낮아지는 효과가 납니다. 평균전압이 낮아져서 LED를 어둡게 만들 수 있는거죠. 아두이노에서는 500Hz 주파수, 2ms 간격으로 이런 작업을 수행합니다. 그리고 아두이노는 이 단계를 256 단계로 구분할 수 있습니다. 우리가 0V(0) ~ 5V (255)를 256 단계로 구분해서 입력할 수 있다는 뜻입니다. on/off 출력이 아니라 단계적인 출력이 가능하므로 아날로그 출력이라고도 합니다.

아두이노가 가진 Digital 핀 중 PWM 기능을 가진 핀들이 이미 정의되어 있습니다. 아두이노 보드에 있는 각각의 핀 아래에는 핀 번호가 적혀있는데 PWM 기능을 가진 핀은 앞에 (~) 물결 마크가 붙어 있습니다. 아래 그림에서 보듯 3, 5, 6, 9, 10, 11번 핀이 PWM 핀이죠.

ArduinoUno_r2_front450px

설명한대로 PWM 핀에 LED를 아래와 같이 연결합니다. 아래 그림에서 5V 에서 나오는 빨간 선은 연결할 필요가 없습니다. 

9번핀 -> 220 ohm 저항 -> LED 긴 다리 -> LED 짧은 다리 -> GND 순서로 연결하면 됩니다.

simplefade_bb

우리는 PWM 핀인 9번 핀을 통해 출력 전압을 조정해서 LED 밝기를 바꿀겁니다.

2. 예제 코드

본격적으로 예제 코드를 확인해 보겠습니다.

/*
 Fade
 
 This example shows how to fade an LED on pin 9
 using the analogWrite() function.
 
 This example code is in the public domain.
 */

int led = 9;           // the pin that the LED is attached to
int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by

// the setup routine runs once when you press reset:
void setup()  { 
  // declare pin 9 to be an output:
  pinMode(led, OUTPUT);
} 

// the loop routine runs over and over again forever:
void loop()  { 
  // set the brightness of pin 9:
  analogWrite(led, brightness);    

  // change the brightness for next time through the loop:
  brightness = brightness + fadeAmount;

  // reverse the direction of the fading at the ends of the fade: 
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ; 
  }     
  // wait for 30 milliseconds to see the dimming effect    
  delay(30);                            
}

3개의 전역 변수가 선언되어 있습니다. led, brightness, fadeAmount 는 각각 PWM 핀 번호, 현재 LED 밝기값, 밝기 변화 간격을 의미합니다. 다른 부분은 이전 강좌에서 설명해 드린 내용과 겹치므로 loop() 함수만 집중해서 보겠습니다.

analogWrite(led, brightness);

위 라인이 PWM 핀을 통해 아날로그 출력(0~255)을 하는 부분입니다. analogWrite() 함수가 이런 역할을 하는 아두이노 제공 함수입니다. 함수를 호출할 때 PWM 핀 번호와 아날로그 출력 단계값을 넣어줬습니다. 즉, brightness 는 0~255 사이의 값을 가져야 합니다.

brightness = brightness + fadeAmount;

그리고 이어져서 나오는 위 라인이 다음번 LED 밝기를 조정하기 위해 brightness를 조절합니다. brightness에 저장된 밝기를 fadeAmount 변수에 저장해 둔 만큼 증가시킵니다. 그리고 다시 brightness 로 저장합니다.

3. 조건문

  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ; 
  }

이제 위와같은 조건문이 나옵니다. 결론부터 말하자면 위 조건문은 밝기값이 0~255 범위를 벗어나지 않도록 fadeAmount 값을 조절하는 역할을 합니다.

if(조건) { 조건이 맞을 때 처리할 내용 }

조건문은 위와 같이 사용합니다. if 로 시작되는 소괄호 안에서 어떤 변수가 특정 값보다 크거나(>), 작거나(<), 같거나(==), 다르거나(!=)… 이런 조건들을 비교해서 조건과 같으면 중괄호 안의 내용들을 처리합니다.

이 예제의 목표는 0부터 시작해서 5씩 밝기를 증가시키다가 최대값 255가 되면 다시 밝기를 5씩 감소시키는 것입니다. 그러기 위해서 loop() 함수가 반복될 때마다 밝기값(PWM 출력)을 재설정 하는 것이죠. 

먼저 0부터 시작해서 5씩 밝기를 증가시키려면? loop() 함수가 처음 실행될 때 brightness 를 0으로 맞춰두고 fadeAmount 를 5로 맞춰두면 loop 함수가 반복될 때 마다 5씩 밝기가 증가하겠죠. 그래서 brightness, fadeAmount 전역변수를 0과 5로 초기화 해 둔 겁니다. 이제 밝기가 증가하다가 255가 되면 범위를 벗어나지 않도록 다시 밝기를 내려야겠죠?

  if (brightness == 255) {
    fadeAmount = -fadeAmount ; 
  }

위와 같이 하면 brightness 가 255가 되었을 때 fadeAmount 를 -5로 바꿉니다. fadeAmount 의 부호를 바꾸어서 다시 저장한겁니다. 이제부터는 loop 함수가 실행될 때 마다 -5씩 감소할겁니다.

그러다 0이 되면 다시 5씩 증가해야겠죠. 아래 코드처럼…

  if (brightness == 0) {
    fadeAmount = -fadeAmount ; 
  }

0이 되었을 때 fadeAmount의 부호를 바꾼겁니다. -5 에서 5로 바뀌겠죠. 이 두가지 조건문을 하나로 합친것이 아래 코드입니다.

  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ; 
  }

밝기가 0, 255 경계값에 도달하면 fadeAmount 의 부호를 바꿔서 범위를 벗어나지 않도록 조절하는 겁니다. 이걸 하나의 조건으로 표현하기 위해서 || 를 사용했습니다. (or, 또는) 에 해당하는 표현입니다. 위 코드를 인간의 언어로 읽으면

조건 (밝기가 0 또는 밝기가 255) { fadeAmount 부호를 바꿈 }

이렇게 됩니다. 보통 조건문에서 여러 조건을 합치는 방법으로 && 도 많이 사용합니다. (and, 그리고)라는 표현입니다. 이 경우는 앞뒤에 있는 조건을 모두 만족해야 한다는 표현입니다.

  if (brightness == 0 && brightness == 255) {
    fadeAmount = -fadeAmount ; 
  }

위 예시처럼 || 대신 &&로 바꿔서 실행하면 어떻게 될까요?

조건 (밝기가 0 그리고 밝기가 255) { …}

이런 조건은 절대 만족할 수가 없습니다. 밝기값은 0과 255가 동시에 될 수는 없으니까요. 따라서 위처럼 잘못 작성되면 brightness 값이 255를 넘어 계속 증가하는 사태가 발생할겁니다. fadeAmount 값이 음수로 바뀌는 부분이 고장난거니까요.

  delay(30);

loop 함수 마지막에는 잠시 쉬어가는 부분이 나옵니다. loop 함수가 너무 빨리 반복되면 곤란해서…

4. 실행 결과

LED 밝기가 밝아졌다 어두워졌다를 반복합니다.

다음 강좌에서는 반복문을 보도록 하겠습니다.

# 강좌의 내용이 명확하지 않거나 이해가 힘든 부분이 있으시면 댓글로 말씀해 주세요. 해당 부분을 지속적으로 업데이트 하겠습니다.

=============================================================

이 문서는 작성자의 동의없이 개인적인 목적 외의 상업적인 목적으로 활용되어서는 안됩니다.

이 문서의 일부 혹은 전체를 수정, 삭제, 재배포 하여서는 안됩니다.

작성자 : GodsTale (godstale@hotmail.com)