Posted on Leave a comment

Setup E3D Chimera/Dual Head on Duet WiFi/RepRapFirmware – and watercooling intro

Some time ago I bought the, at the time, new E3D Chimera+ Watercooled hotend and some extra stuff for it.

(sorry, misplaced photo of unpacked new Chimera+. I’ll see about digging some up!)

I’ve had a bit of issues getting it up and running as the first pump/Reservoir combo I bought from China didn’t work.

A reservoir is just a container where extra water is stored to make sure the system doesn’t run low. It also makes it easier to fill up and maintain, and catch the air/bubbles the bubbles you always have in a new watercooled setup. All of these things can be done without a reservoir, but it makes it a lot easier to get going and easier to maintain and keep a look on waterlevel.

I’ve done a lot of custom watercooling on computers, servers and rack equipment (yes, you can watercool a switch and U1 server), so went into the basement to find some spare equipment.

So, why did I buy a Chinese pump when I allready had a lot of watercooling equiptment the smart reader might ask, and the answer is simply that I figured my pumps were far too powerfull, and yes, they were still too powerfull when I looked at them again, hehe.

My tubings also didn’t match precisely, which I could have worked around and I needed to print some Nylon barbs to work as an adapter from E3Ds bowden solution to the tubes – You can now buy a Water-cooling barbed adapter kit seperately from E3D, which you couldn’t at the time of my purchase… I could do all this, but I still needed a new pump and reservoir.

I could buy a new pump/reservoir combo from China and wait one more month and hope it worked this time…

Or I could buy the Watercooling kit from E3D and get going. This would also make it possible for me to get a look at their new stuff and document it for you in the form of STEP files on GrabCad.

  1. Prelude
  2. Configure RepRapFirmware
  3. Tool Definition
    1. Tool0
    2. Tool1
    3. Tool definition section code
  4. BLTouch offset from Nozzle0
    1. Mesh Grid
    2. The combined section code is like this
  5. Calibrate BLTouch for Z-offset
    1. Find Z-Offset
  6. Define Leadscrew coordinates for Autolevel
      1. How to use it
      2. X coordinates for M671
      3. Y Coordinate for M671
      4. The combined section code is like this
  7. Setup probe coordinates in bed.g

2) Configure RepRapFirmware

Since I’m using my new xBot Chimera+ Watercooled Carriage I need to both setup a new Tool (the second nozzle) which encludes configuring nozzle distance from each other, configure BLTouch placement in regards to my Nozzle, and reset my Z-offset of my BLTouch. Finally I’ll need to redo the coordinates used to do my probing sequce to autolevel my bed.. yes, it’s a lot actually, but taking it one step at a time, and it’s usually not really that hard.

I’ll recommend writing down what you do, if you are like me and work well with having documented what you do and what to do. 
Regardless of the details of your documentation I’ll strongly recommend you do not delete or change existing setup lines, but instead comment them out using ; and create a new line of code, for your new setup.

3) Tool Definition

Lets first add a new tool using M563 for our second nozzle by editing the config.g file. This includes defining which heater and extruder we are going to be using as well as the relative position it has to the first nozzle.

You can name the Tools if you like, which will show up in your web display. I’ve named them Nozzle1 and Nozzle2 respectively.

3.1) Tool0

First tool is Tool 0 (P0), using Extruder 0 (D0) and Heater 1 (H1)
M563 S"Nozzle1" P0 D0 H1 ; Define tool 0
The Tool ofset is defined using G10 and in relation to the origin of the head. I might have used the point between the two nozzles as the origin and defined offset as -10 and +10 on the X axis respectively, but I’m going to be using Nozzle 1 as the origin. This means the offset coordinates for Tool0 are all just 0.
G10 P0 X0 Y0 Z0 ; Set tool 0 axis offsets

3.2) Tool1

The second nozzle looks like: Tool 1 (P1), using Extruder 1 (D1) and Heater 2 (H2)
M563 S"Nozzle2" P1 D1 H2 ; Define tool
The offset of the second nozzle to the first one is +20 on the X axis, so it will look like this:
G10 P1 X20 Y0 Z0 ; Set tool 1 axis offsets

Note on Fans: If you use the default recommend fan0 as print object cooling fan, you do not need to define a fan.


3.3) Tool definition section code:

; Tools
; P = Tool Nr
; D = Extruder Drive nr
; H = Heater used
M563 S"Nozzle1" P0 D0 H1 ; Define tool 0
G10 P0 X0 Y0 Z0 ; Set tool 0 axis offsets
M563 S"Nozzle2" P1 D1 H2 ; Define tool 1
G10 P1 X20 Y0 Z0 ; Set tool 1 axis offsets

4) BLTouch offset from Nozzle0

Next up we need to modify the BLTouch position in relation to the Head Origin, which in our case is the first nozzle Tool0.

It is our G31 in the config.g we need to modify. Just leave the Pnnn value as is.

The BLTouch is placed 10mm to the right of the nozzle, which is X10 and 24,26mm in front of the nozzle, which translates to Y-24.26.

Important: Do not use , as normal in metric systems when denoting decimals when defining the gcode.

We are going to set Z offset to 0, and setup this again later to match our new carriage.

This means our (base) G31 looks like this:
G31 P600 X10 Y-24.26 Z0 ; BLTouch offset in relation to Tool0

4.1) Mesh Grid

My Mesh grid is spanning the area from X5,Y5 up to X205,Y165 and probing every 10mm.

Tip: When doing initial setup of the Bed I like to make the probing distance larger, at 20mm to get a rough map to use for manual adjustment.

It means my M557 looks like this:
M557 X5:205 Y5:165 S10 ; Define mesh grid

4.2) The combined section code is like this:

; ## Nozzle Distance from BED - Offset. Higher value, closer to bed.
; Set Z probe trigger value, offset in realtion to nozzle and trigger height adjustment
G31 P600 X10 Y-24.26 Z0 ; Zero offset
M557 X5:205 Y5:165 S10 ; Define mesh grid

5) Calibrate BLTouch for Z-offset

Previously we reset the Z offset using G31 to Z, so it now looks like this:
; ## Nozzle Distance from BED - Offset. Higher value, closer to bed.
; Set Z probe trigger value, offset in realtion to nozzle and trigger height adjustment
G31 P600 X10 Y-24.26 Z0 ; BLTouch offset in relation to Tool0

So, lets go find the proper Z offset:

5.1) Find Z-Offset

  1. Move your sensor to around the middle of the bed. You might even want to make a Macro for this, as it can be usefull for many different cases.
    1. Herer’s a simply macro I named Move to Centerbed, where I home X and Y first:
      G28 XY
      G1 X97 Y120 F4000 ; Move probe to middle of bed
      G28 Z

      We need to home Z before we can continue, or it fails to test properly after firmware 1.21
  2. Move Z untill your nozzle is about 10cm (4 inches) from the bed.
    1. Be ready to click the Emergency Stop in case the probe misbehaves.
    2. Now issue G30 command.
    3. Your BLTouch should now send the Pin Down and your bed should now move up (or nozzle down) untill the BLTouch is triggered.
    4. Hit the Emergency Stop if it didn’t stop or the Pin didn’t drop down.
      1. Go through your deployprobe.g if the Pin didn’t drop down.
  3. With #2 successfull you put your sensor over the middle of the bed and jog Z axis untill your nozzle is touching the bed.
    1. Note: If it refuses to move as it has reached Z-minima you can type in G92 Z5 to tell it, that you are 5mm from Z=0.
  4. Once your nozzle just touched the bed tell the machine we are at Z=0 by issuing:
    G92 Z0
  5. Move Z 10mm away from nozzle
    G1 Z10
  6. Now send G30 S-1 at which point the Pin drops down and the z-axis closes the gap until the BLTouch is triggered.
    1. Z now stops moving and reports the current position without changing anything. Note down the reported value.
  7. You might want to repeat the steps 4-6 a few times to insure consistency. I personally just did it 2 times and later did final adjust by looking at print starts.
  8. Mine reported the following:
    G30 S-1
    Stopped at height 2.4mm
  9. I should insert 2,4mm now, but I’ll detract 0,2 as a safety margin, so I’ll change the Z parameters in the G31 line from 0 to 2.2.
    G31 P600 X10 Y-24.26 Z2.2
    Important: The higher Z value the closer you move the nozzle and bed to each other! It’s better to have a value too low here than too high to avoid the nozzle and bed doing a mating game when homing.
    Important: If you later redo the offset method you should reset the offset to Z0 before starting or it might lead to strange results I’ve found on some occasions.

6) Define Leadscrew coordinates for Autolevel

Since the xBot is using 3x independent motors for our Z axis we need to define the coordinates of the leadscres in relation to the hotend and carriage combination we are using.

This can be a bit harry, but lets start by looking at the xBot Probe Point Helper Drawing I made for this purpose:

The Drawing is not made specifically for the my current xBot Carriage Chimera+ Watercooled but instead lising the dimensions in relation to the rear center manual finger screw. I did it this way to make it easier for people to use their own favorite carriage and hotend solution.

If you want indepth explanation on what I’m doing here, you should read the section on Z-Leadscrew Placement.

6.1) How to use it:

Before starting you should check if your X and Y -maxima coordinates should be changed. I needed to change mine.

Now home your X and Y axes, then move your carriage to the center rear, so BLTouch is lined up to the rear fingerscrew.
The position reads as X97 and I measure the BLTouch to be placed 20mm in front of fingerscrew, meaning my nozzles are actually placed exactly at my Y-Maxima, which is Y215.

6.2) X coordinates for M671

First leadscrew

Front right is placed 153,6mm to the right of the center rear fingerscrew.

Since my center is X97 it amounts to: 97+153,6 = 250,6 for first X coordinate.

Second leadscrew

Front left is placed 153,6mm to the left of center.

So 97-153,6 = -56,6 for second X coordinate.

Third leadscrew

Rear center is placed at the center, so we use 97 for our third X coordinate.

This adds up to the first part of the M671 line, which looks like this so far:
M671 X250.6:-56.6:97

6.3) Y Coordinate for M671

First Leadscrew

Front right is placed 241,1mm in front of the rear center leadscrew, which has the coordinate Y215 since my Nozzles are exactly on top of it and it corresponds to my Y-Maxima

So we take the Y position 215 and detract 241,1, which gives us 215-241,1 = -26,1 for our first Y coordinate

Second Leadscrew

This is placed at the same point on the Y axis as the first leadscrw, so -26,1 for our second Y coordinate

Third Leadscrew

This on is placed 63,5mm further out the Y axis, so:

215 + 63,5 = 278,5 for our third Y coordinate

When adding the Y coordinates to our M671 codeline we get the following:
M671 X250.6:-56.6:97 Y-26.1:-26.1:278.5 S3

The trailing S3 defines maximum correction the leadscrews can do. Default is 1.

6.4) The combined section code is like this:

; Define the X and Y coordinates of the leadscrews.
; Must come after M584, M667 and M669
; S = Maximum correction
; Motor order: Front right, front left, rear center.
; Snn Maximum correction to apply to each leadscrew in mm (optional, default 1.0)
M671 X250.6:-56.6:97 Y-26.1:-26.1:278.5 S3

7) Setup probe coordinates in bed.g for G32

Now its sime to review our bed.g file to see if it’s still valid.

It’s not really crucial where you probe, but you should try to make the probe points as close to each leadscrews as possible.

I set all mine to 2mm from min and max for each axis.. just in case a wire or something got between my carriage and the printer edges.

The Third point needs to take into account how BLTouch is placed 20mm in front of the nozzles, as it wouldn’t be able to probe at Y215 but at best at Y190. I’ve deducted the extra 2mm and landed on Y188.

It might be a bit fiddly to figure it out, as the actual probing coordinates is for the nozzle, so can be confusing when looking at it.

; bed.g
; Called using G32
; Called to perform Autolevel using 3-point probe
M561 ; clear any bed transform
; Made allowances for BLTouch being up to 30mm in front of nozzle. Typical is 27mm+/-
Probe 3-point
M401 ; Deploy probe - deployprobe.g
G30 P0 X207 Y2 Z-9999 ; Front Right
G30 P1 X2 Y2 Z-9999 ; Front Left
G30 P2 X97 Y188 Z-9999 S3 ; Center Rear
M402 ; Retract Probe - retractprobe.g

Posted on 18 Comments

BLTouch on Duet WiFi – Configuration and usage

In a previous post we connected our BLTouch sensor physically to the Duet hardware and made some basic configurations as well.

In this post I’ll talk about Probes and Sensors interchangeably and will be using the BLTouch name/model during this post, as that is the one I’m using to test this.

If you want to read a bit of an intro into the differences between autolevel and autocompensation, I wrote a brief section about this in Is this autolevel?

I’ve had some correspondence with a lot of peopleduring the writing of this post and I’ve come to understand that I need to specify the printertype I’m talking about here. My printers, which I’m using as basis for this post are:

  1. A box type printer with fixed XY gantries at the top, working together using the cross method to move a carriage around (like an Ultimaker and my xBot), and using a single z-motor to lift the z-gantry containing the printing bed surface.
  2. My xBot which uses the same XY cross-method, but has 3 seperate Z motors for the Z axis, making it possible to adjust it automatically for true autolevel.

You can still use all information even if you are using a Tower printer (like Prusa etc), but I am going to be referring to the two machine models above throughout this post.

i know very little about Delta machines, so I haven’t written with those machines in mind. Donate a Delta and I’ll write some how-tos on it ?

In this blog-post I’ll try to go through different types of more complete configurations and usage scenarios like:

  • Setup BLTouch in Config.g including defining Mesh Grid to probe using M557.
  • Doing a Mesh Grid Probing sequence using G29
  • Doing a Basic Single Probe using G30 before print start.
  • Doing an Advanced Probing sequence using G32 for Autolevel
  • Setup Slizer Startup Gcode to apply our Mesh Grid to the z-plane after doing the Autolevel Probing.
  1. Using a Probe – Intro and Explained
    1. Auto Bed Compensation drop-down menu walkthrough
    2. Summing up
    3. Usage
  2. Wiring of BLTouch
    1. Probe switch function
    2. PWM Channel for Servo Function
    3. Duex owners
  3. Configuring BLTouch
    1. Create a deployprobe.g and retractprobe.g file
    2. Create a BLTouch Macro Group
  4. Change config.g file
    1. Disable Heater to free up PWM pin
    2. Change Endstop Settings
    3. Define Probe Type
    4. Probe Position
    5. Define Mesh Grid
  5. Total Configuration – Summing up
      1. Config.g changes
      2. New Configuration files
      3. Macros
  6. Calibrate our sensor
    1. Find Z-Offset
    2. Run Mesh Grid Compensation sequence
    3. Save Custom named height maps
  7. Before Printing
    1. Homez.g
    2. Homeall.g
    3. Slizer startup gcode
  8. Multi Z-motor setup using bed.g
    1. Z-leadscrew placements
    2. Define XY Coordinates in config.g
    3. Lets have a look at Homing using a Probe
      1. Slizer Startup and Endcode Examples
      2. Single Z-Motor Machine
      3. Triple Z-Motor Machine
  9. Gcodes used

Using a Probe – Intro and Explained

When adding a Z-probe to your 3D Printer it also means introducing a lot of new terms and it requires a fair bit of setup to do and gcodes to learn to use.

Most printers just have some sort of basic limit switch or maybe a hall or IR -sensor for X, Y and Z. This means a G28 command is enough to home all axes.

When using RepRapFirmware a basic homing sequence requires 4 files to work:

  1. homex.gG28 X
  2. homey.gG28 Y
    1. By issuing: G28 XY you can opt to home X and Y at the same time without Z.
  3. homez.gG28 Z
    1. This command will just home Z without the X and Y axes.
  4. The homeall.g file, which is executed using G28 without specifying any axes afterwards.
    1. This file normally homes all axes your machine might have.

Important: When using a Probe located on Z-min (at your nozzle) and using the most basic/normal probetype with 1x Z-motor using Mesh Grid Compensation the Z-Max endstop will be disabled regardless of any virtual axes you might make to get around this issue! 

I am told that his is not the case when using a Delta type Printer. I am not familiar with Delta configurations.

If you have 2 or more individual Z-motors and have configured Auto Bed Compensation in combination with Mesh Grid Compensation a Z-max endstop is mandatory (is it really?) in order for the Printer to calculate your Z plane accurately.

In order to use a Probe we need to configure it using several new M/Gcodes, which we go through below.

We also get a new arsenal of Gcodes to use during startup, and we can use the various functions in the Auto Bed Compensation drop down menu in our web gui:

Auto Bed Compensation drop-down menu walhthrough

  • The actual button Auto Bed Compensation constitutes a G32 which can only be used if you have 2 or more independent Z-motors.
    • When issuing a G32 command, the bed.g macro file is executed.
    • I don’t know how to make the “Show Probed Points” active?
  • The Disable Bed Compensation is used if you have  Auto Bed Compensation in effect but want to disable it.
    • This can also be done by issuing the M561 command which cancels any bed-plane changes you might have in effect by probing (or anything else).
    • The M561 is also placed first in the bed.g file before doing a new Auto Bed Compensation run.
  • G29 – Run Mesh Grid Compensation – Performs a Mesh Probe which is saved to a heightmap.csv file.
    • By probing the bed you automatically enable it as well.
    • You can use custom names. More on this later.
  • The Show Mesh Grid Heightmap displays the grid performed by G29 graphically.
  • The Load Heightmap from SD Card constitutes a G29 S1 command, which you would typically place in your startupgcode file in your slizer after the probing sequence.
  • Disabled Mesh Grid Compensation equals G29 S2 and stops the printer from using the heightmap.

Before we can run G29 we need to define the mesh to probe, which is done via M557 in our config.g file, which we will further down in this post under Define Mesh Grid.

Summing up

  • We setup and configure our Probe/Sensor in config.g
  • Bed.g is only used if we have 2 or more  independent Z-motors. Tower printers would use this method if the Z motors are using seperate drivers.
  • The bed.g file is used to define probe points using M671 in relation to our Z-motors.
  • The bed.g file is not used if we do not have more than 1 independent Z-motor.
  • You can even have multiple differently named heightmaps to use, if you for instance have different plates for different materials.


  • M561 should always be used before running a new probe sequence of any kind.
  • We use G30 (without parameters) to do to the Z-min probe as defined by G31 in the config.g file
  • If we have 2 or more independent Z-motors we use G32 to do the probing sequence as defined in the bed.g file.
  • Any Heightmaps you want to use is loaded after you have finished your probing sequence.

Wiring of BLTouch

We can seperate the 5 wires of the BLTouch into 2 seperate groups:

  1. Probe switch function:
    The Black (GND) and White (Signal – Z Probe IN) which connects to the Probe Connector on the Duet Controller.

    Note: My “white” wire is red on this photo.
  2. PWM channel for Servo Function.
    The Brown (GND), Red (+5v) and Yellow(PWM) goes either onto  a PWM/Servo connector on a Duex board or we use 3 pins in the 40-pin expansion-connector.
    Note: Regardless of wheter we use a Duex or not, I am going to be using Heater7 in my setup examples, which is PWM channel 5. I do this as it is the last one, so it’s easy to remember and it is physically the PWM channel on Duex which sits closest to the edge of the board.
  3. Here is he complete overview of pins used if you do no have a Duex board.

    1. For Duex owners, the Heater7/PWM5 is the connector you see on the middle left side here and the upper one is the Probe connector on the Duet Controller.

      Note: On the photo I have a resistor installed in the Probe Connector. This is necessary if you are using one of the older BLTouch models without the trace you can cut on the rear of it, to make it run 3.3v logic.
      Note: I had a machine where I thought I had cut the trace, but it wasn’t cut all the way, but it still worked, so you might be able to skip this. Ie mine worked fine even though it was still setup as running 5v logic, which means it was still without correct readings it seemed.

Configuring BLTouch

Now that we have everything hooked up, we need to setup our firmware to be able to use it. This includes creating some files and editing config.g and in some cases also bed.g

Create a Deploy and Retract file

Regardless of setup we need to create a deployprobe.g  and a retractprobe.g file.

  • Deployprobe.g
    M280 P7 S10 I1
  • Retractprobe.g
    M280 P7 S90 I1
    These files are used to execute our probe as needed.

Note: If you use Duex2/5 you do not need the i1 parameter

Create a Levelplate Macro Group

This is not strictly necessary, but really usefull, so go to your Macro area and create a new Directory named BLTouch.

Now we create some macros as shown:

  • Alarm Release + Pin UP
    M280 P7 S160 ; Alarm Release and Push-Pin UP
  • Pin Down
    M280 P7 S10 ; Send PWM channel 7 the s10 (angle) command
  • Pin Up
    M280 P7 S90 ; Send PWM channel 7 the S90 (angle) command
  • Self-Test
    M280 P7 S120 ; Send PWM channel 7 the S10 (angle) command

You might want to create some more macros to quickly run your probe to the center of your bed and each corner etc.

Change config.g file

We need to make some changes in our config.g file in order to make use of our probe.

Please note that some or all of these entries exists in your config.g file alrleady if you used the RepRapFirmware online configurator to create your files.

Disable Heater 7

We use M307 to disable Heater 7 to free up the PWM5 channel for our servo (probe).

I’ve put this down with my oher Heater settings for hotend (M301) and heated bed (M307) in the config.g file.
; BLTouch - Heaters
M307 H7 A-1 C-1 D-1 ; Disable the 7th Heater to free up PWM channel 5 on the Duex board.

Change Endstop Settings

Next up we need to change our Endstop Settings, which is done using M574 gcode

It might look something like this now:
M574 X1 Y2 Z2 S1 ; X home to min. Y and Z home to max. Normally Closed limit switches.
We need to remove the Z2 from this line, and add a new line defining Z as using a probe.

The two new lines are going to look like this:
M574 X1 Y2 S1 ; X home to min. Y home to max. Normally Closed limit switches.
M574 Z1 S2 ; Define Z to use Probe. Home to Min

Define Probe Type

Next up we define our probe type using M558, which is Type 5 in our case:

  • P is probe type
  • H is diveheight, which means how far bed moves down/hotend up, between each probes
  • F is the speed of bed up/down movement. If it’s too slow the Probe pin might hit the bed and cause an error.
  • T is the movement speed between probepoints.
  • The X, Y and Z denotes which axes are used by the probe. X and Y are not used, while Z is.

M558 P5 H5 F500 T4000 X0 Y0 Z1 ; Set Z probe type/mode 5. H=Dive Height. F=Speed the bed moves

Probe Position

Next up we use G31 to define the Sensor’s offset from the nozzle in XY and the Bed in Z.

My carriage with hotend and BLTouch looks like this seen from below.

As you can see, the BLTouch is placed:

  • X is directly in line with the nozzle (X0)
  • Y is -25.3mm in front of nozzle (Y-25.3)
    • Note: if you build my xBot it most likely is further away due to the nature of the Carriage.
  • We start with a Z offset of 0.0mm in regards to actual probe activation and factual distance. This value will be adjust later on, to match our setup.
    • Important: It is important to have Z-offset at 0 before calibrating.
  • P is the value needed to trigger the BLTouch. I’ve seen and tried a lot of different values between 25 and 600 and havn’t noticed any difference. But put a pin on this one in case your probe results are inconsistent.

G31 P25 X0 Y-25.3 Z0.0 ; Z probe trigger value, offset in relation to nozzle. And trigger height adjustment

Define Mesh Grid

Next up we use M557 to define the grid on our printbed we want to probe, in order to create a Mesh the controller can use to compensate for surface inaccuracies.

We start by typing M557 then define start and end points on our X and Y axes. Example below shows how we probe from X5/Y5 to X205/Y165.

The Snn parameter defines the spacing between each probe point, where we have defined it to probe with 20mm interval.

Hint: It can be useful to start out with a big interval like 40mm, to make the probing sequence faster, and it is useful to do some manual leveling based on the probing result.
Afterwards, if you have individually driven motors, you do a fine mest for auto compensation when you can’t manually adjust it any better.

Note: There is a maximum of 400 points available for probing, so making it too fine will result in an error. If you get an error, try raising the Snn parameter.

M557 X5:205 Y5:165 S20 ; Define mesh grid

You could do your Mesh Probe sequence now, but it’s important to calibrate your BLTouch first, by calculating the Z-offset

Total Configuration – Summing up

  • Config.g changes Lets combine all our code snippets and put them in our config.g file at your current Endstop section.
  • M574 X1 Y2 S1 ; X home to min. Y home to max. NC microswitches.
    M574 Z1 S2 ; Define Z to use Probe. Home to Min.
    M558 P5 H5 F500 T4000 X0 Y0 Z1 ; Set Z probe type/mode 5. Not using on XY, but using it on Z.
    G31 P25 X0 Y-25.3 Z0.0 ; Z probe trigger value, offset in relation to nozzle. And trigger height adjustment
  • Disable the Heater PWN channel to free it up for our usage:
    ; BLTouch - Heaters
    M307 H7 A-1 C-1 D-1 ; Disable the 7th Heater to free up PWM channel 5 on the Duex board.
  • New Configuration Files
    Regardless of how your setup looks we also created a deployprobe.g  and a retractprobe.g file.

    • Deployprobe.g
      M280 P7 S10 I1
    • Retractprobe.g
      M280 P7 S90 I1
      These files are used to execute our probe as needed.

Note: If you use Duex2/5 you do not need the i1 parameter

    • Macros
      While not strictly necessary it comes in very handy to have created these:

      • Alarm Release + Pin UP
        M280 P7 S160 I1 ; Alarm Release and Push-Pin UP
      • Pin Down
        M280 P7 S10 I1 ; Send PWM channel 7 the s10 (angle) command
      • Pin Up
        M280 P7 S90 I1 ; Send PWM channel 7 the S90 (angle) command
      • Self-Test
        M280 P7 S120 I1; Send PWM channel 7 the S10 (angle) command
      • It isalso very usefull to creeate macros on various places on your bed. Ie in the front corners, center of bed and center rear and so on, depending on your setup.

Note: If you use Duex2/5 you do not need the i1 parameter

Calibrate our sensor.

Now is the time to define the Z-offset parameter in the G31 command in our config.g which looks like this right now:

G31 P25 X0 Y-25.3 Z0.0

Find Z-offset:

  1. Move your sensor to around the middle of the bed. You might even want to make a Macro for this, as it can be usefull for many different cases.
    1. Herer’s a simply macro I named Move to Centerbed, where I home X and Y first:
      G28 XY
      G1 X100 Y120 F4000 ; Move probe to middle of bed
  2. Move Z untill your nozzle is about 10cm (4 inches) from the bed.
    1. Be ready to click the Emergency Stop in case the probe misbehaves.
    2. Now issue G30 command.
    3. Your BLTouch should now send the Pin Down and your bed should now move up (or nozzle down) untill the BLTouch is triggered.
    4. Hit the Emergency Stop if it didn’t stop or the Pin didn’t drop down.
      1. Go through your deployprobe.g if the Pin didn’t drop down.
  3. With #2 successfull you put your sensor over the middle of the bed and jog Z axis untill your nozzle is touching the bed.
    1. Note: If it refuses to move as it has reached Z-minima you can type in G92 Z5 to tell it, that you are 5mm from Z=0.
  4. Once your nozzle just touched the bed tell the machine we are at Z=0 by issuing:
    G92 Z0
  5. Move Z 10mm away from nozzle
    G1 Z10
  6. Now send G30 S-1 at which point the Pin drops down and the z-axis closes the gap until the BLTouch is triggered. Z now stops moving and reports the current position without changing anything. Note down the reported value.
  7. You might want to repeat the steps 4-6 a few times to insure consistency. I personally just did it 2 times and later did final adjust by looking at print starts.
  8. Mine reported the following:
    G30 S-1
    Stopped at height 0.980 mm
  9. This means I’ll change the Z parameters in the G31 line from 0 to 0.98.
    G31 P25 X0 Y-25.3 Z0.98
    Important: The higher Z value the closer you move the nozzle and bed to each other! It’s better to have a value too low here than too high to avoid the nozzle and bed doing a mating game when homing. 
    Important: If you later redo the offset method you must set the offset to Z0 before starting or it might lead to strange results I’ve found on some occasions.

Run Mesh Grid Compensation sequence

Now that we have all our parameters in place we can run a Mesh Probe Sequence by clicking the “Run Mesh Grid Compensation” via the Drop Down Menu, or just type in G29

This Mesh Grid consists of a lot of X, Y and Z coordinates. It can be very helpfull to use this to do some manual adjustment of the Z plane. Ie, meaning you try to make your printbed as level as possible manually by running some faster rougher sequences, and then use a final high resolution mesh sequence when done.

The first Mesh Probe sequence I ran at 11:23 had a mean error of 0.182 and a deviation of 0.084. In normal words the rear bed was a tad higher than the front, so I gave the center rear screw half a turn and did the sequence again. This time the mean error went down to 0.077 and the deviation also decreased a good deal.

You can hover the mouse over the probe points to see the XYZ coordinates.

By Running the mesh grid compensation sequence by either clicking in the menu or typing G29 it will be saved into the file heightmap.csv and be activated.

Save Custom named height maps

If you use multiple different surfaces as I do, you might want to have several heightmaps on hand.

You can use M374 to save the heightmap with a different name than the default heightmap.csv. Below I’ve saved the heightmap as “bareplate.csv” as this is directly onto the surface of my PEI-Coated aluminium plate.

I’ll be making different files for when I’m using glass for printing Nylon, FlexiPlate for PLA and so on.

In order to use one of our custom named heightmaps we can not just use G29 S1 to load the default map, but instead we use M375 to call up our desired height map:
M375 P"bareplate.csv"

Before Printing

Before we can wrap up our configuration we need to adjust our homeing files to match.


The Gcode G30 is actually enough to deploy the probe and make your Z axis home. I’ve added a line to move the bed to Z=10 after probing like so:

; Homez.g
G30 ; Do a single probe to home our Z axis
G90 ; Make sure we are in absolute mode

G1 Z10 F6000 ; Rapidly move the Z axis to Z=10.

The G30 just probes and set Z to 0. The Offset we configured previously adjust the distance to match.


I’m a bit confused here actually as it seems the machine uses homeall and then issue homez even if we havn’t made references to it in the homeall.g file.

Can anyone shed light on this behaviour?

Slizer startup gcode

In order to actively be using our Mesh and use the Sensor when we print, we need to add some lines to our slizer’s startup gcode

  • Here I’m first homing my X and Y axis.
  • Then clearing any Bed Transform I might have in place, as it would otherwise affect the probing.
  • I’m then moving the probe to be at the middle of the bed. If it oozes, you might want to omit or change this.
  • I’m then issuing the G30 command which brings my Z axis to close the distance between nozzle and bed and do the single probe.
  • Now it’s time to load the heightmap we have created previsouly using our Mesh Grid. It is important this comes after the bed probe.
    • You either use G29 S1 to load the default heightmap.csv or you use the M375 to load a custom heightmap.
    • I’ve loaded my custom heightmap below.
  • Finally I’m moving the Z to 20

G28 XY ;Home XY
M561 ; Clear any bed transform that might be in place
G1 X104.5 Y130 ; Move Probe to middle of bed
G30 ; Do a single probe
M375 P"bareplate.csv" ; Load my custom heightmap. Otherwise use G29 S1
G1 Z20.0 F6000 ; Move Z to 20

Multi Z-motors setup using bed.g

Now we have all the common stuff in place we are ready to look at the functions where we use the bed.g file to define how our individual Z-motors are placed and react when probing.

Note: Remember I’m talking from a Box Printer perspective here, but you can use it just fine for Tower Printers  just keep my references in mind!

In order to use the multi z-motor functione we use he multi-probe gcode G32 when homing Z, which calls on the macrofile bed.g where we have multiple probe points instead of just using the single probe point defined via M557 in our config.g file, using the single-probe command G30.

Z-Leadscrew placements

In order to put in some meaningfull coordinates in bed.g we need to know where our Z-leadscrews are in relation to our probe.

Here we can see the placement of my 3 leadscrews on my xBot printer, in relation ot the fingerscrews on my bed.

I used the rear center screw to pinpoint the exact XY coordinate of the probe in relation to the screws.

The numbers in the red circles are the placement and numbering of my Z-motors, while the square boxes indicates the coordinate and probe sequence of my bed.g file.

  • The bed.g starts by issuing a M561 to clear any bed-plane fitting/transform we might have in place by a previous probing.
  • Next we clear any heightmap we might have in effect as the height map should only be loaded after performing our bed leveling probe sequence.
  • Deploy our probe using M401 which simply call on our deployprobe.g we created earlier.
  • Now we come to the business of defining where we probe our bed. We issue the G30 command 3 times, starting with motor 1 through 3.
  • It is 3 times as I have 3 independent Z motors.
    • Important: It is very important we use same sequence as we will be defining the leadscrews in our config.g (next step) file using M671
  • The S3 we have listed after our third line of G30 is crucial to the function, as it must be equal to the number of probe points/individual leadscrews we are using.
    • The strange Z-9999 is there as a Z value less than -9999 causes the machine to probe at the current point to get Z, rather than using the given value.
    • If an S field is specified (e.g. G30 P2 X100 Y165 Z-9999 S3) the bed plane is computed for compensation and stored which is exactly what we want here!
    • if using a Tower Printer with 2 individual Z motors, you would put S2 after the last line instead.
  • Now that we have probed one time pr leadscrew and set it up for computation we retract our probe using M402, which just calls our retractprobe.g file.

; bed.g
; Called using G32
; Called to perform True Autolevel using 3-point probe
M561 ; clear any bed transform
G29 S2; Clear bed height map

; Probe 3-point
M401 ; Deploy probe - deployprobe.g
G30 P0 X200 Y0 Z-9999 ; Front Right
G30 P1 X0 Y0 Z-9999 ; Front Left
G30 P2 X100 Y165 Z-9999 S3 ; Center Rear
M402 ; Retract Probe - retractprobe.g

Define XY Coordinates in config.g

When using the bed.g file to setup multiply points to probe in relation to the leadscrews, we need to define the XY position of the leadscrews in our config.g file.

These coordinates will be outside our printing area and can as such be much higher and even have negative values.

In order to define these, we use the M671 which I’ve placed above my Endstop section in the config.g file.

We obviously also need to know where our leadscrews are placed in relation to our nozzle, for which I’ve made this drawing:

The coordinates we fill in using M671 are the XY coordinates placed at each of the round numbers, in that order.

Remember you can do this with just 2 individual Z-motors, and as such do not need 3 for full autolevel. Using 2 motors will only level the bed on one axis though, but that is still very neat.

The actual syntax used here is a bit strange as we start by issuing the M671 command, then type the axis in question (X at first), followed by the 3 X coordiantes, seperated by :
Next up we do the same with the Y coordinates and terminated by the optional S3 parameter – not to be confused by the S3 we used above!

I used 3mm in the S as I had some issues with Z sync not working as I wanted it to do. It’s defaulting at S1, so you might do fine without specifying anything for S.

; Define the X and Y coordinates of the leadscrews.
; Must come after M584 (Set drive mapping), M667 (Select CoreXY Mode) and M669 (Choosing Kinematics type)
; Motor order: Front right (1), front left (2), rear center (3).
; Snn Maximum correction in mm to apply to each leadscrew (optional, default 1.0)
M671 X256.6:-53.6:100 Y239.10:239.1:65.50 S3

Lets have a look at Homing using a Probe

Now everything is setup according to our system and we are ready to do an autolevel for the first time.

I’m writing Autolevel as my machine is doing an actual true autolevel. If you use 2 z-motors you “only” level it on one axis where as the Mesh Grid applied after the autolevel is our Auto Compensation.

You need to have homed the X and Y axes before starting, but aside from this, you only really need to type in G32 to do the magic.

It will do a probe sequence on the 3 coordinates defined in the bed.g file and calculate the Z-plane based on these measurements and coordinates of the leadscrews as we just defined in our config.g using M671

If you wonder, my homez.g file just home using a single probe action and rapidly moves the bed down again. I have this in place if I want to redo offset.
; Homez.g
G91 ; Relative Positioning
G90 ; Absolute Positioning
G1 Z20 F4000

Slizer Startup and Endcode Examples

As a rounding up on this post I’m posting my start and end codes on 2 machines:

Single Z-Motor Machine

I’m using Cura as my slizer, so I do not need all the “wait for temperature” gcodes of some other slizers, as these are automatcially in place – except for Chamber Heater, which you must add manually if using such a one.

; Startup Gcode
G91                        ; Relative Positioning
G1 Z-1                     ; Move Z down 1mm
G90                        ; Absolute Positioning
G28 XY                     ; Home XY
M561                       ; Clear any bed transform
G1 X104.5 Y130             ; Move Probe to middle of bed
G30                        ; Do a single probe
M375 P"flexiplate.csv"     ; Load heightmap (you can use G29 S1 instead)
G1 Z20.0 F6000             ; Move Z to 20
G1 X5 Y5                   ; Move Head to front left
G92 E0                     ; Zero Extruder
G1 F200 E15                ; Prime the extruder
G92 E0                     ; Zero Extruder


; End Gcode
G10 P0 R-273.15 S-273.15     ; Turn off Tool0
G10 P1 R-273.15 S-273.15     ; Turn off Tool1
M140 S-273.15                ; Turn off Bed
M106 S0                      ; Object fan off
G1 Z210                      ; Move Z to Z210
G92 E0                       ; Zero Extruder
G1 E-2 F300                  ; Retract 2mm
G92 E0                       ; Zero Extruder
G28 XY                       ; Home XY
M84                          ; All motors Off

Triple Z-Motor Machine

And my startup gcode for my xBot triple Z-motor machine.

; Startup Gcode
G91                      ; Relative Positioning
G1 Z-1                   ; Move Z down 1mm
G90                      ; Absolute Positioning
G28 XY                   ; Home XY
M561                     ; Clear any bed transform
G1 X104.5 Y173           ; Move Probe to middle of bed
G32                      ; Start 3-point probe sequence
M375 P"bareplate.csv"    ; Load heightmap
G1 Z20.0 F6000           ; Move Z to 20
G1 X5 Y5                 ; Move Head to front left
G92 E0                   ; Zero Extruder
G1 F200 E20              ; Prime the extruder
G92 E0                   ; Zero Extruder

My Endcode for xBot

In this one I home it to XY and U. The U is my virtual axis I’ve made for Z in order for it to be able to home to Z max, which I can’t otherwise do.

This doesn’t work with the setup for the single Z-machine. I have not yet had time to see if I can get around this, by using bed.g even though I don’t need it for that one.

; End Gcdoe
G10 P0 R-273.15 S-273.15   ; Turn off Tool0
G10 P1 R-273.15 S-273.15   ; Turn off Tool1
G10 P2 R-273.15 S-273.15   ; Turn off Tool2
M140 S-273.15              ; Turn off Bed
M141 S-273.15              ; Turn off Chamber Heater
M106 S0                    ; Object fan off
G92 E0                     ; Zero Extruder
G1 E-2 F300                ; Retract 2mm
G92 E0                     ; Zero Extruder
G28 XYU                    ; Home XY and U to Z max
M84                        ; All motors Off


Gcodes Used

Here’s a list of (some of) the M and Gcodes introduced in this post:

  • G28
  • G29 – Detailed Z-Probe
  • G30 – Single Z-Probe
  • G31 – Set or Report Current Probe Status
  • G32 – Probe Z and Calculate Z-Plane


  • M280 – Set Servo Position
  • M374 – Save height map (with alternate name)
  • M375 – Load (custom) height map
  • M557 – Set Z Probe point or define probing grid
  • M558 – Set Z Probe Type
  • M561 – Set Identity Transform (Reset any Mesh probes or adjustments in place)
  • M671 – Define positions of Z leadscrews or bed levelling screws
Posted on Leave a comment

xBot Medium – Electronics and Electrical parts (BOM cont.)

In this post I’ll continue describing what is needed to actually build the xBot-Medium printer. Last time I talked about the Custom Parts, and this time it will be about the Electronics and Electrical parts.

I’ve set up a xBot-Medium Github Repository where the files can be found for this project. As I havn’t finished it yet, all the files aren’t there, but they will be! Only the .STP files for the Dibond frame pieces and some a few for printed parts are missing, so it’s pretty much complete allready.

This post is going to be about the Electronics and Electrical parts we need for the xBot-Medium 3D Printer. I’ll list the Mechanical parts in a later post.

All “BOM” posts here on my blog are going to be condensed into a BOM in list form on the x-Bot-Medium Github Repository.

Some parts are both electrical and mechancial, like the motors, and such items are added to this post, while the Mechanical parts post are going to be the completely inert like the various pulleys, belts, nuts and such.

This is mostly going to be a list without a whole lot of exlanation to it.

xBot Medium electrical and electronical listing

  1. Duet WiFi
    1. Thermocoupler Daughterboard
  2. Duex5
    1. Consideration if choosing Duex2
  3. PanelDue 5″
  4. BLTouch SMART
  5. Heated Bed
    1. AC Silicone heater 500w
    2. SSR
  6. 3x Z-Motors
  7. XY Motors
  8. Extruder(motors)
  9. Chamber Heater
    1. 3x 30mm fans
  10. 2x 30mm fans for Printed objects
  11. Powersupply
  12. LED – RGB
    1. Manual on-off rocker
  13. Various
    1. Limit switches
      1. Long arm
      2. Short arm
    2. Front USB power out
    3. Rear USB for Controller access
    4. AC Power plug and on/off
    5. GX12 and G16 connectors
  14. Carriage
  15. Hotend
    1. Thermocoupler
    2. Plated Cobber nozzle
    3. 40w Heater Cartridge
  16. Untill next time


Duet Wifi

As the main controller, I’m using the Duet WiFi from duet3d.

Price: inc 20% vat: €162,3

While the price does seem rather high, you should take all the features in consideration.

Best quality of any controller. Simple as that. Both regarding features and quality. There are many safety features build in, like it doesn’t burn if a driver or sensor is accidentially unplugged while power is on, which is the main cause of dead electronics for many people. It doesn’t require active cooling as it get rids of the heat through PCB surface – active cooling is always a good idea though, but it’s not a requirment like pretty much all machines using pololu drivers.

It’s top of the line quality and uses 5x TMC2660, which are the highest end drivers you can get on any controller. They are very powerfull SilentStep Sticks (big brother to TMC2100/TMC2130) and can drive up to 3amp pr driver. Most people end up going out and spend money on silent step sticks anyway, which easily ends up at €50 for a set of those – and you can’t buy TMC2660 pololu sticks.

At some point many people start looking at a remote way to control and monitor the printer, and end up going out to buy a Raspberry Pi, which is another €35.
Regardless of what solution people use they don’t ever get close to the integrated webserver allready in the Duet WiFi. It’s hugely powerfull and very responsive. Has a ton of usefull information, and you even use it to setup the entire printer, so no need to compile firmware on your printer and then transfer using USB.
Since it’s integrated it also talks directly to the controller instead of using USB.
It also provides for real time changes in setup of most settings. Change fans, extrusionrate and LED using sliders etc etc.


From the official Duet3D Features page.

Feature list
From site

The DuetWifi is an advanced 32 bit electronics for the control of 3D printers and other CNC machines. It has the same features as the Duet Ethernet other than providing a WiFi connectivity rather than ethernet, full feature description is available on our wiki, in summary:

  • Powerful 32 Bit Processor
  • Dedicated Wifi module
  • Super quiet TMC2660 stepper drivers, up to 256 microstepping.
  • Dual extruders on the main board, up to 5 more extruders on the expansion board.
  • High Power rating: Each stepper driver is capable of 2.8A motor current, currently limited in software to 2.4A. The bed heater channel is specifically designed for high current (18A).
  • Connect via PC, tablet or smartphone on the same network to the on board web interface.
  • Setup your printer and update the firmware through the web interface.
  • Expandable up to 7 extruders with Firmware support for mixing nozzles and remapping axes to use high power external drivers.
  • Support for the PanelDue: a full colour graphic touch screen

Thermocoupler Daughterboard

Price inc 20% vat: €31

To be honest: Im not a fan of this design (put mildly)! I find it rather cumbersome how it’s stacked like that, and it can easily fall out if mounted upside down.. and thus prone to failure. The small terminals are very unforgiving as well, so can be hard getting a good connection.

As much as I find the price warranted for the Duet WiFi, I do look at these things the opposite way…

But while we supposedly can use 3rd party solutions I havn’t managed to make anything work, or seen anyone making anything work, so if you want to use Thermocouplers (top board below) or PT100 (big lower board) you have to use the official Duet Daughterboards.

If you know of a sure way to make 3rd party boards to work, please let me/us know! Not just a link to the right chip, it must be a complete solution 🙂

Photos from official Duet3D shop.

Usage in build:

1-2x Thermocoupler Daughterboards, price total €31-62 inc 20% vat!

I’m going to use Thermocoupler for my hotend and for the heated bed as they react much faster and are much more accurate than standard Thermistors. It’s also a must for hotend if you want to print over 280c as a thermistor dies at 290c or so. Thermocoupler and PT100 sensors don’t tend to die on you like Thermistors can either, so it’s a one-time purchace.

I’m still a bit undecided as to wheter I want to use a Thermocoupler or a plain Thermistor for temperature sensing in the chamber. It’s really a high price to pay for this, but lets see if I get any sponsoring for the project.

I used to use PT100 before starting to use Duet, but the PT100 daughterboards were much, much more expensive than Thermocoupler boards, so that is the only reason I use Thermocoupler. There is no actual difference in usage. PT100 should be less prone to suffer from interference, but wheter that transfer over in reality is always questionable 🙂


Price: inc 20% vat: €111,6 for Duex5
Price: inc 20% vat: €77,8 for Duex2

The Duet WiFi has 5 drivers, so you might actually do ok with Duex2 if you only want 1-2 Extruders. There used to be other differences, but not anymore.

Driver assignments

  • 1 for X
  • 1 for Y
  • 3 for Z
  • 1-2 extruders. (Can use Duex2)
  • 3-5 extruders. (Need Duex5)

The Duex2/5 boards has the following features:

The Duex2 and Duex5 has the same feature list aside from the first 4 points here, listed as 2/5:

  • 2/5 additional TMC2660 stepper motor drivers with stall notification.
  • 2/5 additional extruder heater outputs.
  • 2/5 servo outputs with 5V power and 5V signal levels, sharing control channels with the heaters, so you can use unused heater channels to drive servos.
  • 2/5 additional endstop inputs with indicator LEDs and 3.3V/5V voltage selection. These are also usable as outputs.
  • 6 additional controlled fan outputs, also usable for driving LEDs etc. The output voltage may be switched between 5V, 12V and VIN.
  • 4 uncommitted general purpose I/O pins.
  • 12V switching regulator, for generating a 12V supply for fans, LEDs etc. when the VIN power is higher than 12V.
  • 5 additional thermistor inputs.
  • Support for 2 more thermocouple or PT100 daughter boards, supporting up to 4 more sensors.
  • Optional 5V external power input for powering servos, fans etc.

Official complete feature list and comparison.

Considerations if choosing Duex2

While researching this I learned the difference between Duex 2 and 5 is only the 4 first points in the above list.

I thought Duex2 would have less fan headers as well. Last year Duex2 also didn’t come with the 12v switching regulator.

It all mean you can pick Duex2 if you don’t plan on using more than 2 extruders, but have to pick Duex5 if you plan on using more than 2 Extruders.

PanelDue 5″

Price: out of stock?
Price Filafarm; inc 19% VAT: 4.3″ €99,89
Price Filafarm; inc 19% VAT: 5″ €109,9

Lets say it as it is: You don’t really need a screen. The Web GUI is just that awesome!

I used my first Duet WiFi printer for over a year without getting around to using the PanelDue I had lying around as the Webinterface is just so super nice and lets face it, these things are really expensive as well.

Price vs performance

It really is a matter of usage preferences as they are stocked full up with features, like:

  • Buying a PanelDue gives you external SD card access (the big SD card type).
  • True serial connection, so full control of the machine (unlike cheap MKS displays which doesn’t really talk to the controller, but only sends commands
    • I mention MKS as someone has worked up an alpha firmware for them, so they might be able to work as standin for PanelDue (using serial)).
  • One awesome thing, which I havn’t seen mentioned elsewhere is how the macro’s you create in Web GUI are transferred to the display as menues and buttons completely automatically. This is awesome, and a super way to stack up on functions: ie i you often do some thing like changing filament, you can make a macro to heatup and retract etc.

Here you can see how I made a few macros to test movement on my previous printer project:

I use the display a lot on my BeTrue3D Printer due to it’s many extruders, but on my normal primary machine I only really use display to check up on temperature at a glance and such.

If that is how you use display as well, you might want to try using the machine without the LCD. Might just use an old phone or tablet, although the response would not be almost instant.


Price Filafarm inc 19% VAT €39.90

We use this sensor to ensure correct distance betwee hotend nozzle and print bed and also to take advantage of our 3-motor Z-axis for complete true autolevel function.

Since the xBot-Medium is 10mm deeper than an Ultimaker 2+ we can now squeese one of these in in front of our hotend.

It’s a combination of a normal limit switch functionality and a servo motor to raise up this switch after engaging, which was a somewhat common solution some years ago. ANTClabs combined these things an came up with the BLTouch.

Lets start by saying: Don’t buy copies. Just don’t. There is a huge difference in quality and you really want these things to work 100%.

If you look around you find a lot of people having problems.. when you dig in, you find that all the people having issues are using copies.

You also want the newest version, called SMART. You can check the difference by the sticker labeled SMART, by the tip of the probe-pin and the BLTouch also needs to have serial number printed on it, which can be verified a



Heated Bed

Price from inc VAT €54-71

I’m using a 5mm thick PEI-Coated Aluminium bed with an AC Silicone heater under.

You can pick from 2 different qualities and several different colors and even get logo or text lasered into the surface.

The price at €54 is the lowest price uses a cast aluminium plate, while you can get a milled plate at €71. I’m honestly not sure what my plates are, as I couldn’t choose quality back then.

Be sure to pick the Ultimaker 2 257x229x5mm under dimensions.

Email the owner to agree on color and price etc, and to be sure the plate comes with holes for fingerscrews… it should as he’s using my drawings for these plates <wink>

I print PLA, ABS+ and PETG on it with great results. I’ve heard people say PETG sticks too hard, but I’ve had no problems with anything.
I do have seperate glass plates I put on top of my bed when I print Nylon (glue on glass). Some PLA don’t want to stick very well to this plate unless I heat it a lot, so sometimes use glass for PLA as well.

AC Silicone heater 500w

Price from Keenovo €40,5

Specifications: 200X240mm 500W 220V build in Thermocouple Type-K sensor.
Link to same version with Thermistor instead of Thermocouple sensor.

As most everything else, there are different levels of quality, and the same goes for Silicone heaters. I’ve come to like the market leader Keenovo heaters and am using one of their heaters for the xBot-Medium printer.

They come with build in wires for the heater itself and wires for Thermistor. I’ve asked them if they can build in Thermocouple instead, which they agreed to do, so now I’m just waiting to recieve my super nice Heaterpad.

These pads comes with high quality 3M tape preapplied to one side.


Price (RobotDigg) €4

SSR10A DC-AC Solid-state Relay

There are many copies of Solid State Relays (SSR) on the market, so make sure to buy from somewhere you trust. I’ve bought SSR from RobotDigg several times, and always recieved good ones.

Make sure you buy one labaled as DC-AC as it is controlled by DC from our Duet and then in turn controll the AC input to the bed. The AMP is really only important if you use a DC-DC SSR – ie if you have dedicated DC powersupply for your bed, then the SSR must be able to handle the amount of amperage you put through it.

3x Z-Motors

Price from RobotDigg: 3x €26,7 = $80
SKU: 17HS3001-280N w Lead Screw: 280mm long, Tr8x8(P2)

Many people are using various couplers, but I really prefer using motors with embedded lead-screws. Seems the Quality Control is much better on these than the loose lead screws we can buy. At least if we don’t go out and pay a lot of money for them.

Regardless though, we need motors with embedded lead-screws to take advantage of our entire Z-distance. If you use a coupler you would sacrifice about the length of the coupler on Z axis height.

These motors comes with a POM nut, but we can really use it as they are too large to fit in there. I could have modified it some I gues, but I also really want to use the anti-backlash nuts instead, which are cheaper to replace in case of wear and tear.

Specifications of the motors

Threaded Rod NEMA17 Stepper body 40mm lenth, 280mm Tr8*8 Leadscrew and POM Nut

The NEMA17 Threaded Rod Stepper Motor has a precision Acme Tr8*8 Leadscrew coming out directly from the nema17 as a Threaded Shaft.

200 steps per revolution (1.8 deg/step)
2 Phase, Bipolar, 4 wires
Rated Voltage 2V DC
Rated Current 1.2A
Phase Resistance: 1.7 Ohm ± 10% (20º C)
Phase inductance: 4.5 mH ± 20% (1kHz 1 V rms)
Holding torque: 0.4 N.m Min.
Motor body length: 40mm

Acme Lead Screw: 280mm long, Tr8x8(P2)
Nut: POM

The Tr8*8(P2) means it is 8mm in diameter and one revolution give a travel distance of 8mm. It has a pitch of 2mm which is the distance between the raised “edges” (leads). It has 4 starts, meaning 4 seperate “raised edges” (starts).

X and Y Motors

Price from 2x €11,9 = €23,8

For X and Y axis I can use high quality 0.9 degree stepper motors, as I made room for motors with a body length of 48mm instead of the normal 40mm length available in an Ultimaker 2

It means I can use the best quality and best suited 0.9 motor I’ve been able to find for the X and Y axes, namely the 17HM19-2004S from

You might ask: Why not just use some smaller 0.9 motor? Lots of those have high holding torque and ok amperage etc etc… good question!

Problem is however, that between the pancake model I use for my extruders and up to this powerfull full size motor, they all have really high Inductance raiting, meaning they are slow!

Additional resources


Price for 17HM08-1204S from (48mm long) €11,9
Price for 17HM08-1204S from (21mm long) €9,9

I’m going to be using 2 different motor types:

  • The same large 48mm size as used for X and Y meant for 2.85/3mm filament, as they do require some extra power.
    • See specifications just above
  • I’m using the panckage nema 17 which is just 21mm long for my normal 1,75mm filament. These are more than strong enough and really a perfect fit.
    • Note: You can use these for 2.85/3mm as well, but have to give them more current than when using them for 1,75mm. Might need to put a heatsink on it as well, which is why I simply opt to use the larger motor for the thicker filament.

This small motor is awesome! Plain and simple.

You might wonder at the small size for an extruder, but by utilizing it’s awesome specifications with it’s 0.9 degree steps and powerfull 11Ncm / 15, / 1,12kg/cm holding torque inserted into my Belted Extruder v4 it’s packing an awesome package that runs smooth, silent and cool!

Specialize brackets for my Belted Extruder v4 to quickly mount and dismount them on the xBot-Medium will be released.

Additional resources

Chamber Heater

Price eBay €4,75

I’ve bought a 200w 24v heater wiht the dimensions: 140 x 32 x 26 mm. I actually bought mine from, but it’s not available anymore.

Be sure to buy a 24v version. I accidentially bought 12v at first. It’s listed on the side of them. The photo below with measurements on it displays a 12v heater.

It’s really just a small heater element so we need some fans to blow the heat up into our Chamber.

So far I’ve just set my heated bed at 140c degrees and waited for the temperature to reach 40-50c before I started printing Nylon and such.

To be honest I don’t generally need a heater, but I wanted to add one, now that i started from scratch. All materials, including PLA and PETG benefits from higher than normal temperature at a stable level, but the inclosed box design of the printer will ensure a temperature of around 40c after printing for a while, even with no lid on it.

I’ve designed a printable fan-duct which is mounted over the hole in the bottom frame part through which the hot air is exhaused through. It needs to be printed in ABS or similar to handle the temperature.
The printed parts are or will be located on the xBot-Medium Github repository and in the Thingiverse Group for xBot-Medium once I’m done with the files.

3x 30mm fans

Price 3x €1,21 = €3,63

I’ve just bought some standard so called 24v 3010 Hotend Cooling Fan for the Chamber heater. 3fans fits snugly on it, so that’s what I did.

2x 30mm fans for Printed objects

Price 2x €2,08 = €4,17

You either need 2x 30mm fans or figure out something else. Yes, it is plenty to cool the stuff you print, so no need for 2x 50mm blower fans.
You could use 2 of the fans listed above, which I’m using for the Chamber Heater, but I’ve decided to try out some “aluminium” fans instead, which are slightly more expensive.

I normally pick 12v fans for this as it’s very hard to find good quality 24v fans, and if you do, they cost way more.

It means I just put them in series:

  1. The 24v power line connects to red wire on one fan
  2. Gnd to the black wire on the other fan.
  3. The unused pin from each fan is connected by a wire or similar.
  4. Voila, you now have your two 12v fan running in series on your 24v system.

Note: not all 12v fans can do this, but most I’ve tried do it 100%.


Price: €60

The price is approximate what you might expect to find a good Powersupply at.

If you don’t plan on using Chamber heater, you can find a good Meanwell 24v 10amperage powersupply at half the above price.

If you do plan on using the Chamber Heater you should look for a 24v 18-20amperage to make sure you have enough juice.

I’m running my primary printer on a 24v 10amp PSU which is passively cooled, ie no fans, and it never even gets temperate, so no need to go overboard.

Better to get good quality with lower amp, than buy crummy 40amp psu.

You need a relatively low profile powersupply. Not much higher than 40mm.

For the xBot-Medium I managed to win an auction for a MeanWell HPR-450-24 powersupply. This translates to 24v 450w 18.8amp

I originally believed it had temperature controlled fan, but what it has is on/off fan that activates at some % load. It’s loud, so I need to figure something out to tame is.

Additional ressources

  • Dimensions: Width 105mm, height 41mm, depth 218mm
  • Datasheet opens pdf


Price for 5m: €11,25

You don’t need RGB and I’ve always just used plain white light, but I recently learned you could use and control these using 3x FAN headers on the Duet/Duex.

I went and bought 5Meters of 24v RGB LED strip. Like normal led strips you can cut these at invertal and so make the lengths you want. 5m is plenty for several different projects.

I bought mine in the EU, so I guess you can get it at half price in China.

Manual on-off rocker

Price less than €1

Manual on/off switch for our front RGB LED light. I just like to have the ability to switch that rocker to turn the off sometimes even though the lights are programably turned on.

I hope I can just use this on the GND to the LED strip, or maybe I need it on the v+ depending on what is shared on the FAN headers, but lets see!

Just look around. It’s often cheaper to buy 2 than 1 and you might get 5 at almost the same price.



Limit switches – long arms

Price for x2 €1,12

We need 2x Limit Switches with long arms for our X and Y axes.

Limit switches – short arm

Price for x3 €1,5

If you use BLTouch sensor you don’t have to install the 3 Limit Switches as endstop at the Z-Max end, but I’ll recommend that you do.

Partly as you can use it as backup system if the sensor fails and you can use them to synchronize the axes as an initial setup sequence.

Considering the price, I see it as a no-brainer to go and install them.

Front USB power out

Price €1,12

I really like having an USB power output in my 3D Printers. It can be used for webcams, powering phone/tablet or, as my favorite, powering my small USB vacumer for cleaning up the 3D Priner interior!

It requires a custom printed part which is available with the rest on the xBot-Medium Github Repository.

This video does not show the xBot-Medium, but is a video from my youtube channel showing my current primary machine.

You could also install the USB adapter intended for the rear side in this spot instead, if you’d rather go that route. I have not yet made any adapter for this option.

Rear USB for Controller access

Price €1,79

Since we have our Duet WiFi complete enclosed under our frame we need some sort of extensions to make it possible to connect to the controller via USB in case of various update and maintenance.

It’s called an USB 2.0 B Female Socket Panel Mount To Micro 5 Pin USB Male – Cable 50cm

You can route this to the front USB port instead if you like. I just havn’t made an adapter for this yet, but it should be a simple matter.


AC Power plug and on/off

Price €1,12

You can get them in a variety of models. I vastly prefer this model with build in fuse as it removes the need for an inline fuse between the power plug inlet and the internal powersupply.

You can get them with and without light and with different colors for the rocker. The cheapest model is without light and black rocker, while the red-rocker with light is a very close second.

Be sure to wire it correctly, so it’s the live wire connection going through the fuse.

GX12 and G16 connectors

Prices at around €1 each – so totalling at around €7

If you can wait for it, then order from china, as they cost a fraction of the cost. Not just a bit cheaper, but like 1/10 price sometimes!

  • 4x GX12-4
    • We can mount 4 external extruders, each of which takes a GX12-4 pin connector.
  • 1x GX16 8pin
    • We need a GX16 8-pin for our Carriage for Hotend Heater (2p), Heatsink Fan (2p), Object fan (2p), Sensor (2p).
  • 1x GX16 5pin
    • We are using a seperate GX16 5-pin for our BLTouch sensor.
  • 1x GX16 4pin
    • We need a single GX16 4-pin to hook up our heated bed: Heater (2p) and Sensor (2p)


This is just a word used to describe the combined collection of objects driving around along with the Hotend. Ie, the mechanisms themselves, fasteners, extra fans and sensors and so on.

We allready talked about the BLTouch, which is definently a part of the Carriage.
We also went over the 2 fans used to cool our Printed Objects.


Price: E3Dv6 Full Bowden €63,6

I’m going to use genuine Full E3Dv6 1,75mm hotends. I also have a (genuine) Full E3Dv6 3mm I use when printing Flexibles as flexibles in 1,75mm just aren’t viable.

You can use some other hotend if you like, but I prefer the E3Dv6 FULL 1,75mm hotend.

  • The FULL part is important as it is made up of an aluminium heater block, a steel heatbreak and a seperate aluminium heatsink. This model has very tight control over extrusion as the seperate pieces of the heatsink (and different materials) makes for very cleanly defined heat and coldzones. Retraction is normally around 1-1.5mm only, when using bowdenThe bowden tube goes down into the top of the heatsink and into the very top of the steel heatbreak. This means the PTFE materail from the bowden is far away from the hot zone, meaning you can use temperatures way above the LITE version (280 with thermistor – 500 with thermocoupler/pt100 sensor)If you by accident pull up in the bowden while the hotend is hot, nothing happens as the molten plastic can’t get up in the space between bowden and heatbreak. The added friction created by the steel heatbreak is actually a good thing as it makes for very tight filament printing control.
  • The LITE version is not recommended in my world. It is made up of a combined steel heatbreak with embedded heatbreak. This model does not have the same tight control as the FULL as it doesn’t have as effective heatsink and because the PTFE Bowden tube goes all the way down through the heatsink and rest directly on top of the Heater block.If you by accident pull up in the bowden while the hotend is hot, the molten plastic will guarenteed slip up in the space just above the nozzle, inside the heatbreak now freed from PTFE Bowden tube. It means you (most likely / often) have to take it all apart to clean it up, to get it working again!It does not have as tight control and while the FULL only requires 1-1.5mm retract, this LITE version takes 6mm! This long retract is required as it does not have as sharply defined hot and cold ends, so lots of “internal stringing” is going on, which in turn needs to be pushed out of the hotend after each retract = not as clean print. They still print better than most other hotends, don’t get me wrong, but not compared to the FULL!

The price includes lots of parts. You can view all under what’s in the box, from where I’ve taken below photos.

Some parts to mention: The nice Steel heatbreak and aluminium heatbreak with the bowden coupler, full kit with fan shroud, fan, blue silicone caps, thermistor and 24v (30w) heater.

There’s also a single 0,4mm standard Brass nozzle included.


Price €12,5

I’m not a huge fan of Thermistors. Both because they can break, but also because they aren’t that accuracte and I print at higher temperatures than they can go (300+), meaning I’m using a Thermocoupler sensor instead.

E3D has begun selling these, which works fine with the Duet. Duet sell these same Thermocouplers from their store now as well.

It does require you to use a Thermocoupler daughterboard for the Duet, so it’s a pretty big extra expense. You can always add this later.

Plated Copper Nozzle

Price inc. vat €11,75

In my world these things aren’t even optional. I know I know, it’s a big extra expense on top of everything else, and sure, you can wait before buying this.. ok it might be prudent to use the included Brass nozzle untill it’s worn down, but this copper nozzle is just so extremely much nice than the standard Brass nozzles.

They were created for ultra high temperature, but lets take this note from E3D:

In addition to high temperature performance these nozzles have an advanced nickel based plating, considerably reducing the adhesion of plastic to the nozzle. This is great for everyday filaments keeping things clean and shiny, but is particularly important at temperatures above 300°C where a silicone sock can’t be used.

And that non-stick feature is what makes it so awesome. If you have printed PETG you’ll cry tears of joy when trying one of these as stringing is just so much easier to manage – also helps on all other materials.

Don’t go and buy the Copper Heater Block as it will really only make your heating up take much longer and suck out €26,4 of your pocket! .

I honestly beleive them to be not at all relevant when using the Silicone Socks on the standard Aluminium blocks, which are included.

Yes, I own one of these and I really don’t much like it. I have not seen any advantages over normal Heater Block. Right now I’ve mounted it on a hotend I use with the TL-Feeder for 2x filament input as it migt be better when hot and cold filament are constantly changed, but I havn’t tested it much yet.

40/80w Heater Cartridge

Price inc VAT €5,4 for 24v 40w
Price inc VAT €6,73 for 24v 80w

What’s this now? Well, the included 30w heater with blue wires is just really slow and in some instances you will find it having problems keeping up the temperature. Especially when printing semi fast.

I strongly recommend buying the 24v 40w instead for this printer and if you tend to print very fast, you might even opt for the powerfull 24v 80w from

Just remember to do a new PID tuning if you change your heater or sensor.

Untill next time!

Wow, that was one long post! Next post is going to be all about the inert parts of the printer.

Posted on 15 Comments

xBot Medium – A new printer is baking!

Wow, been quiet for a while, and guess what, I’ve been busy working on completely new printer build, using the best I could find from the Open Source world and added on features I’ve been missing, like true autolevel and front hinged printbed in addition to the back mounted Z-stage on the Ultimaker machines.

  1. Ultimaker as primary source
  2. Design goals and specifications
  3. What can be improved on this package
  4. Dimensions of the xBot Medium next to Ultimaker 2+
    1. Dimensions
    2. Build Volume
    3. Printer and Printing Properties
    4. Materials
    5. Requirments
    6. Print Surface
    7. Controller Type
    8. Motor
    9. Firmware
    10. Powersupply
    11. Chamber
    12. LCD and SD
  5. Compatibility
  6. Fine Touches
  7. What’s next?

Note: Please note that some details has been changed during the design and buildphase. 

Ultimaker as primary inspiration

There, I said it. Ultimaker machines. This means I’ve been inspired by the Ultimaker 2 Open Source panels and did a complete workover to make it all match my needs. In all honesty it looks like a normal Ultimaker frame at first look, but when digging in the main left-over features are the hidden nuts and slot in system by the individual plates. Even those are placed totally different, so it’s only really the concept used. And of course the material used; 6mm Dibond.

Of course; the construction method is one of two things making the Ultimakers what they are, so it would be silly to change these for something else!

Design goals and specifications

The second thing making Ultimakers the best, is how they have, in my opinion, the best XY design of all Open Source printers on the market. They do not risk skewing the axes when changing direction and have build in self-adjustments.

In my optics it’s the best as it’s rock solid, simple to design and setup and requires next to no calibration or maintenance. You can move the printers around all day long, hook it up and print without any adjustments.

I even shipped one of my Ultimaker 2+ machines (clones) across the country. The buyer opened the box, hooked it up and printed right away. No calibration or adjustments needed! Even did the same trick a few weeks later, so yea, they really are rock solid and requires next to no calibration. Except for bed level!

The way the XY is incorporated into the very sleek case with hidden nuts, makes all axes very sturdy, which contributes to the unmatches printing quality of these printers.

During the designface I managed to make room for 48mm deep Nema 17 motors, which meant we can use high quality 0.9 degree steppers (17HM19-2004S) now! Previously we could only get 40mm motors where all 0.9 degree motors (I have ever seen) has very high Inductance mH, which really must be under 4mH to get acceptable performances.

All in all it just makes for an incredible appetizing package with both functionality and visual design at the fore.

What can be improved on this package?

There’s not much to change on the physical level, but the Z axis has always been the achilleius heel of the Ultimaker printers. It’s only fixed at the rear side and while the the Z rods has moved up in size from 8mm to 12mm, which improved a lot, the stability is just not as good as it could be.

I’ve previously fixed the Lead-screw at the top, which helped stabilize the Z some, but the leadscrew is not meant for this kind of usage. Especially bad if using a poor quality lead-screw which isn’t all straight.

I also created a method of using an Anti-backlash nut. Later on in the UM2+ and UM3 machines something similar appeared in the form of the T8*8 Delrim nut.

The Brass version of Anti-Backlash nut has become very cheap and more popular as it’s a drop in replacement to the normal Brass nut.

I’m a big fan of these Brass Anti-backlash nuts as they are cheap, drop in replacements and they compensate for both bad quality you might have in your lead-screws (and backlash nuts) and for the wear the nuts especially are going to be subjected to over time. Using regular nuts the gaps between the ridges steadily increase with wear and tear, leading to inaccuracies, especially when using z-hop, but the spring compensates for this kind of wearing down.

I’ll be using 3 of these Brass Anti-backlash nuts for the xBot Medium

To truly overcome this challenge I wanted to add 2 extra Z motors with additional z rods at each front corner, for a total of 3 Z-motors and 4 Z-rods, to make it more stable and also to build in the option for true auto-level function.

All without making the machine huge and bulky!

Some challenge, uhh?

Dimensions of the xBot Medium next to Ultimaker 2+

Note/Disclaimer: All info and images of/about the Ultimaker is from Ultimaker 2+ specificatiosn page and the Printer Comparison Page. They belong to Ultimaker and all credits goes to them. I am in no way affiliated with Ultimaker and I solely show the info here to show where I came from.

I have tried making the below table to illustrate and explain the changes and differences between the super nice Ultimaker 2+ and the xBot Medium I’m building.


Ultimaker 2+

xBot Medium


Dimensions with bowden tube
and spool holder:
34,2cm (width) x 49,3cm (depth) x 58,8 cm (height)
(13.5 x 19.4 x 23.1 inches)
11.3 kg (399 ounces)

Dimensions with extruder, bowden tube and spool holder
36,8cm (width) x 50,3cm (depth) x 42,8cm (height with 1,75mm)
Note: Height is up to 20cm more if using 3mm filament

Build Volume

223 x 223 x 205 mm
(8.8 x 8.8 x 8.1 inches)

223 x 223 x 205 mm
(8.8 x 8.8 x 8.1 inches)

Printer and Printing Properties

1x 2.85mm Geared Feeder

Open filament system

180 °C to 260 °C
Olsson’s Block
Up to 4x Belted Extruders v4 and 1x Titan or similar in any combination of 1.75 and 2.85mm

Open filament system

180 °C to 500 °C

E3Dv6 Full-MetalHeated Chamber


PLA, ABS, CPE, CPE+, PC, Nylon, TPU 95A, and PP  PLA, ABS, CPE, CPE+, PC, Nylon, TPU 95A, PP and Breakaway (all materials)


Ultimaker Cura or other Slizer

File transfer: Standalone 3D printing from SD card (included) or USB

Ultimaker Cura or other Slizer

File Transfer: WiFi drag and drop for standalone 3D printing.

Optional printing from SD card if the optional PanelDue is in use.

Print Surface

Heated Bed: 100w (24v 5a) 2mm aluminium heater.

Print Surface: 4mm Borosilicat/Tempered Glass. Optional Fiberplate FlexiPlate etc

Guided leveling of buildplate

Heated Bed: 500w (240hz AC (Mains) via SSR) Silicone Keenovo heater under 5mm milled Aluminium plate.

Print Surface: PEI-Coated Aluminium plate. Optional 4mm Borosilicate glass or Fiber plate etc.

You can use Ultimaker 2 heated bed if you so choose. Same mountpoints.

Full true automatic autolevel.

Controller type

Ulticontroller – 8bit

5x a4988 drivers and 3x PT100 amplifiers.

Controller Duet WiFi – 32 bit

5x TMC2660 drivers.

Thermocoupler Daughterboard for 2 Thermocouplers.

Using Duex2 or Duex5 for full use of autolevel and multiple extruders.


1.8 degree motors for XY.
Single linear motor for Z
1x 0.9 degree motor for Extruder
High quality 0.9 degree motors (17HM19-2004S) for XY from
3x linear motors for Z for true autolevel function
1-5x motors for extruders.
For 1.75mm filament: 17HM08-1204S
For 2,85/3mm filament: 17HM19-2004S


 External Meanwell 24v 15.8 (black brick type) Internal Meanwell 25v 18.9a with temperature controlled cooling.


 Ultigcode/Marlin firmware  RepRapFirmware


 External Meanwell 24v 15.8 (black brick type) Internal Meanwell 25v 18.9a with temperature controlled cooling.


100w Temperature controlled Heated Chamber
Door in Dibond with acrylic window

LCD and SD

 Small LCD control panel with SD card  Optional PanelDue color touch display with SD card.
options: 4,3″, 5″ or 7″


To the best of my abilities I’ve kept it as close to the Ultimaker 2 as I could. This means most things can be directly reused, if you have build a previous UM2 clone, like belts, pulleys, heated bed, finger screws, screws/nuts , XY endstops, all the bearings and the thick 12mm Z rods.

Also using same Z motors, although the xBot is using 3 of those.

You can even reuse your extruder if you have a Titan or UM2 extruder, allthough I do recommend using my Belted Extruder v4 as it’s way more quiet and performance just as well.

Fine Touches

In the back plate there are holes if you want to use an extruder as in the normal Ultimaker machines. I havn’t sunk the holes all the way through for Titan extruder, but they are marked up on the files, so it’s easy to remidy it.

Same goes for the various Optional settings in other plates like front USB plug, manual LED on/off switch and the two optional mount holes for PanelDue, if you choose to use one.

Instead of full wire draws I’ve opted to use the Aviation plugs in sizes GX16 for the wireharness up to the Carriage for Heater Cartridge, Temperature sensor, heatsink fan and printed object fans. A second GX16 for the BLTouch or some other sensor as well.

I’ve used 4x GX12 4pin Aviation plugs for the 4x top mounted Extruders on the rear side, and also a single GX12 4pin connector, installed in the bottom part of the frame, next to the Chamber heater vent, for the 4 wires up to the heated bed.

Here are 2 photos from a different machine to illustrate how the GX12 plugs will be placed on the rear side. All the wires going through on the photos here, will be replaced with the larger GX16 Aviation connectors.

What’s next?

I have ordered linear motors and parts from Robotdigg, quality steel rods from Dold Mechatronic and have put in an order for the Dibond plates here in Denmark with a private person, so can’t link to him… so now it’s just waiting time for me over Christmas.

The X and Y motors are high quality 0.9 degree motors (17HM19-2004S) from OMC-Stepperonline which can fit in there due to room for 48mm motors compared to Ultimaker’s room for 40mm motors only.

.. or.. Actually I’m busy working on creating documentation for a Github page for this project where alle the relevant files will be publicly available.

I have in fact allready created a Repository for the xBot Medium on Github and started putting various files and info in it, so please stay tuned.

The STEP files for the side panels will not be made publicly available untill I’ve tested them.

Stay tuned, here, maybe on my Facebook channel and on the Github repository as well 🙂

Merry Christmas to everyone 🙂


Posted on Leave a comment

Ultimaker – Fintuning nozzle distance from bed

This small blog-post guide can be used with any printer using the standard Gcode system.

I’m simply writing it in regards to Ultimaker as the issue has arisen from using these machines and their special kind of bed adjustment, which doesn’t provide any tools to do fine final adjustments.

Tools needed:


Go to their website and download the program for your system. File downloads for Windows, Linux and MAC.

You can also go and visit their Github repository if you want to.

After installation you select proper Com port and Baud if/as needed and hit Connect.


When you connect you automatically get a detailed readout of current settings.

I’ve noted the Extruder steps/mm as many would like to adjust these some.

The current Z-offset as defined during setup of myUltimaker is Z-12.45. The nozzle needs to be a tad closer to the bed, so I’ll change the Z-offset to Z-12.40 as raising number is closing in the distance, while lowering the number increase the distance.

Adjust Z-offset

We are using M206: Offset Axes to change the Z-offset.

We simply type M206 followed by the new value of Z-12.40
M206 Z-12.40

Save changes

Now use M500 to save the new settings to Eeprom in order for the changes to be in place after poweroff.
It will all look like this in Pronterface serial window:
>>>M206 Z-12.40
SENDING:M206 Z-12.40
echo:Settings Stored

Reconnect to verify changes are now changed. Might want to unplug USB and power the printer on and off to verify the changes are stored correctly as well.

Posted on Leave a comment

RPi Zero Wireless – Video for Duet using MotionEYE OS


Just the other day I wrote the post on setting up Video on the RPi Zero W to use on the Duet.

This post is ending up pretty much the same place, where we can access the video on our Duet Web Interface (and much more), but instead of using the full Raspbian install for it, we are going to use the much smaller and specialized MotionEYE OS.

For this project

For this project I’m going to use one of the tiny Raspberry Pi Zero Wireless controllers, 8GB SD card or larger and a Pi NoIR Camera V2. Using the NoIR as I wanted to try it out, and the NoIR makes it possible to record in the dark using IR lightning. I’ve found it’s also pretty nice just in my average dim room.

You also need one of the camera cables for the Zeros, as they are tapered in one end compared to the normal ones. They come in 15cm and 30cm lengths.


Download MotionEYE OS

Go the the download page for Motion EYE OS and download the one for motioneyeos-raspberrypi-. If you look at the filezie, it’s obvious how it’s very lightweight and specialized at 68MB for complete OS  (225MB uncompressed) compared to the 4GB of our previous Rasbian installation!

Prepare SD

To make sure there are no unmarked bad areas on the SD drive, I strongly recommend getting a proper SD formatting tool, like SD Formatter, and do a format.

Make sure to pick the right drive, give it a name, choose OverWrite in Options and hit Format.

Unpack and write image to SD

Unpack the file and write image to SD using Etcher. Run Etcher as administrator if you run into problems.

Be patient.. it takes a while.

When it goes from writing data to the SD to Validating, Windows might throw some errors at you, but that’s normal, so don’t worry.

Setup WiFi

As opposed to our previous Raspian venture, we need to make a small file for our USB drive containing the necessary information about our Wireless LAN.

On windows I’m using the standard Notepad to create this file. I’ll not recommend using Notepad++ or some such as they are often more smart than they should be.


Replace MyWiFiNetwork with the SSID (name) of your Wi-Fi network, and password123 with your password, making sure to keep the quotes, as above.

If you copy paste the above into a notepad document, make sure to make the correct line breaks.

Now save that file with the filename wpa_supplicant.conf on the root/start of the SD drive

Make sure that your file doesn’t have any extensions on the end of the filename like .txt, it should just be called wpa_supplicant.conf

Hint: Save the file using Save As..  and change filetype drop-down from .txt to All filetypes


Attach Camera

Now lets dig out our RPi camera and the special RPi zero camera cable.

Loosen the tabs on both devices and insert the ribbon cable as shown.

Do not put the devices on top of the antistatic bag. It works the opposite of putting the devices inside it, so don’t do that! I know many people are doing this all over the internet, but you really, really do not want to do that.

First Boot

Now insert SD card into your RPi Zero Wireless and power it up.. sit down and wait 5 minutes.

Use Angry IP Scanner to find the device

Unless you have configured IP manually, or have a screen connected, you need to figure out the IP of your device.

There are several ways to go about doing this, but the easiest way is to download and run the Angry IP Scanner. Some antimalware programs pops up warnings on this program, but it is due to its functionality to scan ports and such, and not because it contains malicios code.

So, start it up and just hit Start. It’ll scan a while. Then sort the results by clicking on the column named Ping.

Mine showed up like this, where the standard client devices like computers and printers are going to have a blue icon on the left hand side, so it’s easy to spot. Same with the Web detect on the right hand side, which isn’t normal for standard devices.

So right-click it -> Open -> Web Browser

Webinterface – Setup

Depending on the browser size you are going to see a small image in the corner, or a fullscreen view.

Click the icon looking like a person in the upper left corner, and switch Username to admin and leave Password blank.

Enable Advanced Settings

Turn on Advanced Settings in the General Settings section, and click Apply

Enable Streaming

Make sure Video Device and Video Streaming is turned on.

You might want to turn on Motion Detection as well instead of just having it on always.

Resolution and frame rate

As our last basic setup we are turning up our resolution a bit. Go into Video Device and select the Video Resoluton and Frame Rate fitting your requirments.

Streaming URL

Easiest way to find the URL (address) we need to use in our Duet Web Interface is to go to Video Steraming and cick on the Streaming URL link

This opens a small popup with an address, which you copy and then paste into the Optional URL to an external Webcam in the Duet Web Interface.

Note: Your url is not going to be exactly like mine

Duet Webcam Integration

In order to integrate the videostream into the Duet Web Interface, we need the direct url for our videostream.

My url, as copied above, is http://meye-f4a4e5e9:8081

I insert this into the Optional URL to an external Webcam box in Settings -> User Interface – Webcam Integration

Check it by going to Print Status tab

How it looks in Duet Web Interface when camera is enabled

Posted on Leave a comment

Raspberry Pi Zero Wireless – Video for Duet

For this project I’m going to use one of the tiny Raspberry Pi Zero Wireless controllers and a Pi NoIR Camera V2. Using the NoIR as I wanted to try it out, and the NoIR makes it possible to record in the dark using IR lightning.

You also need one of the camera cables for the Zeros, as they are tapered in one end compared to the normal ones. They come in 15cm and 30cm lengths.


Download Raspian or Noobs

Grab newest Raspbian version. I’m using the full version. Maybe Lite is enough for our purpose?
If you downloaded Raspbian and imaged it using Etcher rather than NOOBS, then you will boot directly to the desktop environment of Raspbian and won't need to wait.
I ended up having to download using Torrent which took 8 hours less than the regular download!

You can get the Noobs version (instead of the above Raspbian) – and look at this nice guide:
NOOBS is an easy operating system installer which contains Raspbian. It also provides a selection of alternative operating systems which are then downloaded from the internet and installed.

Prepare SD

To make the SD last longer, I strongly recommend getting a proper SD formatting tool, like SD Formatter, and do a format.

Make sure to pick the right drive, give it a name and hit Format.

Unpack and write image to SD

Write image to SD using Etcher – it can open .zip files without extracting it.

Or you can get Win 32 Disk Imager for more options.

Note: For some reason it didn’t want to work with my normal SD card-reader, so had to dig up a different one!

Be patient.. it takes a while.
I had some issues, as mentioned above, so ended up unpacking it manually, which is why the source filename is different in the two images here.

When it goes from writing data to the SD to Validating, Windows might throw some errors at you, but that’s normal, so don’t worry.

Remote Access using VNC

I used usb keyboard and mouse, which I had to switch back and forth, since I couldn’t find my USB-hub, to connect the RPI to my WiFi and to activate VNC.

Windows key to open the menu. Go figure 🙂

Here’s a guide.

Next up I need to get myself a VNC viewer for my PC to connect to the RPI from my PC.

  • Do not use it on your RPi to connect to the RPi!
  • Just press Got It, on the first welcome screen. It looks like options with the icons above, but they aren’t.

Enter the IP and then use the default username pi and password raspberry  to connect.

You want to change these at some point.

I now have access from my PC and am ready for our Camera.

Attach Camera

Now lets dig out our RPi camera and the special RPi zero camera cable.

Loosen the tabs on both devices and insert the ribbon cable as shown.

Do not put the devices on top of the antistatic bag. It works the opposite of putting the devices inside it, so don’t do that! I know many people are doing this all over the internet, but you really, really do not want to do that.

We do not need to activate the camera using commands, since we enabled the Camera further up top alongside VNC.


Now we need to update before continuing setting up the Camera.

Enter the Console/Sli and type:

Sudo apt-get update
and then
Sudo apt-get dist-upgrade

If you are used to use sudo apt-get upgrade instead of the dist- you might want to read about the differences.

Test Camera

Lets see if it works, by issuing this command:
raspistill -v -o test.jpg
You can find the test.jpg file using the File Explorer, where the photo should be placed at your home directory.

There is a larger guide here.

Install Camera software

I had planned to install the software Motion, as I had read a nice guide, but it turned out it just didn’t want to work with my Noir V2 camera, so I decided to look elsewhere. I also learned the project is no longer in the hands of the original author and has not been updated for a while.


I decided on using RPI-Cam-Web-Interface instead although it is a webinterface, which isn’t strictly what I want for my Duet WiFi purposes. But I hoped it would make the raw videostream available, which it turned out to do.

The interface options also makes it easier to setup the different options as I’m not much of a linux console kind of guy.

Installing it:

There is a nice wiki guide, which I’m pretty much just following.

Since we allready updated our RPI, we can skip to step 4 to install the actual software via the Console:
1 command pr line. Wait for each to finish.

git clone
cd RPi_Cam_Web_Interface
chmod u+x *.sh

Short explanation: First it downloads the program, change to the folder, makes all .sh files executable and then installs  it.

A window is going to pop-up after a while. I just used default settings under installations.

Accessing RPI Interface

Open you browser and type in the IP of your RPI. If using default settings, you will be presented with a directory listing, where you can click on html link before you see something like this:

All done as we don’t need to do anything here really, but you might want to go into Camera Settings to setup resolution

Duet Webcam Integration

In order to integrate the videostream into the Duet Web Interface, we need the direct url for our videostream.

Lets say the IP is like mine, the address you need to insert into the Duet Web Integration box is:
You put this into the Optional URL to an external Webcam box in Settings -> User InterfaceWebcam Integration

Note: I’m not entirely sure what the checkboxes are meant to do. I can find no differences if I check the Embed Webcam Stream or not?

Posted on Leave a comment

Ultimaker 2 – Use 5v controlled fan to also get a 24v controlled fan.

As people might know, the Ultimaker 2/3 series machines are very sleek, minimalistic looking, with all wires, motors and electronics neatly hidden away.

This is nice from a visual perspective, but it does have some drawbacks in the form of overheating disaster waiting to happen.

This posts covers 2 seperate scenarioes which you can mix as you like:

  • Use the 5v controlled power for the small 25mm fan for the hotend heatsink to also controll a 24v radial fan to cool the electronics.
  • Use the 5v controlled power, as above, to controll a 24v fan for an E3D hotend and the same 24v radial fan as mentioned above.



The Ulticontroller is getting rather hot when running, and it is enclosed in a tiny enclosure with no active ventilation. I wanted to rectify this.

Printable Coolboard Duct

My goal was to attach a controllable radial fan to blow into the electronics compartment. I found this nice Ultimaker 2 Coolboard Duct for Control Board Cooling on Youmagine, which you can download for free and print yourself. Seems they have started using my photos, but that’s ok 🙂

There are air ventilation holes in the end of the electronics compartment, which is perfect for our purpose.

Controllable fan

I did not want the fan to run at full speed whenever my printer was turned on though, due to the noise, so something had to be done to make it turn on and off automatically.

I thought about modifying the firmware, but I didn’t know the pin numbers on the controllerboard, or even if they were controllable. It would also be rather restrictive for many people, as they run original firmware.

This type of fan is called a radial fan, and is designed to push air through tight spaces.

How it works

I’m going to achieve my goals using a Mosfet control board (example, example), so we are not going to solder seperat small components together, but just wire things together combined with a few wire-connectors (Can do without if you absolutely have to).

Mosfets are the components turning your heaters and fans on and off, so we basically add an extra one to our machine.

I am using this model as I’ve had best general results with this.

We would normally control these functions using a seperat PIN and some code in firmware. As this option is not available to us, we are going to piggyback on the function allready setup for our 5v 25mm small fan blowing on the Hotend Heatsink. This one turns on and off at 40c, which suits our purpose superbly.

Bill Of Material

  • Radial Fan 50mm x 15mm
  • 1x DC control MOS FET switch control panel
  • 2x male and 1x female XH2.54 connector. Buy a box.
  • 2x female dupont connector + pins. You can use a male XH2.54 connector plug if you have to.
  • 8x male dupont pins. Can do without, but highly recommended.
  • Some heatshrink
  • Kapton tape or similar
  • 2x 35-40mm m3 screws if you use the printed Duct.

Prepare the wires

As you can see here, we are going to create 4x pieces of wires:

  1. Wire from Controller 5v connector to Mosfet control
    1. 5-6cm with male XH2.54 to 2x male dupont pins
  2. Wire from mosfet control to original 25mm fan Connector
    1. 10-11cm with female XH2.54 to 2x male dupont pins
  3. Wire from mosfet DC out to Radial fan connector
    1. 6-7cm with male XH2.54 to 2x male dupont pins
  4. Wire from Controller 24v power pins to Mosfet DC in
    1. 16-17cm with 2x female dupont connectors to 2x male dupont pins

Optional: Instead of #4 you can use the unused Controller FAN connector at the end of the controller.
8-10cm wire with male XH2.54 connector to 2x male dupont pins

Optional: Instead of the first 2 seperate wires you can create a combined Y wire, meaning 1 male XH2.54 connector to 1) 2x male dupont pins and 2) 1x male XH2.54 connector

Wire up

  1. Number 1 is the 5v connector on the Controller. This wire goes to the control in port on the Mosfet control board.
  2. Number 2 is the 24v output pin on the controller. Goes to DC in on the Mosfet Control board.

Here you can see the short wire from Mosfet Control board Control in to the original connector up to the 25mm fan. This just pass on the 5v.

I have an E3D on one of mine, and use a 24v fan for its’ heatsink. Just connect this short wire to the Mosfet Control board DC OUT insteaad, same as for the Radial fan.

I’ve used the printed parts from the E3D Ultimaker 2, 2+ Upgrade Conversion Kit for this E3D carriage.

Here you can see the wire from Mosfet Control board DC OUT to the Radial fan. It also shows the place we are going to stash the control board, but we need to prepare it a bit first.

Before putting the Mosfet Controller board into it’s hiding place, we must make sure there is no shorts going to happen. As you can see, I’ve simply wrapped Kapton tape around mine.

It’s not going to generate a lot of heat, so don’t worry about that.

Before wrapping Kapton around it, you should make sure the pins on the backside of the board doesn’t poke through. Use a small wirecutter to shorten them as much as you can.

Reinstall Controller shield

I’ve done this a lot, and thought I’d make a seperate section for it to make it easier to get it right the first time.

  1. First slide it gently down like photo 1. Make sure all cables are inside.
  2. When you have caught all wires inside it, you should tilt it like on photo 2 and make sure the “pin” next to the motor is correctly inserted into the hole in the frame.
  3. Now tilt the shield back and fix it in place.
Posted on 9 Comments

Lets build an Ultimaker 2+ Extended clone – Part 5 – Lets buy stuff 3 – DIY – Motors, LEDs and more

In our previous blog-post series, we focused on buying stuff premade.

This post will focus on getting the proper wires, connectors, leds and motors to put our own parts together, and hopefully save some money along the way 🙂

The big saving is going to show if you like to tinker with stuff, as you’ll have bought yourself a nice cache of spare-parts for this and other projects.

You need a soldering iron for this and some basic tools. It might be usefull to buy an actual crimping tool, but it’s not mandatory.


LEDs for front lightning

In the Ultimaker 2 printers we have LED strips on the inside of the front sides and top.

It’s basically just 3 strips of 24v bright white leds with wires attached between them, and a wire with a 2-pin Molex kk connector going down to the controller.


So, first we buy a roll of 24v bright white leds. They cost $5-10 depending on length


Roll for wires

Next we need to get some wires. I rather like to buy 1m rolls of multicolored wires from RobotDigg. 1M doesn’t sound like much, but there are 30-40 wires of 1m each in a roll, and it’s very usefull to get thme like this.


Price is from $1.8+ depending on how much you buy.

  • You need 1 roll of the black-red bundle.
  • If you like to make other projects, I recommend buying one or both of the 3-color and 5-color rolls as well.
  • We’ll look at wires for motors elsewhere on Aliexpress.


We are going to buy a box of connectors. These will come in very handy for any number of projects.

Price at $3.40


We need some heatshrink to put onto our parts, where we solder things together.

I can recommend buying both a set of black and one of red pieces, but 1 color is going to work fine.

If you want it just right, you need a white set as well, for the front LEDs, allthough you can’t see these when done.

Price $2.4-$5ish

Make it

I used 3x 30cm LED strips, but these lengths are determined by the LED roll you buy, as they can be split up in different lengths.

Measure strips and wires.

Solder and put on heatshrink

Remember to slide on heatshrink before you solder both ends of the short wires – speaking from experience, hehe.

Testing and installation

Test the wires using a 24v source.

You also MUST clean up the inner face of the front-panel using Acetone or the LED strips will come loose.

Price compare

If you bought pre-made it would cost you $10

If you bought the parts and made yourself, it would cost:

Leds 5m $5.84
Connectors 50 sets $2.4
Wires 40m $1.8
Heatshrink – much 2.4
DIY + spares $12.44


We need 3 motors for XY and Extruder + a motor with build in leadscrew for Z.

We need 67cm of wires on your motors and appropriate connectors.

Links and price

The leadscrew on Z-motor is around 36cm long. Do not buy a motor and loose leadscrew. You are loosing a lot of Z-height and it’s not as good. Especially if you use a flexible coupler.

I have only listed Robotdigg as they have cheaper motors and we are going to buy wires and stuff from them as well.

But remember to factor in the shipping costs when you decide on where to buy.

  • Buy 350mm linear stepper from Robotdigg at $34
  • XY and Extruder 42HS40-1704 at $6.40 each = $19.2
  • XYE Motors comes with 1m wires and correct plugs (not entirely sure of Z connector, but you are going to get one when buying endstops below)

Adjust motors axels

One draw-back is that you need to shorten up the axels of the motors or they are going to hit the rear and side respectively.

You need to twist the cable pairs. First  twist red/blue and black/green, and then twist the resulting 2 bundles.

Price compare

Premade set $99
DIY set $53,2


We are going to need 3 endstops, also known as a Limit Switch for our X-min, Y-max and Z max.

The Z-max endstop has a short arm and the other two needs to have long arms.

They are all configured as NO (Normally Open) in original firmware. This means the wires is connected as shown on the photo.

Wire colors, blue, red and black are in place in order to know what’s what.

Remember the the lengths of the wires for our Extended is not the same as in the pdf files.

There is a single 2-pin HX2.54 connector on each endstop wire.


Links and Price

Expect to pay around $0.2-0.3 for each limit switch. Search around for prices if you like. You might want to find a set of 10 if you want to have some spares, or some for other projects.

Price compare

  • Premade $7-14 for a set
  • DIY set costs $3.63 and you’ll have a lot of spares.

Wireharness from controller to carriage

The Wireharness consists of the wires from carriage (carriage is the assembly for hotend and fans) to controller. Since the wires from Heater Cartridge and PT100 temperature sensor runs straight down to the controller on their own, the Wireharness is really only for the small Heatsink fan and the 2x cooler fans.

If you want the right colors you should buy 1 more roll of wires from Robotdigg. I’d replace the blue one with a white wire, as the blue wire isn’t included in any of the wire bundles.

Links and Price

  • Premade $10
  • 1 roll of 5 color wires (50m) at $1.8
  • Connectors from LEDs and Endstops.
  • Heatshrink from LEDs

The wireharness you buy has 3 wire-sets in it, buy one of these are not used. I do not know what was intended here. The red/brown pair is unused.

Phto above shows the one I made for this project.

The Green/Yellow is for the 12v fans. When put in series they each get 12v from our 24v system.

Total Price compare

I’ve picked the price in the middle of an eventual price-range.

Remember several of the pieces from LEDs are used for the other Items.

Item Premade DIY
LEDs  $10  $12,44
Motors  $95  $53,2
Endstops  $10,5  $3,63
Wireharness  $10  $1,8
Total $125,5  71,07

You save $53,93 on just this project by doing a bit of DIY!

Savings on future projects are going to be bigger as you now have a cache of usefull items 🙂

Posted on Leave a comment

Spot bent 8mm rod in Ultimaker 2

Spotted irregular movement of my back slider, in my newly build Ultimaker 2+ Extended and thought I’d share how to check your rods.

How to check if your rods are straight.

They look straight and feel straight, but when mounted it is easy to see they if they are not.

Simply place the slider in the middle of the rod you want to check. Move the carriage back and forth.
The slider should be still. No movement at all.
As you can see, this slider moves up and down as I move the carriage back and forth, so it needs to be discarded.

If you can’t see how the slider moves up and down, then try focusing on the belts connecting to the slider.