원래의 제목은 '어제의 성공, 오늘의 hotfix'로 하려고 했었다. 그러나 실제로는 어제 밤늦게 작업을 한 뒤 자정을 넘겨 '성공'에 대한 포스팅을 했기 때문에 지금 hotfix에 관한 글을 쓰는 시점과 날짜는 같다. 그래서 '새벽의 성공, 이어지는 hotfix'라고 제목을 지었다. Hotfix란 급하게 수정해야 하는 버그 잡기 정도라고 정의하면 된다. 중요한 기능을 구현했다고 김칫국부터 마시면서 릴리즈했다가 치명적인 문제가 포함되었음을 깨닫고 다시 급하게 수정본을 배포하는 행위에 해당한다.
어제 Fluid Ardule의 UNO-1 입력 컨트롤러에 자동 캘리브레이션 기능을 넣고 꽤 뿌듯해하고 있었다(관련 글 링크). 저항 사다리(resistor ladder) 방식의 5-버튼 키패드는 단 하나의 아날로그 입력만 사용하기 때문에 구조가 단순하고 배선도 간결하다. 비용도 적게 든다. DIY 프로젝트에서는 꽤 매력적인 방식이다.
이번에 구현한 기능은 각 버튼의 ADC 중심값을 자동으로 측정해 EEPROM에 저장하는 방식이었다. 사용자가 LEFT, UP, DOWN, RIGHT, SELECT 버튼을 차례대로 누르면 시스템이 직접 기준값을 계산해 주는 구조다. 저항 편차나 전원 상태 변화에도 좀 더 유연하게 대응할 수 있을 것 같았다. 실제로 처음 테스트했을 때는 제법 그럴듯하게 동작했다. 이제는 펌웨어 자체를 수정하여 컴파일 후 업로드하지 않아도 작동 중에 보정치를 구해서 직접 적용할 수 있으니 정말 영리하게 목표를 달성했다고 자부하고 있었다.
하지만 늘 그렇듯, 진짜 문제는 “잘 되는 것처럼 보인 뒤”에 나타난다.
테스트를 반복하던 중 이상한 현상이 보였다. 캘리브레이션 모드에 진입한 직후 아직 LEFT 버튼을 누르지도 않았는데 시스템이 이미 LEFT 입력을 받은 것처럼 다음 단계로 넘어가 버리는 경우가 생긴 것이다. 처음에는 threshold 계산 문제인가 싶었다. 그런데 원인을 추적해 보니 더 흥미로운 곳에 문제가 숨어 있었다.
문제는 캘리브레이션 진입 자체에 사용했던 롱프레스 입력이었다.
사실 인코더 롱프레스는 원래 인코더 회전 가속(acceleration) 단계를 변경하는 기능에 이미 할당되어 있었다. 따라서 캘리브레이션 진입을 같은 롱프레스 동작에 연결하자 메뉴 의미가 충돌하기 시작했다. 결국 캘리브레이션은 인코더와 SELECT 버튼을 동시에 길게 누르는 조합 입력으로 변경하였다. 일반적인 조작과 유지보수 기능을 분리하기 위한 선택이었다.
그런데 시스템은 아직 그 입력 상태의 “잔향” 속에 있었는데도 이미 다음 단계로 넘어가 LEFT 입력을 기다리고 있었다. resistor ladder 방식에서는 버튼을 떼는 순간 ADC 값이 잠깐 불안정한 영역을 지나간다. 그 transient 값이 우연히 LEFT 버튼 영역을 스치면서 실제로는 누르지도 않은 LEFT가 눌린 것처럼 보인 셈이다.
결국 이번 hotfix에서는 캘리브레이션 state machine 자체를 손보게 되었다.
캘리브레이션 진입 직후에는 먼저 모든 버튼이 완전히 해제된 안정 상태를 확인하도록 바꾸었고, 단순히 “현재 눌려 있는 상태”가 아니라 NONE 상태 이후 새롭게 발생한 press edge만 유효 입력으로 인정하도록 수정하였다. 각 단계 사이마다 반드시 버튼 release를 확인하는 과정도 추가했다.
사실 이런 문제를 겪다 보면 임베디드 시스템에서 가장 어려운 것은 화려한 기능이 아니라 상태 전이(state transition)라는 생각이 든다. 특히 아날로그 입력, 롱프레스, 노이즈, 실시간 이벤트가 한꺼번에 얽히기 시작하면 예상하지 못한 모서리(edge case)가 끝없이 나타난다.
그래도 이런 시행착오가 재미있다. “왜 이런 일이 생겼지?”를 추적하다 보면 회로와 펌웨어가 실제 세계와 어떻게 부딪히는지가 조금씩 보이기 때문이다.
한편으로는 현재의 resistor ladder 구조를 계속 유지할지에 대한 고민도 다시 하게 된다. 장기적으로는 PCF8574 같은 I2C 기반 GPIO 확장 칩도 검토해 보고 싶다. 버튼마다 독립적인 디지털 입력을 사용하면 threshold drifting 같은 문제에서는 훨씬 자유로워질 수 있기 때문이다. 물론 배선은 조금 복잡해지겠지만 말이다.
![]() |
| 자작나무 합판이 도착하여 드디어 케이스 만들기에 착수하였다. 목공용 플램프가 없어서 이번에도 접합 후에 단차가 약간 발생하였다. 충분히 주의하면서 위치를 잡은 후 무거운 것으로 눌러 두었음에도 불구하고... 만약 PCF8574 확장 칩을 쓴다면 사진 가운데에서 보이고 있는 패널용 누름 버튼 스위치 5개를 이용하여 약간은 수고스럽게 배선 작업을 해야 한다. |
어쩌면 이번 경험은 단순한 버그 수정이라기보다, “입력 장치를 만든다”는 것이 생각보다 훨씬 깊은 세계라는 사실을 다시 배우는 과정인지도 모르겠다.

댓글 없음:
댓글 쓰기