악력 재활 훈련 시스템
악력으로 조작하는 재활 훈련 게임
Impact
- 4단 필터스파이크 → 중간값 → 이동평균 → 데드존8 kg 급상승을 막고, 1 kg 미만은 0으로 처리
- 4개의 소프트웨어게임 3종과 악력 신디사이저 제작3초 유지, 순간 도달, 두 손 차이로 입력 방식을 구분
- 스레드 분리센서 80 Hz, 게임 루프 60 Hz로 분리큐 대신 최신값 하나만 읽게 함
Background
악력은 생활 능력과 인지 기능의 지표로 쓰여, 꾸준한 측정과 훈련이 필요합니다.
하지만 기존 재활은 단순 반복이라 지루하고, 상용 장비는 비싸고 조작이 복잡합니다.
저비용 부품으로 측정과 훈련, 피드백을 하나로 묶고, 모든 조작을 악력만으로 하게 했습니다.
2인 팀에서 하드웨어 설계와 신호처리를 맡았습니다.
Architecture

Contributions
하드웨어 설계
로드셀은 미세한 전압 변화만 내보내, HX711이 24비트로 증폭해 읽습니다.
아두이노가 두 채널을 받아, 라즈베리파이로 넘깁니다.
- 로드셀 2개: 왼손과 오른손 각각 20 kg
- HX711을 라이브러리 없이 bit-bang으로 직접 읽음
- 진동 모터는 HIGH/LOW 신호로만 동작

4단 필터: 순서가 설계
스파이크 제거, 중간값, 이동평균, 데드존 순서로 걸렀습니다.
- 스파이크 제거: 직전 값보다 8 kg 이상 뛰면 직전 값으로
- 중간값: 윈도우 3, 산발적 이상치를 걸러냄
- 이동평균: 윈도우 5, 유지 구간의 미세 진동을 다듬음
- 데드존: 1 kg 미만은 0, 손을 뗀 상태를 확실히 구분
스레드 분리
- 메인에서 시리얼을 읽으면 읽기 지연이 프레임 드롭이 됨
- 잠금으로 보호한 최신값 하나만 읽고 큐는 쓰지 않음
사용자별 캘리브레이션
로드셀은 개체마다 스케일이 다르고, 조립 상태에 따라 영점이 달라집니다.
- 첫 실행에서 영점 3초, 최대 악력 5초를 측정
- calibration.json 에 남겨 다음 실행부터 재사용
- 측정한 최대 악력으로 그 사람 기준 난이도를 잡음
Troubleshooting
진동이 울리면 오른손 센서가 끊김
- 문제
- 진동 모터가 돌 때만 한쪽 로드셀 값이 사라짐
- 원인
- 신호 간섭이 아니라 전류 부하. 모터를 아두이노 핀에서 직접 구동해, 센서 쪽 전원이 흔들림
- 해결
- NPN 트랜지스터로 모터 구동 회로를 분리. 모터는 켜고 끄기만 하고 세기는 조절하지 않음
- 결과
- 회로를 바꿔 해결. 양손 값이 함께 유지됨
소리가 밀리고 음이 바뀔 때 Pop Noise 발생
- 문제
- 힘을 바꿔도 소리가 늦게 따라옴. 음이 바뀌는 순간 Pop Noise 발생
- 원인
- aplay 파이프에 데이터가 쌓여 지연 누적. 주파수를 바꾸면 파형이 끊김
- 해결
- 청크 하나 재생 시간만큼 기다려 파이프를 비움. 위상을 누적해 파형을 이어 감
- 결과
- 남은 지연은 하드웨어 버퍼뿐. Pop Noise 사라짐