← Back to Design & Engineering
Smart Goniometer
For ME292C, we built a wearable goniometer with dual IMU sensing, haptic and audio feedback, and a web app for ROM sessions and CSV export.
Background
A handheld goniometer is the hinged plastic protractor clinicians use to measure joint range of motion in degrees, typically flexion or extension at a knee, elbow, or shoulder. Physical therapists need a concrete reading to show whether mobility is returning after an injury rather than relying on how the joint feels that day. The method assumes two people in the loop, one to hold the pose and another to set landmarks and read the dial, which works fine in a clinic and falls apart when you are alone at home trying to repeat the same measurement between sparse visits or over video.
For ME292C we interviewed people in ergonomics, injury rehab, and sport, and ran observation sessions where participants used a standard goniometer solo with minimal coaching. What tied those sessions together was not one user type but the same friction. Placement drifted by a few degrees between trials, people twisted to read the scale, raw degrees did not match how progress felt, and several participants said they would rather feel a cue on the limb than hear another alert when precision mattered.
The course had us diverge on a large concept pool and use semantic maps with AI-assisted criteria scoring on feasibility, novelty, and impact to see the full space, though the shortlist still came down to human judgment and whether an idea matched what interviewees said about trust and real-time feedback. We landed on continuous wearable sensing, haptics during the motion rather than only a summary afterward, and a web layer for logs and export. That is why the hardware is two IMU straps instead of electronics bolted onto the handheld tool.
Technical architecture
The prototype uses two IMUs, one rigidly mounted on each bone segment on either side of the joint, for example the upper arm and forearm at the elbow. Each IMU estimates its segment orientation in space. After calibration at a neutral pose, firmware computes the included angle between the two segment directions in the plane of the exercise. Because both modules move with their segments, their relative orientation tracks flexion and extension without placing a sensor exactly at the joint pivot.
A Seeed XIAO ESP32-C3 microcontroller reads both LSM6DSO IMUs over I2C, applies target bands and precision tiers (roughly ±10° for the tight tier in the current workflow), and drives haptic motors and a speaker with intensity tied to distance from the target band so feedback lands inside the same rep. The hosted app includes a Three.js joint model, exercise presets, calibration prompts, repetition counting, hold timing, post-session surveys, and CSV export. It connects over Web Bluetooth for live data, and browsers without BLE still run the full UI in demo mode.
Results and Iteration
Getting the haptic feedback to feel useful rather than annoying turned out to be most of the work. Our first motor settings were too aggressive, and people described them as distracting rather than informative, so we spent several iterations tuning drive intensity and threshold logic before the cues started landing the way we intended. That process also forced us to be more precise about what the tiers actually meant in practice, since a threshold that felt right on paper read differently on the body during motion.
On the software side, the GitHub Pages build runs end to end with presets, hold timing, surveys, and CSV export, and connects to the board over Web Bluetooth when the browser supports it. The wearable itself is hand-soldered on a protoboard, and we added a 3D printed enclosure midway through after connector failures kept interrupting wear tests. The angle output ended up accurate to the degree, which matched what we set out to build from the start.