이번에는 디지털 출력을 이용해 LED를 켰다 껐다만 하는 것이 아니라, 밝기까지 같이 조절하는 제어방법에 대해 봅시다!


#1 디지털 신호와 전압

흔히 디지털 신호는 0과 1의 값을 갖는다고 알려져있죠.

그럼 대체 그 0과 1의 신호는 어떻게 생긴 신호일까요?


앞선 포스팅에서 아날로그와 디지털을 간단히 설명했지만, 조금 더 명확하게 설명하자면

디지털 신호라 함은 전압 신호를 두가지 상태로만 나눠서 사용하는 경우를 말합니다.


특정 전압 이상이 되면 1, True, HIGH 상태가 되고, 특정 전압 이하면 0. False, LOW 상태가 됩니다.


이런 디지털 신호는 어느정도의 노이즈가 있어도 안정적으로 신호를 보낼 수 있기때문에 통신에 주로 사용이 됩니다.



#2 LED 밝기 제어

그럼 순수한 디지털 신호만 이용한다면 LED의 두가지 상태, 즉 On/ Off 를 제어할 수 있겠죠

 

그럼 LED의 밝기는 어떻게 조절 할 수 있을까요?


보통 밝기는 LED에 가해지는 전압에 따라 정해지게 되어있습니다.


위 회로처럼 꾸미고 나면 베터리에서 나온 전류는 스위치를 거치고 LED와 저항을 거쳐 흐르겠죠.


그렇다면 저항이 높아지면 어떻게 될까요?


상대적으로 LED에 걸리는 전압보다 저항에 걸리는 전압이 커지겠죠? 


위 회로는 저항과 LED가 직렬로 연결되어있으므로, 


i 는 LED와 저항에 동일하게 흐르지만, V=i*R 이므로, 저항(R) 이 커지면 저항에 걸리는 전압(V)도 커진답니다.


저항을 낮추면 어떨까요? 당연히 저항에 걸리는 전압은 낮아지겠죠


결국,


저항 -> 저항에 걸리는 전압 -> LED에 걸리는 전압 -> LED 밝기 감소

저항 -> 저항에 걸리는 전압 -> LED에 걸리는 전압 -> LED 밝기 증가


의 관계가 형성이 되죠!


때문에 밝기 제어를 위해서는 저항값을 바꿀 수 있는 가변저항(Potentiometer)가 필요합니다.


하지만 저항을 사용하게되면 LED를 켜는데 전력이 소모될 뿐만 아니라 가변저항에서도 에너지가 소모되겠죠?


그럼 어떻게 하면 쓸데없는 에너지 손실을 없애고 밝기를 제어할 수 있을까요...?



#3 아두이노를 이용한 디지털 LED 밝기 제어

자 우리가 가변저항을 없애고 제어를 한다면 불빛이 '켜진 경우' 와 '꺼진 경우' 두가지 상황밖에 만들수가 없습니다.


그럼 우리가 할 수 있는일은 껐다 켰다를 반복해보는거죠.


껐다 켜기를 1초에 2번, 4번, 10번, 100번, ... 빠른 속도로 껐다켰다를 하면 눈에는 어떻게 보일까요?


꺼진것 처럼 보일까요? 켜진것 처럼 보일까요? 깜빡인다는걸 인식할 수 있을까요?


사람의 눈은 흔히 초당 60번 (60Hz) 이상의 변화를 감지하기 힘들다고 하죠. 


물론 정량적으로 초당 몇번을 볼 수 있는지 아직까지는 말이 많습니다만, 


대락 수백 Hz 이상이면 사람의 눈으로는 깜빡임을 감지할 수 없습니다.


그리고 눈으로 확인했을때, 꺼진것도, 켜진것도 아닌 중간의 밝기로 보이게 됩니다.


즉, 껐다 켰다를 빠르게 반복하면 밝기가 조절된것 같은 효과를 낼 수 있다는 것 이지요.


실제로 LED 형광등으로 나오는 제품들이 이와 같은 원리를 사용한답니다.


그럼 어떤 요소가 밝기를 변화시키는 주된 요소일까요?


초당 LED를 깜빡이는 속도일까요?


아래 그림을 보시면 알 수 있습니다.



두 신호는 동일한 속도로 깜빡이는 신호입니다. 


즉 한 번 껐다 켜지는데 걸리는 시간이 동일한 신호죠.


다만 다른점은 한 주기 안에서 켜져 있는 상태의 비율(점유율)이 다릅니다.


켜져있는 상태의 폭이 다른 것이죠.


이런 형태의 신호로 하드웨어를 제어하는 방식을 


펄스 폭 변조, Pulse Width Modulation (PWM) 


라고 부른답니다.


그렇다면 어느 신호가 LED를 밝게 만들까요?


신호 1번이 LED를 더 밝게 만들것 같죠?


왜 그런지 조금만 더 구체적으로 살펴봅시다.



전압이라는 성분은 우리가 빠른속도로 껐다켜게 되면


정말 순간적으로 0V에서 5V로 변하는 것이 아니라 전압 강하와 상승에 약간의 시간이 소요됩니다.


그 한계의 순간에서 전압을 빠르게 껐다켰다하게되면


전압은 그 주기 안에서의 평균적인 값으로 나타나는것 처럼 보이게 됩니다.


때문에 주기를 변화시키게되면 전압이 변하게 되고, 이를 통해 밝기가 바뀌게 되는겁니다.


그렇다면 아두이노에서 한 번 구현을 해볼까요?



위와 같은 회로를 구성한 다음, 아두이노 IDE에서


파일 -> 예제 -> Basic -> Fade 를 여시면 됩니다.


초기 핀 세팅이 9번으로 되어있는데, 이를 13번으로 바꿔주시면 됩니다.


위 코드에서 앞서 말씀드린 PWM 신호를 생성해 주는 함수는


analogWrite( 핀번호, 주기 점유율(0 ~ 255) )


입니다. 


int led = 13;           // the PWM pin 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 13:
  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);
}


코드를 업로드 하시면, 30ms 간격으로 


주기 점유율이 0, 5, 10, 15, ... , 255 까지 올라가면서 밝아지고,


끝까지 밝아진 다음에는 255, 250, 245, ... 0 까지 내려가면서 어두워 진답니다.




PWM은 이렇듯 추가적인 전자부품없이, 디지털의 방법으로 전압을 가변하는것과 같은 효과를 내줄 수 있어


다양한 방면의 신호제어에 사용이 된답니다.



이상입니다!

+ Recent posts