{"id":484,"date":"2026-03-02T11:23:32","date_gmt":"2026-03-02T16:23:32","guid":{"rendered":"https:\/\/jimandnoreen.com\/?p=484"},"modified":"2026-03-02T11:42:10","modified_gmt":"2026-03-02T16:42:10","slug":"mc-2100-motor-controller-console-for-arduino-uno","status":"publish","type":"post","link":"https:\/\/jimandnoreen.com\/?p=484","title":{"rendered":"MC-2100 Motor Controller Console for Arduino Uno"},"content":{"rendered":"\n<p>My fancy NordicTrack iFit treadmill recently greeted me with a blank screen when I switched it on.  (No, it wasn&#8217;t a victim of the <a rel=\"noreferrer noopener\" href=\"https:\/\/www.ifittreadmillsettlement.com\" target=\"_blank\">iFit bricking debacle<\/a>.  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).<\/p>\n\n\n\n<p>I first tried to repair the fried console.  Aside from some community created reverse-engineered <a href=\"https:\/\/www.dropbox.com\/scl\/fi\/tmqcscf03akpz0rzh73zp\/MC2100_rev_engrd.pdf?rlkey=pt20dimqxo8mj2sscjw4fy294&amp;e=1&amp;dl=0\" target=\"_blank\" rel=\"noreferrer noopener\">schematics<\/a>, 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&#8217;t fix or source a replacement for.  <\/p>\n\n\n\n<p>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:<\/p>\n\n\n\n<ol><li>Full support for the popular MC-2100 motor controller, which is used in NordicTrack, Icon and Proform exercise equipment<\/li><li>Buildable for &lt; $25.  Runs on Arduino Uno R3 or compatible MCU.<\/li><li>Open source<\/li><li>Fully customizable controls<\/li><li>Future support for <a rel=\"noreferrer noopener\" href=\"https:\/\/www.bluetooth.com\/specifications\/specs\/fitness-machine-service-1-0\/\" target=\"_blank\">FTMS (FiTness Machine Service)<\/a> protocol, allowing integration with numerous fitness applications like <a rel=\"noreferrer noopener\" href=\"https:\/\/www.zwift.com\/\" target=\"_blank\">Zwift<\/a>.  I would welcome some collaboration for this part.<\/li><\/ol>\n\n\n\n<p>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&#8217;m also guessing the genuine MC-2100 boards are more robust.<\/p>\n\n\n\n<h2>Assembly<\/h2>\n\n\n\n<p>Before I jump into build details, please note that <strong>this is experimental pre-production software.  The user is responsible for implementing safety controls, including an emergency stop switch.<\/strong><\/p>\n\n\n\n<p>That said, let&#8217;s jump right into a build.  These instructions assume you&#8217;ve already installed the Arduino IDE:<\/p>\n\n\n\n<ol><li>Download the <a href=\"https:\/\/github.com\/RatRanch\/MC-2100_Treadmill_Controller_Console\/blob\/main\/MC-2100_Treadmill_Controller_Console.ino\">MC-2100_Treadmill_Controller_Console.ino<\/a> sketch from Github.<\/li><li>Install the <a href=\"https:\/\/docs.arduino.cc\/libraries\/timerone\/\" data-type=\"URL\" data-id=\"https:\/\/docs.arduino.cc\/libraries\/timerone\/\">TimerOne<\/a>, Wire and LiquidCrystal_I2C libraries in your Arduino IDE<\/li><li> Upload the sketch to an Arduino Uno or other compatible board with 5V logic.<\/li><li>Follow this wiring diagram for connections:<\/li><\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/MC-2100-Motor-Controller-Console.png?ssl=1\"><img data-attachment-id=\"487\" data-permalink=\"https:\/\/jimandnoreen.com\/?attachment_id=487\" data-orig-file=\"https:\/\/i0.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/MC-2100-Motor-Controller-Console.png?fit=1556%2C1102&amp;ssl=1\" data-orig-size=\"1556,1102\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"MC-2100 Motor Controller Console Wiring Diagram\" data-image-description=\"\" data-medium-file=\"https:\/\/i0.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/MC-2100-Motor-Controller-Console.png?fit=300%2C212&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/MC-2100-Motor-Controller-Console.png?fit=625%2C443&amp;ssl=1\" loading=\"lazy\" width=\"625\" height=\"443\" src=\"https:\/\/i0.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/MC-2100-Motor-Controller-Console.png?resize=625%2C443&#038;ssl=1\" alt=\"MC-2100 Motor Controller Console Wiring Diagram\" class=\"wp-image-487\" srcset=\"https:\/\/i0.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/MC-2100-Motor-Controller-Console.png?resize=1024%2C725&amp;ssl=1 1024w, https:\/\/i0.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/MC-2100-Motor-Controller-Console.png?resize=300%2C212&amp;ssl=1 300w, https:\/\/i0.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/MC-2100-Motor-Controller-Console.png?resize=768%2C544&amp;ssl=1 768w, https:\/\/i0.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/MC-2100-Motor-Controller-Console.png?resize=1536%2C1088&amp;ssl=1 1536w, https:\/\/i0.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/MC-2100-Motor-Controller-Console.png?resize=624%2C442&amp;ssl=1 624w, https:\/\/i0.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/MC-2100-Motor-Controller-Console.png?w=1556&amp;ssl=1 1556w, https:\/\/i0.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/MC-2100-Motor-Controller-Console.png?w=1250&amp;ssl=1 1250w\" sizes=\"(max-width: 625px) 100vw, 625px\" data-recalc-dims=\"1\" \/><\/a><figcaption><a href=\"https:\/\/www.tinkercad.com\/things\/4U0k4xll2df-mc-2100-motor-controller-console\">MC-2100 Motor Controller Console Wiring Diagram<\/a><\/figcaption><\/figure>\n\n\n\n<p>Parts list:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>ID<\/strong><\/td><td><strong>Description<\/strong><\/td><td><strong>Uno Pins<\/strong><\/td><td><strong>Note<\/strong><\/td><\/tr><tr><td>Uno<\/td><td><a href=\"https:\/\/amzn.to\/4aZ6qJ4\" target=\"_blank\" rel=\"noreferrer noopener\">Arduino Uno R3<\/a><\/td><td><\/td><td>Or compatible 5V board<\/td><\/tr><tr><td>LCD1<\/td><td><a href=\"https:\/\/amzn.to\/4cnR17Q\" target=\"_blank\" rel=\"noreferrer noopener\">2-line I2C LCD<\/a><\/td><td>A4, A5<\/td><td>Adjust address in sketch if necessary.  Default 0x27<\/td><\/tr><tr><td>R1, R2<\/td><td>2.4K resistor<\/td><td>2, 3<\/td><td>Pull-up to +5V.  Use instead of internal pull-up resistor.<\/td><\/tr><tr><td>R3, R5, R6, R7<\/td><td>220 ohm resistor<\/td><td>4, 10, 11, 13<\/td><td><\/td><\/tr><tr><td>R4<\/td><td>1K resistor<\/td><td>9<\/td><td><\/td><\/tr><tr><td>LED1, LED2<\/td><td>LED<\/td><td><\/td><td>Optional, but helpful for troubleshooting<\/td><\/tr><tr><td>SW2, SW3<\/td><td><a href=\"https:\/\/amzn.to\/4seE3h3\" target=\"_blank\" rel=\"noreferrer noopener\">Momentary switch<\/a><\/td><td>7, 8<\/td><td>Incline up\/down. Can use one SPDT switch instead if desired.  Auto style switches work nicely.<\/td><\/tr><tr><td>SW1<\/td><td><a href=\"https:\/\/amzn.to\/4lcGS04\">Toggle switch<\/a><\/td><td>12<\/td><td><\/td><\/tr><tr><td>POT1<\/td><td><a href=\"https:\/\/amzn.to\/3ORgU5Z\" target=\"_blank\" rel=\"noreferrer noopener\">10K Potentiometer<\/a><\/td><td>A0<\/td><td>Can be either slide or rotary style<\/td><\/tr><tr><td>PCB1<\/td><td><a href=\"https:\/\/amzn.to\/4aVKVsH\" target=\"_blank\" rel=\"noreferrer noopener\">Proto Shield<\/a><\/td><td><\/td><td>Recommended for wiring convenience <\/td><\/tr><tr><td>HD1<\/td><td><a href=\"https:\/\/amzn.to\/3OBd01d\" target=\"_blank\" rel=\"noreferrer noopener\">JST-XH Connector<\/a><\/td><td><\/td><td>Optional.  For connecting to treadmill wire harness, if desired.<\/td><\/tr><\/tbody><\/table><figcaption>MC-2100 Motor Controller Console Bill of Materials<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Pin<\/strong><\/td><td><strong>Color<\/strong><\/td><td><strong>Function<\/strong><\/td><\/tr><tr><td>1<\/td><td>Black<\/td><td>ground<\/td><\/tr><tr><td>2<\/td><td>Red<\/td><td>12V<\/td><\/tr><tr><td>3<\/td><td>Green<\/td><td>5V PWM belt speed control<\/td><\/tr><tr><td>4<\/td><td>Blue<\/td><td>belt tach to console (2.4K pullup resistor required; see wiring diagram)<\/td><\/tr><tr><td>5<\/td><td>Orange<\/td><td>incline up (1.5 &#8211; 5V relative to pin 6, not ground!)<\/td><\/tr><tr><td>6<\/td><td>Yellow<\/td><td>incline down (1.5 &#8211; 5V relative to pin 5)<\/td><\/tr><tr><td>7<\/td><td>Violet<\/td><td>incline pulse (when moving, 3 pulses per degree of incline. Use a 2.4K pullup resistor.)<\/td><\/tr><tr><td>8<\/td><td>Blk\/Wh<\/td><td>ground (unconfirmed reports say this also carries signal info on some models)<\/td><\/tr><\/tbody><\/table><figcaption>MC-2100 HD2 Connector Pinout<\/figcaption><\/figure>\n\n\n\n<p>Build notes:<\/p>\n\n\n\n<ol><li>If you build the circuit on a proto board, there&#8217;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.<\/li><li>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.<\/li><li>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.<\/li><\/ol>\n\n\n\n<h2>Operation<\/h2>\n\n\n\n<p>The current software has these limitations, which will be addressed in a subsequent release:<\/p>\n\n\n\n<ol><li>The speedometer is slow to respond to changes and may intermittently display an incorrect speed.<\/li><li>Incline position is not saved to EEPROM.  You must return the treadmill to zero degrees incline before switching it off. <\/li><li>Incline and speed calibration functionality needs to be added.  Currently, settings need to be changed in the sketch.<\/li><\/ol>\n\n\n\n<p>Here&#8217;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.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i1.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/IMG_8491-scaled.jpeg?ssl=1\"><img data-attachment-id=\"483\" data-permalink=\"https:\/\/jimandnoreen.com\/?attachment_id=483\" data-orig-file=\"https:\/\/i1.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/IMG_8491-scaled.jpeg?fit=2560%2C1920&amp;ssl=1\" data-orig-size=\"2560,1920\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;1.6&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 12 mini&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1770797186&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.2&quot;,&quot;iso&quot;:&quot;800&quot;,&quot;shutter_speed&quot;:&quot;0.0333333333333&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}\" data-image-title=\"Budget Treadmill Console\" data-image-description=\"\" data-medium-file=\"https:\/\/i1.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/IMG_8491-scaled.jpeg?fit=300%2C225&amp;ssl=1\" data-large-file=\"https:\/\/i1.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/IMG_8491-scaled.jpeg?fit=625%2C469&amp;ssl=1\" loading=\"lazy\" width=\"625\" height=\"469\" src=\"https:\/\/i0.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/IMG_8491.jpeg?resize=625%2C469&#038;ssl=1\" alt=\"Budget Treadmill Console\" class=\"wp-image-483\" srcset=\"https:\/\/i1.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/IMG_8491-scaled.jpeg?resize=1024%2C768&amp;ssl=1 1024w, https:\/\/i1.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/IMG_8491-scaled.jpeg?resize=300%2C225&amp;ssl=1 300w, https:\/\/i1.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/IMG_8491-scaled.jpeg?resize=768%2C576&amp;ssl=1 768w, https:\/\/i1.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/IMG_8491-scaled.jpeg?resize=1536%2C1152&amp;ssl=1 1536w, https:\/\/i1.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/IMG_8491-scaled.jpeg?resize=2048%2C1536&amp;ssl=1 2048w, https:\/\/i1.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/IMG_8491-scaled.jpeg?resize=624%2C468&amp;ssl=1 624w, https:\/\/i1.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/IMG_8491-scaled.jpeg?w=1250&amp;ssl=1 1250w, https:\/\/i1.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/IMG_8491-scaled.jpeg?w=1875&amp;ssl=1 1875w\" sizes=\"(max-width: 625px) 100vw, 625px\" data-recalc-dims=\"1\" \/><\/a><figcaption>Budget Treadmill Console<\/figcaption><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>My fancy NordicTrack iFit treadmill recently greeted me with a blank screen when I switched it on. (No, it wasn&#8217;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 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":482,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"spay_email":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false},"categories":[54,12,5],"tags":[55,92,94,91,93,90],"jetpack_featured_media_url":"https:\/\/i2.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2026\/03\/IMG_8496-scaled.jpeg?fit=2560%2C1920&ssl=1","jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8sNNV-7O","jetpack-related-posts":[{"id":259,"url":"https:\/\/jimandnoreen.com\/?p=259","url_meta":{"origin":484,"position":0},"title":"A USB adapter for the Apple Newton keyboard","date":"March 9, 2017","format":false,"excerpt":"Back in the pre-smartphone days, the Apple Newton was the first device in the PDA category.\u00a0 Newtons were only sold for five years between 1993 and 1998, when Steve Jobs pulled the plug on the program.\u00a0 Although Apple frequently took a ribbing for problems with the Newton's handwriting recognition feature,\u2026","rel":"","context":"In &quot;Apple&quot;","img":{"alt_text":"","src":"https:\/\/i1.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2017\/03\/IMG_3278.jpg?fit=640%2C480&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":356,"url":"https:\/\/jimandnoreen.com\/?p=356","url_meta":{"origin":484,"position":1},"title":"Long Distance Mailbox Alert using LoRa","date":"October 28, 2020","format":false,"excerpt":"You've got mail! An IoT project using solar power and long range radio In these pandemic times of limited mobility, I become more like a dog every day: looking forward with great enthusiasm to meals, walks and car rides. One of the daily events that's taken on new importance is\u2026","rel":"","context":"In &quot;Arduino&quot;","img":{"alt_text":"","src":"https:\/\/i0.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2020\/10\/img_5468-scaled.jpg?fit=1200%2C821&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":385,"url":"https:\/\/jimandnoreen.com\/?p=385","url_meta":{"origin":484,"position":2},"title":"A $2 Development Board Test\/Programming Jig","date":"October 5, 2020","format":false,"excerpt":"I've been using LoRa (Long Distance Radio) boards for a few recent projects. At $20 a pop, these aren't exactly cheap. I didn't want to dedicate one to breadboard prototyping by soldering headers to it and sought a commercial solution that would allow me to easily make a reliable temporary\u2026","rel":"","context":"In &quot;Arduino&quot;","img":{"alt_text":"","src":"https:\/\/i0.wp.com\/jimandnoreen.com\/wp-content\/uploads\/2020\/10\/2.jpg?fit=1200%2C900&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":304,"url":"https:\/\/jimandnoreen.com\/?p=304","url_meta":{"origin":484,"position":3},"title":"13\" Retina MacBook Pro Retina won't boot, fan running full blast","date":"March 8, 2018","format":false,"excerpt":"So this repair is mildly interesting. \u00a0The user's late 2012 MacBook Pro just wouldn't start up one morning. \u00a0It would get as far as a \"missing boot disk\" icon and shortly thereafter the fans started running full blast. Apple Diagnostics recognized that an SSD was installed but was unable to\u2026","rel":"","context":"In &quot;Apple&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":322,"url":"https:\/\/jimandnoreen.com\/?p=322","url_meta":{"origin":484,"position":4},"title":"Nuvico HDocs Mobile HD app stopped working","date":"June 14, 2018","format":false,"excerpt":"Here's a quick one for anybody with a legacy Nuvico HD-TVI security DVR, e.g.,model DT-E800.\u00a0 The iOS app stopped being updated in 2014 and doesn't work with iOS versions 11 and later.\u00a0 My user was ready to ditch his perfectly functional DVR because of this. Long story short, a little\u2026","rel":"","context":"In &quot;Apple&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":178,"url":"https:\/\/jimandnoreen.com\/?p=178","url_meta":{"origin":484,"position":5},"title":"Microsoft Surface Pro 3 first impressions","date":"January 16, 2015","format":false,"excerpt":"My office is replacing its aging fleet of HP 620 notebooks with Surface Pro 3\u00a0 (256 GB, Intel Core i5) tablets. \u00a0Each tablet will be deployed with an optional keyboard cover and docking station. \u00a0This is the middle-of-the-road model, which is powerful enough to run most business applications but not\u2026","rel":"","context":"In &quot;Reviews&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/jimandnoreen.com\/index.php?rest_route=\/wp\/v2\/posts\/484"}],"collection":[{"href":"https:\/\/jimandnoreen.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jimandnoreen.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jimandnoreen.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jimandnoreen.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=484"}],"version-history":[{"count":12,"href":"https:\/\/jimandnoreen.com\/index.php?rest_route=\/wp\/v2\/posts\/484\/revisions"}],"predecessor-version":[{"id":497,"href":"https:\/\/jimandnoreen.com\/index.php?rest_route=\/wp\/v2\/posts\/484\/revisions\/497"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jimandnoreen.com\/index.php?rest_route=\/wp\/v2\/media\/482"}],"wp:attachment":[{"href":"https:\/\/jimandnoreen.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=484"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jimandnoreen.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=484"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jimandnoreen.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=484"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}