Z-probe V3: Now With Wings

In previous posts I described a z-probe modification I made to Squirty the RepRap. The major issue with this z-probe was that the point probed was about 30mm away from the nozzle, which meant that the probe could not reach the entire bed. I’ve designed a new version that resolves that issue. By mounting the microswitch on the same side as the hotend the microswitch for the z-probe is almost directly underneath the nozzle. Mounting the z-probe in this way required creating “wings” that stop the servo arm from colliding with the z-axis at low/high x values. In this post I’ll describe how to assemble and set up this z-probe on a RepRap Huxley. I hope this is useful for anyone out there who is still, like me, printing on a 5+ year old design. If you do try it then please let me know how it works out!

The video below shows the probe in action.

Begin by printing four parts (stls on Thingiverse)

  • Fan shroud
  • X carriage base
  • Nozzle mounting (I suggest slicing this at a 45° angle for increased strength)
  • Servo arm

If you wanted to modify the designs then you can clone them from Onshape

You will also need the following non-printed parts:

  • Tower mini servo motor, with mounting holes drilled out to 3mm
  • Microswitch with mounting holes drilled out to 3mm, and tabs cut/filed short
  • 27mm piece of pulley belt
  • 5x M3 x16mm bolts
  • 2x M3 x6mm bolts
  • 6x M3 nuts
  • 1x M3 locking nut
  • 4x M3 washers
  • 4x M3 x10mm screws
  • If you don’t already have a ducted fan, you’ll need a 24V 40mm fan


Parts for installing z probe. Printed parts top to bottom are fan shroud, x-carriage base, nozzle mounting, servo arm

I printed the nozzle mounting part at a 45° angle to make the “wings” as strong as possible and to stop the layers from splitting when adding screws. All the other parts were printed with normal settings.

Nozzle mounting sliced at a 45 degree angle

Remove any support material and fettle all holes with a 3mm drill bit except the holes for the servo and microswitch (these take M3 screws so should be tight). Use a rounded file to make the x carriage accept a linear bearing (should be a tight fit).


Fettling the x carriage
Don’t fettle these holes to 3mm as they will have screws going into them. I fettle to 2.5mm instead.

Attach the fan mounting to the x-carriage using the two short M3 bolts (6mm) and two M3 nuts. Be careful throughout the assembly process to avoid damaging the pillars that are inside the fan shroud – they are delicate. Drop 4x M3 nuts into the nut pockets in the x-carriage. There are two at the top, one on each side. “Drop” might be a little ambitious – you may have to tap them in using a screwdriver and a small hammer.

X-carriage attached to fan duct with 2x M3 bolts
Fan duct attached to x-carriage. The nuts fit into slight depressions that stop them from spinning
Nut pockets at the top of the x-carriage
Nut pockets at the side of the x-carriage

Screw the servo into the nozzle-mounting. Add the servo horn to the servo if you haven’t already. It is important when attaching the servo horn to make sure that the servo’s range of motion includes both the “stow” and “deploy” probe positions. Usually the servo will have 180° of motion. Only 90° are needed, so you can allow some play on either side and then adjust the stow/deploy angles in software. Screw the microswitch into the servo arm. The wires going to the microswitch should clip neatly into the little pocket on one side of the servo arm to avoid them dragging on the print bed.

Attach the servo arm to the nozzle mounting. On the servo side the printed part should slip over the servo horn (you might need to cut the tip off the horn). On the other side use a M3 16mm bolt with four washers (two each side of the attachment to the nozzle mounting piece) and the M3 locking nut.

Servo attachment to nozzle mounting and microswitch attachment to servo arm
Assembled servo arm and nozzle mounting

Check that the hotend assembly fits neatly into the nozzle mounting. Check how much the nozzle juts out – it should be just clear of the nozzle mounting. Too much clearance and the fan will blow on the heating block rather than the nozzle, too little clearance and you risk the nozzle mounting catching on the printbed. Add/remove washers to the bolts in the cooling block to adjust the clearance. Remove the hotend assembly.

Testing the hotend assembly fit with the nozzle mounting
The nozzle should be clear of the nozzle mounting, but not so far clear that the fan is going to blow on the heating block

Attach the x-carriage to the printer by sliding the linear bearings into the lower track of the x-carriage, then tilting it to capture the upper linear bearing. To avoid later gnashing-of-teeth double check that you have installed it facing the right way, i.e the fan shroud side should face towards the front of the printer. Join the pulley belt in the x-carriage under some tension using a small piece of belt.

X-carriage installed on the printer

Use 4x M3x16mmm bolts to attach the nozzle mounting to the x-carriage.

Nozzle mounting attached to x-carraige

Attach the hotend assembly. Drop the ducted fan into the fan shroud. Reattach any wiring, reattach the bowden tube from the hotend assembly.

Ducted fan dropped into shroud
Complete z probe assembly

Double check the wiring, then it’s time to try it out!

Start by setting the probe angles. Use the M280 command (set servo angle) to find a good “stow” and “deploy” angle. E.g. M280 P0 S70 sets the servo to 70°. For me, around 70° is a good stow angle, 175° is a good deploy angle (I like to have the servo arm above horizontal when stowed to allow some room for servo jitter). Be careful that in either position the servo is not blocked – if the servo is continuously trying to force the arm through the x-carriage then the motor will wear out quickly.

Add these angles to your Marlin configuration file. E.g. my SERVO_ENDSTOP_ANGLES line reads…

#define SERVO_ENDSTOP_ANGLES {{0,0}, {0,0}, {175,70}}

While you are editing your Marlin config file you should also set up the z probe offsets. You can measure these yourself or trust my values below (z probe landing is 2mm ion front of nozzle and 7mm to the left). It would be very easy to redesign the servo arm to make both these values 0, I might do this some day.


Ignore the Z_PROBE_OFFSET_FROM_EXTRUDER value, this should be set using the terminal (M851 command) and stored in EEPROM.

The penalty for the small x & y offsets are that the servo arm needs some considerable height to deploy. To avoid crashing the servo arm into the bed, set the following values (note all these lines should already be present in your Marlin configuration, just search for the string and edit the value).


Note that 30mm is quite a large rise in height, and this will happen as soon as you tell the printer to home Z. MAKE SURE THAT YOU HAVE ENOUGH VERTICAL SPACE FOR THE 30MM RISE BEFORE YOU HOME Z. It is very easy to forget that the nozzle is already quite high (because you just finished a tall print) and then absent-mindedly tell the printer to home Z, causing the carriage to rise 30mm and crash into something. Before starting a print confirm that the carriage is not too far from the print bed and, if it is not, then manually bring it to a reasonable height.

Be aware that the ducted fan shroud will collide with the Huxley’s frame at about z=55mm for low and high x values, i.e. much lower than the Huxley’s nominal build height. This was an issue with the “official” ducted fan attachment as well. It may be possible to increase the collision height, however it shouldn’t be much of an issue unless you want to print something which is both very wide AND very tall. If your slicer includes gcode at the end of a print that moves the nozzle to the bottom left of the print bed it is wise to remove it, as otherwise any print higher than 55mm will cause the fan to crash into the frame (not the end of the world, but if you have been printing for any length of time the sound of blocked stepper motors probably strikes terror into your heart).

With the configuration file set and uploaded to your Melzi you can test Z probe deploy/stow using M401/M402, or you can go straight ahead and run a z-probe repeatability test using

M48 P10 V4 E

This will do 10 probes of the print bed in the same location, stowing the probe between measurements, and report the standard deviation of the results. I am always astonished by how good this is given all the potential sources of lash etc. in the servo arm. My standard deviation is 0.004598mm.

Send: M48 P10 V4 E
Recv: M48 Z-Probe Repeatability test
Recv: Positioning the probe...
Recv: 1 of 10 z: -22.292848 mean: -22.292848 sigma: 0.000000
Recv: 2 of 10 z: -22.299766 mean: -22.296306 sigma: 0.003459
Recv: 3 of 10 z: -22.296802 mean: -22.296472 sigma: 0.002834
Recv: 4 of 10 z: -22.298284 mean: -22.296926 sigma: 0.002577
Recv: 5 of 10 z: -22.304956 mean: -22.298532 sigma: 0.003954
Recv: 6 of 10 z: -22.307428 mean: -22.300016 sigma: 0.004901
Recv: 7 of 10 z: -22.300262 mean: -22.300050 sigma: 0.004538
Recv: 8 of 10 z: -22.296060 mean: -22.299552 sigma: 0.004445
Recv: 9 of 10 z: -22.291858 mean: -22.298698 sigma: 0.004838
Recv: 10 of 10 z: -22.297790 mean: -22.298606 sigma: 0.004598
Recv: Mean: -22.298606
Recv: Standard Deviation: 0.004598

All you need to do before printing is set your Z probe offset using M851. Do a Z home, then use the paper method to work out how the offset needs to be adjusted. E.g in terminal output below I needed to adjust the z probe offset by 0.9mm to -18.8mm. You should an offset around this number.

G28 Z

Send: M114
Recv: X:70.00 Y:70.00 Z:0.90 E:0.00 Count X: 70.00 Y:70.00 Z:0.90
Recv: ok
Send: M851
Recv: echo:Z Offset : -19.70
Recv: ok
Send: M851 Z-18.8
Recv: echo:Z Offset ok
Recv: ok
Send: M500
Recv: echo:Settings Stored (380 bytes)
Recv: ok

You should now have a working z-probe!

Designing this thing has been a very long process The videos below show earlier versions of the z-probe concept, which you can read more about in previous posts.


Leave a Reply

Your email address will not be published. Required fields are marked *