티스토리 뷰

Arduino

다양한 스위치를 활용한 불 밝기 조절.

생각많은 소심남 2012. 1. 31. 16:32
지난 시간에 PWM을 이용해서 불의 밝기를 조절하는 방법에 대해서 배웠습니다. 가장 핵심은 아두이노상의 9~11핀을 이용해서 analogWrite()를 통해 해당 밝기를 줄 수 있다는 게 취지였습니다.

이제 스위치를 여기다가 가미해보도록 하겠습니다. 그래서 처음 스위치를 누르면 LED 자체에 불을 껐다켰다 하는 것을 제어할 수 있고,켜진 상태에서 버튼을 누른 시간에 따라 밝기가 조절되는 것을 해보고자 합니다. 물론 여기까지가 책에 있는 내용이지요.


 

우선 여기서 주목해야 할 점은 startTime이라고 지정해서 버튼을 누른 시간을 알기 위해서 초기에 변수로 설정했다는 점, 그리고 밝기 정보 역시 변수로 지정해서 버튼을 누른 시간에 따른 밝기를 표현한 점이 주요 요점이었지요.

많은 사람들이 궁금하길 왜 val과 old_val 부분을 나눠서 값을 받느냐는 겁니다.사실 이 부분은 버튼의 입력값을 저장받아서 이전값과의 비교를 위해 작성된 부분인 겁니다. 어떻게 보면 필요없을 것처럼 보이는데 왜 삽입된걸까요?

믿지는 못하겠지만 아두이노는 1초에 수십만번의 연산을 실행합니다. 즉 하나의 연산을 하는데 있어서 수십만분의 1초가 걸린다는 겁니다. 우리가 아무리 스위치를 한번 잠깐 누른다고 할지라도 거기에 소요되는 시간동안 아두이노는 벌써 연산을 한다는 겁니다. 그 와중에는 지난번에 언급했던 바운싱 문제도 있을거고 약간의 오차로 인한 떨림도 존재할 겁니다.

가령 old_val이라는 변수를 따로 안두고 이전값을 저장하지 않는다면 분명 그 떨림으로 인한 결과값의 변화가 존재합니다. 예를 들어서 스위치를 끄려고 버튼을 눌렀는데 아두이노가 받아들이기는 아직 꺼짐이라는 신호를 받지 못할 수도 있다는 겁니다.

그럼 이제 논리적으로 따져보면 분명 꺼짐과 켜짐은 다른 state입니다. 같이 올 수 없는 조건이라는 것이죠. 그럼 버튼의 입력값을 이전값과 비교해서 다르다는 것만 보여준다면 버튼을 준 입력은 LED에 제대로 전달될겁니다.

또 하나가 바로 앞에서 언급한 startTime이라는 건데
이 변수는 millis()라는 함수를 통해서 값을 받는 것을 확인할 수 있습니다.

 

아두이노의 중간에 보면 쇠로 16.000이라고 적힌 것이 있습니다. 이게 바로 크리스탈이라는 건데 이게 아두이노가 자신의 시계를 맞추는데 쓰는 기준이 되는 겁니다. 16.000이라고 된것은 16MHz로써 1초에 1600만번 진동한다는 의미인데 이걸로 자신의 동작속도와 동기화시킴으로써 아두이노도 시계로 쓸 수 있게 되는 겁니다.

그래서 위에서 밑에 나온 부분은 전반적으로 불이 켜졌을때 이전의 state를 현재 state로 바꿔주고 그때부터 시간을 측정해서 startTime에 저장시키게 되는 겁니다. 이전 포스팅 보신분은 아시겠지만 delay(10)은 바운싱을 제거하기 위한 기법중 하나로 쓰였습니다.

저 구문이 끝이 아니라 조금더 붙여야 합니다.


위의 구문이 LED의 on/off를 제어하는 거였다면 이번 구문은 시간에 따른 밝기값을 결정짓는 부분이 됩니다. 역시 바운싱 제거부분과 analogWrite를 통한 입력값이 초과할 경우 다시 초기화 시켜주는 구문이 포함됩니다.


보면 알갰지만 LED가 꺼졌다가 켜진 후에도 이전의 밝기 값을 그대로 유지되는 것을 볼 수 있습니다.

여기까지가 책 내용이었고 저는 이걸 해보고자 합니다.


지금 사진으로 보이는 건 빛의 밝기에 따라 전류의 크기가 달라지는 Light Dependent Resistor.우리나라말로는 조도센서라고 하는 겁니다. 그래서 제 책상의 스탠드가 켜지면 LED가 천천히 꺼지고 스탠드가 꺼지면 LED가 천천히 켜지는 걸 구현해보고자 합니다.

우선은 이전에 한 코드에 버튼 스위치만 대체해보도록 하겠습니다.

 
잘 동작하네요. 그럼 지난 포스팅에서 했던 내용을 응용해서 넣어보겠습니다.

 


거의 똑같습니다. 다만 LDR의 특성을 고려했기 때문에 val값이 조금 변하는 것이지요. 동작영상입니다.
 



물론 문제점이 있습니다. 빛을 금방금방 변화시켰을때 그 변화를 따라가지 않고 기존에 하던 행동을 수행한 후에 이뤄집니다. 물론 이 부분은 더 고민해봐야 하는 부분이 되겠네요.

조도센서를 이용해서 불의 밝기를 조절하는 것까지 해봤습니다. 

댓글