FormFit

A quantitative exercise feedback system. With FormFit, my team and I have successfully created a device and mobile app that records accelerometer and gyroscope data via Arduino, sends it via Bluetooth to our custom Flutter mobile app, and accurately scores and gives specific feedback to users.

I'm currently the project lead for FormFit for 2025-2026, with big plans to improve our design before Engineering Open House 2026

Conception

The idea for FormFit originated as a general sports solution, but given the potential applications in personal training and physical therapy, our group pivoted to exercise. We were successful in our goal of having a working, calibrated device and app prototypes before Engineering Open House 2025 in early April.

Below is the inside of the FormFit device, and me presenting it at EOH:



Arduino and Data Transfer

It was my job to figure out how to get data from our accelerometer and gyroscope to the user. After briefly considering a display on the device itself, I decided the best way would be to use a microcontroller and a mobile app connected via Bluetooth. I chose the Arduino Uno R4 as it has built-in Bluetooth capability, and Flutter as the mobile app framework due to its cross-platform compatibility and Bluetooth libraries.

In the end the data flow went Sensors -> Arduino -> Bluetooth -> Flutter app (via Bluetooth library) -> End user. The code used for the Arduino can be found on my GitHub at muvaro2/FormFitArduinoCode.

Below is a peek at the Flutter homepage:

Calibrating the Device

Calibrating FormFit turned out to be a harder endeavor than I thought. Calibration data was collected through a barebones version of the final flutter app (on GitHub) that allowed me to export a given part of calibration data as CSV. The calibration data was collected from myself and various experienced lifters whom we asked to use their best form on a given exercise with the device active. Due to time constrains, we only fully calibrated a bicep curl, but the methods used could generalize to most exercises.

To return an actual score and feedback, the calibration data was averaged into a long array with the average value of each of the 6 axes (acceleration(x,y,z) and gyroscopic acceleration(x,y,z)). The exercise done by the user was trimmed to the start/stop of motion, stretched/shrunk to the same length as the calibration, and the sum of squared errors was mapped from 0-100% for a final score.

If the score fell below 80%, the app would give the best feedback on how to improve. This was done by making several calibrations of 6 common mistakes (swinging the weight, overrotating the wrist, etc.), and based on which mistake the users data mapped closest to, it would give the appropriate feedback.

Below are the graphs of the main calibration (normalized to 40 samples):

UI Screenshot

Results & Takeaways

Overall, the project was successful, however not without a high number of shortcomings:

- Device was too bulky, the Arduino limited how small we could shrink it.
- Device was not rechargeable nor was easy to set up.
- The calibration algorithm was not up to the standard for those with very different arm lengths/sizes and techniques.

In the next year, I plan to solve the first two changes by abandoning the goal of creating new hardware, and instead sideloading our code onto existing hardware (FitBits, Apple Watches, etc.). This would make the device more commercially viable and accessible, and allows us to take full advantage of the innovation that wearable device manufacturers have already done.
Next, to solve issues with the calibration, I plan to use PyTorch to train a ML model to detect good/bad form. At the cost of more training data, this would vastly improve feedback accuracy.

Stay posted for future updates. If you have any questions or would like clarification, feel free to email me at muvaro2@illinois.edu