1. 믿었던 놈인데...
ESP8266은 2017년도 부터 사용했기 때문에, 7년 정도 사용해 왔었다. 그동안 여러 종류의 내 프로젝트에 사용한 MCU이고, 이에 따라서 신뢰도가 상당히 높았다. 물론 순수한 ESP8266으로 사용하지는 않고 Wemos D1 mini 계열(정확하게는 clone)을 사용해왔다.
2. 발명품 때문에...
아직 중학생인 아들의 발명품 경진대회 출품작 때문에 최근에 다시 D1 mini를 사용했다. 발명품은 작은 OLED와 푸시 버튼을 2개 가지는 구조이었다. 푸시 버튼 입력을 어떻게 구성할까 생각하다가 그냥 Pull-Down 구조로 구성하기로 하였다.
3. 시작은 쉬웠으나...
OLED야 자주 사용하던 모듈이었기 때문에 별 어려움 없이 회로를 구성하고, 기존 개발해 놓았던 소스코드를 이용하여 나름 쉽게(?) 한글을 출력하였다.
푸시 버튼은 2개의 Input Pin을 이용하여 데이터를 읽어서 HIGHT, LOW 상태를 체크 하였는데, 문제는 입력신호가 다음번 버튼을 누를때 올라오거나, 한번 눌렀는데 2회가 눌리는 경우, 버튼 근처에 손가락을 가져갔는데도 동작하는 등 여러가지 문제가 나왔다. 사실 Wemos D1 mini의 여러 버전의 Clone을 사용해 보았는데, 이런 경우는 사실 처음이었다.
4. 의심은 또 다른 의심을...
손쉽게 개발이 끝날줄 알았는데, 버튼이 이상하게 동작해서 먼저 작성한 코드를 의심해 보았다. 이리저리 조건을 더 넣어 보기도 하고, 분기를 좀더 세분화 하기도 해보았지만 해결이 되지 않았다. 그래서 처음으로 푸시 버튼의 물리적 고장을 의심해 보았다. 푸시 버튼을 오래 사용하다 보면은 버튼이 눌려진 채로 안 올라오는 경우도 있고, 또는 눌렀지만 실제적으로는 전기적으로 연결이안되는 경우가 있어서 이다. 열심히 테스트를 가지고 버튼을 눌러 보면서 테스트 하였지만, 특이점을 발견하지 못하였다. 한 백번쯤 테스트 해보고 물리적 이상은 없다고 판단 하였다.
그 다음으로 Pull-down 회로를 의심하기 시작했다. 보통 Pull-down 회로를 추가하는 이유는 버튼의 상태가 floating 현상을 가지는 경우가 있어서 이를 안정화하기 위하여 사용한다. 사실 Pull-down 회로가 어려운 것도 아니고 간단하게 저항하나 걸치면 되는 것이라 문제될 부분이 없어 보였는데, 이것도 확실하게 하기위하여 테스터기를 또 열심히 찍어 보았다. 단락도 테스트하고, 저항도 테스트 하며 역시 문제가 없다는 것을 확인하였다. 15K 저항이 너무 낮은 값이어서 Pull-down이 동작을 잘 하지 않을 수도 있다는 글을 어디선가 보아서 100K 저항으로 변경하여 테스트 하였지만 역시 증상은 동일하였다.
다시 원점으로 돌아와서 소스 코드를 확인하였다. 수십년의 개발 경험을 가지고 있지만, 노안과 집중력 감소로 아무래도 실수는 할 수 있다는 생각으로 열심히 살펴보았다.
이미 독자분들은 결론을 알겠지만, 이러한 의심들은 전혀 소용이 없었다. 어떠한 노력을 해도 문제가 해결되지 않았다.
5. 검색을...
결국 구글신의 도움을 받아 보기로 하였다. 구글링한지 30분도 안되어서 아주 아주 흥미로운 내용을 발견하였다.
결론은 Wemos D1의 짝퉁 버전들은 Digital Input Pin을 이용하여 데이터를 읽을때 편차가 있다는 것이다. 이번 발명품은 2개의 Digital Input Pin을 사용하는데 하나는 큰 문제점이 없었는데, 다른 한개의 Pin이 문제를 일으키고 있었다.
6. 고생의 끝은...
결국 캐패시터 하나로 해결되었다. 단순히 Digital Input Pin 과 GND 사이에 캐패시터를 연결하면 된다. 세라믹 캐패시터는 극성이 없기 때문에 아무 방향으로 연결해도 문제없다.
캐패시터를 추가하니 2개의 푸시 버튼 모두 내가 원하는 형태로 동작하였다. 뭐랄까.. 쾌적해진 느낌이 되었다.
7. 왜 캐패시터를 사용하는가?
커패시터를 사용하는 이유는 대략 느낌상으로 알고 있었지만, 구글링을 통하여 찾은 내용을 한번더 정리해본다. (여기에 정리해 두면 나중에 찾기 쉬우니....)
- 디지털 신호 안정화(노이즈 필터링) : Arduino 계열의 Digital Input Pin은 전압의 빠른 변화를 감지할 수 있는데, 외부 환경이나 전자기적 간섭으로 인해 신호에 노이즈가 발생할 수 있다. 이에 따라서 의도 하지 않은 상황에서 Input Pin에 HIGH 또는 LOW가 걸릴수 있다. 캐패시터를 연결하면 빠른 전압 변화를 완화하고, 신호가 더 안정적으로 들어오게 된다.
- 디바운싱(Debouncing) : 버튼이나 스위치와 같은 입력 장치가 연결된 경우, 버튼을 눌렀을 때 물리적인 특성으로 인해 여러 번 신호가 변화하는 현상이 발생할 수 있다. 이 현상을 디바운싱이라고 하는데, 캐패시터를 추가하면 신호의 변화를 부드럽게 만들어 여러 번의 잘못된 입력을 방지할 수 있다.
* 보통 스위치 신호를 안정화 하기 위해서는 0.1uF 정도의 캐패시터를 사용한다. 용량이 커지면 스위치의 반응이 느려지고, 용량이 커지면 스위치의 반응이 민감해지는데, 너무 작은 용량의 캐패시터를 사용하면 노이즈 필터링 효과가 줄어들기 때문에 추천하지 않는다.
다른 사람들이 나처럼 고생하지 않기를 바라면서 글을 적었다.
May the force be with you.