아두이노 레시피 : LED Dimmer - 기초편
# Recipe 16. LED 정복하기 시리즈 : Dimmer

photo by Technology Tutorials
안녕하세요~ 아두이노셰프입니다. 어제 for함수로 단순히 반복 말고도, 핀제어등 다양하게 사용할 수 있다는 걸 다뤄봤었는데요. 어떠셨을지 모르겠네요ㅎㅎ 지금껏 '깜빡이기'만 했는데, 실제로 'LED등'을 보면 단순히 켜고 끄는 것 말고도 디머, 색 바꾸기 등 다양한 기능이 있는 걸 볼 수 있잖아요. 오늘은 아두이노로 이 디머 기능을 만들어보겠습니다. 디머가 무엇이냐고요? DIMMER는 쉽게 '밝기 조절'이라고 생각하시면 될 것 같아요. 1,0인 디지털 신호 말고, 전기세기를 미세하게 조정해서 밝기를 조절할 수 있어요. 오늘 PWM이란 새로운 개념이 나오는데, 간단하게 다뤄보고요. 또한 가변저항을 이용해서 LED 밝기도 조절해 보겠습니다.
오늘은 그 세 번째 시간, ‘Dimmer'; ‘밝기조절’입니다.

오늘의 재료 Ingredient
<메인 재료>
LED (3개)

<그 외 재료>
아두이노 우노
브레드보드
1kΩ 저항(3개)
수-수 케이블(10개)
가변저항
메이킹 방법 Steps
Step 1. 선 연결하기 Wiring

a. LED 두 다리(극) 중 긴 쪽이 + , 짧은 쪽이 - 에요.(반대로 연결하시면 불이 안 들어와요!)
b. LED의 +(긴 극)를 저항의 한쪽과 연결해 주세요.
c. 저항의 남은 한쪽은 각각 아두이노의 D9,10,11번에 연결해 주세요.
d. LED의 -(짧은 극)을 아두이노의 GND에 연결해 주세요.
e. 가변저항의 첫째 핀은 5v, 둘째 핀은 A0, 셋째 핀은 GND에 연결해 주세요.
(그림을 참고해 주세요!)
- - - - - - - - - -
Step 2. 아두이노 코드 Code review
여러분의 요리가 훨씬 간편해질 수 있도록, 숙성이 필요한 코드는 언제나 제가 준비할게요ㅎㅎ
Q. 질문 : 9번 LED를 50%의 밝기로 깜빡이려면 어떻게 해야 할까요?
void setup()
{
pinMode(9, OUTPUT);
}
void loop()
{
analogWrite(9, 127);
delay(1000);
analogWrite(9, 0);
delay(1000);
}
Q. 질문 : LED 3개 모두 50%의 밝기로 깜빡이려면 어떻게 해야 할까요?
void setup()
{
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
}
void loop()
{
analogWrite(9, 127);
analogWrite(10, 127);
analogWrite(11, 127);
delay(1000);
analogWrite(9, 0);
analogWrite(10, 0);
analogWrite(11, 0);
delay(1000);
}
Q. 질문 : LED 3개가 0%~100%까지 서서히 켜졌다가 서서히 꺼지려면 어떻게 해야 할까요?
void setup()
{
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
}
void loop()
{
for(int i = 0; i<255; i++){
analogWrite(9, i);
analogWrite(10, i);
analogWrite(11, i);
delay(5);
}
for(int i = 255; i>0; i--){
analogWrite(9, i);
analogWrite(10, i);
analogWrite(11, i);
delay(5);
}
}
Q. 질문 : 가변저항에 따라 LED 3개의 밝기를 조절하려면 어떻게 해야 할까요?
void setup(){
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(A0,INPUT);
}
void loop(){
int pot = analogRead(A0);
int pwm = map(pot,0,1023,0,255);
analogWrite(9, pwm);
analogWrite(10, pwm);
analogWrite(11, pwm);
}
Step 3. 동작시키기 Working
● 코드를 아두이노 우노에 업로드해 주세요.
● 코드를 하나씩 업로드하여 동작시켜 보세요. 질문한 대로 잘 동작되나요?
코드의 동작 알고리즘
알고리즘은 쉬운 말로 ‘진행절차’라고 할 수 있습니다.
코드가 어떻게 동작되는지 알아볼까요?
오늘의 코드를 이해하려면 pwm이란 개념을 알아야 해요.
pwm 이란 pulse with modulation의 약자로
우리말로 하면 펄스폭 변조 정도가 되겠네요.
제가 그림하나를 가져왔어요.

1,0 밖에 없는 디지털 신호를 그래프로 나타내면 이런 모양이랍니다.
아날로그 신호와 달리 중간이 없거든요
하지만 이런 디지털 신호로도 아날로그처럼
전압의 세기를 조절할 수 있답니다.
그게 바로 PWM이란 기술이에요.

PWM은 0~255까지의 범위를 가져요. 0은 0, 255는 1인 거죠.
세기를 직접 조절하지는 못하지만
위의 그래프처럼 신호의 시간간격을 조절해서
세기를 만들어낼 수 있답니다.
0과 1의 간격이 짧아지면 짧아질수록
세기는 더욱 세집니다.
간단히 이런 원리로
디지털핀을 가지고 전압의 세기를 조절할 수 있어요.
대신 모든 디지털 핀들이 사용 가능한 건 아니고
옆에 '~' 표시 있는 핀들만 PWM 사용이 가능해요.

9,10,11번 핀의 옆을 보면 '~' 표시가 있지요?
PWM사용이 가능한 핀들이랍니다!
자, 이제 질문에 대한 답을 알아볼까요?
Q. 질문 : 9번 LED를 50%의 밝기로 깜빡이려면 어떻게 해야 할까요?
아두이노에서 PWM을 사용하려면
analogWrite함수에 디지털핀을 넣어주면 된답니다.
대신 범위는 0~255인 것 잊지 말고요.
50%라고 했으니 최댓값이 255의 절반이면 되겠지요?
전 127로 할게요.
analogWrite(9,127);
이렇게 하면 9번 핀을 50%의 밝기로 켤 수 있어요.
Q. 질문 : LED 3개 모두 50%의 밝기로 깜빡이려면 어떻게 해야 할까요?
이것도 어렵지 않겠죠?
analogWrite(9,127);처럼
10번 11번도 똑같이 켜주고
다시 0으로 꺼주면 되니까요.
Q. 질문 : LED 3개가 0%~100%까지 서서히 켜졌다가 서서히 꺼지려면 어떻게 해야 할까요?
analogWrite(핀번호, 세기)
이렇게 사용해야 하니까
세기를 0~255까지 모두 넣어야겠군요..
그럼 설마 코드만 255줄??
그건 아니겠죠.
다시 한번 for문의 힘을 빌려봅시다!
0부터 255까지 값을 변경하고
계속 반복하려면....
이거 그냥 for문에 대한 설명이죠?ㅋㅋㅋ
for(int i=0; i <255; i++)
이렇게 하면 초기값 0부터 1씩 계속 더해져서
255가 되면 멈추겠네요.
그리고
analogWrite(9, i);
이렇게 하면 for문이 한번 반복될 때마다
i의 값만큼 LED의 세기가 출력되겠죠?
또한 반대로 255부터 1까지 가려면
for(int i=255; i>0; i--)
이렇게
초기값을 255로 하고, 0보다 클 때까지만
1씩 빼면 되겠죠?(-- 는 x=x-1이라는 표현이에요)
for문이 아직 어려우신 분은 이전포스팅
LED 깜빡이기, 여러 LED 깜빡이기 편을 참고해 주세요!
Q. 질문 : 가변저항에 따라 LED 3개의 밝기를 조절하려면 어떻게 해야 할까요?
서보모터 응용 편을 보신 분들은 쉽게 이해하실 수 있을 텐데요.
pwm으로 제어하려면
가변저항의 신호를 0~255로 변환해야 되잖아요.
analogRead로 들어오는 가변저항의 값은
0~1023(아날로그 신호의 범위)까지니까
이를 변환해야 하죠.
여기서 map함수라는 녀석이 사용됩니다.
[입력값, 입력값의 범위, 변환할 값]
을 입력하면 바로 변환해 주는 함수예요.
map(analogRead(A0),0,1023,0,255)
이렇게 하면 가변저항을 돌리는 값이 PWM 범위에 맞게 매칭될 겁니다.
이 변환된 값을
analogWrite로 출력하면
가변저항을 돌리는 대로
세기를 조절할 수 있답니다~
map함수에 대해서는
'가변저항으로 서보모터 제어하기 - 초중급 편'을 참고해 주세요~~
for문이 생각보다 쓸모가 많죠?ㅎㅎ