티스토리 뷰

Processing

[Arduino with processing] PWM-Controlled LED

생각많은 소심남 2012. 8. 13. 23:59

지난 포스트에서는 컴퓨터의 마우스커서를 통해서 LED를 제어하는 시리얼통신에 대해서 다뤘습니다. 실은 이렇게 쓴 글의 주제를 어디로 해야 될지가 참 고민이 되었습니다. 어떻게 보자니 아두이노에 속하는 내용이고, 다르게 보면 프로세싱 글입니다. 하지만 큰 맥락에서 보면 제 목적은 결국 키넥트의 입력값을 아두이노의 출력으로 내보내는데 그 중간 요소인 프로세싱을 다루는게 맞는 듯합니다. 아마 아두이노 부분에서는 그 본연의 기능에 대해서 다루려고 합니다. 

 아무튼 이번에는 아두이노 파트에서 계속 다룬 PWM을 활용해서 LED를 조금더 부드럽게 제어해보고자 합니다. 그 글에서도 언급했었지만 PWM이란 전압의 on/off 폭을 제어하는 것을 말하는데 LED에서는 사람 눈의 잔상효과를 사용해서 불의 밝기를 조절할 수 있다고 했습니다. 그 와중에 duty Cycle이란 개념이 나왔는데 그림을 잠깐 보시지요.



duty Cycle이란 전압의 한 주기동안 on이 되어 있는 시간간의 비율을 의미합니다. 즉 25% 듀티 비라고 하면 전체중에 1/4정도는 불이 켜져있는 순간이다 라고 보시면 됩니다. 첫번째 경우를 제외하고는 모두 불이 들어와 있는 상황이지만 on 이 되어 있는 순간은 두번째가 가장 짧기 때문에 어두울 겁니다. 그 옆에 표시되어 있는 것이 아두이노상에서 25% 듀티비를 넣을 때 쓰는 코드입니다. 

 잘 보면 아시겠지만 전압의 진동폭은 0V에서 5V입니다. 디지털에서는 이를 단순히 0(0V)과 1(5V)로 표현하지만 아날로그는 정확한 값이 없다고 했었지요. 이 0과 1 사이를 8bit binary코드에 나눠서 전달합니다. 8bit binary 코드로 표현할 수 있는 경우의 수는 256이니까 즉 0~5v사이를 256등분 한다는 이야기 입니다. 위에 잘 못 나온거 같은데 25% 듀티비는 당연히 analogWrite(63)이 되어야 합니다. 전체의 1/4값만 전달이 되어야 하니까요. 100%도 analogWrite(255) 이어야 맞을거 같은데..


아무튼 본격적으로 아두이노와 연결해보겠습니다. 아두이노에 보면 PWM 포트가 따로 마련되어 있습니다.



보면 또렷하게 9번 10번 11번에 PWM이라고 적힌 것을 확인하실 수 있을겁니다. 즉 이 포트들을 출력 포트로 활용하려고 합니다. 11번 포트를 사용하도록 하고 풀업저항을 다음과 같이 달아봅시다.



잘 안보이시는 분을 위해서 fritzing으로도 그려봅니다.



허접하지만 이게 끝입니다. 우선은 아두이노에 코드를 삽입해야 되겠지요? 이 것도 생각보다 엄청 간단합니다.



그냥 입력값이 들어온 것을 그대로 11번에 넣어주기만 하면 끝입니다. 당연히 앞에서 언급한대로 analogWrite로 들어가야 할 겁니다. 자 프로세싱으로 넘어가서 다음과 같이 코드를 작성해줍니다.



이전과 동일합니다. 다른 점이 있다면 mouseX의 위피를 그대로 myPort에 넣어준다는 점이지요. 결과를 한번 확인해보겠습니다.



동작은 똑같습니다. 마우스 커서의 움직임에 따라서 LED의 밝기가 조절됩니다. 지난번과 차이가 있다면 미세한 움직임에도 LED의 밝기가 변한다는 것이지요. 

 우리 생활상에서 PWM을 활용한 부분은 많습니다. 물론 이렇게 세밀하게 값을 줘야 하는 상황때 많이 이용하겠지요. 모터의 각도 회전을 할 때도 0과 1로만 표현하기에는 모자라기 때문에 위처럼 0~255 로 나누어서 값을 준다면 조금더 세밀한 값까지 줄 수 있겠지요.

https://dl.dropbox.com/u/96808368/processing/PWMComm.zip

댓글