From RepRapWiki
Jump to: navigation, search

Crystal Clear action run.png

Release status: working

Description Force Sensing Resistors
License GPL
Author Johann
Based-on Kossel
Categories autolevel
CAD Models
External Link https://github.com/jcrocholl/Marlin/tree/fsr


Instead of the retractable Z probe, now using Force Sensing Resistors (FSR) sandwiched between the glass print surface and the triangle frame. We use three FSR wired in parallel, connected to the Z_MIN endstop pin. This allows calibrating the print surface with 0.02 mm repeatability, which is good enough for printing PLA on cold naked glass.

When the hotend pushes down on the print surface, the FSR changes quickly from 5MΩ to <50Ω, depending on the force. Less than one pound (or 500g) of pressure can trigger the Z_MIN endstop digital input pin, because it's using a 20kΩ internal pull-up resistor inside the Arduino or similar microcontroller.

Johann's first prototype used the heated bed thermistor (analog) input pin, but that's actually not necessary. The endstop (digital) input pin works just fine, without any additional parts.

Mini Kossel with FSR There are also designs that put FSRs on the effector platform.


Because FSR setups use the nozzle to touch the bed, they are potentially sensitive to nozzles with plastic residue on them. If the hotend is hot, repeated probes of the same place can leave a gradually growing blob of plastic, gradually increasting the apparent bed height. If the hotend is cold, plastic strings or blobs on the nozzle may be strong enough to trigger the bed sensors too low.

If misadjusted, sensors can fail to trigger, causing the print head to crash into the bed. Alternatively, if they trigger at random, an autocalibration procedure may send your effector wandering off into the middle of nowhere.

Physical design

You will need to replace the printed parts that hold your heated bed in place. There are some designs on Thingiverse, but the key criteria are:

  • Must hold the bed firmly against lifting: when a probe point hits the bed outside the triangle defined by the support points, the bed will tend to lift up at the position of the clamp on the opposite side. Of course this ruins the measurement, but looseness in this axis can also allow the bed (and printed object) to move while printing.
  • Must trigger cleanly and repeatably when probed: if the bed compresses too much during probing, the printer may measure an apparent curvature as the depth of the trigger point varies across the bed.
  • Must provide some insulation of FSRs from bed heat: most FSRs are not designed to function at 60-100 Celsius, and placing them in direct contact with heater elements may be a problem

Most designs place a compressible pad (cork or rubber) between the bed and the support, and use a retaining tab to clamp the bed in place (and pre-compress the pad slightly). The FSR is then set low enough that as the pad compresses, either it or a printed part presses on the FSR when a suitable amount of force is applied. Some adjustment of the clamping may be necessary to ensure reliable triggering; this can be made easier by smarter electronics.

Specifically, some designs place all the weight on the FSR at all times; these designs require smarter trigger electronics than simply being wired to a digital input pin: [1]

Others are more elaborate and may be able to work with no special electronics: [2]

Electronic design

There are at least three general ways to rig up FSRs.

  • Directly to a digital input: the three FSRs are wired in parallel and simply plugged into the Z_MIN_ENDSTOP connector on the RAMPS board. This is just an Arduino input pin with a 20k pullup resistor. It will therefore trigger roughly when the FSR resistance drops below about 20k, which is a very modest amount of force. If a different trigger resistance is desired, the +5V supply to the endstop could be used with another resistor to produce a voltage divider setup that triggers when the FSR resistance matches the other resistor.
  • To an analog pin on the RAMPS board: if your machine doesn't have a heated bed, or has a second extruder thermistor input, the FSRs wired in parallel can be attached to it. Then the firmware could use clever tricks to establish a "tare" resistance and detect probing. Code to do this is not currently present in Marlin firmware.
  • To one or more analog pins on a secondary microcontroller: an Adafruit Trinket, Arduino Micro or other low-powered low-cost board can watch its analog input(s), establish a normal resistance for each, and trigger when it sees a sharp spike in pressure. Often an LED showing trigger state is a good idea; a digital output pin is then connected to the RAMPS Z_MIN endstop connector, and the board can be powered from its +5V line.

The cheapest and easiest option is of course the first, but all adjustments need to be mechanical: the pressure on the FSRs due to holding the bed firmly in place needs to not trigger them, but a gentle tap from the nozzle must trigger them. Beware in particular the points between supports, where the pressure is distributed over two FSRs and the third clamp must hold the opposite side of the plate down. Good FSR mount design may be able to make this reliable, but poor design can result in FSRs that don't trigger reliably or don't untrigger reliably, leading to all kinds of erratic behaviour while probing.

If your firmware supports an analog input for the probe (available on Duet hardware, may require an unmaintained branch on RAMPS) then clever firmware can establish a baseline resistance from the FSRs and trigger when this resistance drops, simplifying the mounting requirements.

Using a spare microcontroller avoids messing with the firmware on your main machine, and also allows the FSRs to be connected separately, although it is not clear that this is necessary. A kit is available here: [3] or there is code to run on one of several tiny microcontroller boards: [4]

Straight digital hookup


Because Force Sensing Resistors are normally open (NO) make sure that you have the following in Configuration.h:

const bool Z_MIN_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.


When none of your endstops are touched and there's less than 300g of added weight on the build surface the result of M119 should look like this:

PC>Reporting endstop status
PC>x_max: open
PC>y_max: open
PC>z_min: open
PC>z_max: open

When you put a weight of about one pound or 500g (e.g. two rolls of blue tape) on the print surface, it should look like this:

PC>Reporting endstop status
PC>x_max: open
PC>y_max: open
PC>z_max: open

Adjusting sensitivity

If you get z_min: TRIGGERED even with less than 300g of weight on the build surface, your FSR endstops are too sensitive. To fix this, increase the size of the sticky pads on top of the FSR sensors, e.g. 1 by 1 inch clear Scotch Restickable Strips. By extending over the edge of each FSR circle, they will support the print bed more and reduce the FSR response.

If you get z_min: open even with more than 500g of weight on the build surface, your FSR endstops are not sensitive enough. To fix this, reduce the size of the sticky pads on top of the FSR sensors, e.g. 1/2 by 1/2 inch clear Scotch Restickable Strips. By putting all the weight on the middle of the FSR circle, they will increase the FSR response.

If you get z_min: TRIGGERED when the build surface is empty, and z_min: open when you put weight on it, your endstop is probably still configured normally closed (NC). But for FSR it must be configured normally open (NO). Make sure you have the following in Configuration.h and then recompile Marlin and upload the firmware to the printer electronics again:

const bool Z_MIN_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.

Using an on-board analog input

For the updated Marlin firmware (Johann C. Rocholl) for Mini Kossel , move back to connect the FSR to the heat bed temperature sensor pin instead of connect to z_min pin.