이 시리즈는 하드웨어 설계부터 소프트웨어 구현까지 기술적인 내용을 중심으로 다뤘다. 마지막 편에서는 한 발 물러나서, 왜 이 시스템을 만들었는지, 무엇을 달성했고 어떤 한계가 있었는지를 정리한다. 의공학부 학부연구에서부터 전자공학회 구두 발표까지 이어졌다.

왜 만들었는가

전 세계적인 고령화가 가속화되면서 근골격계 및 신경질환으로 인한 재활 환자 수가 늘고 있다. 국내 65세 이상 노인 인구 비율과 등록 장애인 수, 진료비 모두 꾸준히 증가하는 추세다.

재활 치료의 핵심 변수는 강도(Intensity)와 반복 횟수다. 그러나 기존 재활 프로그램은 인력과 시간의 제약 속에서 표준화된 프로토콜에 의존해왔다. 치료 강도와 반복 훈련에 관한 선행 연구들도 정의와 치료 구성의 다양성으로 인해 근거가 부족한 상황이다. 환자 개인의 특성을 반영한 맞춤형 프로토콜을 적용하기 어렵다는 것이 기존 시스템의 한계였다.

이 프로젝트가 목표로 한 것은 세 가지다:

  • 원격 모니터링: 전문 인력 없이도 운동 상태를 실시간으로 확인할 수 있게
  • 데이터 수집: 치료 계획 수립에 활용할 수 있는 정량적 데이터 확보
  • 개별화: 강도와 반복도를 데이터 기반으로 조절할 수 있는 가능성 제시

상하지 재활 자전거란

상하지 재활 자전거는 페달과 핸들이 링크 장치로 연결되어 있다. 한 곳에 힘을 주면 나머지 관절도 함께 회전운동을 한다. 한 손이나 한 발의 움직임만으로도 전신 운동이 가능해, 편마비 환자에게도 적용할 수 있다.

고령자부터 고위험군 질환 환자를 대상으로 하며, 환측 관절의 가동 범위 증진, 근력 및 지구력 강화, 심폐기능 증진을 목적으로 사용된다.

시스템 구성

하드웨어와 소프트웨어 각각의 선택에 대한 상세한 이유는 이 시리즈의 앞선 편들에서 다뤘다. 여기서는 전체 구성을 한 번에 정리한다.

시스템 다이어그램

하드웨어

부품역할
ESP32 Feather V2MCU, Wi-Fi 통신, 웹서버
Load Cell × 4팔·다리 각 부위에 작용하는 힘 측정
ADS1232 × 424-bit ADC, 최대 80 SPS
AS5600자기 엔코더, 크랭크 회전 각도 측정
NeoPixel운동 상태 시각적 피드백

소프트웨어 핵심 구조

  • SPIFFS (1.5 MB): HTML, JavaScript, CSS 파일 저장. 웹 UI 수정 시 펌웨어 재업로드 불필요
  • PSRAM (8 MB): 측정 데이터를 패킷 단위로 버퍼링. 최대 36분 분량 저장 가능
  • ESPAsyncWebServer + WebSocket: 비동기 웹서버로 샘플링을 유지하면서 실시간 데이터 전송
  • EEPROM: Wi-Fi 자격증명과 센서 오프셋을 비휘발성으로 저장

기술적 선택들을 돌아보며

이 시리즈를 쓰면서 당시 선택들을 다시 들여다봤다. 몇 가지는 명확한 이유가 있었고, 몇 가지는 시간이 지나도 이유가 기억나지 않았다.

명확했던 것: Hardware SPI 대신 GPIO 인터럽트를 쓴 이유는 4채널 동시 수집 때문이었다. SPI는 MISO가 하나라 순차 읽기만 가능해 채널 간 시간 오차가 생긴다. ISR로 4개 핀을 동시에 읽으면 이 문제가 없다.

아쉬웠던 것들

게인을 코드에 하드코딩: 캘리브레이션 게인이 #define 상수로 박혀 있어, 로드셀을 교체하거나 재설치하면 코드를 수정하고 다시 플래시해야 한다. 오프셋처럼 게인도 EEPROM에 저장하고 현장에서 업데이트할 수 있는 구조였으면 더 실용적이었을 것이다.

타임스탬프 없는 데이터: 저장되는 sensors 구조체에 타임스탬프가 없다. 40 SPS가 항상 일정하다는 가정 하에 인덱스로 시간을 역산하는 방식인데, 루프 지연이나 처리 부하로 샘플 간격이 흔들리면 시간 정보가 어긋난다.

전송 안정성: 바이너리 청크 전송에 체크섬이 없다. 연결이 불안정한 환경에서 데이터 일부가 손상되거나 유실돼도 감지할 방법이 없다. 연구 목적의 프로토타입 수준에서는 감수할 수 있지만, 실제 임상 환경에서 쓰려면 보완이 필요한 부분이다.

OTA 업데이트 미지원: 펌웨어 수정 시 USB 케이블을 직접 연결해야 한다. 병원이나 재활 시설에 장비가 배치된 상황이라면 매번 회수하거나 엔지니어가 방문해야 한다. ESP32는 OTA를 지원하므로 처음부터 구현했으면 운용이 훨씬 편했을 것이다.

저항 조절 없음: 이 시스템은 페달 부하를 측정하기만 할 뿐 조절하지는 못한다. 자전거 자체가 수동 저항 방식이라 강도를 바꾸려면 사람이 직접 다이얼을 돌려야 했다. 만약 전기적으로 저항을 제어할 수 있는 하드웨어였다면, 펌웨어에서 측정값을 보면서 강도를 자동으로 조절하는 구조까지 갈 수 있었을 것이다.

캘리브레이션

1 kg, 3 kg, 5 kg 분동으로 각 로드셀의 게인을 측정했다. 스트레인 게이지의 선형 특성을 이용해 원점을 통과하는 직선의 기울기를 구하고, 엑셀 추세선으로 최종 게인을 산출했다.

영점은 버튼 하나로 현장에서 바로 잡을 수 있도록 설계했다. EEPROM에 저장하기 때문에 전원을 꺼도 오프셋이 유지된다.

결론

이 시스템이 제시하는 것은 다음과 같다:

  • 원격 모니터링과 실시간 데이터 접근성을 통해 전문 인력 부족 문제를 부분적으로 완화할 수 있다
  • 환자의 이동 부담과 경제적 부담을 줄일 수 있다
  • 수집된 데이터를 바탕으로 개별화된 치료 프로그램을 수립하는 가능성을 제시한다

다만 이 시스템 단독으로 임상적 유효성을 검증하기에는 한계가 있다. 측정 데이터가 실제 재활 효과와 어떻게 연결되는지, 어떤 지표가 의미 있는지는 후속 연구가 필요한 부분이다.

느낀 점

학부 과정에서 진행한 첫 번째 프로젝트였다. 회로를 직접 설계하고 소자를 선택하고 납땜까지 혼자 해본 것도 처음이었다.

처음에는 브레드보드로 시작했다. 회로가 동작은 했지만 노이즈가 심해서 로드셀 데이터가 심하게 흔들렸다. 접촉 저항과 긴 점프선이 아날로그 신호에 그대로 실렸다. 결국 만능기판에 납땜하기로 했다.

처음 만든 기판은 넓었다. 배선이 많으니 여유 있게 쓴 게 당연하다고 생각했는데, 지도교수님께 노이즈가 많이 탄다는 피드백을 받았다. 배선이 길수록 안테나처럼 동작해 외부 노이즈를 더 잘 잡는다.

1차 기판 ADS1232 보드를 일렬로 배치한 첫 번째 버전. 배선이 길고 레이아웃이 비효율적이었다.

부품 간 거리를 최대한 줄이고, ESP32를 중앙에 두고 ADS1232 4개를 상하좌우 대칭으로 재배치했다. 신호선과 전원선을 분리하고, 다시 만들었다.

2차 기판 대칭 배치로 배선 길이를 균일하게 줄인 수정본. 노이즈가 눈에 띄게 줄었다.

소형화된 기판에 납땜하는 건 생각보다 훨씬 어려웠다. 인두를 오래 대고 있으면 피복이 녹았고, 좁은 패드에 납이 번지면 옆 선과 쇼트가 났다. 몇 번을 다시 뜯어내고 다시 납땜했다. 교과서에서 배운 회로 이론과 실제로 납땜 인두를 잡고 앉아있는 것은 완전히 다른 영역이었다.

캘리브레이션도 처음 해봤다. 센서에서 숫자가 나온다는 건 알았지만, 그 숫자가 실제 물리량과 어떻게 대응되는지는 막연했다. 분동을 올려놓고 raw 값을 읽어서 기울기를 구하고, 그게 kg으로 변환되는 과정을 직접 해보면서 ADC 출력이 어떻게 의미 있는 값이 되는지 처음으로 이해했다. 센서를 쓴다는 것이 단순히 라이브러리를 호출하는 게 아니라는 걸 그때 알았다.

소프트웨어만 공부하던 시점에서, 하드웨어와 소프트웨어가 만나는 지점에서 직접 무언가를 만들어본 경험이었다. 납땜 불량으로 신호가 끊기거나, 배선 실수로 부팅이 안 되거나, 이런 것들을 겪으면서 임베디드 시스템이 왜 까다로운지 몸으로 배웠다.


이 시리즈를 통해 하드웨어 설계부터 ISR, PSRAM, 캘리브레이션, WebSocket, 데이터 저장까지 전 과정을 기록했다. 코드를 다시 뜯어보며 당시에 왜 그렇게 했는지 기억나는 것, 기억나지 않는 것을 모두 포함해서 썼다. 완벽한 시스템은 아니었지만, 문제를 정의하고 제한된 자원 안에서 동작하는 시스템을 만들었다는 것으로 충분하다고 생각한다.