Opal is a 16-channel sEMG wristband that turns forearm muscle activity into Bluetooth media controls. Our five-person capstone team built and demonstrated the complete path from skin electrodes to a phone while the wearer held a ski pole.
I owned gesture recognition and the browser tooling: model research, embedded implementation, wearer calibration, evaluation, live signal inspection, and labelled-data collection.
A compact int8 CNN reached 80.7% on a five-gesture public dataset and ran in 14 ms using about 35 KB of RAM. Data from our custom electrodes, however, exposed enough wearer and placement shift that this fixed model was not the right final architecture.
I replaced it with four-band log-power features and a linear classifier fit on the ESP32-S3 each time the band is put on. Only two of its ten outputs issue commands; grip and rest classes absorb common false positives, and three matching windows are required before transmission.
Two ADS1298 converters sample 16 differential channels at 2 kHz. They have no FIFO and replace their output every 500 µs; early task-based SPI reads missed 5–6% of data-ready edges. The final firmware uses a separate interrupt-driven pipeline for each converter, aligns both sample streams, then runs feature extraction, classification, command gating, and BLE HID on the ESP32-S3.
The dashboard streams all channels, exposes device state, guides calibration, and records labelled sessions. It was an engineering tool for diagnosing the signal path, not a separate product interface.
After 52 guided calibration cues, the final build produced 173 correct commands across 180 controlled radial/ulnar trials: one cross-command error and six suppressed outputs. On-device processing consumed 59.1 ms per 250 ms of input.
This is a proof of concept, not a general-user accuracy claim. The demo validated two of five intended gestures; cold, snow, skiing motion, and repeated placement remain untested. The next iteration needs more repeatable electrode contact and evaluation across users and donning sessions.