오늘(실은 자정이 지났으니 어제 6월 16일)은 Fluid Ardule의 새로운 기능을 추가하지 않았다. 그럼에도 불구하고 사용감은 그 어느 때보다 크게 좋아졌다. 어쩌면 이런 종류의 개선이야말로 완성도를 높이는 데 가장 중요한 작업인지도 모르겠다.
그동안 가장 마음에 걸렸던 것은 로터리 인코더였다. 천천히 돌릴 때는 별 문제가 없었지만, 조금만 빠르게 돌리면 메뉴가 손의 움직임을 따라오지 못했다. 분명 다섯 칸 정도를 돌렸는데 두세 칸밖에 이동하지 않는 경우도 있었다. 인코더의 문제가 아니라 소프트웨어가 사용자의 의도를 제대로 받아들이지 못했던 것이다.
원인을 추적해 보니 두 군데를 손봐야 했다. 먼저 Arduino UNO-1의 운영용 펌웨어는 인터럽트(Interrupt Service Routine, ISR)를 사용하지 않고 주기적으로 인코더 상태를 읽는 방식이었다. 이를 ISR 기반으로 바꾸자 빠르게 돌려도 입력이 거의 누락되지 않았다. 여기에 버튼 디바운스 시간도 조금 줄여 조작감을 한층 경쾌하게 만들었다.
하지만 이것만으로는 부족했다. UNO는 ENC:+3처럼 "세 칸 움직였다"는 정보를 정확히 보내고 있었는데, Raspberry Pi의 Python 프로그램은 이를 결국 "아래로 한 칸"이라는 버튼 입력처럼 처리하고 있었던 것이다. 결국 Python 쪽도 수정하여 ENC:+N이라는 이동량(delta)을 그대로 메뉴 이동에 반영하도록 바꾸었다. 이제는 빠르게 인코더를 돌리면 실제 손의 움직임만큼 메뉴가 자연스럽게 스크롤된다.
흥미로운 점은 이번 업데이트에서 새로운 기능은 단 하나도 추가되지 않았다는 사실이다. 그럼에도 한 화면(5~6 줄 정도)을 드르륵 돌리면 누락 없이 시원하게 넘어가는 모습을 보니 마치 전혀 다른 제품을 사용하는 느낌이다. 전자악기에서 중요한 것은 화려한 기능보다도 손의 움직임에 얼마나 자연스럽게 반응하느냐는 점인데, Fluid Ardule도 이제는 그 기준에 한 걸음 더 가까워진 것 같다.
물론 아직 완벽한 것은 아니다. 아주 빠르게 돌리면 가끔 한 칸 정도 더 이동하는 경우가 있고, TFT-LCD의 화면 갱신도 Windows처럼 즉각적으로 이루어지는 것은 아니다. 그러나 이것은 Raspberry Pi 3B와 SPI TFT라는 하드웨어 구조가 가진 한계에 가까운 문제다. 중요한 것은 입력 자체를 잃지 않는다는 점이며, 오늘 그 목표는 거의 달성했다고 생각한다.
개발을 하다 보면 새로운 기능을 만드는 날보다 기존 기능을 다듬는 날이 더 뿌듯할 때가 있다. 오늘이 바로 그런 날이었다. 기능 목록은 어제와 똑같지만, 손끝으로 느껴지는 Fluid Ardule는 분명 어제보다 한 단계 더 성숙해졌다.
![]() |
| 직경 13mm짜리 알루미늄 노브(구입처: 엘레파츠 EPXJ6BGX). 기기를 조작하는 즐거움은 이렇게 직접 손으로 조작하는 부품에서 온다. |
어제도 알리익스프레스에서 '마무리 작업용' 부품을 주문하였음을 솔직하게 시인한다.


댓글 없음:
댓글 쓰기