Inspiration
What it does
How we built it
Inspiration
We wanted to make a game you can actually feel — not through a screen or a headset, but in your hand. Ping-pong was the perfect fit: fast, physical, all about timing. What if you could swing a real paddle at a ball that only exists on the wall, and feel the exact spot where it hit?
What it does
Edge Pong is a projected arcade ping-pong game. You swing a real paddle (or a mouse) at virtual balls, and when you connect, a smart paddle buzzes right where the ball struck — top-left, bottom-right, wherever. All the tracking, physics, and haptics run locally on the edge — no cloud, no headset. Miss your timing and the rally's over; land it and you score.
How we built it
- Backend (Python): an authoritative game engine — fixed-step physics, swept collision so fast balls can't tunnel, a full rally system with serves and an AI opponent, scoring, and pose fusion that blends camera + IMU orientation using quaternions.
- Frontend (Three.js + TypeScript): a 3D arena — table, net, paddle, opponent — driven over a WebSocket at 60 Hz, with sound and particles fired off the same impact events as the haptics.
- Smart paddle (ESP32-C5): custom firmware streams motion over Wi-Fi and receives haptic commands, driving four vibration-motor quadrants through MOSFETs.
- Haptics: four motor quadrants with bilinear interpolation, so the balance of the four motors encodes where on the paddle you hit.
Every physical piece also has a simulated stand-in — a fake camera and paddle feed the exact same pipeline — so the whole game was playable with a mouse long before the electronics were done.
Challenges we ran into
Honestly, most of the fight was hardware.
- MOSFET wiring: our first motor spun the instant the battery connected, no code involved — a swapped Drain/Source, where the transistor's internal diode bypassed everything. Multimeter detective work to find it.
- Power: the boost converter kept auto-shutting-off because the ESP32 didn't draw enough current. The fix — disabling Wi-Fi modem sleep — turned out to be exactly what we also needed for low-latency haptics.
- Networking: with no home router, we ran the laptop as a hotspot. The paddle wouldn't connect until we forced it to 2.4 GHz; it kept landing on a flaky 5 GHz channel.
- Feel: we measured the motor's stiction point (~18% duty), set the haptic floor just above it, and reworked the strength curve so even light hits land solid instead of fading to nothing.
What we learned
- Your hand can't resolve 16 vibration zones on a paddle — 4 is plenty, and interpolation fills in the rest.
- Quaternions beat pitch/yaw/roll for a swinging paddle: no gimbal lock, smooth blending.
- "Fun over physically exact" — a slightly forgiving hit volume makes it feel responsive instead of broken.
- Half of hardware is just measuring things with a multimeter before you trust them.
What's next
Wiring up the real camera + AprilTag tracking (the interfaces are already there), populating all the motors, and packing the electronics into the paddle handle for a proper self-contained controller.
Challenges we ran into
Accomplishments that we're proud of
What we learned
What's next for Edge Pong
Built With
- esp32
- python
Log in or sign up for Devpost to join the conversation.