My fancy NordicTrack iFit treadmill recently greeted me with a blank screen when I switched it on. (No, it wasn’t a victim of the iFit bricking debacle. The console just up and croaked). I was saddened (but not entirely shocked) that neither a replacement console nor parts for it were available. The motor controller board checked okay when tested with a PWM source and 1.5V battery (see below).
I first tried to repair the fried console. Aside from some community created reverse-engineered schematics, I could not obtain service manuals or any other technical documentation for it. I traced the issue to a bad Android MCU that I couldn’t fix or source a replacement for.
Anyway, I was never a big fan of iFit, preferring to run the treadmill in manual mode 99% of the time. So I decided the better course of action was to build my own console, with the following goals:
- Full support for the popular MC-2100 motor controller, which is used in NordicTrack, Icon and Proform exercise equipment
- Buildable for < $25. Runs on Arduino Uno R3 or compatible MCU.
- Open source
- Fully customizable controls
- Future support for FTMS (FiTness Machine Service) protocol, allowing integration with numerous fitness applications like Zwift. I would welcome some collaboration for this part.
There are generic treadmill controllers available from sites like Aliexpress that replace both the console and motor controller board as a set. The disadvantage of this solution is cost ($150+ for a decent unit) and lack of flexibility. I’m also guessing the genuine MC-2100 boards are more robust.
Assembly
Before I jump into build details, please note that this is experimental pre-production software. The user is responsible for implementing safety controls, including an emergency stop switch.
That said, let’s jump right into a build. These instructions assume you’ve already installed the Arduino IDE:
- Download the MC-2100_Treadmill_Controller_Console.ino sketch from Github.
- Install the TimerOne, Wire and LiquidCrystal_I2C libraries in your Arduino IDE
- Upload the sketch to an Arduino Uno or other compatible board with 5V logic.
- Follow this wiring diagram for connections:

Parts list:
| ID | Description | Uno Pins | Note |
| Uno | Arduino Uno R3 | Or compatible 5V board | |
| LCD1 | 2-line I2C LCD | A4, A5 | Adjust address in sketch if necessary. Default 0x27 |
| R1, R2 | 2.4K resistor | 2, 3 | Pull-up to +5V. Use instead of internal pull-up resistor. |
| R3, R5, R6, R7 | 220 ohm resistor | 4, 10, 11, 13 | |
| R4 | 1K resistor | 9 | |
| LED1, LED2 | LED | Optional, but helpful for troubleshooting | |
| SW2, SW3 | Momentary switch | 7, 8 | Incline up/down. Can use one SPDT switch instead if desired. Auto style switches work nicely. |
| SW1 | Toggle switch | 12 | |
| POT1 | 10K Potentiometer | A0 | Can be either slide or rotary style |
| PCB1 | Proto Shield | Recommended for wiring convenience | |
| HD1 | JST-XH Connector | Optional. For connecting to treadmill wire harness, if desired. |
| Pin | Color | Function |
| 1 | Black | ground |
| 2 | Red | 12V |
| 3 | Green | 5V PWM belt speed control |
| 4 | Blue | belt tach to console (2.4K pullup resistor required; see wiring diagram) |
| 5 | Orange | incline up (1.5 – 5V relative to pin 6, not ground!) |
| 6 | Yellow | incline down (1.5 – 5V relative to pin 5) |
| 7 | Violet | incline pulse (when moving, 3 pulses per degree of incline. Use a 2.4K pullup resistor.) |
| 8 | Blk/Wh | ground (unconfirmed reports say this also carries signal info on some models) |
Build notes:
- If you build the circuit on a proto board, there’s plenty of room to include test controls, if desired. Note that the development board I built has incline and run/stop switches, test points and a speed pot in addition to connectors for external controls.
- The LEDs and associated resistors R3 and R7 are optional. R4, R5 and R6 current limiting resistors are recommended even though the circuit will work without them.
- R1 and R2 pull-up resistors connect to the transistor side of opto-isolators on the MC-2100. You will need to stay close to these values to get a good pulse signal.
Operation
The current software has these limitations, which will be addressed in a subsequent release:
- The speedometer is slow to respond to changes and may intermittently display an incorrect speed.
- Incline position is not saved to EEPROM. You must return the treadmill to zero degrees incline before switching it off.
- Incline and speed calibration functionality needs to be added. Currently, settings need to be changed in the sketch.
Here’s how my assembled console looks now. Not pretty, but it works! I want to try reverse engineering and utilizing the stock controls when time permits.

