People with late-stage ALS, locked-in syndrome, or high spinal-cord injury often keep their vision and cognition fully intact, but lose every reliable muscle they could use to communicate. Eye-trackers need steady oculomotor control. Switch scanning needs some working muscle. Real clinical brain-computer interfaces cost lakhs, need a tethered PC, and effectively don't exist outside research labs.
The SSVEP decoding technique behind this project isn't new, it's been established for decades. What's missing is a complete, self-contained device a family or small clinic could actually switch on without a technician. That's what NeuroGaze is: a four-choice brain-computer interface where a single Arduino UNO Q receives raw EEG over Wi-Fi and, standalone, handles the decoding, the visual stimulus, and the application. No host PC, no internet, no cloud inference anywhere in the loop.
Four squares flicker on screen at 7, 13, 15, and 17 Hz. When you look at one, your visual cortex starts oscillating at that exact frequency, a steady-state visually evoked potential (SSVEP), measurable at the back of your head.
Three electrodes (O1, Oz, O2) feed into a wireless EEG amplifier built on two ADS1299 chips (16 channels total, 3 used here). It broadcasts its own Wi-Fi network, the UNO Q joins it, and from there the board receives, filters, calibrates, and decodes the signal at 250 samples per second entirely on its own.
The decoder is a Filter-Bank Canonical Correlation Analysis (FBCCA) model. It takes the last 2 seconds of EEG, splits it into 5 harmonic sub-bands, correlates each against reference sine and cosine waves for all 4 target frequencies, and fuses the results into one score per target. It only commits to an answer when the winning score clears a confidence threshold, beats the runner-up by a set margin, and wins 2 of the last 4 decisions. Otherwise, it stays silent rather than guessing.
That decision drives the application: a retro zombie-shooter where looking at a square fires the turret guarding it.
This needed two things that usually live on opposite sides of the microcontroller/SBC divide: a jitter-free visual stimulus at the full 120 Hz (the flicker is the stimulus, if a frame slips, the decoder is correlating against a frequency the eye never actually saw), and continuous multi-channel DSP, 5 filter bands, 4 targets, 4 harmonics, and a canonical-correlation solve every 250 ms, indefinitely.
A classic Arduino MCU can't do either. A headless single-board computer can do the DSP but has no display pipeline. A laptop can do both but isn't a deployable assistive device. The UNO Q's Linux side, a quad-core Cortex-A53 with a GPU running full Debian, does both at once.
One measurement made this decisive. Running the display and decoder in a single Python process cut EEG sample intake by 57% and pushed frame drops to 5.55%, because the display's present() call holds the interpreter lock while waiting for VBlank. Splitting them into two OS processes, which needs a real multi-core OS, restored full sample intake and cut frame drops to 0.17%.
Electrodes are placed at O1, Oz, and O2, with a common negative above the left ear and a reference above the right, using a syringe to apply electrode gel for consistent contact. On boot, the UNO Q measures the display's true refresh rate rather than trusting the nominal spec, since even a 0.3% error becomes a real frequency error in the stimulus. Calibration is a 90-second guided routine: 3 trials per target, plus 3 "rest" trials that teach the system what "not looking at anything" looks like. From there, the live loop runs every 250 ms: score the last 2 seconds of EEG, apply the confidence gate, and either fire or stay silent.
Results- 76.1% un-gated accuracy across 1, 944 labelled 2-second windows (chance level is 25%)
- With the confidence gate active: 98.6% accuracy on committed decisions, at a 32.2% commit rate
- Best single session: 100% gated accuracy, zero false accepts
- Real-time performance on-device: 119.8 fps against a 119.99 Hz panel, 0.26% dropped frames, 0.96 ms render time per frame
The biggest lesson: in real-time biosignal work, timing bugs are accuracy bugs. Every major accuracy gain came from fixing a clock somewhere, not tuning the classifier, the measured refresh rate, the frame budget, the interpreter lock, the calibration trial phase. A broken stimulus still looks like a flickering square, so none of these failures announced themselves until they were actually measured.
One specific case: an early version used TRCA, which performed at chance. It turned out trials were being cut at inconsistent points in the flicker cycle, since the calibration sleep ran on a separate thread from the free-running flicker. Isolating that one variable took accuracy from 27.5% (chance) to 88%. FBCCA was adopted afterward since it's phase-invariant by design and needs no templates at all.
What's NextUsing the UNO Q's microcontroller side, currently unused, to drive a relay, wheelchair interface, or robotic arm, turning the same 4-choice decision into physical control instead of on-screen control, which is the actual assistive goal. Frequency-plus-phase coding to expand from 4 choices to 8-12 (a full speller). Dry electrodes to remove the gel and setup time, moving this from demonstration to daily-use device.












Comments