SIMCLINE - Simulation of Changing Road Incline for Indoor Cycling




Introduction: SIMCLINE - Simulation of Changing Road Incline for Indoor Cycling

The grade of a highway is a measure of its incline or slope. The amount of grade indicates how much the highway is inclined from the horizontal. For example, if a section of road is perfectly flat and level, then its grade along that section is zero. However, if the section is very steep, then the grade along that section will be expressed as a number, usually a percentage, such as 10 percent.(c.f.

Indoor training on the bike is developing from a boring exercise, on rollers only, to a immersive experience. Direct-drive trainers, rocker plates in many configurations, real life videos in HD, virtual reality in Zwift, animated 3D riders in 2D videos with Rouvy, and still more to come. Some of these developments help you to become a stronger cyclist. One of them is possibly enabling the rise and drop of the front wheel with the changing grade of the virtual road you ride. Rising the front wheel when training indoor, can help simulate your position on the bike as you ride uphill, which can aid in activating those muscles used when the trainer resistance is increased during climbing. In winter training plans of coach Hunter Allen (Peaks Coaching Group) for example, he regularly suggests in Climbing Sweet Spot Workouts to "put a 4 inch block under your front wheel on the trainer and complete the 20 minute efforts heading up" for more benefit of the indoor workout...

Wahoo was the first to introduce the Wahoo Climb indoor grade simulator. Dedicated to training plans of Hunter Allen, I spend a lot of time training indoor to improve my climbing skills, for riding fondo's in hilly and Alpine countries, with a 4 inch block under the front wheel! The two inspired me late 2019 to take the challenge: design and build a road grade simulator from scratch, that can be used with the TACX Neo that I heavily use for my indoor training in the winter and during virus lockdown(s). A prerequisite of the project was that it should work flawlessly with all modern cycling applications that control the trainer's resistance like Zwift, TrainerRoad, Rouvy, TACX desktop, VeloReality, etcetera. Disadvantage of the Wahoo Climb is that it only works with some of Wahoo's own indoor trainers and not with the TACX Neo or other brands! Aside of its high cost, it is not of much practice when one owns a TACX indoor trainer!

The TACX Neo is a socalled smart trainer, having both ANT+ and BLE for communication techniques. A cool benefit of a smart trainer is its ability to communicate with cycling applications to control resistance automatically as you workout (in ERG mode) or ride virtually a route with a Real Live Video on the monitor. With the arrival of smart trainers, using the open (ANT+) FE-C protocol (see: This is ANT), indoor cycling gets more accessible without hardware and/or software vendor lock-in.

It took me a lot of time studying the relevant techniques, protocols and software tools involved with ANT+, BLE and FE-C to extract the knowledge that was needed to rise to the challenge. Many projects at Github address ANT+ and/or BLE with a different point of departure, however I learnt a lot of looking closely at the many program codes, explanations and descriptions. Finally, I tracked down how a smart up/down lift of my front wheel axis is optimally benefitting from the (ANT+) FE-C protocol when I am indoor riding with the TACX Neo in the hilly Zwift game world or with any other virtual cycling program that simulates road grade. After a succesfull proof of concept with ANT+ and BLE tools (see This is ANT and Nordic NRF Connect), I concentrated on the mechanical aspects of the project.

After failed and even crashed prototypes, I had figured out a heavy duty mechanical construction to move the front wheel axle up and down using widely available and relatively low cost components. Complicating the assignment is that I am an enthousiastic user of a "Rocker Plate" (see BikeAccess) on which the TACX trainer is mounted. This is giving the feeling of more realistic bike riding, since one has more freedom of movement. Therefore I had also to account for much more mobility than with the standard fixed position of the trainer + bike! Subsequently the mechanical forces increase in longitudinal and lateral directions. In addition the rotational forces, when you sprint or climb standing up, and pull the handlebar, cannot be neglected and have to be accounted for in a robust design that is supposed to last for years and years of regular practise!

Please notice that we only recently have developed code that allows Wahoo KICKR trainers to work with the Simcline design! Check Github for the latest details: Simcline for KICKR

I like to mention a project of the Instructables repository that was instructive and helped sharpen the requirements: OpenGradeSIM. However the project is not meeting the many requirements for this project.


2 pieces: plywood sheet: 1220x610 mm, 1 piece of 12 mm and 1 piece of 5 mm thickness.

1 piece: Linear Motion Track System with Recirculating Ball Bearing Carriage: 440 mm length (see: or

1 piece: Strip of aluminium sheet, 40 mm wide, about 300 mm long and 2 mm thickness.

1 piece: Metal tube of 100 mm long and 15MM OD X 12MM ID (1.5MM WALL)

1 piece: Aluminium 12mm thru axle to 9 mm adapter, quick release setup (See

1 piece: 12 volt DC power supply (in: 100-240 VAC, 50/60 Hz; out: 12V DC, 3 A, 36 watt max)

1 piece: Linear Actuator; 300 mm stroke; load 750N; speed 10 mm/s; 12 Volt DC. (

1 piece: Strip of aluminium sheet, 40 mm wide, about 120 mm long and 3 mm thickness.

2 pieces: Mini limit switches

1 piece: Cytron Motor Driver MDD3A.

1 piece: Bluefruit Feather nRF52

1 piece: OLED display blue 128x64

1 piece: Time-of-Flight-Distance sensor VL6180X

Straight and Right Angle 2.54 mm Headers; Female-Female wires with pre-crimped terminals; 2.54 mm crimp connector housings: 1x4-Pin; Shrink tube; Solder, nuts and bolts, etcetera.

Step 1: Elevator Pitch (Wahoo Style)

The SIMCLINE physically adjusts the bike position to mimic hilly roads and Alpine climbing. This allows the rider to naturally change position on the bike, engage climbing muscles, and improve pedaling technique to become a more efficient and powerful climber.

Without user intervention the SIMCLINE will replicate inclines and declines depicted in (online & offline) training programs (like Zwift, Rouvy, VeloReality and many others) that adjust accordingly the resistance of the indoor trainer.

The SIMCLINE auto connects at power up with the trainer and let's relive the ascents and descents from favorite rides or routes while training indoors.

The SIMCLINE has a physical reach of: 20% maximum incline and -10% maximum decline. However, the reach that the rider is comfortable with can be adjusted even during a ride!

The SIMCLINE pairs directly to the TACX smart trainer for a connection that notifies the SIMCLINE to simulate autonomous the (change in) physical grade of the road during an indoor ride.

The OLED display on top of the SIMCLINE alerts you at startup as to when it is selftesting and when the SIMCLINE is searching and/or paired with the TACX Smart Trainer and/or paired with your Android smartphone.

During operation the OLED display shows the road grade in digits and in graphics or cycling data from the trainer (speed, power, cadence, elapsed time and distance)

The SIMCLINE is designed for heavy duty and can be used concurrently with rocker plates.

The SIMCLINE Companion App (for Android smartphones) can be paired simultaneously for adjusting operational settings, like maximum comfortable ascent (between 0-20%) and descent (between 0-10%), road grade change factor (between 0-100%) and the type of OLED display format.

Other features of the Companion App include manual control and rendering of operational data: grade percentage + graphics and simultaneously relevant trainer data during an indoor ride.

Notice: The SIMCLINE is not in any way interfering with the functioning of the trainer and/or (offline or online) training programs!

Step 2: Lessons Learned the Hard Way

Before reaching a well thought and cool product, that is overdone outlined in the pitch, a long road paved with failures and mistakes was travelled. At the start I had only vague ideas about how the mechanics should function. Some first testing was done with an oversimplified prototype build out of plywood blocks and spare pieces of pipes from the home heating system. I learned that the "carriage" needs linear bearings when shear forces load it, if it is supposed to also be able to slide freely along the pipes.

The next prototype construction was inspired by how CNC machines are built. It was using precision components: 2 linear motion shafts (OD 12 mm), 2 linear bearing blocks and 2 flanged shaft supports to mount the construction on plywood blocks. Perfectly aligning the two shafts is a critical and not an easy task! Integration with a partly dismantled actuator (stroke 300 mm, load 300N and speed 30 mm/s) resulted in a working prototype. Connected to the electronic cicuitry and mounted on an oversized and ugly plywood construction it actually operated (during training sessions) for a few months. I had selected a fast (30 mm/s) actuator because of the notion that speed was so important for a vivid experience. However, speed comes at a price and at the expense of maximal load. So I wrongly decided to accept the lower maximal load to stay within budget. During realistic pratice it turned out that an actuator with 300N load is simply not powerfull enough to realize a natural experience.

The 30 mm/s speed actuator was abondonned and replaced by an actuator with 10 mm/s speed and 750N load specs. Now the prototype was responding completely to my expectations and I enjoyed many rides! Despite the suitable load specifications suddenly the linear bearing blocks crashed (broken bearing balls) and ruined the precision shafts. Apparently I had underestimated the detrimental forces that act when one is rocking the bike and applying it to the max in climbs. So this CNC-inspired appliance was abandonned.

After some time of reflection and searching for alternatives it was replaced with a "Linear Motion Track System with Recirculating Ball Bearing Carriage". The recirculating ball bearings are also found in the linear bearing blocks but in the track system at double sizes and this whole system is more designed for heavy duty and not for CNC precision. It is specified to withstand loads of 500N. An other advantage is that aligment is no issue due to the use of an aluminium track out of one piece. After installation in the oversized previous prototype it has functioned without any problems and without any disturbing wearing until today.

An experimental extension with 2 bearings that mount on the axle support tube at the outside of the sidecovers was added to the prototype. These bearings resolve forces that act when the handlebar is asymmetrically and vigourously pulled when sprinting and/or in extreme climbs. This prototype has worked perfectly until it was replaced by the present more elegant design. After all the lessons learned during prototyping the moment arrived to make a new design based on the proven mechanics! The design was elaborated in FreeCad (version 0.18) and changed with progressive insight until it led to the present outcome. Subsequently it was built precisely following the worksheets, assembled and tested again. This instructable documents the building proces.

Step 3: Constructing 4 Components of the Frame

The frame is built from plywood boards and is kept together with wood glue only, no screws have to be used for the construction! The design and the strength of 12 mm plywood garantee a very strong construction that easily deals with excessive and detrimental forces that exceed the normal use it is designed for. Adding the sidecovers will increase even more the strength of the whole construction!

We start with 2 sheets of plywood. In most hardware stores you will be able to find them in the following precut sizes: 1220x610 mm, 1 piece of 12 mm and 1 piece of 5 mm thickness.

You can win time and accuracy when you let the hardware store saw off the following sizes with their professional sawing machine:

8 pieces of 22 x 610 x 12 mm (used for the front and back lengths of the frame)

2 pieces of 68 x 610 x 12 mm (used for the top block parts & floorstand cheeks)

1 piece of 135 x 610 x 12 mm (used for the floorstand middle parts)

2 pieces of 160 x 610 x 5 mm (used for the sidecovers)

Use the different detailed worksheets to copy accurately the design of the different parts to the appropriate pieces of plywood.

Use an electric jigsaw to saw out carefully the curved shapes from the boards. The more precisely you work the less work you have later when sanding/finishing the components of the frame.

Warning: Do NOT yet saw out the inner cut-outs for the wheel axis throughputs in the boards of the sidecovers! Check their position and size later, when you have installed the mechanical components (carriage + wheel axis) for the up/down movement. Small construction differences (with the design) can influence the exact position of the cutouts in the sidecover boards!

Glue together the appropriate components (using wood glue) in such a way that you end up with the 4 different components as shown in the above picture (Top Block, Front length, Back length and Floorstand). Use clamps and/or weights to press together the glued parts and give the 4 components enough time to dry completely. Again work precisely, the result at the end will benefit!

Apply a first treat of sanding (electric or by hand) to level the different sides of the 4 components. Get rid of excessive relicts of glue in inner corners of the 4 components.

Step 4: Assembling Components of the Frame

Before assembling the 4 plywood frame components it is advised to mount first the "Linear Motion Track System with Recirculating Ball Bearing Carriage". When the frame is fully assembled, perpendicular access with tools longer than 150 mm is no longer possible, due to the presence of the opposite back length!

Cut the aluminium track profile to 440 mm length and drill screw holes on the center line (fully countersunk) every 70 mm.

Mount in the right (!) position (centered and top level) with wood screws (of about 15 mm length) at the inside of the front length and conforming the design (see photo).

Insert the ball bearing carriage hereafter and fix its position with adhesive tape. Don't forget since after assembling the frame this step is nearly impossible to execute! The top block and the floorstand are its mechanical end stops.

Assemble the 4 plywood components, glueing them tightly together and accurately see to it that all 4 inner corners are at 90 degree angles. This is critical for a proper functioning of the attenuator and the "time-of-flight" sensor VL6180X, that is later flat mounted at the inside of the top block. Any angular deviation leads to misalignment of the measuring beam and has to be corrected later...

Apply a second treat of sanding (electric or by hand) to level the different sides of the assembled frame.

The assembled frame can now be painted or finished otherwise. Do not paint the track system!

Step 5: Construction for Wheel Axle and Actuator

The carriage of the track system has to be connected to the front wheel axle and to the actuator that is doing the actual up and down movement. In exploded view the different parts are shown in one of the above pictures.

Start with the "wheel axis mount". An about 120 mm long strip of 40 mm wide and 2 mm thick is bended according to the pattern that is supplied in the worksheet. I was able to create this bended shape using only a medium size mechanic bench vise and a (wooden) hammer. Drill the M5 screw holes for mounting it on the carriage and the holes for fixing the other parts.

The wheel axis support block is made out of massive plywood of 15 mm thickness. This is easily worked: sanded and filed to exactly fit the inner side of the wheel axis mount. Drill a 15 mm excentric hole as indicated.

Acquire a metal tube (stainless steel) of 100 mm long and 15MM OD X 12MM ID (1.5MM WALL). The tube will accomodate the inserted 12mm thru axle to 9 mm adapter that holds the front fork. Front fork is fixed with a quick release of my rim brake front wheel. It can also hold the thru axle (100 x 12 mm) of a front wheel with disc brakes. Cut or file off some metal at the ends of the metal tube reducing the length to about 99,8 mm. Notice: the metal tube itself cannot and should not be able to rotate! However, the thru axle adapter should be able to freely rotate inside when it is going up or down! It therfeore should be slightly longer (100 mm) than the metal tube (99,8 mm)!

Test the construction when mounted and with the 2 M5 nuts (of the wheel axis mount) fixed. The metal tube should be very tightly fixed and stable!

Create the bended laser reflection plate according to the worksheet. Drill or jig saw out the large hole as indicated in the design that allows the spindle of the actuator to pass and rotate freely.

To allow for small construction adjustments a # mm spacer (of plywood or aluminum) can be inserted. When mounting the actuator it will become clear if the spacer is needed and how thick it should be. I used a 2 mm spacer!

Check Pattern Side-Cover-Cutouts : The carriage can be moved freely up and down with the thru axle metal tube in place. This is an excellent moment to finish the sidecovers. Loosen the thru axle nuts allowing the metal tube to slide out half way. Place the frame flat lying on the side of one sidecover and align (frame and side cover) in ideal positions as if they were to be attached. The metal tube (at the down pointing short side) only touches the sidecover. Move the carriage up and down and mark the route of the metal tube over the sidecover. Adjust the sideway thru axle cutout pattern of the side cover accordingly.... Repeat for the second side cover. Now or later finish the side-cover-cutouts using an electric jig saw.

Step 6: Prepare the Actuator for Mounting

The actuator is delivering the vertical forces needed to move the front fork up and down. It is stabilized by the track system that accounts for dissolving the lateral forces and allows for only vertical movement. The actuator's construction is "carrying" a large percentage of the weight of the rider and the bike. The percentage will in first approximation range between 40% and 60%, dependent of up or down end position respectively. The present design accounts for a rider weight of around 80 kg and a bike weight of 8 kg. The actuator is working with a 12 volt DC power source. Up and down is selected by reversing the polarity of the power source.

Test the working of the actuator with a 12 volt DC power supply, simply by connecting the wires (by hand) to the positive and negative side respectively of the 12 volt jack and reverse polarity by changing position of the wires.

Disassemble only the parts of the actuator that guide and slide the push and pull movement, as shown in the picture. Leave the gearbox and motor housing untouched! Slide carefully the electric wiring with the microswitch end stops and diodes out of the external tube. Cut the wiring (red and black wire) leaving preferably 30 mm of wire being attached to the motor housing. You can solder the 2 wires together and insulate the connection.

Rotate the inner (push&pull) tube upwards along the spindle until it is completely free from the spindle. The lower side of this tube holds the lead screw. It is usually machined out of a hard plastic material. Mark 50 mm from the lower side.

Saw off the lower part of the inner (push&pull) tube at 50 mm. This part contains the lead screw which is moving up and down when the spindle rotates. It is mounted (later) with a clamp on the carriage construction of the previous step.

Bend the clamp for the spindle lead screw that will move the whole construction in the end. Drill the holes in the clamp for connection to the construction. Mount the clamp and the 50 mm aluminium tube that holds the lead screw inside. Check that it can be fixed very tightly and is stable.

Carefully check the carriage position at the lower position! See to it that the carriage can go all the way down until stopped at the lowest end of the spindle.

Step 7: Mount the Actuator in the Frame

Not all Actuators are delivered with a U-shaped mounting bracket. And most of these are oversized and to "heavy" (overdimensioned). Therefore I bended an U-shaped bracket from a stroke of 40 mm wide aluminium sheet, 3 mm in thickness as indicated in the worksheet. Drill a 4 mm hole, giving the gearbox and motor housing enough slick to accomodate small movements without touching the bracket. Also drill a centered and counytersunk hole in the bottom side. This will be used later to fix its position (with a wood screw) on the floorstand.

Mount the U-shaped bracket below the gearbox and motor housing. Check the slight ability for movements.

Mount the alu tube plus lead screw on the open actuator spindle and rotate the lead screw downwards all the way, until the lowest position of the spindle, blocked by the gear box and motor housing. Now mount the actuator housing and spindle provisionally inside the frame and fix the lead screw and alu tube effortless on the carriage construction with the clamp. The carriage plus actuator can still move freely (some distance) downwards until the U-handle touches the frame (at the floostand). Put the frame in an upright (vertical) position

Carefully check the carriage position and all mounted construction parts at the lower position! See to it that the carriage can go all the way down, undisturbed, until the lead screw is stopped at the lowest end of the spindle. Adjusting the size of the spacer will help to find its ideal position with an undisturbed movement.

Align the spindle at the top with the sides of the frame. The spindle should be parallel to the full length of the track system and fully centered. Only now mark exactly the position of the U-shaped bracket on the top of the floorstand.

Unmount the clamp and lead screw. Take the actuator out of the frame.

Place the U-shaped bracket on its marked position and mark the bottom drill hole on the top of the floorstand. Drill the hole for a woodscrew.

Place the U-shaped bracket on the marked postion and use a wood screw to fix it permanently.

Mount the actuator and spindle again in the frame and fix the lead screw clamp. Fasten the actuator on the mounting barcket

Test the working of the mounted actuator with a 12 volt DC power supply, simply by connecting the wires (by hand) to the positive and negative side respectively of the 12 volt jack and reverse polarity by changing position of the wires. Be very carefull at the bottom and top position of the carriage and lead screw. The actuator can push and pull 750N! There are no electric end stops (micro switches) to stop it!

Step 8: Mount Mini Limit Switches (end-stops) and Wiring

In the original (unharmed) actuator construction, end-stops are an integral part to protect the unit from being damaged at the limits of operation.

See the schematic to understand its working:

  • Switch stops motor at limit and diode allows reversing 12 Volt power polarity of the motor.
  • Normally Upper and Lower are closed, but at limits one will open and shuts off the power to the motor. Diode will be reversed biased.
  • Diode will allow motor to go only in reverse direction. Once motor moves, limit switch closes and power flows through both switches.
  • Once limit switches are closed, motor can go in either direction again: until limit switches are opened.

Compare the wiring and construction that came out of the outer tube of the actuator. Notice the wire colors, the markers on the diodes and how they were connected to the wires that leave the gearbox/motor housing. You are making an exact working copy inside the frame. So keep it close, as the perfect instruction!

The original wiring, diodes and switches can only partially be reused. I got 2 new mini limit switches and reused only the diodes. You need 2 wires of appropiate length.

Bend a strip of aluminium of 10 mm wide, 40 mm long and with 2 mm thickness to hold the switch (see photo). Drill one hole for mounting on the wooden frame and 2 small holes in the pattern of the mini switch. Mount the limit switch to the alu construction.

The easiest way to continue is to unmount the actuator & spindle again and take it off the frame. Leave the U-shaped bracket in place at the bottom. The carriage can now freely move up- and downward to the limit positions.

Two aluminium strips (30 mm long, 10 mm wide and 2 mm thickness) are mounted on the front and back M5-bolds of the carriage that close the limit switches at the top and bottom respectively (see photo). These are slightly inward bended. The limit switches have a perceptible click when mechanically and electrically closed.

Position and test the working of these parts carefully. Then mount the swiches permanently on the inner top and bottom of the frame using wood screws.

Solder the diodes on the outer pins of the limit switches with the markers conforming the original construction.

Solder the wiring and connect again with the right cut-off wires on the gearbox and motor housing, again conforming the original construction wiring. Use shrink tube to isolate the stripped wire connection.

Mount the actuator and spindle again in the frame and fix the lead screw clamp. Fasten the actuator on the mounting barcket. Provisionally tie up the wiring on the inside of the frame

Test the working of the mounted actuator with a 12 volt DC power supply, simply by connecting the wires (by hand) to the positive and negative side respectively of the 12 volt jack and reverse polarity by changing position of the wires. Be very carefull at the bottom and top position of the carriage and lead screw when testing the correct functioning of the limit switches.

Step 9: Electronic Components and Circuitry

This project could have been elaborated with many different electronic parts and come to more or less the same successful end product. I have chosen for the following 4 active components:

Cytron Motor Driver MDD3A. Two channel motor driver for 12 V and 3 Amperes with buttons to test manually the working of the attached DC motor. This board enables the processor to set the Actuator motor in up or down movement. It transforms logical digital levels (Go Up, Go Down and Stop) from the Feather nRF52 to switching of 12 Volt at 3 Amperes max., the levels at which the Actuator works.

Adafruit Feather nRF52840 Express Is another easy-to-use all-in-one Bluetooth Low Energy board with a native-Bluetooth chip, the nRF52840! Notice that the Feather nRF52840 Express is to be preferred and has better value for money!

This chip has twice the flash, and four times the SRAM of its earlier sibling, the nRF52832 - 1 MB of FLASH and 256KB of SRAM. Compared to the nRF51, this board has 4-8 times more of everything.

It's Adafruit's take on an 'all-in-one' Arduino-compatible + Bluetooth Low Energy with built in USB and battery charging. It is a low power, handsome and fast processor board with lots of memory and I/O pins. Can easily be programmed over the USB connection. The programmed Feather nRF52840 is communicating with (a) the trainer to collect power output information and (b) with the training App for resistance settings (like grade) or (c) with the Companion App on your mobile phone. The programmed Feather nRF52 is in full control of the Simcline operation.

OLED display blue 128x64 pixels Small display with screen of: 26.6 mm x 19 mm. Shows cycling data and diagnostic info that is gathered during operation by the Feather nRF52 to inform the Simcline user about relevant information. NOTICE: Install Right Angle Through Hole Male PCB Header Pins on the board; these will allow later flat mounting of the board on top of the frame! The photos show straight headers that had to be replaced later!

Time-of-Flight-Distance sensor VL6180X The sensor contains a very tiny laser source, and a matching sensor. The VL6180X can detect the "time of flight", or how long the laser light has taken to bounce back to the sensor. Since it uses a very narrow light source, it is perfect for determining distance of only the surface directly in front of it.The sensor registers quite accurately the (change in) position of the wheel axle during operation, by measuring the distance between the top of the inner frame and the reflection plate that is mounted on the carriage. The distance feedback of the sensor is crucial for determining how to set the position of the carriage and axle in accordance with the grade information that for example Zwift is using to set the resistance of the trainer. NOTICE: Install Right Angle Through Hole Male PCB Header Pins on the board; these will allow later flat mounting of the sensor board on the inside of the frame! The photos show straight headers that had to be replaced later!

In retrospect I do not regret the choices made. All components are documented very well. There are lots of examples for use in an Arduino environment. They have turned out to be very reliable.

When I started the project I did not have any practical experience with any of the components. So I had to setup the circuitry step by step adding components and did a lot of time consuming but instructive testing first.

My advice is to setup the electronic components first in a similar way as shown on the photo with the cardboard base. Use double sided adhesive tape but only attach it on sections that have no pcb-wiring or soldering, to avoid possible electrical interference. Install the Arduino IDE and all the libraries on a PC/Mac. You will find all the code that controls the Simcline on Github and also the Arduino test programs (modified for this project) that focus on the components separately and in conjunction. Download all the code from Github.

Always check if your trainer has support for the FE-C ANT+ protocol over BLE feature, since NOT all TACX trainers that are labelled "smart" are equally smart!

Download from Github also the (Android) code that is used for the Simcline Companion App. The Companion app will allow you to change settings, have manual control and monitor the functioning of the Simcline.

Step 10: Assembling the Electronic Components Inside the Frame

Once the electronic components and the circuitry have been tested in a provisional arrangement, it is time for assembling these permanently inside the SIMCLINE frame.

One component needs very special care: the "Time-of-Flight" distance sensor VL6180X. It is flat mounted on the inside of the top of the frame (see photo). The positioning there is critical and it should be aligned with and perpendicular to the center of the laser reflection plate mounted on the carriage. In an ideal world the two are exactly parallel and opposite: the (invisible) laser beam from the sensor bounces at the center of the reflection plate at an angle of 90 degrees and is reflected exacltly in the opposite direction it came from. Get as close as possible to this situation. The laser reflection plate allows for small adjustments to become (almost perfectly) parallel with the inside face of the top of the frame where the sensor is flat mounted. Getting the two in exact opposite position is easiest.

The OLED display is flat mounted on top of the frame. A sloping hole is drilled from the top of the frame to the inside, to give access for the wiring. Carefully select the inside exit location of the drill hole with respect to the sensor that is mounted very close...

The positions of the other components is not very critical as long as the distances are minimized to avoid deterioration of digital signal integrity. Take care that the components, wires, connectors, etcetera are never in contact with the moving parts of the construction, like the laser reflection plate that passes close! Fix all tightly with glue and/or woodscrews, since loose components will be damaged (grinded) undoubtedly as a consequence.

Step 11: Mounting and Finishing the Side Covers

The side covers are mounted on the frame with 8 countersunk wood screws each. The pattern of eight screw holes in the 2 side covers should not be identical, to avoid that screws (from both sides) will touch in the middle, when placed exactly opposite of each other!

To achieve maximum stability (to deal with strong rotational forces) I have added two bearings that are slided over the metal tube and touch only lightly the sidecover. The bearings (ID 15 mm and OD 24 mm thickness 5 mm) are kept simply in position on the tube by a rubber O-ring (3/4" or OD 26.5 mm). Alongside the cutout two strips (10 mm width and 5 mm thick) of plywood are mounted from bottom to top. These strips were carefully aligned with the bearing's up- and down-movement, only lightly touching at every position the edge of the strips. In static operation this construction plays no role and is resistance free during vertical movement. However, when the handlebar is pulled asymmetrically (left and then right) the bearings accomodate consequently the rotational forces. The construction reduces backlash and protects the carriage construction and track system from potentially detrimental forces. The bearings accomodate these forces perfectly even during vertical movement of the axle! I used two retired bearings of my Mavic frontwheel that were replaced after many years of duty.

This is all the more urgent since the SIMCLINE in my situation is placed on top of a support construction that allows movement in litterally all directions. Any movement is proportionally absorbed by rocking rubbers in the support construction. The support top plate and the locked in SIMCLINE will return effortless to a balanced (vertical and forward-aligned) position when the forces reduce.

I have applied car wrapping foil (anthracite color and self adhesive) with a 3D carbon print to finish the side covers in a look that is compliant with my all black bike.

Step 12: Preparing the TACX Trainer

One can easily find some references on the internet to an aspect of using the TACX Neo in combination with an up- and down moving frontwheel: the issue of the rear dropouts rubbing as the bike moves. Some trainers have an axle that is freely rotating, consequently the axle follows freely the rotational movement when the bike is lifted up at the front. However, the TACX trainers have fixed axles!

In the earlier mentioned OpenGradeSIM instructable this issue is addressed and a sophisticated solution was suggested by the author: Currently my best solution for me is to mount some standard 61800-2RS deep groove bearings (about £2 each) on the quick release adapters and then mount the through axel drop outs on these (see pics) with an over size QR skewer The bearings need a thin shim washer eg M12 16mm 0.3mm between the adapter and the bearing.

Although one should not blow up this "dropout rubbing" to excessive proportions, since the maximal angular rotation at the rear dropout is only 16.5 degrees (over the full range: -10% to +20% grade), still it is something we cannot ignore for the long-term. After some time of reflection I have come up with a very simple and low cost solution that has proven its effectivity during more than 5 month of intense use: insert at least one thin washer between the bike dropout and trainer axle at both sides of the trainer (see photo). Give the washer some greasing (axle side) and fasten the quick release hand-tight! The washer applied in this project measures OD 16 mm, ID 10 mm and has a thickness of 0.8 mm. If one inserts 2 thinner washers per side, it will even more perfectly accomodate the resistance during rotational movement between the bike rear dropout and the trainer axle. I inserted only one washer per side. Lifting up the front wheel is taken place without any noticable resistance.

I have inspected regularly over the past 5 months the arrangement Trainer + Bike + Washers and I am fully convinced that it solves the problem appropriately. I cannot identify any serious wearing out on the trainer axle or the rear bike dropout. With the solution of OpenGradeSim or the use of simple washers the issue is closed!

Step 13: Tips and Tricks

(1)Enlarging inner diameter of metal tube: The inner diameter (ID 12 mm) of the metal tube most probably has to be enlarged (to about 12.1 mm) to allow the 12 mm thru axle to 9 mm adapter of the same size to move freely inside! Machining the metal tube accurately in a lathe would of course be ideal, if one has access to one. If this is not the case, use a long round hand file and/or sand with a drilling machine plus a sanding spindle. Build quick and easy your own sanding spindle: Use a firm metal rod (OD about 5 mm) of 150 mm long and glue, with quick drying cyanoacrylate, a strip of sanding paper of 100 mm wide around it, until you reach an outside diameter of about 10 mm. Fasten the tube in a bench vise and insert and rotate the spindle with the drilling machine!

(2) Build your own track system: In the present design is choosen for a ready made track system. Only later I figured out that it can also be built with few ready avalilable components, at a very low cost and with relative little effort! See the photo's for a first prototype (base plate is made of 5 mm thick plywood).

  1. The carriage: 6 V-groove bearings mounted with M4 nuts, bolts (22 mm) and washers on a base plate of 40 mm wide, 84 mm long and 3 mm thickness; See drill pattern for exact measures;
  2. The track: a strip of aluminium (of 20 mm wide, 440 mm long and 2 mm thickness) with holes on centerline fully countersunk
  3. 6 V-groove bearings, size: 4 x 13 x 6 mm and type: V624ZZ (see DOMOTICX)
  4. Base: Strip of plywood or MDF: 15 mm wide, 440 mm long and minimal 6 mm thickness.

You have to experiment a little with the heigth of the total construction to avoid major adjustment of the other components that hold the axle and the actuator lead screw. Replace for example the nut (of the prototype) between bearing and bottom of the base plate with a (OD 7 mm) washer to decrease the height and still allow the bearing from freely moving!

(3) Build your own Circular Saw Jig: To be able to saw out accurately all the plywood parts, a circular saw cutting jig was built first, using a 12 mm plywood base sheet of 610 mm long - 700 mm wide. This construction controls the rectilinear movement of the circular hand saw. It is a customized version inspired by the many examples one can find on Internet. See for an example that comes quite close at Instructables.

1 Person Made This Project!


  • Plywood Contest

    Plywood Contest
  • Halloween Contest

    Halloween Contest
  • Microcontroller Contest

    Microcontroller Contest


Christian Boudreau
Christian Boudreau

11 months ago

Thank you for the project. I am building it and working hard to understand how the electronic components work. I was wondering what made you choose the VL6180X sensor with a range of 100mm instead of the VL53L0X which has a range of 30mm to 1000mm

Jörgen van den Berg
Jörgen van den Berg

Reply 10 months ago

Dear Christian, Hope the project is progressing! Please help me with the following: You had problems with the Companion App and solved it with the latest version of BluetoothLE1. What Android version were you using when the problem occurred? The problem is reoccurring with versions 10 and 11....?
Thanks in advance, Jörgen.

Christian Boudreau
Christian Boudreau

Reply 10 months ago

Hello Jörgen,
The version of Android I use is 10 on a Galaxy S9. As you mentioned, things get complicated with the Whahoo... For the moment I'm working on other ways to capture the information exchanged between Zwift and the fitness machine. The mechanical side is going well. The project integrates a rocker plate on bearing, a slope simulation system and Sterzo-like driving. I also designed and built a bearing system that modifies the pivot of the second generation Kickr to make it compatible with the slope simulator and possibly with the true axle bikes.

Jörgen van den Berg
Jörgen van den Berg

Reply 10 months ago

Wow! You are busy indeed! Very impressed! Do you have time left to actually sit on the bike....?
I have been thinking about the "man-in-the-middle" pattern to solve the problem: the Feather is only passing around the data (from trainer to Zwift and v.v.) while sneaky peeking, to pick out data that is needed to run the slope simulation.....
For the record: all you changed in the MIT code was delete old version of BluetoothLE1 and upload the new version, no other clever tricks?

Christian Boudreau
Christian Boudreau

Reply 10 months ago

Exactly all I changed in the MIT code was to remove the old version of BluetoothLE1 and download the new version. That's it. Right now my challenge is to communicate with the trainer. I still don't understand how to do it and what are the differences between Kickr and tacx. I don't have a lot of knowledge in coding so I'm learning by trial and error.

Jörgen van den Berg
Jörgen van den Berg

Reply 11 months ago

Well I chose for the short range version (made by Pololu) and had no experience before with this Time-of-Flight type of sensors. On the testbed it responded well and had good accuracies at very short range (centimeters) as well as at the Simcline max distance of 30-33 centimeters. In the long run it never failed!
Notice that the Alu reflection sheet needs accurate installment to avoid deviation of the reflected (and invisible) laser beam! Further its application is straight forward and not complicated! Have fun with the building process!

Christian Boudreau
Christian Boudreau

Reply 11 months ago

Hello Jörgen,
I have a lot of trouble debugging the code.
The Oled I bought is slightly different from yours. Fortunately I found the solution. It was the addressing
#define SSD1306_I2C_ADDRESS 0x3C changed to 0x3D and it works fine.
The other problems I'm running into are:
Can't do the positioning test sequence.
Can't connect the app even though I can pair my phone.
When I test with the examples each section works fine but when it's the main program it stalls.
Your help would be much appreciated
thank you

Jörgen van den Berg
Jörgen van den Berg

Reply 11 months ago

Daar Wells240, The Simcline code does (after start up) testing of the collaboration of the Time-of-Flight sensor and the Actuator. It has the actuator step up and step down some seconds while checking the readings of the sensor... this is to avoid serious damage when the two are not working properly... If the test fails further operation is stopped! Otherwise the front wheel is positioned in neutral position and pairing with TACX and smartphone is started.
Do you have a fully operational setup, electronically and mechanically? Or is it still in an early state? That would explain the message fully !
Carefully study the code and you will see when the test is executed!

Christian Boudreau
Christian Boudreau

Reply 11 months ago

Jörgen, I have the electrical part with the actuator connected but nothing done on the mechanical side. I have tested all the electronic modules and everything works for each of the tests. The actuator moves according to the distance from the position sensor (activated by hand) with the Test_Standalone_Functions_And_Library test.

Jörgen van den Berg
Jörgen van den Berg

Reply 11 months ago

Dear Christian, The Time-of-Flight sensor and actuator are not physically connected! In other words the sensor does not detect the movements of the actuator, i.e. no laser beam reflection from the actuator carriage back to the sensor for determination of the path the carriage is following. One cannot expect the Simcline code to work in this state. That is not a bug but a feature, the code is painstakingly programmed to detect an erroneous state and stops operation to avoid damage. The mechanical limit switches at the top and bottom have a comparable last resort function!
Best wishes, Jörgen van den Berg.

Christian Boudreau
Christian Boudreau

Reply 11 months ago

Dear Jörgen, After working for several hours to learning how the BLE and programming of the App works, I finally found the reason why I could not see the results when scanning. The BluetoothLE1 extension in MIT App Inventor is problematic. I found the solution quite by chance will creating a small test app. So to fix the problem in Simclin Companion I just download BluetoothLE extension 20200828 released in MIT App Inventor and recompile the apk.
It works perfectly now.
I thank you for the explanation on how the distance sensor works. Finally after setting up a bench test that respects the physical distances everything works. The next step is to test the VL53L0X sensor which has a range up to 1000mm. Also my biggest challenge will be to adapt the code to use with a Wahoo Kickr
Best wishes, Christian Boudreau

Jörgen van den Berg
Jörgen van den Berg

Reply 11 months ago

Dear Christian, Thank you for this very important observation about BluetoothLE1 version 20200828. I have updated the Simcline APK and the MIT App Inventor code file immediately on Github. You were the first to be challenged with a BLE extension version problem! Clever trouble shooting to reveal it! Respect!
I am afraid you are in for a very serious challenge with the Wahoo Kickr...
Thanks again and much wisdom...
Best wishes, Jörgen.


10 months ago

Thanks for sharing. Do you've a demo video?

Jörgen van den Berg
Jörgen van den Berg

Reply 10 months ago

You're welcome! What information are you missing in the instructions that you would like to see in the video?


1 year ago

Hello, very nice project! A few weeks ago a alread found OpenGradeSIM. Now im CADing for my own. I'd link to have grade sim + rocker plate support. I hope I'll building soon ;)

Jörgen van den Berg
Jörgen van den Berg

Reply 1 year ago

Nice to hear! Please share some images when you are building! I am curious and wish you succes!


Tip 1 year ago

Thank you , great write up. I have just started building it. To make bike movement smoother you can use Axial Needle Roller (Thrust Bearings) instead of washers. They are very cheap. Here is a link to eBay UK where I got mine:

Jörgen van den Berg
Jörgen van den Berg

Reply 1 year ago

Wow! These are perfect indeed! I was not aware of their existance! If you have any questions during the build, let me know!


Question 2 years ago

Very interesting. Does it connect to the Smart trainer? Do you have a demo video?