Inspiration

One of our teammates' grandmother has Parkinson's. Watching her journey up close, we noticed something frustrating: her symptoms change day to day, and even hour to hour depending on when she last took her medication. But neurologist visits are snapshots, a few minutes every few months, scored by eye. Everything that happens in between gets lost or reduced to "I think it's been a bit worse lately."

We wanted to build something a family could keep on a kitchen table: a quick, honest motor check-up that tracks how things are changing over time and produces data a doctor can actualfly use. Not a diagnosis, just a better record of the in-between.

What it does

ParkTech is a tabletop Parkinson's motor check station. It runs three tests on each hand, modeled on items from the MDS-UPDRS clinical rating scale, and scores each one from 0 to 4:

  • Rest tremor (webcam): tracks fingertip motion, converts it to centimeters, and runs an FFT to look for the characteristic 3–8 Hz Parkinsonian tremor peak.
  • Finger tapping (webcam): measures tap speed, amplitude, rhythm variability, hesitations, and decrement (whether taps get smaller or slower as you go).
  • Rapid hand flipping (tilt switch + webcam fusion): an SW-520D tilt sensor on an Arduino counts flips while the camera measures rotation angle. The two signals are cross-checked live, showing FUSION LOCKED or MISMATCH.

Every score comes with a WHY THIS SCORE panel showing each rule, the measured value, and the threshold it was compared against. No black boxes.

On top of the tests:

  • Results dashboard with a Motor Fingerprint radar chart for both hands, asymmetry detection, and low-confidence flags when signal quality is poor.
  • NeuroScore, a transparent composite tracking index with the formula shown on screen:

$$\text{NeuroScore} = 100 \times \left(1 - \frac{\sum \text{scores}}{4 \times \text{scored tests}}\right)$$

  • Trend view that plots NeuroScore over time and against hours since the last levodopa dose, so patterns around medication timing become visible.
  • PID rhythm coach: a metronome that adapts its tempo in real time using a PID controller targeting 85% on-time taps, measuring the patient's maximum sustainable rhythm and comparing cued vs. uncued performance.
  • Doctor exports: a one-key PDF report and a FHIR JSON export so results can plug into healthcare systems.
  • Physical feedback: green/yellow/red LEDs show live flip speed during the test and the overall result afterward, plus a buzzer and optional LCD summary.

How we built it

  • Python 3.11 with MediaPipe for hand landmark tracking and OpenCV for the camera pipeline and custom HUD.
  • Signal processing written as pure, testable modules: high-pass filtering and FFT peak detection for tremor, event detection and decrement analysis for tapping and flipping, and sensor fusion between the tilt switch and camera rotation.
  • Arduino Uno firmware for the tilt switch, buzzer, LEDs, and LCD, configurable with three #defines (bare switch vs. module, active vs. passive buzzer, no LCD / I2C / parallel). A script compiles all 12 configuration combinations and a pin checker proves there are no conflicts.
  • Serial protocol with auto-detection, a READY handshake, state round-trip checks, automatic reconnect, and a background writer thread.
  • Boot self-check that verifies camera FPS, MediaPipe load time, the Arduino port, tilt readings, and the buzzer/LEDs before every session.
  • Full simulation mode with a fake hand and fake switch, so everything can be developed and demoed without hardware. Anything simulated or seeded is clearly labeled SIM or DEMO DATA on screen.
  • Testing: pytest unit and app tests, a headless self-test that runs a full session and prints a PASS/FAIL table, and a scripted GUI smoke test that drives a real window and captures screenshots.

Validating on real patients

We didn't want to just make up thresholds and call it a day. We ran our exact finger-tapping pipeline on the public HUBU-FIS dataset from the University of Burgos: 234 videos of 118 people (controls and Parkinson's patients), with each hand rated by clinicians on MDS-UPDRS item 3.4.

Thresholds Exact match Within 1 point Weighted kappa
Original demo thresholds 42% 85% 0.47
Tuned, 5-fold cross-validated by participant 45% 85% 0.49

We cross-validated by participant so the same person never appeared in both training and test folds, which keeps the numbers honest. Moderate agreement (kappa ≈ 0.5) is our real headline: useful for tracking change, not for diagnosis.

We also built a calibration tool: record a few normal and "acted symptom" runs from volunteers, and it reports false alarms, misses, and suggested thresholds tuned to your specific camera, lighting, and sensor.

Challenges we ran into

  • Turning pixels into real units. A tremor score depends on amplitude in centimeters, but a webcam only sees pixels. We used the wrist-to-middle-knuckle distance as a body-based ruler to convert to physical units.
  • Separating tremor from normal movement. Natural hand drift can swamp a small tremor, so we high-pass filtered the signal and required a clear spectral peak (well above the median and a true local maximum) in the 3–8 Hz band before calling it tremor.
  • Fusing two imperfect sensors. The tilt switch is cheap and bouncy, and the camera can lose the hand during fast flips. Getting them to agree, and flagging when they don't, took real work.
  • Dependency wrangling. MediaPipe 0.10.14 only has wheels for Python 3.11, so we had to pin our environment carefully.
  • Staying honest. It's tempting to show impressive-looking numbers. We made a rule that every number on screen is either measured live or explicitly labeled as simulated, and that every score explains itself.

Accomplishments that we're proud of

  • Validating our tapping scorer against real clinician ratings on a public dataset, with proper participant-level cross-validation.
  • Full explainability: every score shows exactly which rules fired and why.
  • A complete loop from cheap hardware to a FHIR export that could plug into real healthcare systems.
  • A PID-controlled rhythm coach, tuned against a simulated patient model.
  • Robust engineering for a hackathon: boot self-checks, simulation mode, automated tests, and firmware that builds in every configuration.

What we learned

  • How clinicians actually score Parkinson's motor symptoms with the MDS-UPDRS, and why consistency between raters is so hard.
  • Practical signal processing: filtering, FFTs, peak detection, and sensor fusion on noisy real-world data.
  • That honest validation matters more than flashy accuracy claims. A kappa of 0.49 isn't a magic number, but it's a real one.
  • How much a transparent tool can build trust compared to a black-box score.

What's next for ParkTech

  • Validate tremor and hand flipping against clinician-rated data the way we did for finger tapping. Right now those thresholds are still demo thresholds.
  • Work with neurologists on a proper clinical study with patients scored by specialists.
  • Smaller, cheaper hardware so a family can set it up in minutes.
  • Secure sharing so caregivers and doctors can see trends between appointments.
  • And, most importantly, getting it in front of our teammate's grandma and families like hers.

ParkTech is a tracking and decision-support tool, not a diagnostic device.

Built With

Share this project:

Updates

Submission history