Project to turn an Arduino board into a USB adapter for the Logitech G29 Driving Force Shifter.
Inspired by this project and this video. Code rewritten to use the UnoJoy library and work on a non-Leonardo board.
Note: If you are having trouble with the UnoJoy library, check out this branch which uses the ArduinoJoystickLibrary library instead as well as this issue
Connect the pins from the shifter's serial connector to the Arduino:
More details can be found in this video by AMStudio. It also shows how the finished product should look like, though the code base is different.
Download the UnoJoy library. Copy the UnoJoy.h
file in the same directory as G29_Shifter.ino
, and flash G29_Shifter.ino
to your board using the Arduino IDE.
Make sure to read UnoJoy's project page, which describes the steps to install the library and to program your Arduino.
Just as a helpful reminder, here are the steps required to turn your Arduino into a gamepad:
Put your Arduino in DFU mode: Using a piece of wire or other small metal object, connect the 2 pins closest to the USB connector together. You should hear a "beep" when the board enters DFU mode.
DFU stands for "Device Firmware Update". This mode is used by UnoJoy to change your Arduino's firmware, and either make it act as a regular Arduino board or as a controller.
Now that your board is in DFU mode, you can update the firmware.
You simply need to run (by double clicking) UnoJoy's TurnIntoAJoystick
(.bat
for Windows, .sh
for Linux, and .command
for macOS).
Note: To reprogram your board as an Arduino instead of a joystick, simply run TurnIntoAnArduino
instead.
This should open the shell and log information about the process. If it ends with passed
, you're all good! If you see failed
, your board probably wasn't in DFU mode. If you're sure that it was, head over to UnoJoy's project page for more information or to open an issue.
Simply unplug and replug your Arduino and you should be good to go!
Once your Arduino is in "Joystick mode", you can no longer reprogram it using the IDE. To turn it back into an Arduino (and be able to reprogram it), the steps are identical, but you need to run TurnIntoAnArduino
instead of TurnIntoAJoystick
.
Once you have flashed your Arduino, if you're running Windows, you can check that the gears are working correctly from the control panel:
Try to switch into each gear and check that they are correctly recognized. The first gear should show up as button 1, the second gear as button 2, and so on and so forth. The reverse gear should show up as button 7.
If that's not the case, please checkout the "Debugging" section.
Make sure you have correcty programmed the Arduino using UnoJoy's TurnIntoAJoystick
. You must set it to DFU mode before running TurnIntoAJoystick
, and you must unplug and replug the Arduino afterwards.
If the wrong buttons are selected when you shift gears (e.g. gear 1 enables button 3, or gear 6 enables button 4), the thresholds are probably wrong. You need to recalibrate the values as they depend on your setup (e.g. length of the cables between the shifter and the Arduino).
You'll need to open G29_Shifter.ino
and change the following values:
#define XAXIS_LEFT_THRESH
#define XAXIS_RIGHT_THRESH
#define YAXIS_UP_THRESH
#define YAXIS_DOWN_THRESH
Here's how the thresholds work:
When the gear is perfectly centered (in neutral), its X and Y values should be around 500. If the X value goes under XAXIS_LEFT_THRESH
(300 by default), then you are probably switching into first or second gear. At the contrary, if it goes above XAXIS_RIGHT_THRESH
, you are probably switching into fifth, sixth, or reverse.
Here are a few examples of symptoms and how to fix them:
XAXIS_LEFT_THRESH
.XAXIS_LEFT_THRESH
.YAXIS_UP_THRESH
.YAXIS_DOWN_THRESH
.To know which values you should use, you can flash Test_Arduino_Shifter.ino
and observe the values read by opening the serial port in the Arduino IDE (baud rate is 9600).
Check your wiring. Make sure to watch this video by AMStudio which explains precisely how to connect the shifter to the Arduino.
Flash Test_Arduino_Shifter.ino
to your Arduino board and make sure that the outputs on the serial port change when you switch gears. Check that those values are coherent with the defined thresholds (see above).