FS-Touch Bed Levelling Tool




About: I'm programmer and an electronics hobbyist. I try to find that point where software meets hardware meets art. "Necessity is the mother of all creation, but laziness is the father." "The best w...

Tired of trying to get the perfect levelled 3D printer bed? Frustrated with guessimating the proper resistance between nozzle and paper? Well, FS-Touch will help you measure this pinching force quantitatively and achieve quick and accurate bed levelling in no time.

Features of this bed levelling(proper term is tramming) tool:

  • Works with all types of beds: metal, glass, magnetic
  • Allows measuring the force and comparing against a reference force value.
  • The reference value can be set to new value with press of a button.
  • Indicates direction to rotate levelling knobs, because everyone gets confused which direction is up and which is down!
  • Shows how much more to turn the knob to hit the sweet spot through rotation speed.
  • Detachable force sensor which can be replaced quickly.

Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.

Step 1: How It Works

To get a perfect print, your 3D printer bed needs to be levelled(correct term is trammed). A properly levelled bed is equidistant from the nozzle tip over whole of its surface. This is usually done by taking a piece of paper and putting it between the bed and nozzle when the hot-end is at zero height(Z=0). Then the paper is slid around and levelling knobs are used to adjust bed height till the paper gets pinched between the two. This is repeated for all the corners.

While in theory it sounds easy, doing it practically is a pain. The friction between the nozzle and paper is not on/off(digital) but gradual(analog) over a large range of levelling knob positions. It gets really frustrating trying to find the point where to stop because even when pinched between the nozzle and bed, the paper can move if you apply even slightly more force. So it is really a hit-and-trial game and going by feeling whether the pinching force is enough or not. I created FS-Touch to help measure this pinching force objectively instead of subjectively going by feeling and rough estimates, to get perfectly levelled bed every time.

For this a Force Sensitive Resistor(FSR) and an Arduino Pro Micro is used to measure the pinching force and displayed using a 7-segment display. The FSR changes its resistance to the amount of force applied to it and we can measure that using an Arduino by treating the FSR as part of a voltage divider. It is then compared against a value store in Arduino's EEPROM and the 7-segment displays the info. The direction of rotation shows the direction to rotate the levelling knobs. Its rotation speed shows how much it is off from the required value.

Step 2: Stuff Required

  1. Arduino Pro Micro
  2. 7 segment display
  3. Force Sensitive Resistor
  4. Custom PCB
  5. 3D printed case
  6. Push Button
  7. 2.2K Resistors x8
  8. 100K Resistor x1
  9. Male and Female Headers
  10. Blu-Tack

Step 3: Fabricating PCB: CNC Milling

Download the Eagle file and make the PCB. It is a double sided design and does not require PTH. So it is home fabrication friendly. Iron transfer method can be used to create this PCB.

Since I have a CNC Router with me, I created this PCB using it.

Step 4: Fabricating PCB: Soldermask

This was my first time working with soldermask for a project. Initially I drilled the holes and applied soldermask paste but then it clogs up the holes and makes soldering difficult instead of easy. So the second time around, I applied soldermask paste before drilling the holes.

Printed out the soldermask layer on transparent sheets and layered 3 per side. This was aligned and taped to the milled PCB. Then soldermask paste was applied and the transparent sheets was placed on top. This was repeated for the other side of PCB as well. Then it was cured with a UV lamp. This didn't cure it well enough even after hours so I put them in the sun for a while and that did the trick.

After that, the transparencies were removed and the board washed with alcohol while being scrubbed slightly with a brush. This removed all the uncured soldermask paste and revealed the pads. Some parts which were supposed to have soldermask but didn't, had a bit of the paste applied and cured. Some parts which shouldn't have soldermask but did, were carefully scraped with a blade.

Finally the board was drilled and milled out of copper blank. The end result is a beautiful looking board.

Step 5: Solder Components

First solder all the vias. Once done, the resistors are to be soldered to the bottom side of the PCB in a vertical position as shown in image. Next solder the 7-segment display and button in place. Finally solder the male headers in place. Also cut solder female headers to size and solder to the Arduino Pro Micro.

Step 6: Fabricate Interface PCB

Make the Interface PCB which is simply a board to break out 2 of the pads from the main board to another position for FSR. It has 2 wires from the board connected to 2 male header pins to which the FSR's female pins connect.

After soldering the male headers to the interface board, solder 2 wires from interface board to FSR pins on the main board. Attach the main board atop the Arduino, attach FSR to interface board and our hardware is ready!

Step 7: Upload Code

Download the attached Arduino sketch. Connect arduino to PC with USB cable. Upload sketch.

The 7-segment should show a line going around in circles. Try squeezing the FSR with your fingers and the display's rotation speed should change.

Step 8: 3D Print Enclosure

I have provided the STL files along with Fusion360 design files.

Slice them in your slicer of choice(mine is Cura) into gcode. Upload to 3D printer and print away.

Step 9: Assembly

In the enclosure bottom, first set the Arduino Pro Micro so its USB port fits nicely in the hole for it.

Then insert the interface PCB. It snap fits at an angle so the FSR sensor is tilted downwards towards the bed and ends up as near to bed as possible at rest position. This removes any little upwards flex force exerted by sensor when pressed down by nozzle.

Next attach the PCB to the top of Arduino. There will be wires going from PCB to interface PCB which needs to be folded in the available space.

Lastly add the top lid of enclosure which will snap fit to the bottom and FS-Touch is fully assembled.

Step 10: Time to Level

To use it, we will need to save reference value of force between nozzle and bed. Unfortunately, for the first time use, it can only be recorded from a levelled bed. But once the reference is set, it is a breeze to re-level the bed.

  1. Roughly level the bed using the paper trick if it isn't levelled with a heated bed and nozzle.
  2. Allow the bed and nozzle to cool down completely to room temperature.
  3. Make sure the nozzle is at Z=0 by auto-homing the printer. The bed and nozzle should not be heated.
  4. Then move nozzle over a levelling knob's screw, either using jog controls or using automatic levelling option available in some printers(such as Creatlity CR-10S which I use).
  5. Place FS-Touch's sensor between the nozzle and bed. You might have to slightly push down on the bed to make room for it to slide in. This shouldn't affect the bed levelling as all beds have springs which will bring them back to levelled position as soon as released.
  6. Now hold down the button on FS-Touch for 2 seconds till countdown begins. This provides you a 5 second window to release the button(and any extra pressure due to your finger) and allow the bed to return to levelled position. When counter reaches zero, the reference force value is saved in the EEPROM and you probably won't have to save it again unless the sensor is changed.
  7. You can now move the nozzle to next levelling screw and again insert FS-Touch between nozzle and bed.
  8. This time, you can match the levelling to the reference levelling you just saved. Rotate the knob in the direction the LED is spinning. The slower it spins, the closer you are to reference value. When it changes direction, that means you went a bit too far and need to dial it back a bit. The perfect position is when the LED keeps changing the position repeatedly. The DP LED of the 7-segment blinks faster and brighter the better the value matches.
  9. Repeat this for the remaining leveling knobs and you have all the knobs at the same level.
  10. Try printing first layer and it should come out well. If the distance is too much or too less, you can adjust the Z-offset too.

The next time you want to level, just insert FS-Touch and quickly bring all levelling knobs to the reference value.

Step 11: Drawbacks?

A drawback of FS-Touch is that it can only be used on a cool bed and nozzle. Heating them up can melt the sensor. As the bed warps and the metal of nozzle expands upon heating, the distances change and so levelling should be done when both are hot. It can be mostly remedied by calibrating with paper once in heated condition and then letting it cool down. Then storing the reference for FS-Touch. This will include the expansions in the reference value and help mitigate any changes in values due to heating. So when the nozzle and bed heat up again, they should reach back to the levelled distance.

Applying Blu-Tack to the back of FS-Touch helps it to stick to the bed pretty well and keeps it from shifting around due to the USB cable. It also ensures that the pull/push forces are not propagated from the USB cable to the sensor which can affect the values.

One thing to ensure before using FS-Touch is that the nozzle should be completely clean. Any filament goop on the nozzle tip will increase its height and hence yield wrong force values for the sensor.

Overall, it is a handy tool to save time and headache when levelling a 3D printer bed.

Be the First to Share


    • CNC Contest

      CNC Contest
    • Make it Move

      Make it Move
    • Teacher Contest

      Teacher Contest

    23 Discussions


    16 hours ago

    Perhaps I missed it, but I've no clue as to what kind of pressure (mass) the sensor should be rated for. Is 0-200g ok?


    2 days ago

    Could you upload the wiring diagram? I do not have a CNC Milling machine.
    Thank you,


    13 days ago

    I have a question about the Arduino board you are using.
    I see it says Pro Micro on the board, but I cannot find this board on the Arduino website. All they show is a "Micro".
    Do you have any more information about the board or where you bought it from.
    Thank you.

    2 replies

    16 days ago

    Oh I am SOOOO going to make this!! I still haven't been able to get my printer to work properly, once I make this and level the bed with consistent resistance from each levelling point, all I would need to do from there is figure out what else might be a problem for my machine. Thank you so much for going through all the effort and trials to make this! you sir, are a genius! You could market this to the 3D printing community you know, if you are interested in the difficulties of being an entrepreneur! :)

    3 replies

    Reply 11 days ago

    Where can I obtain the Main circut board or the files G Code file to make on ?

    Charlie (VK2CLH)

    Antzy CarmasaicOculumForamen

    Reply 15 days ago

    Thank you. I posted this project on FB and received several request for buying it as a kit. I'm frankly surprised by this much interest for something that is just a prototype/proof of concept. I'm considering making an improved version and running a tiny batch for sale. Still divided on it though.

    OculumForamenAntzy Carmasaic

    Reply 15 days ago

    Well, here's a push in that direction! You should sell it as a kit, but if you are interested in making it better, I would suggest that a little experimentation on what is the best height, convert that into inch-pounds of force needed to "pull the paper out, then program that value into each eeprom in the kits, this would make it a defined value. At that perfect stop, when it is reached, then you could easily program the display to do a specific animation, so users know when they have hit that sweet spot. I hope I am making myself clear on this. or instead of inch-pounds you could simply use crush force. But setting it according to a specific type of measurement, it then makes it repeatable for almost everyone, and it also makes it easier to alter those values if need be, because the measurement scale used would have defined values that you don't have to create yourself. It'll take some equipment to do the initial measuring of what it needs to be, but once you have the value, it's pretty much done. Let me know if i'm making myself clear or not, but I for sure think you are onto a bit of a gold-mine here. No one else has created something like this, but you've made it and it works! so now all you have to do is make it more or less idiot proof and then you can sell it. It's your baby, and you're in charge of it!!! I would work hard on this though, you've posted your idea in Instructables and it is basically now common property and someone else can now use your tool to make a better one and then market it. the idea is certainly yours but all they have to do is mention your name as the creator of the original, and he's done his due diligence. Make a better one and make it fast bro! I greatly anticipate the Bed Leveller mk.II, if you are going to make it, that is! I would buy your tool in a heartbeat, if it was available.
    Oh yeah, I almost forgot, make it with a battery, so it doesn't have three pounds of cord hanging off the other end. That is probably one of the first changes I would make. I think others would agree. Cheers!


    15 days ago


    volatile int T_Counter;
    float T = 0.0;
    float d = 0.0;

    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    TCNT0 = 0;


    void main(void)

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 8000.000 kHz
    // Mode: Normal top=0xFF
    // OC0 output: Disconnected

    // Timer(s)/Counter(s) Interrupt(s) initialization

    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: On
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud Rate: 9600

    // Global enable interrupts

    while (1)

    T_Counter = 0;
    PORTC.0 = 1;
    PORTC.0 = 0;

    while(PINC.1 = good but


    15 days ago

    This is cool if you level when the hotend is cold. But I level with heeated hotend and bed, because the distance of nozzle and bed changes when heated.

    1 reply
    Antzy Carmasaichubi

    Reply 15 days ago

    I tackled this problem in the last step. twhite101 had also put up a similar query and I have answered it in extra details in his comment. Please check that.


    15 days ago

    Great project but one small issue, bed leveling is done with the nozzle heated up to insure hardened plastic on the tip will not interfere. If we do this with the force sensor it will melt it.

    1 reply
    Antzy Carmasaictwhite101

    Reply 15 days ago

    That's true and I have already mentioned that in the last step. So the solution I propose is that the initial calibration with paper should be done on a heated bed. Then the bed is allowed to cool down and value is stored in FS-Touch as reference. When the bed heats up, it should go back to the proper calibrated distance. So this saved reference value can be used again in future to re-calibrate the bed.


    15 days ago

    This is awesome and very well documented. Thanks!


    Tip 16 days ago

    Oh yeah. I was thinking about FSR and 3d printing last week, hoping it's already exists and now... You did it ! Great !
    I have a -big- printer with 50 bed levelling points....you can't feel 50 times the same resistance.

    But well, here is a tip : you said "Unfortunately, for the first time use, it can only be recorded from a levelled bed." But... No, not necessarily, because if you have the same force applying to each test point, you only need to adjust the z=0 after that. So why this sentence ?

    2 replies
    Antzy CarmasaicWapata

    Reply 16 days ago

    Wow. What kind of a printer has 50 levelling points?
    Yes, as you mention, all the levelling points will be at the same level but it can be too low or too high. But most printers with stock firmware do not allow changing Z-offset, and even if they do, it isn't saved in non-volatile memory. That's why I was mentioning adjustment using Z-offset. But have added a line at the last step for people who do have that option.

    WapataAntzy Carmasaic

    Reply 16 days ago

    Yeah it's a big one. 600x400mm of glass.
    With my little home printer I don't make many bed levelling because it's a reliable printer. But I do redefine the z=0 with G1 / M306 / M500.
    It mean (for example) go to z=0, set this position to -0.05, save to firmware.
    But your system is a good one, it's the one I need for the big printer (and I don't find a commercial equivalent).


    18 days ago

    So much need in one little package... The only thing I might change would be to add a battery