이번에는 디지털 출력을 이용해 LED를 켰다 껐다만 하는 것이 아니라, 밝기까지 같이 조절하는 제어방법에 대해 봅시다!
#1 디지털 신호와 전압
흔히 디지털 신호는 0과 1의 값을 갖는다고 알려져있죠.
그럼 대체 그 0과 1의 신호는 어떻게 생긴 신호일까요?
앞선 포스팅에서 아날로그와 디지털을 간단히 설명했지만, 조금 더 명확하게 설명하자면
디지털 신호라 함은 전압 신호를 두가지 상태로만 나눠서 사용하는 경우를 말합니다.
이런 디지털 신호는 어느정도의 노이즈가 있어도 안정적으로 신호를 보낼 수 있기때문에 통신에 주로 사용이 됩니다.
#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) )
입니다.
코드를 업로드 하시면, 30ms 간격으로
주기 점유율이 0, 5, 10, 15, ... , 255 까지 올라가면서 밝아지고,
끝까지 밝아진 다음에는 255, 250, 245, ... 0 까지 내려가면서 어두워 진답니다.
PWM은 이렇듯 추가적인 전자부품없이, 디지털의 방법으로 전압을 가변하는것과 같은 효과를 내줄 수 있어
다양한 방면의 신호제어에 사용이 된답니다.
이상입니다!
'Projects > Arduino Project' 카테고리의 다른 글
아두이노-LED 제어 방법[1] (0) | 2017.07.04 |
---|---|
아두이노-SD카드에 데이터 로깅하기 (1) | 2017.05.26 |
프로세싱-시리얼 플로터 (Serial Plotter)를 통한 아두이노 그래프 그리기 (1) | 2017.05.22 |
아두이노-조이스틱으로 서보모터 제어 (0) | 2017.04.22 |
아두이노-푸리에 변환 (FFT)과 활용 (73) | 2017.04.12 |