SmoothStep force feedback steering wheel

The SmoothStep is an affordable precision force feedback sim racing wheel platform with open source hardware/software.

Public Chat
Similar projects worth following
The SmoothStep is a sim racing wheel designed to provide the feedback of an expensive direct drive wheel, without the price-tag of some of the other direct drive wheels on the market. It is based on a 14NM Stepper motor and a 20000ppr encoder. This project was inspired by this thread on xsimulator.netHere is a demo of what I have working so far

The motor drive system is composed of a 14NM NEMA32 stepper motor.,off the shelf TI development boards,  custom firmware,  and a 5000 PPR  (20000 CPR) Differential encoder. 

The software uses Field-Oriented Control to, with the help of the encoder, precisely control  the magnetic flux vector so that maximum torque with minimal ripple is achieved. 



YOU, THE USER OF SmoothStep, MAY NOT USE SmoothStep:



SmoothStep based Force Feedback systems (FFB) pose high mechanical danger that may cause serious injuries to living beings, cause damage to external property, or loss of profits. Always operate SmoothStep based systems with maximum caution.

  • Beware of very high sudden torques or vibrations produced by motor attached to SmoothStep - these are expected even in normal operating conditions.
  • Be aware that malfunction of misconfiguration may cause uncontrolled or higher than normal motor rotation or torques.
  • End-user's responsibility is to ensure that motor, or items connected to the motor can not cause damage due to rotation, torque or vibration.
  • Always be ready to let go of the motor or parts connected to it (i.e. take hands off the simulator wheel)
  • Make sure that a reliable stopping method is available and user reachable at all times (reliable method: unplugging AC power). Note that unplugging power might not stop motor immediately.
  • Do not try to stop spinning motor by hands or other mechanical means as injury could occur.
  • Note that wheel, cables or other items attached to motor could become dislodged and hit objects or living beings with damaging effects. User's responsibility is to control this danger and take responsibility of the possible consequences caused by moving items.
  • Ensure that motor and items attached to the motor are rigidly fixed to avoid becoming loose under extreme vibrations and rotations.
  • Commonly used motors may exceed torque of 30 Newton meters and rotation speed of 1000 rpm when attached to SmoothStep.
  • Due to high electric currents, motor, cables or SmoothStep drive may get dangerously hot. (skin burns, fire hazard)
  • For your own safety, do not operate SmoothStep if you don't understand these dangers

View all 8 components

  • Iracing Demo

    John Taylor03/24/2019 at 17:16 0 comments

    Demo In IRacing with a few different cars

  • Received MOBO from fab

    John Taylor02/24/2019 at 05:05 0 comments

    I received and partially assembled the new DD stepper motherboard from @oshpark  today.  So far so good. All of the pins for stacking the STM and C2000 dev boards line up perfectly. I was able to connect to MMOS after some fiddling and was also able to connect my G27 pedals and shifter and get them working...well mostly. The shifter is having issues shifting into reverse, but I'm confident that I'll be able to figure that out in the next few days.

    Unfortunately I forgot to order a few components, namely a level shifter and a DB9 connector to attach to my encoder. I have these parts on order and should receive them in the next week or so and then I'll be able to test the wheel input. Also the huge inductor on my motor driver board broke off and took the pads with it. I'm going to get in touch with TI and see if I can get a replacement because that board is pretty expensive.

    Overall it came out looking better than I expected, and I'm excited to get it working fully.

  • Success!

    John Taylor02/21/2019 at 17:45 0 comments

    I am happy to announce that @matthew.gregg has taken the skeleton of the platform I have been developing and massaged it enough to get it working with Assetto Corsa! Using the STM Disco board and MMoS game controller integrated with my FOC software for stepper motors Matt is shown below making some laps with his good looking DD wheel.

    I have to give Matt a lot of credit, he took a lot of his own time to work on this project, even when I hadn't touched it for months. He has also provided invaluable information for the design of the system. 

    Matt has also inspired me to finish the latest PCB design for the project, which is a motherboard to integrate all of the motor control components as well as add connection for the G27 shifter and Pedals. I should receive the prototype for the motherboard in a couple days so that I can begin testing.  For now, here is a sneak peek at the MOBO. If it ends up working, I'd like to make it available to fellow DIYers! BTW the website on the board is under construction and not available yet.

  • The Grand Redesign

    John Taylor11/07/2018 at 04:27 0 comments

    Hi Folks. I left you guys last time with news that electrical noise from the motor was causing problems with some of the important signals in the design.  The PWM signal from the PC that lets the motor know how much force to produce and in which direction was so distorted that is was unusable and the encoder signals were affected at high currents. I ordered a new motor driver with integrated phase current sensing to move the motor traces far away from the signal traces on my board, but when It arrived, it did not fit on the current C2000 launchpad with my custom driver board well at all. When I did get it to fit, I had to re-do the encoder connection and ended up breaking one of the pins off of the back of my US digital encoder... This was the second pin that broke on this encoder and It took some real finesse to re-attach the previous one.

    Instead of trying to patch the encoder up and continue testing, I took this as an opportunity to  address some of the major design flaws with the project.

    First, the encoder is a pain to install. It requires a custom 3D printed adapter, Standoffs and also requires gluing to the motor shaft, which at best is tedious and at worst causes misalignment that could rip the connection apart at high speeds. Also I was using a single ended encoder, which is susceptible to noise compared to a differential encoder. To remedy this I searched and searched for a through-shaft encoder to easily attach to this dual shaft stepper motor. After several hours of searching for a through shaft encoder with a 12mm hole with no luck, I was just about ready to give up. Then I had one final idea...Check Alibaba. Immediately I was presented with several serviceable solutions and settled upon the GHH60-12G5000BKL5(60mm outer, 12mm through hollow shaft, 5000PPR, 5v line driver output, 1 meter cable side) encoder from CALT. I should be receiving the motor and encoder by next Monday, so We I'll be interested in the quality of the encoder and to see how well the motor and encoder fit together. Hopefully this will solve the encoder noise and fitment problems for good.

    Another problem was the entire interface to the STM board. I was trying to isolate all of the signals from the board, but the power for the board and the USB comms were two separate connectors so there were a lot of wires everywhere on my desk. To simplify this, i will power the STM from the motor supply and isolate between the computer and the STM USB comms. This will require a custom adapter board that will connect the motor driver, C2000 board and the STM. It will also contain the differential signal receiver for the encoder. Here is a block diagram of what the new system will look like.

    I hope to be getting into some of the PCB design soon, but I have been doing a lot of that at work lately so it's hard to find time/motivation. Should have something by the end of the year.


    John Taylor10/23/2018 at 02:18 0 comments

    Although it has been several months since I updated the site, I have still been working on the project. Since the last update I have met several milestones, and ran into a HUGE hurdle. Let's get into it.

    The biggest accomplishment I have made so far has been getting motor current control working. I was able to leverage TI's IQmath fixed point library to implement the Field Oriented Control algorithm so that it runs fast enough to be useful. It was a challenge to get all of the libraries working and I have to remove all of the function calls from the algorithm to make it lightning fast. With all said and done, the algorithm works well. 

    I have noticed that sometimes the measured electrical phase angle becomes offset from the actual value, usually when the motor is under heavy load. I am chocking this up to noise from the motor interfering with the encoder signals.

    I have also been able to get the PWM capture from the STM disco board working. The PWM from the disco board tells the motor controller how much force to apply and in which direction. Unfortunately when the motor is running the signal is severely distorted. This seems to be due to the motor power trace running right next to the signal line. The noise on this line makes it impossible to do any real testing with IRacing, which is disappointing.

    In order to solve these problems I have ordered a new motor driver from TI that will allow me to move the motor traces away from my signal lines. 

    I have also designed a "brake chopper" board that connects to to the power supply and prevents the motor from putting unwanted back-emf onto the supply.

  • Plotting

    John Taylor05/04/2018 at 02:09 0 comments

    Today I finally got back to the project a little bit. I got the basic plotting functionality for the phase currents implemented and it looks pretty good. Hopefully later this week I can make the plots a little nicer and add labels, then start working on getting the controller math worked out and tuning. The github for the python plotting libraries can be found here :

  • Testing complete...on to firmware development

    John Taylor04/06/2018 at 22:31 0 comments


    Wow, it's been a while since this project has gotten an update. After a long hiatus, I have finally completed the assembly and testing of the current sensing booster-pack. The only problem i ran into was one of the tiny 0402 caps was shorted because of a poor soldering job. I was able to fix that easily enough, and since I tested for continuity between power and ground before actually powering the board I didn't break anything. I also modified the firmware to use the new ADC channels that the booster pack feeds into. To verify, I was able to apply voltages to each of the motor phases and see the correct current output in the ADC registers.  Over the last couple of days I have been working on a task-scheduler that I can use to do various tasks at fixed rates using one timer.  I used this blog post as a template, but since I am using C++ I am doing things a little differently. Check the github if you are interested. I will use this for my control loops as well as data transfer to a host-PC (more on that later...)

    Whats Next?

    The obvious next step is to start working on the controller. We very obviously need current controllers for both the A and B phases.  In my experience developing control systems, ones job becomes much easier if he/she is able to see an output of the control signals as well as the setpoint in order to do step-response test, see errors in real time, etc. My plan is to develop a GUI in Python that communicates with the motor control processor to facilitate this. This GUI will make tuning and validating the system much easier. I usually use Java for this sort of thing, so I am excited to see what Python brings to the table. Once the GUI is working I'll implement the PID controllers for the current control system and start testing. 

  • Current Sensing board 99% assembled + Test Plan

    John Taylor02/28/2018 at 19:52 0 comments

    I received the phase current sensing PCB from OSHPark on Monday. I finally got around to assembling it today. Here are some pics.

    If you look closely, you will notice that U2, one of the isolators, is missing. Unfortunately I forgot to order this part from digikey and I'll have to wait for it to come in.  There were a few problems with the board. I used really tiny 0402 resistors and capacitors and from an assembly perspective this made things tedious. I also forgot to put a package outline and a pin-1 callout on the current sense amps so I had to reference the Altium file to figure out which way they needed to go on the board. 

    Test Plan

    1. Make sure no power nets are shorted to ground (done)
    2. power board on (done)
    3. Check Vref (done)
    4. Apply i known current through the channels and make sure it shows up on the output of the op amp (done)
    5. Check all of the digital signals to make sure they are working (done)

    I probably wont get to this until late next week because I'm going to be out of town.

  • Current Sensing PCB is ordered

    John Taylor02/11/2018 at 21:44 0 comments

    After a few weeks of tinkering, I finally finished the PCB that will allow me to sense the phase currents of the stepper motor. The phase output wires of the motor driver board plug into one side and feed the motor current through 5mohm resistors. Special kelvin connections that I learned about from this article were used to improve the measurement accuracy at high-currents. INA240 current sensing amplifiers from TI were used for their enhanced PWM rejection. With these components I should be able to sense currents from -16.5-16.5A. Isolators were added to isolate the motor driver processor/power circuitry from the STM discovery board. I have also added connector ports to route the encoder and PWM signals to the STM discovery board. This board has a standard booster pack layout and will plug directly into the C2000 launchpad.

  • Update

    John Taylor02/08/2018 at 04:39 0 comments

    I have been working on the project for almost a month now and have accomplished a bunch, and also ran into a few problems.  


    • Sourced motor, encoder, motor driver,wheel rim, game controller interface board (STM32) and motor controller processorboard (TI C2000)
    • Mounted the encoder to the back of the motor with a 3D printed adapter. I had to machine a hole in the back of the motor case in order to have access to the shaft. I then drilled and tapped mounting holes and mated the encoder shaft with the motor shaft via an adapter. (pics)
    • Mounted the wheel rim to the motor output shaft with a 3D printed coupler (pics)
    • Wrote software to set up the Motor Controller Processor to talk to the Motor Driver/send PWMs and wrote a basic stepper motor algorithm to spin the motor up to about 300RPM
    • Researched Field Oriented Control for Stepper motors extensively and made an excel spreadsheet detailing and graphing the desired current in each of the motor coils in one electrical cycle. (Great PPT on the subject)
    • Got MMos set up on my STM32 dev board and got my FFB-less wheel to control a car in IRacing. (video

    I have however ran into one big challenge. The DRV8301 Motor Driver Booster pack from TI uses low-side current sensing. Because of the topology of the motor I am using, the sensors on the low-side of the inverter do not provide enough information to determine the phase currents. For this reason I have been working on a custom phase-current sensing booster pack that the motor leads will pass through on their way to the motor. This booster pack will plug directly into the launchpad dev board and provide the phase current information that I need for FOC. 

    The plan moving forward is to order the PCB in the next couple of days. As soon as i receive the PCB's I will test them and begin writing the FFB code. 

View all 10 project logs

Enjoy this project?



adil wrote 03/10/2021 at 12:29 point

Can you share schematic for the baraking resistor

  Are you sure? yes | no

Ben Climo wrote 02/25/2021 at 19:55 point

There is currently a different project that is currently still being updated that is allowing the use of servo motors with very high precision. Called open ffboard

  Are you sure? yes | no

John Taylor wrote 02/25/2021 at 20:02 point

this is an awesome project. Anytime people have asked me about continuing this project I point them to open-ffboard

  Are you sure? yes | no

Ben Climo wrote 02/25/2021 at 20:08 point

Exactly! Thanks for introducing me to that project. Are you apart of the discord chat as well?

  Are you sure? yes | no

Jason Cho wrote 01/05/2021 at 13:42 point

Interested in the current progress as well, an update will be appreciated :)

  Are you sure? yes | no

Arian wrote 12/13/2020 at 11:01 point

Any update on this? I'm very much interested. Also, I do believe Mmos is outdated. AFAIK, there are alternatives for people building DIY steering wheels. My DIY steering wheel which is a belt driven scooter motor, is using a software called EMC which still supported by the dev and can use Arduino Leonardo, STM32F103C8T6, and STM32F407VET6. I've seen people build belt driven steering wheel like mine and DD with DC Motor. You should contact the developer so you can use a much updated software.

  Are you sure? yes | no

Jason Cho wrote 01/05/2021 at 13:42 point

thanks for the info!

  Are you sure? yes | no

Nathan wrote 01/17/2020 at 13:53 point

Hi John , I am currently trying to build my own DD wheel with the same motor as you but I unfortunately don't have the required knowledges you have when it comes to electronic so I was wondering I you were going to release a more detailed tutorial about your work ? 

  Are you sure? yes | no

Huang Jin wrote 10/07/2019 at 02:30 point


  Are you sure? yes | no

Huang Jin wrote 10/07/2019 at 02:27 point


  Are you sure? yes | no

Tony B wrote 08/12/2019 at 05:30 point

Hey guys! So I'm a machinist who bult a home CNC mill  about 5 years ago. I had COMPLETELY forgotten I had an extra stepper motor, driver, and power supply just LAYING AROUND in the garage!!

I did some quick google searching and found this site and this site:

Sadly, his site seems to be completely abandoned and no contact info, so you guys are my last hope! I have the rig built, but I have no idea how to hook up the Discovery board, to the stepper motor driver!

Could any one help? I'd love to make this information more available for everyone, imagine this taking off it could really help bring down costs of servo based units as well!!

Thanks in advance!

  Are you sure? yes | no

Dmitriy wrote 07/08/2019 at 07:10 point

That's one awesome project. I'm sure many simracers would like to build or buy your creation. Just one thing is not clear for me - the motor in description seems to have 4 inputs (a+ a- b+ b-), however you use 3-phase driver. Is there some fancy way to use 2-phase motor with 3-phase driver? I'm afraid some people may face problems trying to recreate that design 

  Are you sure? yes | no

John Taylor wrote 08/12/2019 at 13:56 point

You have to tie a- and b- together

  Are you sure? yes | no

Dzor wrote 11/19/2020 at 05:28 point

That wouldn't work in 2-phase motor. I think, what you have here is 3-phase motor. The thin black wire is probably a "neutral" in a centerof a star-configuration. During normal operation the current through the black wire should be small. I would either float it or connect to the ground.

Edit: I was thinking more about that, and even though I still think this is 3-phasse motor, technically it would be possible to make 2-phase motor run smoothly with just 3 half H-bridges. It would require special consideration when for PWM switching since 3 bridges cannot anergize phases to same polarities at the same time.  (Only 6 (out of 8) sectors of the inverter vector modulation would be used.) At 45deg electrical angle, we would be 50% of time in phase A and 50% in B, so current would be 2^-0.5 compared to if a single phase was energized. So current would have to be generally limited to about 70% of what noramlly 2 full H-bridges could do. Which is not bad, since we have to often limit the current anyway. Interesting

  Are you sure? yes | no

Al S. wrote 05/11/2019 at 18:40 point

Do you have in plan to selling the pcb?

  Are you sure? yes | no

John Taylor wrote 05/12/2019 at 15:53 point

Send me a PM

  Are you sure? yes | no

Colecollett wrote 05/05/2019 at 16:25 point

is there a step by step guide on how I can build this yet?

  Are you sure? yes | no

John Taylor wrote 05/10/2019 at 20:01 point

PM me and we can discuss

  Are you sure? yes | no

pichethelicam wrote 03/18/2019 at 06:26 point

Well, I need your help.
I have your own motor controller I'm going to get the board stm32f4
I want to know how to connect cables from the motor control board to the board. stm32f4 detailed I hope you can help me. Thank you.

  Are you sure? yes | no

Oconnor wrote 02/27/2019 at 15:38 point

Hi, do you think it will be possible to expend or adapt the project for a second axis ?

The use case will be in flight sim joystick

I had the same kind of idea but using BLDC FOC motor controller (i.e VESC 6) with 3-phase stepper, sadly i lack a bit of knowledge in the USB HID FFB thing :)

BTW, Great project

  Are you sure? yes | no

John Taylor wrote 03/04/2019 at 15:00 point

You could possibly do that. Open source USB game controller emulator I am using is Mmos. It is designed for racing games, so you would have to overcome that obstacle. This project primarily deals with the FOC control of the stepper. As long as you can get the game to spit out force data and feed it to the motor controller it should be possible. Be warned, however, that FOC on a stepper requires a really fast controller and a pretty good encoder.

  Are you sure? yes | no

jnowak1054 wrote 10/15/2018 at 07:13 point

Thoughts on utilizing a system such as could be used as driver and encoder combo? If so, one would think it would certainly simplify the build.

  Are you sure? yes | no

John Taylor wrote 11/07/2018 at 04:37 point

That is a really cool project.

It seems like they are really successful with position  control. 

This application uses force control and requires a lot more processing power to run the Field Oriented Control algorithm, so I don't know if their platform would work. 

I am far from an expert, however, so I'd love to talk to these guys about their experience working with these types of motors.

  Are you sure? yes | no

lee.williams824 wrote 09/23/2018 at 21:05 point

hi John

Great project idea, super exciting what you are attempting. I'd love to see someone bridge the gap between the commercial wheels and the servo motor wheel out there. I know accuforce use a custom stepper but if you guys could make it a reality too, count me in.

Any news on how the project is going? Once again, great work

  Are you sure? yes | no

John Taylor wrote 11/07/2018 at 04:44 point

Thanks for the interest! Sorry it has taken me so long to respond. 

I have also read that the AccuForce is using a stepper motor. I am really curious about the internals of their design, particularly the encoder that they use.

As far as updates, I am still working on the project. I have had good progress getting force control working with the motor and motor driver, but I ran into some noise issues with some of the sensors/signals. There were also mechanical problems with the encoder I was using. All of this required me to make a pretty big hardware pivot. Its going to take me some time to design some new PCB's and do some more testing but I have a good feeling about this next iteration. I'll be sure to post more updates, because I know sometimes I fail to keep this site updated. The goal is for everything to be open source so that anyone with enough ambition can build one of these for less than you can buy one from AccuForce.

Keep in touch!

-John Taylor

  Are you sure? yes | no

matthew.gregg wrote 05/01/2018 at 11:40 point

Hi John, I have been doing some investigation after reading this. A thought has struck me that maybe it could be possible to use this  BOOSTXL pack from ti It has inline current sense and is compatible with the launchpad eco system. I see that there would be a extra need for encoder input, but that should be a relatively simple circuit.  I have most components for this project now, Including a NEMA34 13NM stepper.  I'm currently having nightmares with TI CCS, but slowly this software stuff is coming back to me.

  Are you sure? yes | no

John Taylor wrote 05/01/2018 at 14:40 point

Matt, it would definitely be possible to use that booster pack. It is actually the same design I based my phase current sense board on. It seems like TI only recently started selling it however. Because when I found the reference design a couple months ago it was not avalilable for purchase. Feel free to message me with any problems you have with CCS. 

  Are you sure? yes | no

Does this project spark your interest?

Become a member to follow this project and never miss any updates