2026년 5월 24일 일요일

[Fluid Ardule] 아두이노 우노 펌웨어에 자동 보정 기능 도입

자정을 넘겨서 그림을 만들도록 했더니 5월 24일 업데이트라는 제목을 달아 버렸다.

저항 '사다리'를 이용한 5-버튼 키패드는 겨우 하나의 아날로그 입력을 사용하기 때문에 매우 단순하다. 하지만 사용을 거듭하면서 동일한 문제가 자꾸 반복하여 발생하기 시작하였다. ADC 값이 항상 일정하지는 않기 때문에 고정 threshold 방식만으로는 안정적으로 처리하기 어려웠다. 어제는 잘 작동하던 Left 버튼이 오늘은 Up 버튼처럼 행세한다.

Threshold를 이따금 조정하는 방식으로는 아두이노 우노의 펌웨어 자체를 매번 고쳐서 업로드해야 하니 여간 성가신 것이 아니다. 근본적으로는 "현재 환경의 실제 ADC 중간값"을 다시 학습해야 한다는 결론에 이르렀다. 이에 따라서 키패드의 self calibration 기능을 아예 구현하여 넣기로 했다.

새로운 펌웨어에서는 엔코더를 길게 누르면 캘리브레이션 모드로 진입한다. LCD는 순서대로 각 버튼을 누르라고 안내하며, 사용자가 버튼을 충분히 길게 누르고 있는 동안 여러 차례 ADC 값을 샘플링한다. 이 과정에서 원래 작동 상태를 나타내는 LED가 아닌 LCD 자체를 blink시키도록 하였는데, 결과적으로 꽤 직관적인 UI가 되었다. 측정 중에는 LCD가 점멸하고, 안정된 값이 확보되면 steady on 상태로 바뀌며 “Release key” 메시지가 나타난다. 사용자는 그때 손을 떼면 된다.

측정된 값은 EEPROM에 저장된다. 따라서 매번 threshold를 코드에 하드코딩할 필요가 없어졌다. 사용 환경이나 부품 상태가 변하더라도 사용자가 직접 다시 보정할 수 있다. 또한 calibration 중에는 runtime BTN/ENC/POT 이벤트를 모두 억제하고, Pi와의 링크는 heartbeat만 최소한으로 유지하도록 하여 watchdog 문제를 피하도록 하였다.

오늘의 개선은 CHANGELOG.md 파일에 5월 24일의 것으로 기록해 넣었다. 내가 생각해도 꽤 버튼 작동과 관련한 부품을 바꾸지 않은 상태에서 가장 최적의 개선을 이룬 것 같다.

Fluid Ardule을 케이스에 넣기 위하여 전후판(3mm 알루미늄)을 설계하면서 디스플레이도 전면판에 수직으로 고정하기로 하였다. 이를 위해서 라즈베리 파이와 TFT-LCD를 연결할 40핀 리본 케이블도 구입하였다. 특별한 것이 아니라 예전에 40핀 IDE HDD용 케이블로 쓰던 것을 그대로 팔고 있었다. 약간 생각을 잘못하여 케이블 양 말단이 female로 마감된 것을 구입하였다. 라즈베리 파이에 붙어 있던 GPIO 헤더 확장용 직각 커넥터를 이용하여 얼추 연결을 마쳤다. 이번에는 라즈베리 파이 -> 40핀 케이블 -> 확장용 직각 커넥터 -> TFT-LCD의 순서로 연결되므로 여기에서 분기하는 I2C DAC(PCM5102A) 등의 점퍼 연결에 주의해야 한다. 라즈베리 파이에 붙어있는 40핀 GPIO와는 좌우가 반전된 것으로 생각해야 하기 때문이다. 글로 옮기려니 쉽지 않다. 배선을 한참 들여다보며 점퍼를 연결하여 겨우 시리얼 콘솔 화면이 뜨게 만들었다.


아이베란다에서 주문한 자작나무 합판도 마침 도착하였다. 수 주일 내에 완성된 모습의 Fluid Ardule을 보게 될 것으로 기대한다.

댓글 없음: