Opal EMG Wristband

Overview

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.

1 / 3

Close-up of the final Opal prototype worn on a forearm

The final integrated prototype used for calibration and command testing.

Why the Architecture Changed

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.

opal_architecture proxy Initial research path fixed int8 CNN 5 gestures · 80.7% proxy accuracy evidence Custom-electrode evidence wearer and placement shift fixed model did not transfer proxy->evidence calibration Per-don calibration four-band log power 64 features fit on-device evidence->calibration current Final command path 65×10 linear model 2 commands · 8 reject/rest classes 3-window gate → BLE HID calibration->current
Custom-electrode data changed the shipped architecture from a fixed CNN to a model calibrated for each don.

Embedded Signal Path

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.

Demonstrated Result

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.

Confusion matrix showing 52 correct command classifications out of 468 rows

Controlled demo result: 52 correct commands, zero wrong commands, and six suppressed outputs.

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.

Final Poster

mpg3@sfu.ca, linkedin · Updated 2026-08-13