아주 기본적인 이야기 이지만, 버튼을 눌렀을 때 Bouncing 이 발생한다는건 많은사람들이 상식적으로 알고있는 이야기 이다.

하지만 실제로 어떻게 시그널이 생성되는지 잠시 알아보기 위해 몇가지 실험을 해보고 이를 해결하기 위한 방법을 S/W 와 H/W 로 접근해보기로 한다.

일단 수치적으로 보면 버튼을 눌렀을 때 아래와 같은 현상이 발생한다.

A0 (14) 핀에 버튼을 물려놨고, 버튼이 처음 HIGH 일 때 부터 1000 번의 루프에서 digitalRead() 를 한 결과이다. 

버튼을 누르고 있는 상태에서 조금 버튼을 비벼(?)댔더니 96%와 심지어 28%까지의 결과가 중간에 나온다.


위 실험 결과를 보면, 눌렀다 떼었다 한 부분이 다른 부분은 명확하지만 파란색 박스가 쳐져있는 부분은 순간적인 Bouncing 이 일어난 부분이다. 만약 무조건 HIGH = 눌림 으로 했거나 Interrupt 를 걸어서 H-L 위상 변화 시에 눌림으로 인식하게 했다면 파란색 부분은 두번 이상 눌린 효과가 발생했을 것이다.

(Plotting 도구와 내 컴퓨터의 성능 한계로, 아두이노는 115200 속도에 5ms 딜레이를 매 루프 내에 주었다. 5ms 미만으로 줄 경우 툴이 반응하지 못해서 측정이 불가하다. 오실로스코프가 필요한때이다 싶다)


위 그래프는 아날로그로 Read 한 결과이다. 누른 상태에서 버튼을 비벼대니 저런 지저분한 결과가 나왔다. 원래 의도대로라면 계속 눌려있어야 하는데 눌리지 않고 중간에 저렇게 전압이 마구 변동되는 모습을 볼 수 있다. 

앞으로 해볼일은 위 현상들을 Single 버튼일때 없애는 것과 ADC 를 통해 Analog 로 여러 버튼으로 읽을 때 없애는 것이며, S/W 와 H/W 적인 방식에 대해 직접 테스트 해볼 예정이다.

반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,