Please check the manual on this page.
This is a now stable software suite to manage force feedback game effects from a C# feeder application made with vJoy, using an IO-board based on Arduino to make physical effects played on almost all arcade race cabinets with hardware ranging from Sega Model 1 up to recent PC-based cabinets. Some cabinets equiped with DC motors (like Midway's ones) are also supported through third-party electronics.
This work has been done in a few weeks thanks to other people who paved the road before me.
In particular, this project is strongly based on the amazing work done by Shaul Eizikovich who did vJoy with support for force feedback effects. Without him, this would have never been started!
This vJoy+Arduino strategy is not new and was an idea of BigPanik (M2Pac author) and SailorSat (DaytonaUSB author) who made the first proof-of-concepts of controlling a Sega Model 2/3 drive board from an Arduino.
Compared to their respective developments, this project has now complete support for digital outputs to control lamps/relays and also support many different arcade driveboards with a working translation mode using either native protocols (Sega) or DIY electronics boards to make the translation (FFB converter, PWM2M2 or PWM2HAPP). This allow playing all force feedback effects on almost any cabinet, making it a universal PC-based platform.
I started to document Sega's Driveboard and servoboard commands. The information is placed in this page.
A lot of documentation is also available in the french forum Gamoover
The software supports 4x Analog inputs for 1 steering wheel and 3 pedals, 12 to 16 digital inputs for buttons, and optionally on the Mega2560 an additionnal keypad decoder that can be used to report 12 more raw inputs).
Force feedback output is handled with following modes :
- analog PWM+Dir
- digital PWM using serial communication with a motor drive board
- almost all Sega Model 1/2 cabinets using PWM2M2 motor control board: Daytona, Sega Rally
- almost all Sega Model 2/3 driveboards that are clone to Indy500: Super GT, Touring Cars, Le Mans 24, ...
- almost all Sega Model 3 driveboards using the Sega Rally 2 EPROM which has the best torque control capability: Scud Race, Daytona 2, Sega Rally 2, E.C.A, Dirt Devils, Nascar, F355 Challenge, ...
- almost all Sega Naomi, Lingbergh, Ringedge/wide up to the latest PC based servoboard using FFB controller : Initial D series, Outrun 2 series, ...
- almost all Happ or DC-motor based cabinets (Midway, new Sega cabinets) using either an L6204 or a PWM2HAPP motor control board: Grid, Sega Rally 3, Cruis'n series
In most cases, FFB effects are emulated by cheating with fast constant-torque commands@5ms (200Hz). This allows for full effects to be played on your setup, whatever the underlying driveboard can provide. Emulating requires at least the constant torque effect to be operationnal on your motor driver (ie a rumble-only setup cannot be used).
Calibration of the wheel rotation and analog inputs can pe performed from the GUI to map your physical wheel amplitude to the maximum vJoy amplitude (0..32768), same for pedals motion. Digital inputs are mapped to buttons and remapping is possible using the GUI. This allows to finally handle your personnal setup.
Outputs (to drive lamps) are retrieved for MAME, Supermodel (model 3), m2emulator, and OutputBlasters plugin games (Teknoparrot) using either MAME Windows Output system, or direct raw memory read (model 2). Already a lot of games are handled properly, and more are added over the time. Many thanks to SailorSat& BigPanik and Boomslangnz for all their work.
The software also allows to define "control sets" for a unique configuration per game or per emulator. The control sets store parameters that can be tuned according to each game or emulator behavior. Using runtime auto-detection based on current running process and main window's title, the software will automatically switch its configuration according to the current game playing.
The feeder software also allows to define keystrokes (emulation of keyboard keypress) based on either buttons or axes inputs. This can be a replacement for joytokey or autohotkey in most use cases. In particular, it can detect combinaison of buttons press to issue special keystrokes like Alt+F4, or ESC when the user presses or holds the panel buttons.
The next steps I plan are:
- add schematics to help people do their cabling
- add I2c support for lowcost digital IO extensions (mainly for Leonardo)
- support encoder feedback to get very fine angle resolution, perhaps making a better FFB feeling.
Two possibilities are offered : either pick the latest released installer/setup, or compile the software by your own.
To build the application, please install Visual Studio 2019 Community Edition with C# for Desktop.
The software expect vJoy 2.2.1 to be installed, so please install it separatly (see subdirectory tools/vJoySetup_2.2.1 signed.exe).
Next, configure the first virtual joystick using the Configure vJoy tool with following options:
Note: Only 3 or 4 vJoy axes are useful. The 5th axis Dial/Slider2 is only used as a monitoring value to see how much torque is send to the motor driver when using PWM mode.
Depending on your hardware, different options are possible.
Model 1/2, Happ or DC-based motors (DIY wheel): analog or digital PWM mode on Arduino Mega2560 or Leonardo
Analog PWM or Dual PWM output can be used for DIY steering wheels.
For PWM2M2 or PWM2HAPP installation (Sega Model 1/2, Midway cabinets), crawl on the web for information. The system shall be configured with PWM_CENTERED and digital PWM enabled (serial communication).
Hardcoded wiring on the Arduino Leonardo:
- 12 Buttons are mapped to D2-D8 (seven inputs), D12 (plus one) and D0/D1/A4/A5 (four more)
- Wheel "volume" potentiometer is A0
- Accel "volume" is A1
- Brake "volume" is A2
- Clutch "volume" is A3
- analog PWM output is D9 (configured for fast PWM at 15,6kHz), either 0-100% or centered value.
- dual analog PWM output on D9/D10 for
- digital ouput for Direction is D10 for forward, D11 for backward.
- for digital PWM: use SerialPort 0's Tx on D1
For the mega2560, same wiring except:
- 8 Buttons are mapped to D2-D8 (seven inputs), D12 (plus one), 8 buttons are mapped to D38-D41 and D50-D53
- 8 more inputs are mapped to D30-D37 (can be used for buttons)
- Wheel "volume" potentiometer is A0
- Accel "volume" is A1
- Brake "volume" is A2
- Clutch "volume" is A3
- analog PWM output is D9 only 490Hz! (not yet configured for fast PWM at 15,6kHz), either 0-100% or centered value.
- dual analog PWM output on D9/D10
- digital ouput for Direction is D10 for forward, D11 for backward.
- for digital PWM: Use SerialPort 3's Tx3 (pin D14) for the Mega2560.
- if keypad decoding is used (see "USE_KEYPAD" in the Arduino's code), then D42-D48 are used for key press decoding. In this case, 12 more raw inputs (keys) are reported back to the feeder.
In case you are using the FFB Converter shield, please select "Pin mapping for FFB Converter". Please have a look for the Arduino PlatformSpecific.h file for more details about the pinout.
In all cases, use Arduino IDE and flash it with the common Arduino code here (same source code for Leonardo and Mega2560).
In this case, you must use a Mega2560 Arduino board. For cabling the Model 2/3 drive board with a parallel communication bus connected to an Arduino Mega2560, see BigPanik's webpage here.
Hardcoded wiring on the Arduino Mega2560:
- 8 Buttons are mapped to D2-D8 (seven inputs), D12 (plus one), 8 more buttons are mapped to D38-D41 and D50-D53
- Wheel "volume" potentiometer is A0
- Accel "volume" is A1
- Brake "volume" is A2
- Clutch "volume" is A3
- Pins D22-D29 are for 8x digital outputs (PORTA) connected to your driveboard RX pins
- Pins D30-D37 are for 8x digital inputs in pull-up mode (PORTC) connected to your driveboard TX pins.
- if keypad decoding is used (see "USE_KEYPAD" in the Arduino's code), then D42-D48 are used for key press decoding. In this case, 12 more raw inputs (keys) are reported back to the feeder.
In order to communicate with the DriveBoard, use Arduino IDE and flash the Mega2560 with the common Arduino code here.
Recommended inputs wiring for 4-axes and 32 vJoy buttons setup:
-
A0: Steering A, mapped to X in vJoy
-
A1: Accel, mapped to Y in vJoy
-
A2: Brake, mapped to Z in vJoy
-
A3: Clutch (if applicable), mapped to RX in vJoy
-
D2: Coinchute 1 entry or Credit button (European cabinet), mapped to vJoy 1 (COIN1)
-
D3: Test button, mapped to vJoy 2 (TEST)
-
D4: Service button, mapped to vJoy 3 (SERVICE)
-
D5: Start button, mapped to vJoy 4 (START)
-
D6: View button 1, or View Zoom In, or single view change button (SegaRally2, OR2), mapped to vJoy 5 (VIEW1/VIEWCHANGE)
-
D7: View button 2 or View Zoom Out, or side handbrake (SegaRally2), mapped to vJoy 6 (VIEW2/SIDEBRAKE)
-
D8: View button 3, mapped to vJoy 7 (VIEW3)
-
D12:View button 4, mapped to vJoy 8 (VIEW4)
-
D38: U/D-shifter Up or H-shifter 0 (Up row), mapped to vJoy 9 (SHIFTER DOWN)
-
D39: U/D-shifter Down or H-shifter 1 (Left/Right side), mapped to vJoy 10 (SHIFTER UP)
-
D40: H-shifter 2 (Down row), mapped to vJoy 11 (SHIFTER SIDE)
-
D41: Optional music button mapped to vJoy 12 (MUSIC)
-
D50: wheel button 1, mapped to vJoy 13 (WHBTN1)
-
D51: wheel button 2, mapped to vJoy 14 (WHBTN2)
-
D52: wheel button 3, mapped to vJoy 15 (WHBTN3)
-
D53: wheel button 4, mapped to vJoy 16 (WHBTN4)
-
Up/Down or H-shifter decoder output: only map to vJoy buttons 17-18-19-20-21-22-23-24 for gear shift N-R-1-2-3-4-5-6 (neutral is 17)
-
D30-D37: Rx0-7 from driveboard TX pins (no mapping), or H-4 or H-6 shifter gear selection (Delo shifter) mapped to vJoy buttons 17-24 (see decoder above)
-
If using the Keypad decoder with a Mega2560, there are 16 more raw inputs that maps to 12 "hard keys" on the keypad (like Batman cabinet). Those can be safely mapped to vJoy 17 to 32 as no H-Shifter will be used in this case.
Outputs:
-
A9: coin meter1, mapped to game output 1
-
A15: coin meter2, mapped to game output 2
-
A10: Start lamp, mapped to game output 3
-
A11: View lamp1, mapped to game output 4
-
A12: View lamp2, mapped to game output 5
-
A13: View lamp3, mapped to game output 6
-
A14: View lamp4, mapped to game output 7
-
A8: Leader Lamp, mapped to game output 8
-
D22-D29: TX0-7 to driveboard RX pins (no mapping), mapped to game outputs 9-16. This is used to perform "raw" control of Sega driveboards.
Recommended Pins | Function | vJoy mapping (emulator configuration) |
---|---|---|
A0 | Steering | (Axis X+) in game, menu left/right |
A1 | Accel | (Axis Y-) in game |
A2 | Brake | (Axis Z-) in game |
A3 | Clutch | (Axis RX-) in game |
D2 | Coin1 | (vJoy 1) Coin 1 entry |
D3 | Test | (vJoy 2) Test button, test menu entry |
D4 | Service | (vJoy 3) Service button |
D5 | Start | (vJoy 4) Start button |
D6 | View1 | (vJoy 5) View 1 (red), or view change |
D7 | View2 | (vJoy 6) View 2 (blue), or side handbrake |
D8 | View3 | (vJoy 7) View 3 (yellow) |
D12 | View4 | (vJoy 8) View 4 (green) |
D38 | ShiftUp | (vJoy 9) Shifter Up, menu up or HShift0 |
D39 | ShiftDown | (vJoy 10) Shifter Down, menu down or HShift1 |
D40 | Shift2 | (vJoy 11) HShift2, or option |
D41 | Music | (vJoy 12) Music selection |
D50 | Wheel1 | (vJoy 13) Boost/Turbo |
D51 | Wheel2 | (vJoy 14) Item |
D52 | Wheel3 | (vJoy 15) |
D53 | Wheel4 | (vJoy 16) |
D30 | Neutral | (vJoy 17) Neutral (no gear) |
D31 | Reverse | (vJoy 18) Gear Reverse |
D32 | Gear1 | (vJoy 19) Gear 1 |
D33 | Gear2 | (vJoy 20) Gear 2 |
D34 | Gear3 | (vJoy 21) Gear 3 |
D35 | Gear4 | (vJoy 22) Gear 4 |
D36 | Gear5 | (vJoy 23) Gear 5 |
D37 | Gear6 | (vJoy 24) Gear 6 |
Recommended Pins | Function | game output mapping |
---|---|---|
A9 | Coin Meter1 | (1) Coin1 |
A15 | Option | (2) Optional output |
A10 | Start lamp | (3) Start game |
A11 | View1 lamp | (4) View change 1 |
A12 | View2 lamp | (5) View change 2 |
A13 | View3 lamp | (6) View change 3 |
A14 | View4 lamp | (7) View change 4 |
A8 | Leader lamp | (8) Leader Lamp, attract lamp |
D22-D29 | TX to driveboard RX | (Raw 8bits) driveboard control (Sega) |
Use Aganyte's FFB Converter board (based on Arduino Mega2560). This FFB Converter board will translate PWM commands from the feeder application directly to Sega's proprietary protocol without using another Arduino. The system shall be configured with PWM_CENTERED and digital PWM enabled (serial communication).
If using the installer, simply runs BackForceFeedeerGUI and go to the hardware page to configure your setup.
If building from Visual Studio, open the solution file BackForceFeedeer.sln.
Build the solution in x64, then run it in Debug mode. Go to the Log Window and select "DEBUG" level to see messages from the internal modules. Check that you got at least these messages (in below example, the Arduino Mega2560 is seen as COM3):
10:47:54 | [MANAGER] Program configured for MODEL3_SCUD_DRVBD
10:47:54 | [USBSerial] The following serial ports were found:
10:47:54 | [USBSerial] COM3
10:47:54 | [USBSerial] Attempting to connect each with 115200bauds...
10:47:57 | [MANAGER] Found io board on COM3 version=1.0.0.0 type=IO BOARD ON MEGA2560
Check with vJoy Monitor if something is alive (like wheel position feedback).
You can then test the force feedback using tools/fedit.exe and selecting and effect you would like to try.
To be explained...
Once the application is run and then closed, an XML configuration file is created to
your "My Documents" directory (%USERPROFILE%\Documents\BackForceFeeder), which usually maps to :
C:\Users\LOGIN\Documents\BackForceFeeder\
The FAQ is in a separate file here.