Skip to content

Knightfury166/Arduino-Sim-Steer-Bridge

Repository files navigation

Arduino-Sim-Steer-Bridge

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

SimWheel Bridge

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.

Overview

  • 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).

Operating Modes

  1. Sim Racing Wheel — Xbox 360 controller and PS controller emulation via vgamepad/ViGEmBus, vjoystick emulation via pyvjoy
  2. Bluetooth PC Controller — HC-05-based mouse/keyboard passthrough
  3. Desktop Monitor — temperature/humidity readout via DHT11 + I2C LCD

Architecture

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

Serial Protocol

ASCII CSV packets over serial:

SW,<steer>,<gas>,<brake>,<hexBTN>\n
  • hexBTN is 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

Calibration

  • 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

Building

Packaged with PyInstaller. Requires bundling the ViGEm client library:

pyinstaller --onefile --name=SimWheelBridge_V3 --collect-all vgamepad main.py"

Roadmap

  • 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

History

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

About

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

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages