I recently decided I wanted a sequential shifter and didn't have the funds to purchase one, so I decided to make my own. I took some inspiration from here https://www.isrtv.com/forums/topic/...-project-picture-heavy-with-sort-of-tutorial/
I have used a BMW steptronic shifter before and I wasn't super impressed with the shift feel. I found a BMW M6 E63 SMG shifter for fairly cheap (~$20) on Ebay and thought I would take a risk.
When I got the SMG shifter I disappointed to find that it's shifting was not controlled with switches, like the steptronic shifters afaik. The SMG shifter uses a magnet on the end of the shifter and travels across Hall effect sensors to register gear changes. This means that if you want to use the output from the shifter you need to power it and use some logic to figure out what pins go low or high when the shifter is moved. This took a few hours for me to figure out the pin out from the shifter but I managed to get it working.
For this project I used:
BMW M6 E63 SMG shifter (I think any E60, E63, or E64 SMG shifter will work, but don't quote me)
Arduino Pro micro or Arduino Leonardo
Dupont Wires
You'll probably need a shift knob, I bought a cheap universal shift knob adapter off of Ebay and used a shift knob I had laying around
Step 1: Remove the parking lockout solenoid. I used a screw driver to pop it out, it took some force to remove. Once this is removed you should be able to move the shifter freely.
Step 2: Wiring
Pin 1 is the forward left pin (parking pin is in the rear) The corner pins are numbered on the connector but might be difficult to see, I have included a picture below. Match the BMW pins to the Arduino pins to match my code (this can easily be modified with some simple Arduino knowledge and should work for both a pro micro and Leonardo)
As you can see in the excel table the logic for the shifter, kinda cool to see the failsafes built into road cars. (I'm a little confused with the drive and upshift having the same output, there might be another pin I'm missing, but this is enough to get a working shifter)
Step 3: Code
If you have never used an Arduino before practice making a simple button box or something before you try this. I am not super familiar with Arduino but I know enough to stumble through it and sometimes get something to work. You will need the joystick library. The way I have this setup it will give you three control inputs Upshift, Downshift and Reverse (I use it for exiting a race)
*This probably isn''t the best way to code this but it works for me, if you have a recommendation on how to make the code better leave a comment.*
#include <Joystick.h>
#define PINS 11
#define BMWPINS 5
Joystick_ Joystick;
void setup() {
for(int i=0 ; i<PINS ;i++)
pinMode(i, INPUT_PULLUP);
Joystick.begin();
}
int lastButtonState[11] = {1,1,1,1,0,0,0,0,0,0,0};
void loop() {
/* //this reads and outputs for the regular buttons (could make this better by doing some sort of if loop to see if anything changed, the delay to give the button out put slows down the shifting response)
for (int index = 5; index < PINS; index++)
{
int currentButtonState = !digitalRead(index);
if (currentButtonState != lastButtonState[index])
{
Joystick.setButton(index, currentButtonState);
lastButtonState[index] = currentButtonState;
}
%delay(50);
}
*/
//this section for shifter logic only
//upshift
if (digitalRead(1) == 1 && digitalRead(2) == 1 && digitalRead(3) == 1 && digitalRead(4) == 0)
{
Joystick.setButton(0, 1);
delay(25);
}
else
{
Joystick.setButton(0, 0);
}
//downshift
if (digitalRead(1) == 0 && digitalRead(2) == 1 && digitalRead(3) == 1 && digitalRead(4) == 1)
{
Joystick.setButton(1, 1);
delay(25);
}
else
{
Joystick.setButton(1, 0);
}
//reverse
if (digitalRead(1) == 1 && digitalRead(2) == 0 && digitalRead(3) == 1 && digitalRead(4) == 1)
{
Joystick.setButton(2, 1);
delay(25);
}
else
{
Joystick.setButton(2, 0);
}
}
*End Code*
Step 4: Test it out!
Step 5: Mount it
I have an 8020 rig so I just drilled some holes and mounted it. Mounting could be difficult and you might need to get creative.
I have this working with Assetto Corsa, I haven't tried it with any other sims, but it should work with any PC sim that can take a standard HID game controller input.
After using it for a few weeks, I really enjoy using it. The shift feel isn't the greatest, it's no aiologs shifter (my next upgrade) but the shifts are reliable. I did this project for about $50 and at that price it might make more sense to buy an off the shelf shifter that will require less skill and risk.
If you have any issues I'll try to help out, but I can't make any promises. If you're having an issue with Arduino you're probably better off googling it.
I hope this inspires you to take on your own DIY project, if you make it yourself or have something similar drop it below and share it with everyone else.
I have used a BMW steptronic shifter before and I wasn't super impressed with the shift feel. I found a BMW M6 E63 SMG shifter for fairly cheap (~$20) on Ebay and thought I would take a risk.
When I got the SMG shifter I disappointed to find that it's shifting was not controlled with switches, like the steptronic shifters afaik. The SMG shifter uses a magnet on the end of the shifter and travels across Hall effect sensors to register gear changes. This means that if you want to use the output from the shifter you need to power it and use some logic to figure out what pins go low or high when the shifter is moved. This took a few hours for me to figure out the pin out from the shifter but I managed to get it working.
For this project I used:
BMW M6 E63 SMG shifter (I think any E60, E63, or E64 SMG shifter will work, but don't quote me)
Arduino Pro micro or Arduino Leonardo
Dupont Wires
You'll probably need a shift knob, I bought a cheap universal shift knob adapter off of Ebay and used a shift knob I had laying around
Step 1: Remove the parking lockout solenoid. I used a screw driver to pop it out, it took some force to remove. Once this is removed you should be able to move the shifter freely.
Step 2: Wiring
Pin 1 is the forward left pin (parking pin is in the rear) The corner pins are numbered on the connector but might be difficult to see, I have included a picture below. Match the BMW pins to the Arduino pins to match my code (this can easily be modified with some simple Arduino knowledge and should work for both a pro micro and Leonardo)
As you can see in the excel table the logic for the shifter, kinda cool to see the failsafes built into road cars. (I'm a little confused with the drive and upshift having the same output, there might be another pin I'm missing, but this is enough to get a working shifter)
Step 3: Code
If you have never used an Arduino before practice making a simple button box or something before you try this. I am not super familiar with Arduino but I know enough to stumble through it and sometimes get something to work. You will need the joystick library. The way I have this setup it will give you three control inputs Upshift, Downshift and Reverse (I use it for exiting a race)
*This probably isn''t the best way to code this but it works for me, if you have a recommendation on how to make the code better leave a comment.*
#include <Joystick.h>
#define PINS 11
#define BMWPINS 5
Joystick_ Joystick;
void setup() {
for(int i=0 ; i<PINS ;i++)
pinMode(i, INPUT_PULLUP);
Joystick.begin();
}
int lastButtonState[11] = {1,1,1,1,0,0,0,0,0,0,0};
void loop() {
/* //this reads and outputs for the regular buttons (could make this better by doing some sort of if loop to see if anything changed, the delay to give the button out put slows down the shifting response)
for (int index = 5; index < PINS; index++)
{
int currentButtonState = !digitalRead(index);
if (currentButtonState != lastButtonState[index])
{
Joystick.setButton(index, currentButtonState);
lastButtonState[index] = currentButtonState;
}
%delay(50);
}
*/
//this section for shifter logic only
//upshift
if (digitalRead(1) == 1 && digitalRead(2) == 1 && digitalRead(3) == 1 && digitalRead(4) == 0)
{
Joystick.setButton(0, 1);
delay(25);
}
else
{
Joystick.setButton(0, 0);
}
//downshift
if (digitalRead(1) == 0 && digitalRead(2) == 1 && digitalRead(3) == 1 && digitalRead(4) == 1)
{
Joystick.setButton(1, 1);
delay(25);
}
else
{
Joystick.setButton(1, 0);
}
//reverse
if (digitalRead(1) == 1 && digitalRead(2) == 0 && digitalRead(3) == 1 && digitalRead(4) == 1)
{
Joystick.setButton(2, 1);
delay(25);
}
else
{
Joystick.setButton(2, 0);
}
}
*End Code*
Step 4: Test it out!
Step 5: Mount it
I have an 8020 rig so I just drilled some holes and mounted it. Mounting could be difficult and you might need to get creative.
I have this working with Assetto Corsa, I haven't tried it with any other sims, but it should work with any PC sim that can take a standard HID game controller input.
After using it for a few weeks, I really enjoy using it. The shift feel isn't the greatest, it's no aiologs shifter (my next upgrade) but the shifts are reliable. I did this project for about $50 and at that price it might make more sense to buy an off the shelf shifter that will require less skill and risk.
If you have any issues I'll try to help out, but I can't make any promises. If you're having an issue with Arduino you're probably better off googling it.
I hope this inspires you to take on your own DIY project, if you make it yourself or have something similar drop it below and share it with everyone else.