This is Specifically made as a Cheap robust method to emulate a sim steering using VigemBus Driver and Pyvjoy. Doesn't Need to flash the Arduino FIrmware just plug and play. Updating on Features instead of hard coding things in. Made by myself, Claude and Gemini
A DIY Arduino sim-racing steering wheel paired with a modular Python bridge that turns raw serial input into Xbox 360 controller emulation, Bluetooth PC control, or desktop macros — depending on mode.
- The wheel uses a gear-down mechanism for ~900° rotation, driven by an asymmetric potentiometer, and connects over USB serial (clone board limited to
BAUD=9600).
- Sim Racing Wheel — Xbox 360 controller and PS controller emulation via
vgamepad/ViGEmBus, vjoystick emulation via pyvjoy - Bluetooth PC Controller — HC-05-based mouse/keyboard passthrough
- Desktop Monitor — temperature/humidity readout via DHT11 + I2C LCD
The Python bridge is a 10-module design:
| Module | Responsibility |
|---|---|
main.py |
Entry point, pre-flight checks, main loop |
serial_manager.py |
Auto-detects and pairs with the microcontroller |
bridge.py |
Decodes incoming packets, routes by mode prefix |
sim_mode.py |
Sim racing input handling and live profile switching |
gamepad_manager.py |
Virtual Xbox 360 controller, PSDS controller, Vjoystick controller output |
calibration.py |
Axis scaling, deadzone/threshold compensation |
bt_mode.py |
Bluetooth macro/mouse-keyboard passthrough |
config.py |
Persistent settings (config.json) |
ui.py |
ANSI-based console output (custom, no rich dependency) |
utils.py |
Shared helpers |
| --- | --- |
| Arduino uno sketch | Simply Serial prints data through No calculations |
ASCII CSV packets over serial:
SW,<steer>,<gas>,<brake>,<hexBTN>\n
hexBTNis a 4-character hex bitmask covering 16 buttons from a 4×4 keypad matrix- Buttons 12–15 are reserved: steering center offset trim (±2 units), steering profile cycling, and Arduino-side mode switching
- Buttons 5-6 Combined press switches Controller type XBOX → PSDS → PyVjoy
- Can be Calibrated at bridge startup hardcoded default values will be overwritten
- Asymmetric lock scaling maps raw pot values to a symmetric axis (-32767 to 32767)
- Pot ranges:
STEER_LEFT_LOCK=110,STEER_CENTER=418,STEER_RIGHT_LOCK=756 - Pedal ranges:
GAS_MIN/MAX=160/260,BRAKE_MIN/MAX=90/190 - Three selectable steering profiles: full range, deadzone-compensated, and threshold-filtered with center deadband
- Interactive CLI calibration wizard for sampling/saving thresholds
Packaged with PyInstaller. Requires bundling the ViGEm client library:
pyinstaller --onefile --name=SimWheelBridge_V3 --collect-all vgamepad main.py"
- Upgrade to an Arduino Mega 2560 to support 7 potentiometers (steering, gas, brake, clutch, handbrake, H-pattern shifter X/Y)
- 5-speed H-pattern shifter (two-pot X/Y)
- L298N-driven DC motor for force feedback (not yet built — planning stage)
- Move HC-05 to hardware UART (Serial1)
- Evaluating SimHub as a lower-effort FFB telemetry source vs. writing per-sim parsers
Originally prototyped with pyvjoy, later migrated to vgamepad/ViGEmBus for cleaner Xbox 360 emulation. Axis scaling is intentionally kept in Python rather than on the Arduino to keep firmware simple.
Knightfury166