Hardware
my controllers
the home practice fleet. none of these replace the real cab (nothing does, the cab is the cab) but they keep my hands warm between arcade trips and let me grind reading on charts i'd be embarrassed to fail in public.
the lineup#
| name | game | what it is | verdict |
|---|---|---|---|
| the washer | maimai | DIY 2-player-width ring, 8 sanwa buttons + capacitive touch screen overlay on a 24" panel | my baby. 85% cab feel |
| ribbon | CHUNITHM | 16-key capacitive slider + 6-beam IR air tower | the one that gets the most hours |
| knobjockey | SDVX | aluminium-top controller, 7 buttons, 2 optical encoders | rock solid, hates my desk |
| pocket ring | maimai (travel) | tablet + 3D printed bezel with 8 low-profile buttons | for trains and boredom |
| the shelf of shame | various | two cheap SDVX controllers, a broken slider prototype | do not touch |
the washer (maimai)#
the big one. lives on a rolling cart so it can hide in the corner when people come over.
build:
- screen: 24" 1080p IPS rotated to portrait-ish, cropped to a circle with a laser-cut acrylic mask. real cab is a 1080×1080-ish round view per side, so the crop is close
- touch: IR touch frame (40-point) on top of the panel, mapped into 34 virtual zones by a small rp2040 board that speaks the DX touch protocol over USB serial. zone map is a hand-tuned polygon table, see maimai zones
- buttons: 8× sanwa OBSF-30 in a 3D printed ring (PETG, 6 segments, bolted). swapped the springs for 50g ones because stock felt mushy compared to the cab
- LEDs: WS2812 strip behind each button, driven off the same rp2040, mirrors button lighting
- firmware: my own, ~900 lines of C on the pico SDK. debounce is 2ms. touch is polled at 1 kHz, reported at the cab's native rate
quirks:
- IR frames register a touch slightly above the glass, so slides start about 3mm before my finger lands. it trained me to be lazy and i pay for it on the real cab. compensate with a +1 frame offset at home
- the D zones near the bezel are the weakest because the IR frame's edge accuracy sucks. edge TOUCH notes at home are a lie
- the cart wobbles if i slam the bottom buttons. need a cross brace
todo:
- cross brace for the cart
- capacitive film instead of IR (would fix the hover problem)
- second side for 2P sync, which will never happen because space
ribbon (CHUNITHM)#
the one i use most because chuni is the game my hands are worst at and also the most fun.
build:
- slider: 16 copper pads on a custom PCB (16 keys, matches the real 16-cell ground slider; each pad split into top/bottom halves = 32 sensing regions like the cab), driven by two MPR121 capacitive controllers
- air: 6 IR beams (break-beam, emitter on one side, receiver on the other) on aluminium extrusion towers either side of the slider. heights roughly match the cab, tuned to my arm length
- cover: 1mm frosted acrylic over the slider, sanded for friction. too smooth = no feel, too rough = skin loss
- LEDs: 31 RGB segments under the acrylic (16 keys + 15 dividers), mirrors the cab lighting
- MCU: teensy 4.0, reports slider at ~1 kHz
quirks:
- capacitive is sensitive to humidity. summer in livermore = calibrate every session
- the air towers are slightly too far apart, so my AIR-ACTIONs are a bit sloppy at home. i compensate by lifting higher, which is a bad habit on the real cab
- left tower's 4th beam drifts out of alignment if the cat (not mine, it visits) bumps it
tuning notes:
- threshold per pad lives in EEPROM; i keep a
ribbon.cfgwith known-good values per season - slider debounce: none. capacitive is analog-ish, debounce makes slides feel delayed
knobjockey (SDVX)#
store-bought base, heavily modded.
- body: aluminium top plate, wood sides
- buttons: 4× BT (big white) with 60g springs, 2× FX (wide, under the BTs), 1× START. i swapped BT microswitches for silent ones because naomi complained
- knobs: 2× optical encoders, 600 PPR, aluminium knob caps. reports as mouse-axis or analog depending on mode
- feet: rubber + a layer of museum putty so it stops sliding off the desk during knob slams
quirks:
- knob sensitivity at home is higher than most cabs. i keep it at the "cab-ish" setting and fix my lasers on the real thing
- the FX buttons are a hair lower than cab height. fine.
- the start button has double-triggered twice. suspicious
pocket ring (maimai travel)#
ipad-sized tablet in a 3D printed bezel with 8 low-profile kailh choc switches around it. tiny. silly. good for practicing reading and slide shapes on the plane, terrible for actual timing. i only track "did i understand the pattern," not scores.
the shelf of shame#
- 2× cheap sdvx controllers that came before knobjockey. one has a dead knob, one has a dead soul
- slider prototype v1: 8 keys, resistive. i don't want to talk about it
- a box of spare sanwa springs, choc switches, and one MPR121 i'm 60% sure is fried
lessons learned#
- feel > accuracy. a home controller that feels right but is 2ms laggy is more useful than a precise one that feels wrong
- copy the cab's dimensions exactly. every mm you deviate is a habit you have to unlearn
- never practice timing on a controller you haven't measured. latency kills
- build the boring stuff (cart stability, cable strain relief) first. i didn't. i regret it
