Posted on

Configuring Endstops on Ramps 1.4 With Marlin Firmware – @section Homing

This is going to be a, hopefully, complete tutorial on configuring endstops on 3D printers build on Ramps 1.4 using Marlin firmware.

I am going to use Pronterface/Printrun host program to connect to my printer and issue terminal commands (G-codes). That sounded very hairy, but it is just a simple program with a graphical interface.

Even though I’m going to use Ramps 1.4 and Marlin firmware, this tutoral will most likely be usefull for most setups. We are going to use the newest Arduino IDE to edit the Marlin firmware.

Configuring endstops often boils down to being methodical in finding faults, which is why it is causing so many problems for many people, as many hope they can, and try to, just plug in the printer and hope it works. Which it rarely does.

If it doesn’t Work it can be tempting to do something rash in hope of a quick fix, which in turn tends to compound the issues and make it much worse.

Common symptons of faulty endstops are motors/axes which refuses to move, move in the wrong direction or move a tad this and then that way.

In short: setting up endstops correctly is not just recommended, but is mandatory before beginning to configure movement, including homing -settings for the Axes.

In this tutorial we are going to:

  1. Explorer physical endstop pin-layout on Ramps 1.4 board.
    1. Connect 2 and 3 pin endstops.
  2. Get endstop status and configure Marlin firmware @section homing using Pronterface and the newest Arduino IDE
  3. All done. Ready for motion configuration.

Step 1: Endstop Pin-layout on Ramps 1.4

Our first task is to identify the pins we are going to use on our Ramps 1.4 board.

Endstop pin-layout

When looking at the Ramps 1.4 board with the power-plugs facing left, the endstop-pins are located in the upper right corner as shown in the image.

From left to right we have X-min, X-max, Y-min, Y-max, Z-min, Z-max

The top most pins are Signal pins, the middle pins are ground and the lower pins are 5v/Vcc.

Connecting Endstops

If we use a simple limit-switch as our endstop, shown on an image here, which only uses 2 wires, we are going to connect them to the Signal and Ground pin. It does not matter in which order they are connected. Signal and Ground are the 2 top-most pins.

The limit-switch has 3 legs where 1 is for signal and the other 2 are labeled NC and NO, which means Normally Closed and Normally Open, respectively.

Choosing NC or NO

I prefer using NC which Means a current is running through it all the time. When depressing the arm on the switch the circuit is broken and it triggers a response. It also means a fault is registered if a wire breaks, a connector comes loose, or something similar.

If you use NO the Circuit is closed, a current runs through it, when the arm is depressed. This means that no alarm is triggered if a wire or connector comes.

Some years ago NO was the norm as it wasn’t as sensitve to noise and Thus did not make false positive (triggering the endstop) due to noise from motors.

The Electronics now, even on cheap Ramps 1.4 has imrpoved a lot and the noise should not be an issue any more, so I’ll recommend using the NC pin.

3-pin endstops

More advanced endstops which have LEDS or other Electronics Integrated use 3 wires. One for signal, ground and 5v/vcc.

When connecting these kinds of endstops it is vitally important that the wires are correctly connected. The Signal and Ground becomes important, as opposed to the 2-wire switches, as you risk shorting out the Electronics if you connect the signal to gnd and gnd to signal, while also using the 5v/vcc pin.

Testing wires

When you have soldered the two wires to your endstop, you should test for continuity on the wires using a Multimeter. If you do not have one, I’ll recommend you go buy one. A cheap one will do.

If you use more advanced endstops like IR sensors or similar, you should test it according to the manufacturers documentation.

Step 2: Endstop Status Using Pronterface and Setup Marlin in Arduino


Now we have successfully connected our endstop and it is time to setup our firmware.

Using Pronterface

Fire up Pronterface and connect to your printer.

You can see in the middle of the program, marked by a blue Square, I have added some custom bottoms for actions I use a lot like getting Endstop status, allowing Cold Extrusion and Vis Temperature on Extruder (Vis = show in Danish).

You do not have to create any button, but it is a nice tool. Just click the +, type in some text and the Gcode you want to use. The code for Get Endstop Status is M119

Commands can also just be written in the input boxt in lower right corner, see image, and exectud by pressing enter or send.

Using M119 command

First make sure no endstops are triggered. Move the Axes if neccessary. It makes it much easier to do this if all endstops has the same status. When all is ready you issue the M119 command.

After issueing the command you will most likely see some endstops with the status of OPEN and some with the status TRIGGERED

The ones with the OPEN status are most likely configured correctly, while the other endstops are either defective, activated by your axes or the firmware needs to be corrected.

Fault finding/verifying

Now that we have our status we check to see that all the endstop with OPEN status are working correctly. You do that by manually activating them one by one while issue in the M119 command. If the status does not change when activated it is most likely due to bad pin-wiring on Ramps, but it can also be the firmware.

If you have any endstops not behaving you turn off the printer, unplug the USB and Check the pin-connection.Correct as nesccesary.

Also check for continuity again, using a multimeter.

Make a list of the endstops which shows the staus as TRIGGERED when not triggered, or just keep pronterface open to see the output.

Configuring Marlin firmware in Arduino IDE

Open the Configuration.h file/sketch/tab and scroll Down to the @section homing – around line 330 or so.

Make sure you do not have 2 // in front of #define ENDSTOPPULLUPS. If you have, then remove them, upload the firmware to your printer and redo the tests we just did in Pronterface.

Note: remmeber you have to discconnect in Pronterface before uploading firmware or you will get an error in Arduino IDE

Now go Down a few line to “// Mechanical endstop with COM to ground and NC…” and change the value from false to true or the other way, see image, for the endstops outputting TRIGGERED when not triggered.

// The pullups are needed if you directly connect a mechanical endswitch between the signal and ground pins.
const bool X_MIN_ENDSTOP_INVERTING = false; // set to true to invert... 
const bool Y_MIN_ENDSTOP_INVERTING = true; // set to true to invert...
const bool Z_MIN_ENDSTOP_INVERTING = false; // set to true to invert...
const bool X_MAX_ENDSTOP_INVERTING = true; // set to true to invert...
const bool Y_MAX_ENDSTOP_INVERTING = false; // set to true to invert..
const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert...

Upload the firmware and redo the test in Pronterface.

I changed my Z-min to true from false and it now displays correctly in Pronterface – see image.

Step 3: All Done. Ready for Motion Configuration

Congratulate yourself as you have just setup one of the most important features of your printer.

You actually don’t need to use endstops, but when you do, you really need to have them configured correctly before you can move on and setup the motion of your printer.

Posted on

Smoothieware – MKS Sbase – Controller Basics and Intro


I’m really pleased to see how this basic intro into Smoothieware and the MKS Sbase 1.x controller have gotten so much attention, and really hope it’s going to help people get started or decide not to.

What this is about:

This Instructables is about finding our way around and Configuring the MKS Sbase 1.x 32-bit controller Card basics and intro to Smoothieware. It can be used for Smoothieboards as well in most regards.

I am going to explain and set it up to work as a new controller in my Ultimaker 2 clone with a single extruder.

What this is not going to be:

I am not going to go into the hardware of the board, aside from the need to connect relevant cables.

I am not going to do anything advanced in the firmware/configuration

Table Of Contents:

  1. Connect and install
    1. Connecting USB
    2. Installing firmware
  2. Configuring Smoothieware compared to Marlin
  3. Obvious difference from Marlin
    1. Less obvious differneces
    2. Firmware and Config file(s)
    3. Configuring firmware
  4. Firmware Step 1: Default feed rate
    1. 1/32 Multistepping
    2. Connecting Motors
    3. External Motor Controllers
  5. Firmware Step 2: Cartesian axis speed limits, pins and current
    1. Pins
    2. Current
  6. Firmware Step 3: LCD, SD and Extruder
    1. LCD and SD
    2. Extruder Setup
    3. Delta driver current
  7. Firmware Step 4: Hotend temperature control configuration
    1. Thermistor Type
    2. PID Tuning
    3. Hotend Thermistor – Physical Layout
    4. Hotend Heater Pins – Physical Layout
  8. Firmware Step 5: Heated bed temperature control configuration
    1. Thermistor Type
    2. Temperature Control Bed BANG-BANG
    3. Heated bed thermistor – Physical Layout
    4. Heated bed heater pins – Physical Layout
  9. Firmware Step 6: Configuring Endstops
    1. Homing direction
    2. Disable unused endstops
    3. Define axes size
    4. Reversing endstop output
    5. Fast and slow homing rates
  10. Firmware step 7: Network Settings
  11. Step 8: What’s next?
    1. More advanced setup?
    2. Using Switches

Step 1: Connect and Install

In order to install the drivers for MKS Sbase v1.x (opens shop on Aliexpress) board on our computer we first need to go and download the necessary drivers from the makerbase makerbase-mks on

Note: You do not want to use MKS firmware as it is redacted. Always use firmware from Smoothieware. If confused about the name “Repository”, then just look at it as a folder of files.

Click the file and click the Download in Github and save it somewhere on your computer, then extract it to a folder.

Conencting USB

Plug in USB to the board and look at the LEDs at the upper left corner.
Immediately the D7 led lights up. After a bit D1 also starts lightning while D2 and D3 blinks rapidly.

Open device manager and update drivers for the new Smoothie/Seriel USB device with the signed drivers you just downloaded from Github located in the easy to find folder:

Mine installed fine on Windows 10 x64 pro.

Installing firmware

  1. Firmware from MKS are just and old copy of Smoothieware, so we always just want to use the newest version from Smoothieware.
    1. In other words: always use firmware from Smoothieware.
    2. If you can’t find config.txt file from original smoothieware, just use the one from MKS.
  2. Download official firmware from Smoothiewares firmware page which is a subpage on their own Github page (you might want to download their full github repository (folder) in order to find their config.txt file)
    1. Start by using the Stable version. When everything is working fine, you can use the Nightly version instead. It is the newest version, but not fully tested yet, and considered as beta/test.
  3. Insert the SD Card into the MKS Sbase board and plug in the USB Cable. Your SD Card is now going to show in your file-Explorer.
    1. If not, you need to make sure you have the Drivers installed.
  4. If you can’t find the config.txt file from Smoothieware, just locate the config.txt in \MKS Sbase\MKS-SBASE-master\MKSSBase-firmware and copy it to your SD Card.
    1. Smoothieware suggest disabling auto-Mount on the SD when connecting to USB. Especially when using a MAC, as MAC OSX tends to do funky stuff at strange times.
    2. I have changed nothing on my win10. And nothing bad has happened the past year.
  5. The D7 lights up, shortly after D1 follows. D2, D3, D4 blinks and then D4 turns steady while D2 and D3 continues blinking.
    1. At this point, the firmware.binchanged had changed to firmware.cur file on the SD card
  6. After successful updated, the file name will turn into firmware.cur.

Changing or Updating firmware

Just delete the firmware.cur file from your SD, or rename to firmware.cur.old or similar, and copy on the new firmware.bin file to your SD. Powercycle your printer (also unplug USB) and you can see your new firmware.cur file on your SD card.

Note:After making any changes to your config.txt file in the future, you need to power-cycle your controller, meaning disconnect both power (if in use) and USB. You can send a reset command, but only through true terminal use and not through Printrun/Pronterface or similar.

You can use the edge firmware which is eseentially a realease candidate, which has more features, but also might contain some errors. This goes beyound this Instructables.

Step 2: Configuring Smoothieware Compared to Marlin


I’ve been using Marlin firmware on Arduino+Ramps for a long while, same as the majority of 3D people, so I’ll use Marlin as comparative source for configuring firmware.

Obvious difference from Marlin

Configuring Smoothieware is done in a single config.txt file which is saved directly to the SD card, using notepad instead of a big program like Arduino IDE. The firmware settings are updated by power-cycling the printer or sending a reset command to it. This compared to Marlin with a very large amount of sketches (files) we need to keep track of and modify – see Photo for settings the printer I’m actively upgrading here!

Less obvious differneces

There are some less obvious differences between Marlin and Smoothieware, where the most notable are:

  1. Speeds are rather confusingly listed as a scattering of mm/sec and mm/min in Smoothieware and Marlin, so have to be aware of this. No clear pattern is in place.
  2. The axes in Marlin are listed as XYZ and Extruder while the axes in Smoothieware is listed as Alpha, Beta, Gamma and Delta/E0 and E1

Firmware and Config file(s)

As you might have gathered, the Smoothieware firmware is based on 2 files. A firmware.bin and a config.txt file. There is a base config.txt file and a bunch of preconfigured configuration files present in the repository from MKS, located in a subfolder. The Config file can also be named without the .txt extension.

Note:This is a template and not just something to put in and use.

You can pick the one that most resemble your printer, like Delta or Cartesian. I’m just going with the basic Config.txt file.

Configuring firmware

First make a backup of your config.txt file, then open config.txt using notepad. Disable “Word wrap” as it might confuse you some.

Note: Smoothieware warns against Notepad++.

Also remember to take your microstepping multiplier into account. My setup here is based on 1/32 multistepping to take advantage of the build in DRV8825 drivers. Multistepping jumper is placed in upper right corner. (1)


You can make your own comments by writing # at the start of your line and then your text. This is very usefull to remember what something is about.

I’m adding a line to the start of the file: # Ultimaker 2

Step 3: Firmware Step 1: Default Feed Rate

I have 300mm/sec in Marlin, which translates to 18000mm/min, so I’ll change the preconfigured 4000 to 18000. My Ultimaker is very well tuned, so you might have much lower setting – or higher if using a Delta.
Default_feed is translated to DEFAULT_MAX_FEEDRATE in Marlin.

alpha_steps_per_mm and beta_steps_per_mm needs to be changed to 160 while gamme_steps_per_mm is changed to 800.

acceleration is changed to 300 and z_acceleration to 80

1/32 multistepping

All of the above are 1/32 multistepping. In order to use 1/32 you also need to set the correct jumper on your Controller. It is located almost at the upper right corner with 16|32 next to it. The pins are named J3.

Note:Do not change any jumper with power on. Including connected USB cable

Connecting Motors

There is really not much to it. You need to have some 4 pin XH 2.54 4-pin connectors. You can use dupont as well, but they tend to fall out.

The Controller board is clearly labeled X (Cm2_M2), Y (Cm3_M3), Z (Cm2_M4), E0 (Cm2_M1) and E1 (Cm3_m5).

External Motor Controllers

If you need to hook up some external motor controller, you can do it using the pins just below the big heatsink over the drivers.

The pin-outs are labeled Jc_M2, Jc_M3, Jc_M4, Jc_M1 and Jc_M5 listed in order of above motor conenctors.

Step 4: Firmware Step 2: Cartesian Axis Speed Limits, Pins and Current

Defaults are 10000mm/min which translates to 166mm/sec (to keep reference to Marlin users) which is enough for many printers. Note how I write down defaults/current value in notes after the setting. This is a good idea in case (when) you need to make changes.

I have 300mm/sec on my Ultimaker 2 though, so I’ll put in 18000 for XY and 4800 for my Z axis.


I’m not changing any pins at the moment, but we have to type in the _max_rate for each axis, which on a cartesian printer i the same as _axis_max_speed. This is not the case for Delta printers.

So for alpha_max_rate and beta_max_rate I enter 18000 and for gamma_max_rate I enter 4800.

Take note of the ! listed after each _dir_pin – this denotes the direction of an axis, which means you can remove or add ! if your axes is going the wrong way.

Go back and modify this later as needed instead of swapping around the cables, which you can’t do, if you use the proper connectors in any case.


My XYZ Nema motors are rated at 3.2 voltage and 1.7amp.

If I wanted to feed my motors max current, I’ll set the _current to 1.7 amp, but the motors would run rather hot then, so I’ll try out using the 1 instead which should be plenty.

I have set my Z-motor to 0.8 amp as it really isn’t doing much Work, translating to: gamma_current 0.8

Step 5: Firmware Step 3: LCD, SD and Extruder

LCD and SD

I’m not going to change anything regarding LCD and SD.

Extruder setup

I am not using the original extruder, so my numbers will be different here!.

I have uncommented two settings here: extruder.hotend.retract_length and extruder.hotend.retract_feedrate but I must admit I do not know wheter this is necessary or not, since we configure this in our slizer in any case.

Delta driver current

One thing of note here is the current for our delta driver, which translates to our Extruder 01 motor.

My Extruder motor is rated at 2.5amp. I want to give it some juice, but not running it too hot, so I’ll put it at 1.5amp. I am running a 5.1 geared extruder, so I do not really need to pressure it. 1.5amp is probably too much as well.

Step 6: Firmware Step 4: Hotend Temperature Control Configuration

I’m not changing the pins or connector we use, but stick to the default.

Thermistor type

I do change the type of thermistor used. I am using E3D hotend, which comes with a Semitec thermistor, so I need to change that.

To find the correct thermistor, we look at:

PID tuning

We do need to configure this, but we cant really do it at this stage since we need everything setup first.

When you are ready to do it, the command is slightly different than with Marlin firmware.

In Smoothiware the command is M303 E0 S60 to test at 60c. I did a test at 60 and then Again at 200 with new values.

Hotend thermistor – physical layout

In order to actually connect our thermistor we take a look at our pins image to figure out where we connect it.

Default connector for hotend thermistor is the one named TH2 on the board.

  1. TH1 is P0.23 – Heated bed
  2. TH2 is P0.24 – Hotend
  3. TH3 is P0.25 – Unassigned
  4. TH4 is P0.26 – Unassigned

I have made a small comment in the config.txt file to remind me that 0.24 is TH2

Hotend heater pins – physical layout 2.7 is the screw-terminals labeled Heater1 on the board

Below chart looks rather unorderly, but is listed as left to right on the controller-board. It is listed on the board itself, which makes it not as bad as it might seem.

  1. Hot-bed is P2.5 – Heated bed
  2. Heater1 is P2.7 – Hotend01
  3. Heater2 is P2.6 – Hotend02
  4. FAN is P2.4 – FAN

Step 7: Firmware Step 5: Heated Bed Temperature Control Configuration

There was no comment to clearly state the start of the heated bed section, so I made a start comment #Heated bed temperature control configuration to match the start of hotend section.

Thermistor Type

You might need to change the Thermistor to the appropriate type for your setup. Nothing else to it really.

To find the correct thermistor, we look at:

Temperature Control Bed BANG-BANG

I am running my heated bed through a SSR (Solid State Relay) which is not very good at handling PID, which uses higher PWM signals. I could do it by turning signals down to 20 (according to smoothiewares site), but I honestly don’t know how to do a PID tuning of my Heated-bed?

If I wanted to specify my frequency for the bed, it would be like this:

temperature_control.bed.pwm_frequency            20

I uncomment and change the setting for temperature_control.bed.bang_bang to true and also uncomment the next line temperature_control.bed.hysteresis

Heated bed thermistor – Physical Layout

Here we once Again take a look at our pins image to figure out where we connect the thermistor.

Default connector for heated bed thermistor is the one named TH1 on the board.

  • TH1 is P0.23 – Hot-bed
  • TH2 is P0.24 – Hotend
  • TH3 is P0.25 – Unassigned
  • TH4 is P0.26 – Unassigned

I have made a small comment in the config.txt file to remind me that 0.23 is TH1

To find the correct thermistor, we look at:

Heated bed heater pins – Physical Layout

temperature_control.bed.heater_pin 2.5 is the HOT-BED screw-terminals. This is the large screw-terminal right next to power input.

Below chart looks rather unorderly, but is listed as left to right on the controller-board

  1. Hot-bed is P2.5 – Heated bed
  2. Heater1 is P2.7 – Hotend01
  3. Heater2 is P2.6 – Hotend02
  4. FAN is P2.4 – FAN

Heated bed is default set as bang_bang which is fine for large areas like a heated bed.

Step 8: Firmware Step 6: Configuring Endstops

This sections looks very confusing at first glance, but it really not bad, when you first figure out how it is ordered.

Smoothieware source:

Homing direction

Lets setup homing direction for our Ultimaker style printer. We know it homes to X min, Y max and Z max. This translates to:

  • alpha_homing_direction home_to_min
  • beta_homing_direction home_to_max
  • gamma_homing_direction home_to_max

Disable unused endstops

We do not use X max, Y min and Z min endstops, so lets disable those, by typing nc, which translates to Not Connected.

  • alpha_max_endstop nc
  • beta_min_endstop nc
  • gamma_min_endstop nc

Define axes size

We need to define the size of our printer. This translates to Software endstops in Marlin.

  • alpha_max 213
  • beta_max 179
  • gamma_max 195.8

Reversing endstop output

Test output by issuing a M119 command to it. This looks different than when using Marlin, so instead of triggered, you get an 1 if the endstop is signalling a hit.

If you get a false positive you need to revert the endstop signal by adding an ! after the pin number.

You can see how I removed the ! from my alpha_min_endstop and how it changed the output when issuing M119 command.

Hint: Just don’t focus on 1.24, 1.27 or 1.29 which are the pin numbers, but just look at the !

Fast and slow homing rates

Homing rate transfers directly to move speed mm/sec.

I upped the _fast_homing_rate for X and Y to 100 and Z to 20. The Ultimaker 2 homes to Z max and it really just takes ages for it to home if you keep it at its default.

I actually had double this in Marlin, but want to test it out a bit, before raising it, since I just changed my heated bed to something heavier.

When hitting the endstop the axes retracts a bit, where the distance i defined in _homing_retract_mm, and then moves slowly back. This is defined by _slow_homing_rate some. I upped these well, especially for my Z axes.

Step 9: Firmware Step 7: Network Settings

If you are going to use the networked option you can go with automatic setup, where you enabled DHCP and your printer is given an IP from your router/DNS server.

If you want to configure your printer with a static address instead, you simply type in the IP address and subnet mask here.

I have changed it to something fitting for my subnet. Yours might be looking different.

I can now connecto to the printer using both a standard internet browser or using Pronterface.

Using an Explorer we get a simplified Pronterface GUI for our use.

I have kept telnet enabled as I want to see what options it gives me.

Note: Do disable any networking service you do not use, aa it will open a security breach where people might take over your machine. Especially disable Telnet if you do not use it.

Step 10: What’s Next?

This is it for now!

I hoped it helped you get started, or helped you decide wheter to make the leap for Smoothie-type boards and Smoothieware or stay away.

I believe I have fullfilled the purpose of this Instructables by getting started using the Sbase 1.2 controller and using Smoothieware.

We should by now have a functional printer, albit some tuning is stillneeded.

More advanced setup?

I allready did setup a Hotend Temperature and -fanswitch (2 switches), which I will cover in an upcoming Instructables.

Using switches

1) Fanswitch :: Be able to turn on/off my fan used to cool my hotend heatsink – I do not want it ON all the time unless it is needed, as it can be rather noisy.

2) A switch that polls the temperature for our hotend and then use the fanswitch to turn on the fan at temperatures at or above 50c and then off again, when temperature gets below 50.

Posted on

Lets build an Ultimaker 2+ Extended clone – Part 3 – Buy stuff 1

Buy Stuff 1

I originally thought to make just 1 post about buying items, but I quickly realized it wouldn’t be feasible, so I’m splitting it up into parts and doing a sum up in the end.

It’s time to start buying stuff!

I’ll go through the individual items and talk some about what to pay attention to and give a link to the items I bought, and a generic link with search results, but please note that the links might not work when you read this, so you might need to make your own generic search on Aliexpress instead.

Many items can be bought in different versions, so pay attention to the details, like material of the frame and size of filament for the hotend etc.

Ultimaker 2+ Extended frame/case

This is the most expensive piece on our build and it is of course very important.

Things to note:

  • These things can be found in a various materials. We want to get Dibond, which is a sandwich material with aluminium for each side and hard plastic for the center, for all the parts except for the sides of the frame, which are made from acrylic plates.
  • You can get them with Dibond for the sides, but that is up to you. The original is with acrylic sides, for light to shine through. Also heavier when using Dibond sides. It might be more rigid, but I don’t think so.
  • Many sellers feature wooden and all acrylic cases. You do not want to buy these. They are not as rigid and they are much more noisy.
  • They are sold in 3+1 basic versions:
    • Frame including all screws and nuts and the 8x F688-2RS flanged bearings used for the end of each 8mm rod.
    • Frame including all screws.
    • Frame without anything included.
      • The Print Table Back cover for the heated bed should be included with the frame. I have not seen this sold seperately.
        If you don’t see it on the photos and in the description of the item, then ask for it to make sure.
  • I talked about shipping options in Part 2 of this series, and it is very relevant here. I like to buy using DHL, UPS or similar shipping to make sure it all goes smoothly. It also says something about the seriousness of the seller to use a proper shipping company for these kinds of items.

Links for Ultimaker 2 Frame

You might want to search for “Case” as well).

8x Flanged Bearings

If they are not included in your frame, you need to buy 8x F688-2RS bearings.


Experient with free shipping and buying lots instead of individual bearings.

Generic search – I had some on hand, so didn’t buy for this project.

Ulticontroller, LCD and SD reader

Things to note:

  • Can be found for around $100 including shipping. Some shops still lists at $140 though, but talk to them about it, if you found a favorite shop or something. They are highly likely to lower the price to match competing shops.
  • The controller is pretty much just an 8bit Arduino Mega r2560 and Ramps build into one and primed for 24v usage. This board does not use normal thermistors though, and has build in 3x pt100 sensor amplifiers, which are rather costly on their own at £15 a piece from E3D!
    • All in all, it means that $100 is really not high price for this controller including lcd and sd reader + cables.
    • A very nice thing about it is how it’s very neat and ordred, so not a lot of wires and stuff sticking out with risk of falling out and ruining your controller.
  • Unless you buy everything at the same place, I’d like to wait a bit with buying this, as it is handy to have 2x PT100 sensors on hand to test it. These two sensors are found on the Heated bed and in the Hotend respectively, and you can’t really test it without these two as the controller is going to just give an error message.
  • You need sensors, motors and an SD card in order to test this. Preferebly some LED’s and a multimeter device as well, to test various output voltages.
  • You can use any 24v psu with at least 16amp, but I recommend buying an original one. I buy mine from an authorized Ultimaker reseller for about $75 including shipping, so it’s actually cheaper than buying on Aliexpress!

Links to Ulticontroller etc.

Current version is 2.1.4 for the Ulticontroller and v2.1.1 for the LCD/SD controller

I’ll strongly recommend you buy the parts as a single package as you’ll find it impossible to prove what went wrong if controller is from one and lcd from another, and something went and died when powered on.


I’m not sure the correct name is Z-stage, but I’m using it to describe the entire moving printbed construction. Ultimaker seems to call it Heated Bed Build platform.

You can buy it assembled/complete but these tends to be very expensive and the individual parts has dropped a lot lately, so either buy them individually or at least talk to the sellers to get the price lowered for the complete sets.

Print Table Base Plate

This is the base plate of the z-stage assembly. Meaning the aluminium plate everything is screwed on to.


Bearings for Z axis

We need 2x LMK12LUU bearings for the Z-axis. You want/need the square models or it wont fit on the Base Plate.


Print table Heated Plate

Special attentions needs to be made when buying the Print Table Heated Plate, as it comes with and without asscessories.

Things to note:

  • The black side with Ultimaker name is actually the underside.
  • Most plates comes without the screw terminals for wires (lengths in link are for normal ultimaker2, so correct as needed.) and the ones with the terminals are often much more expensive. Most comes witout wires as well, which means you need to do some soldering.
  • It is very important that the plate comes equipped with a PT100 sensor as it does not work with the Ulticontroller otherwise. Some comes with nomral Thermistors or without any sensors!
  • The screw holes on the blank sides must be countersunk, or you have to do it yourself.


Print Table Glass

This Print Table Glass plate is actually a pretty expensive piece as it is made from Borosilicate glass. It means you can take it directly from the printer, while it’s hot, and stuff it into your fridge or freezer to make the items pop loose.

You can use plain glass, just don’t stuff it into your oven.

There are Build Platform Glass Retainer clips mounted on the heated plate to hold the glass in place. These are designed for 4mm glass thickness. I’m personally using bulldog clips instead on sides and front, as the original clips are very hard on the fingers.


Expect a price at around $25

Heated Bed Cable Clip

I recommend you just print this Heated Bed Cable Clip. If you don’t own a printer to do it, just use a plastic ziptie untill you can print your own.

You can find the model on my thingiverse collection for Ultimaker 2.



The Ultimaker machines use 3 Fingerscrews to adjust the Print Bed.

They are made up of 3x Knurled Nut Platform, 3x Table Springs with dimensions of 15mm long, 9.2mm outer diameter and 1.2mm thick steel. You also need 3x m3 20mm screws with xxx head and 3x M6 washers (6,4mm inner diameter, 12mm od)

The Fingerscrew Knurled Nuts are normally sold alone or along with the springs. I don’t think I’ve ever seen washers and screws included. Notice that some nuts are golden instead of metallic looking.


Heated Bed Glass Retainer Clips

The glass on the print platform is held in place with 4x Heated Bed Glass Retainer Clips. The rear ones are installed using 4x m3 x8mm screws and 4x m3 lock nuts.

The 2 front clips are held in place using the Fingerscrews in one of the holes on the clips – resulting in the clips can be turned open to release the glass. I personally do not use the front clips, as they just kill my fingers, so I’m using the rear 2 clips and use bulldog clips on the sides and front, to keep the glass in place.

I have not seen these be sold along with screws and nuts.


Posted on

Lets build an Ultimaker 2+ Extended clone – Part 2 – Using Aliexpress

Welcome to Part 2 of the blog-post series with the never ending name of Lets build an Ultimaker 2+ Extended clone 🙂

This Part 2 is going to be about how to use Aliexpress, and what to keep an eye on.

  1. Ammendment – Ultimaker 2 assembly manua
  2. Lets get down to it – Picking suppliers
    1. Don’t just pick the first the best
      1. Sold By and Visit Store
      2. Product Name and Descriptionv
      3. Shipping and Shipping Price
      4. Total Price
      5. Positive Feedback
  3. Known good suppliers
  4. Common telltale to keep away

First a bit of an ammendment

I forgot to talk about the existing Ultimaker 2 Assembly manual, which is located on the official Github repository.

You might, rightly so, wonder why on earth I’m creating this blog-post series when a manual allready exists?

Well, that is a good question, and the reason why I havn’t got around to writing sooner. Not because of the question, but because of the existence of this manual, but the thing is: Just because you get an assembly manual, doesn’t mean all the small things are taken into account, nor, and especially, are there any things related to how to actually obtain the various parts.

This is the true heart of what I’m trying to do here: Descriping how and what parts you need to get, and what prices you can expect, along with advice on how to do this, or more particularily, what to avoid when shopping on Aliexpress along with some tricks on purchacing bundles.

Lets get down to it – Picking suppliers

I’m almost exclusively buying parts on – if you are new to it, you need to create an account and associate a credit card or paypal account. I’ve never had any issues regarding money been withdrawn when I hadn’t bought something. I’ve also always get my money refunded when relevant.

So, why make a section on picking suppliers, when it’s so easy?

Not all suppliers are created equal, and nor are their products.

When searching for items, you can sort by price, then do spend some time looking at the various items. You can also put a tick in free shipping, but that is not always favorable, so experiment some on this.

Don’t just pick the first the best

Do not just pick the first cheapest item that shows up in your search and buy it without doing a bit of investigation into the reseller.

Lets go through what to look for, using the seller from which I bought the frame and many of the parts as an example:

SANJIUPrinter 3D Research Center Store

Sold by and Visit Store

After a while you’ll get to recognize several resellers name listed under Sold by (Number 1), which is good, but untill then, you should use the Visit Store (Number 2) and browse through it.

If they sell all kinds of (junk) non 3D and CNC parts like fishing equipment, parts for various craft hobbies etc, you most likely don’t want to buy your stuff from that one – why? Because they likely just got a big batch of the items you look at, at a very low price, and just pass them on without any Quality Control. You might get lucky of course, and I’ve bought some minor items from such.

Product Name and Description

Product name and Decription (Number 3 and 4) are extremely important here. Yea sure! you might say, of course the name and description are important, but it is much more than as such. A good deal of suppliers use stock photos, so while it might show 2 pieces of something the name might say 1, or even worse, the name actually does say 2 pieces while the description states that you are only going to recieve 1 item.

This means you always must go through name and description for such discrepancies and take proper care. If in any way in doubt you should either pick a new store or Contact Seller (Number 5) and ask to make sure.

Also the seller might have special discounts listed in the Description. Our example seller here gives you discount if you add the item to a Wish list and add the shop to your Favorite Shop.

Note: in order to take advantage of rebates, you still need to add to basket, then click Buy (do not use one-click buying option), but choose a different payment method from normal, but not another card. This way the order is going to be placed, but awaiting payment. The seller can now go in and modify the price before you pay.

Simple, ehh? Not really, but it does work.

Shipping and Shipping price

Pay attention to the Shipping price and method (Number 6). This seller has free shipping using DHL on the frame, which is worth a lot. Also means it might just pay off to pick several other items from this shop, as you are guaranteed to get the items quickly, instead of waiting a month, and without most of the potential problems that might occur with missing packages slow toll/vat and such.

Total Price

The Total Price (Number 7) is the price of the item + shipping. It’s rather obvious, but I’m mentioning this, as the shipping price might be rather significant on smaller items, so stacking on a large free shipping items often pays off.

Positive Feedback

Feedback is everything on Aliexpress and the sellers are going very far to get a positive rating. It means you should contact them if you have any problems with the product, which often leads to some sort of partial refund.

After recieving your product you firstly need to confirm you have recieved it. You should give feedback, as it also rates the other way. The sellers are rating you as well, so keep that in mind! If you have problems, contact the seller and if you can’t find a solution you can Open a Dispute and 3rd party from Aliexpress judges the case.

Be resonable: you can’t get full refund for a functioning but slightly damaged product, like scratches etc.

Known good suppliers

As mentioned earlier, you are going to learn to recognize certain resellers. Don’t be afraid to shop from many different sellers, but I’ll put up a short list of shops I dare recommend. Also for more expensive parts.

Listed in no particular order

Common telltales to keep away

When searcing for a product you know is manufactured by a certain manufacturer, like the MKS-Makerbase controllers I’ve written about on instructables, you really should never buy such things from 3rd party stores. It does require you keep your eyes open, as multiple shops, also some of the Known good suppliers above, are selling copies of these things, but they can never give the same service and it’s often bad quality or a completely diffferent product alltogether.

Why have them on the Known good suppliers if they act like this? There are bad, and there are bad. Allways keep your eyes open 🙂

Another thing you really must keep your eyes on, is when you are looking for the Ultimaker 2 frame. It should be created from Dibond plates (sandwich of aluminium on either side and hard plastic as core) and acrylic plates for the sides, but you are going to see a lot of wooden and even all acrylic frames. Don’t go there! Some are assembled, meaning screws and nuts are included, while others are not, so take that into consideration.

Some shops include parts, you might see as 100% part of the object, but which is viewed as an extra by the resellers. Like the piece of Dibond for the Ultimaker 2 bed, hiding the bearings and lead screw nut. These things are worth money, and looks matters as well.

Posted on

Lets build an Ultimaker 2+ Extended clone – Part 1 – Source files and BOM

I know I know, I allready have too many printers and unfinished projects, but I have a squirrel brain and tends to jump from one thing to the next, while my printers are busy trying to keep up with my ideas! 😀

This Lets build an Ultimaker 2+ Extended clone is actually an old idea of mine as a follow up project to my venerable Complete Newbie Step by Step, 3D Printer With All Parts Lists printer project back in the days.

I just made the mistake of mixing 2 projects together: Ultimaker build guide and Detaield explanation on 3D Printers, so it quickly got out of hand and sidetracked.


  1. What is this going to contain?
  2. Open-source and license
  3. BOM and using Ultimaker Github repository
    1. BOM
    2. Models of the parts
    3. Complete model
  4. What’s next?

What is this going to contain?

This time I’ll focus solely on building the Ultimaker 2+ Extended, show all the parts used, the price I paid for them and provide some links. Just remember that prices change, often to the better though, but it will provide an idea on what it will cost to build your own Ultimaker 2+ Extended.

This guide can be used to build the non-extended as well. Just get a normal frame, shorter Z rods and z-motor with shorter lead-screw.

Open-source and license

Please remember the license on these things!

While Ultimakers are open source, and you are allowed to build for yourself, you are not allowed to build them with the goal of being a reseller.

The Ultimaker robot and name are also trademarked, so be sure to mention yours is a clone if you decide to sell your machine in the future. I’m not in any way a legal advisor, so please contact Ultimaker if you have any questions regarding this.

BOM and using Ultimaker Github repository

I’ve build and rebuild a lot of machines by now, so I don’t really much need a BOM (Bill Of Material) to go on, but I am using the official Ultimaker Github repository as a source of information. To be more precise, we need to scroll down, go to page 2 and click on Ultimaker2ExtendedPlus

…but oh no! Lots of unnamed files.. all but impossible to use this as any sort of sensible source of information.. fear not, lets go through what’s what:


There is a folder named BOM where you can find BOM 9407 Ultimaker Heated Bed assembled.pdf and BOM Ultimaker2extended+.pdf

I had an excell file once, but can’t find it now.. please let me know if you find it 🙂

To be honest, they are not that usefull.. or, they are, but I think you’ll find the links with images I’m going to post later on, somewhat easier to use!

Models of the parts:

All the STEP files in the Ultimaker2ExtendedPlus directory are 3D models of the individual printer parts… unfortunately it is all but impossible to find your way around there, so I’ll recommend using the normal Ultimaker 2 folder if you want to view individual parts, as they are named for the parts used.

It’s usefull if you want to make sure of lengths of rods, size of glass plate, specifications on bearings, building your own 3D printed parts to match and so on.

I’ve used one of the STEP files to print my own motor spacers instead of buying them for instanec. Just upload it to Fusion and then save it as STL file 🙂

I’ve created a collection on my thingiverse profile where I add the various items 3D printable items for Ultimaker 2 machines. I’m not recommending using these over injection molded parts pr say, but it is a nice way to save money. Just be sure to use ABS for the parts you are going to put inside the frame.

Complete model:

In the folder 3D model Ultimaker2extended+ you can find a model of the printer in STEP format, which you can Upload into Autodesk Fusion 360 (free – says trial which means you have to accept the licens once pr. year) or similar.

Be aware that it does require a bit of an ok CPU and graphics card to handle the full model.

What’s next?

In part 2 of this series, I’ll start posting images of the parts I’ve bought, prices and some links and advice.

Posted on

BeTrue3D Printer build part 8 – Carriage for 5way Diamond Hotend

Putting the 5way Diamond together.

Aside from this one having 5 heatsinks and the previous version had 3 heatsinks, the method of assembly is the same.

I’m using some high temperature paste to coat on the Heater Cartridge, and fill up the hole for the Thermistor (I’m using a Thermocoupler).

The 5way Diamond will ship with a 60w heater cartrdige, but since they havn’t landed in Denmark yet, I’m using a 12v 30w E3D cartridge which will magically turn into a 60w 120w heater as I’m running my BeTrue3D Printer as a 24v system.

I have contacted E3D to hear about quality of their cartridges – wheter it can sustain the increased voltage/current through it. I can limit the voltage in firmware and hit the recommended 60w, but still need to hear from E3D wheter it’s ok or not.

I’m coating the heater cartridge in the paste, and insert it into the middle hole. At first I had no paste coming up, so I applied a good deal more and inserted it once again, while rotating it.


This time I had a deal of excess paste coming up, which I cleaned away using a cotton tip, and then inserted into the hole for thermistor/thermocoupler.

Putting the wires through the heatbarrier and opted to fixate the Thermocoupler wires onto the Heater wires

Screwing on the individual heatsinks, while making sure the Thermocoupler and Heater Cartridge stays in place.


Attaching 5way Diamond to Carriage

I’m first going to put a ø2,5mm drill through the holes I made to mount my 40mm fan. I then tapped the holes with an m5 tap to make it easier to mount the fan later on.


Afterwards I start by inserting a plastic zip-tie to hold the cables in place, once I clip on the entire assembly onto the Carriage.

Carefully putting the wire through the Carriage, without uprooting the Heater and Thermocoupler, and clip on the assembly. Making sure all 5 heatsinks has clipped on.


Securing the cables in place. The insulation is taking too much space, so had to remove some of it.


Once I’ve fixed the cables and made sure the heatsinks are all in place, I use a zip-tie to fasten each heatsink to the Carriage.

Attaching a fan

Normally you might use a 50mm fan, but I had this nice 40mm 20mm thick fan lying around, and made my carriage to fit.



Fasten Carriage to Y Sliders

Finally got the 5way Diamond hotend mounted on my printer and put the bowden tubes in it 🙂

Struds and wirework

I’m printing some struds to fasten the two X sliders on both sides as I write this, which are needed to make it work.

Here’s some images of the struds and some tidying of the wires and bowden tubes.

Future changes

I think I’m going to combine the Carriage with belt fastener. Not entirely sure yet.

My overall plan has always been to make a Carriage system where I can drop in change between the 5way Diamond and and E3D hotend and such, but not entirely decided yet, how it should work.

Regardless though, I need to make some mounting points for fans on either side of the nozzle.

Posted on

BeTrue3D Printer build part 7 – CoreXY and Front Panel

CoreXY Setup

I’ve build a bunch of printers by now, but this is my first CoreXY. I had read quite a bit about it, and also looked at a lot of photos trying to figure out some nice ways to put on the belts.

What I entirely missed was the requirment that all belts, aside from the rear/far right on my printer, must meet the bearings at a straight angle, and leave it at a straight angle as well, which mine did not do (still don’t).


This led to some extra hours of tinkering, as I posted some photos online to get some input after my first draft.

I came up a piece of metal for each of the far corners, which I can tilt as needed, to make the inner bearings to line up perfectly with the X sliders.

At my first draft I also had the far ends (away from motors) in two levels, in order for the belts to pass each other.

I later learned I could twist the belts to make them cross on the same level. It is ok to make one of the outer corner idlers a tiny tad lower or higher to make a bit more clearance for the belts.


I have ordered some teethed idler pulleys with bearings in them, as I need 4 of those for the idler-posts, where the teeth-side of the belts are touching the bearings.

I’m going to design some sort pieces for the Y sliders to grib the belts coming onto them from the X sliders. As they are now, they are very far from a right angle on the bearings 🙂

Front Panel – magnets

I always close up my printers. Or semi closeup as I do not cover the top usually. This helps keeping a stable temperature in the now-chamber, and greatly enhance the print-quality. Also for PLA.

It also makes it possible to open windows right next to the printer, which is nice.

I cut up some acrylic plate I had to match the front, marked up 3 holes on each side, did a 3mm pilot hole and then almost drilled through using an 8mm drill, which fits the round magnets I have on hand.

Note: I use some old dull metal drill-bits when drilling in Acrylic materials. It works a charm without ruining it.

Don’t despair if you happend to drill all the way through.. I did it myself a couple of times.

Glue in the magnets

I’m using 2 magnets pr. hole, as they aren’t very strong individually. Put a tiny drop of loctite between the two and some locticte in the hole as well.

You can see how this one is drilled all the way through, so just make sure to get some on the edges.


And done

Here’s the final piece. 2×3 magnets pr side – you might wonder how it sticks to my aluminium case?

A few posts back, I put on some black glue-on magnet strips I bought for some PC Mod a few years back.

They are very weak, but enough for this job.

Posted on

Duet WiFi – Configuration walkthrough and adjust – Part 1

We allready did a basic setup using the online RepRapFirmware Configuration Tool and it’s time to take a look at the config.g file and see what it all means and make sure it all works as it should.

Don’t be depressed if, say, your object cooling fan is blowing as soon as you turn on your printer or one or more axes are moving the wrong way.

Before continuing you should go get some coffee or similar, as this blog-post ended up as a huge post with lots of information.

I also hope you appreciate how I managed to get rid of the right hand column, so the reading quality on this site improved a lot!

For more technical info, you should take a look at the official Configuring RepRapFirmware for a Cartesian printer wiki page.

Duet WiFi overview.

Lets start by putting up the Duet WiFi overview I made for my previous blog-post: Duet WiFi controller from the previous Duet WiFi – Intro & Explained.

General preferences


These are all set from the online configurator and we really only need to adjust the M208 axis min and max.

You can change the M555 Pn if you want to change the compatiblity mode, ie. if you want it to respond in a certain way when you input commands in the Terminal.

We will however let this be for the moment, as we need to verify our movement settings before doing this.

Note: I’ve later discovered that we should remove or comment out the M83 line as it is causing all kinds of problems. From what I gather I believe it’s a bug, that this command is in there in the first place.


Lets take a look at what is going on here.

First we have M574  which is used to define the XYZ endstop parameters. A setting of 1 after axis letter denotes an endstop placed at the minium of that axis, a 2 if it is placed at the max. If you do not have an endstop, you insert a 0.

Meaning we have X at minium and Y and Z and maximum.

Sn – Active low or high

S1 defines the switches as Normally Closed (NC), which means current is running through when the switch is not engaged, and the circuit is broken when the switch arm is engaged. This is also called “Active high” in the Duet documentation.
S0 defines the switch as Normally Open (NO), which means there is no current running through the endstop when not engaged. When the endstop is activated a current will go through. This is also called “active low” in the Duet documentation

Sum up Endstop M574

It all means we have X at minium and Y and Z at maxium and the endstop switches are normally closed.

; Endstops
M574 X1 Y2 Z2 S1 ; Define active high microswitches

Z-Probe Type

The M558 Gcode defines Z-probe type and settings. Insert ; in front of it, as we do not have a Z-probe.

Z-Probe Status

The G31 Gcode can be used several times to define different probe types (i.e. 0+4 for switches, 1+2 for IR probes and 3 for alternative sensors).

We are not using any Z.probe, so uncomment it, by placing a ; in front of the line.

Set Z-probe point or define probing grid

The M557 is also used for use with a Z-probe to define a mesh grid.

As before, we do not use a Z-probe, so we’ll put a ; in front of the line to uncomment it.

Endstops final settings

Since we do not use a Z-probe, we really only need 1 line in the Endstops section

; Endstops
M574 X1 Y2 Z2 S1 ; Define active high microswitches

Here’s the entire Endstops’ section

I  have left the z-probe part in place, as I might use a z-probe later, and it’s nice to have as a reference.

; Endstops
M574 X1 Y2 Z2 S1                  ; Define active high microswitches

; M558 P1 X0 Y0 Z0 H5 F120 T6000  ; Set Z probe type to unmodulated, the axes for which
; it is used and the probe + travel speeds
; G31 P600 X0 Y0 Z2.5             ; Set Z probe trigger value, offset and trigger height
; M557 X15:215 Y15:195 S20        ; Define mesh grid


Next up we look at the movement of our printer.

When using the RepRapFirmware our motors are listed as Drives. The first 4 lines each denotes a motor, where the first three from 0 to 2 are our XY and Z drive, while number 3 is our extruder.

Movement direction

Lets go to machine control and test each axis by pressing the associated +1 buttons for each axis.

Yours is probably different, but my X axis is going the wrong way, so I’ll have to change the direction of X:

Changing this: M569 P0 S1 to M569 P0 S0

Note how we “use” the Gcode M569 to change the settings for drive P0 from direction S1 to direction S0

Extruder direction

I also hit the extruder bottom, but since my hotend are cool I recieed this error:

We’ll let this be for now, and return to it once we have configured our hotend heater.

Save the changes, click yes to reboot and check your new configuration.

Microstepping mode

Next up is the configuration of microstepping mode using M350.

We start by issuing the M350 command and list each drive followed by microstepping mode.

The trailing In denotes wheter or not we have interpolation mode enabled. I1 to enable and I0 to disable it.

After running through the Web Configurator I learned that only by running at 16 microstepping the I1 parameter causes the microstepping to be interpolated to 256x.

Allthough you can turn on interpolation and set microstepping at 32, I have come to believe interpolation is in fact not enabled, so 32 would generate more noise than 16 with interpolation enabled.

I means I change

M350 X32 Y32 Z32 E32 I1        ; Configure microstepping with interpolation
M350 X16 Y16 Z16 E16 I1        ; Configure microstepping with interpolation

Steps pr mm

Since I just changed microstepping from 32 to 16, I need to change the line, where I used the M92 Gcode to define steps pr mm.

My current setting is 160 steps pr mm for XY, 800 for Z and 2050 for E:

M92 X160 Y160 Z800 E2050       ; Set steps per mm

I’ll change that to 80 steps pr mm for XY, 400 for Z and 1025 for E

M92 X80 Y80 Z400 E1025       ; Set steps per mm

Speed configurations

Last part of the Drivers section consists of settings for instantaneous speed changes, which roughly translates to marlins jerk setting. the maximum speeds, accelerations, motor current and motor idle current and lastly idle timeout for how long the motors stays engaged before turning off.

Allowable instantaneous speed changes

The M566 sets the allowable instantaneous speed changes. I’lll leave this as is, as I need to test some.

M566 X900 Y900 Z12 E120        ; Set maximum instantaneous speed changes (mm/min)

Maximum feedrate

The M203 set maximum feedrate pr mm/min as opposed the more commonly used mm/sec, so keep that in mind.

M203 X12000 Y12000 Z6000 E1200 ; Set maximum speeds (mm/min)


The M201 is used to set max printing acceleration. Instead of mm/sec, or even mm/min, this now uses mm/ s^2. I personally find this an odd size, as it is very hard to relate to. I’ll leave it as is.

M201 X500 Y500 Z250 E250       ; Set accelerations (mm/s^2)

Motor current

The M906 command is required. Without it, motor currents will remain at zero.

We have listed 800 for each of our motors, which stands for 800 miliamp for each.

A risk of going too low is that if you get a blob or curl up on your print and the head hits it, at lower currents the motor is more likely to skip steps. Also at very low currents, the microsteps are less uniform because the detent torque becomes significant in comparison to the torque due to current. That’s why the suggested minimum is 50% of rated current.

The last I parameter is % of power for the motors on idle.

In our case we have set idle power at 30% by using the I parameter followed by 30.

M906 X800 Y800 Z800 E800 I30   ; Set motor currents (mA) and motor idle factor in per cent

Note/quote: The I parameter is the percentage of normal that the motor currents should be reduced to when the printer becomes idle but the motors have not been switched off. The default value is 30%.

You can use an optional H parameter to issue seperate power a z-probe should use if you have one such.

Drives settings.

This leaves us with this setting:

; Drives
M569 P0 S0               ; Drive 0 goes forwards
M569 P1 S1               ; Drive 1 goes forwards
M569 P2 S1               ; Drive 2 goes forwards
M569 P3 S1               ; Drive 3 goes forwards
M350 X16 Y16 Z16 E16 I1  ; Configure microstepping with interpolation
M92 X80 Y80 Z400 E1025   ; Set steps per mm
M566 X900 Y900 Z12 E120  ; Set maximum instantaneous speed changes (mm/min)
M203 X12000 Y12000 Z6000 E1200 ; Set maximum speeds (mm/min)
M201 X500 Y500 Z250 E250       ; Set accelerations (mm/s^2)
M906 X800 Y800 Z800 E800 I30   ; Set motor currents (mA) and motor idle factor in per cent
M84 S30                        ; Set idle timeout

Click Save Changes and choose Yes to reboot your Duet WiFi in order for the changes to take effect.


In this section we are going to configure both of our heaters: Hotend P1 and Heated Bed P0

We use thje M143 gcode to configure maximum temperature for all our heaters.

During our tour through the Web Configurator, we set our hotends’ maximum temperature at 320c by using the parameter S. Note: how we do not need to specify heater number for this. It’s due to our hotend as heater 1 being default when none is specified.

We want to add maximum temperature for our heated bed as well. This is also done using the M143 command. This time we need to use the Parameter H to specify the heater in question, and 0 as the number of heater in question.

I need my bed very hot, as I print Polycarbonate, so I’ll set it at 140. You probably want it somewhat lower.

Note: From RepRapFirmware 1.17 onwards, the default maximum temperatures are 262C for extruders and 125C for the bed.

; Heaters
M143 S320 ; Set maximum heater temperature to 320C
M143 H0 S140   ; set the maximum bed temperature to 140C

PID Tuning

PID tuning in RepRapFirmware is very different from marlin and smoothieware where you basically just set target temperature and number of cycles to test, and the system runs its test-cycles and output the variables for our use.

There is a usefull page at the Duet Wiki Tuning the Heater Temperature Control and a Duet forum post you might find usefull as well.

First we have our M301 gcode which is used to define the parameters for our heaters.

The H parameter is used to specify the heater in question, and heater 1 (hotend) is once again default if none is entered. Here we see the output for our heated bed, so H0 is used to specify the bed heater.

M301 H0 S1.00 P10 I0.1 D200 T0.4 W180 B30 ; Use PID on bed heater

Configuring Heated Bed

The output from the Web Configurator only has values from our bed, but we really need to run a new PID tuning cycle using M304 to get the proper parameters for our Heated bed.

Lets start by taking a look at the running configuration of the Heated bed using the M307 command that sets or report the heating process parameters.

I got the following output:

M307 H0
Heater 0 model: gain 90.0, time constant 700.0, dead time 10.0, max PWM 1.00, mode: bang-bang

Lets be honest, I really do not know what it all means, but we don’t need to either.

The important things here for our purpose are Heater 0, which matche the above H0 and the max PWM 1.00 which corrolates to S1.00.

A setting of S1 means we run at 100% power. If you want it at 50% power, you set it at S0.5

PID Tuning Heated Bed

I want my Heated Bed to use PID since I use a powerfull 500w AC heater, so lets run a PID tuning cycle using the M304 gcode.

If we just run M304 on it’s own, we get the message that it currently is in Bang-Bang mode, so we need to change that.
Heater 0 is in bang-bang mode

The Heated Bed is by default started up as Bang-Bang. In order to change it, we insert a line in our heaters section, after the M301 line.

The M307 command I use here, defines H as 0 (heated bed) to start up in PID mode, by using B0.

Note: Do not confuse the B parameters in M301 and M307, as they are not the same.
; Heaters
M143 S320 ; Set maximum heater temperature to 320C
M301 H0 S1.00 P10 I0.1 D200 T0.4 W180 B30; Use PID on bed heater (may require further tuning)
M307 H0 B0
M305 P0 T100000 B3988 C0 R4700 ; Set thermistor + ADC parameters for heater 0 ; BED
M305 P1 T100000 B4138 C0 R4700 ; Set thermistor + ADC parameters for heater 1 ; Heater 1

After saving and rebooting the Duet, we run the M307 H0 again, to check the status of our Heated Bed.

Our Heated Bed is now in PID mode, so lets continue to use M303 to run PID tuning.

We use the parameters:

  • H = Heater. H0 for heated bed.
  • P = Power in %. Default is 50%, written as 0.5.
  • S = Maximum temperature. Default is 225, so it’s important for bed, which I set at 100c here.

M303 H0 P0.5 S100

Here we witness a hugely annoying part of RepRapFirmware… it fails tuning if temperature exceeds the maximum temperature. As opposed to Marlin, which automatically compensate and turn the heater on/off, this one just fails, so we have to wait for temperature to drop before trying again with a lower power setting than our current P0.5

I did 0.4, 0.3, 0.2 before succeeding at 0.1 after an hour and 5 minutes!

You have to wait some time after each failed attempt, or the tuning is cancelled as you see here.

An hour and 5 minutes later, I manged to finish the PID tuning at 10% power, along with a warning about it being overpowered.

I really hope this function is tweaked asap as it’s a huge bother and doesn’t take into consideration the large part of people starting to use faster heaters as we don’t want to wait 15 or more minutes for the bed to heat up.

Now that the PID tuning completed, we use the M307 H0 command to see the result.

Our parameters and variables are:

  • Heater = 0
  • Gain = A
  • Time Constant = C
  • Dead time = D
  • Mode ( 0 for PID) = B

Which results in this line for our config.g file.
M307 H0 A252.2 C635.5 D7 B0

Saving PID settings

First we remove or uncomment the old M301 line.
; M301 H0 S1.00 P10 I0.1 D200 T0.4 W180 B30; Use PID on bed heater

.. and we are going to replace the snippet we inserted in order to change Heated Bed to PID mode

M307 H0 B0
M307 H0 A252.2 C635.5 D7 B0

Instead of writing it in our config.g file, we could also use M500 command, which would save it to save the heater parameters in config-override.g, which is supported in firmware 1.17 and later.

Save Changes and reboot before continuing

Configuring Hotend PID

The output from the Web Configurator only has values from our bed, so we really need to run a new PID tuning cycle using M303 to get the proper parameters for our hotend.

PID Tuning Hotend

In order to setup our tuning of the hotend PID we use M303 and these parameters:

  • H = Heater. H1 for Hotend
  • P = Power in %. Default is 50%, written as 0.5.
  • S = Maximum temperature. Default is 225, so it’s important for bed, which I set at 100c here.

M303 H1 P0.5 S240

Aww, thought I was safe as I use standard E3Dv6 and used standard power settings at 50%, but it still overshot, so have to wait for it to cool down and try again.

After completing the tuning, which luckily is much faster than tuning the bed, we get a nice output like this:

As with the bed, we now need to use the M307 to have the result displayed. This time using H1 instead of H0
M307 H1

Lets sort out the parameters and variables here:

Our parameters and variables are:

  • Heater = 1
  • Gain = A
  • Time Constant = C
  • Dead time = D
  • max PWM = 1 (1= 100% power. 0.8 equals 80%)
  • Mode ( 0 for PID) = B

This results in the following line, which we need to put into our config.g file in our heaters section.
M307 H1 A352.6 C122.2 D8.0 S1 B0

Note: after updating thermistor settings farther down this blog-post to accurate settings, the code looks like:
M307 H1 A313.8 C118.7 D8.1 S1 B0

Thermistor and ADC parameters

Before wrapping up our Heaters section, we might want to look at the M305 command.

If you have some experience in configuring these kinds of things, you might miss some parameters. More precicely the ones related to ADC. It’s because the Duet WiFi have automatic ADC calibration so you should not need to use the H or L parameter.

Heated bed sensor configuration

I’m using a 500w 220AC Keenovo silicone heater, which comes equipped with a NTC 100K thermistor ( Beta 25/50 3950K-1%) as temperature control sensor ( Click Here (pdf file) also for thermistor R-T Datasheet.)

It means it has a restiance of 100.000 and beta coefficent of 3950.

These matches up to:

  • P = Sensor number
  • T = Thermistor resistance at 25oC
  • B= Beta value, or the reciprocal of the Steinhart-Hart thermistor model B coefficient
  • C = Steinhart-Hart C coefficient, default 0
  • R = Series resistor value, which is R4700 for Duet WiFi

So, lets make a command based on our parameters and variables for our heated bed sensor:
M305 P0 T100000 B3950 C0 R4700

Hotend sensor configuration

I am using a genuine full metal 24v bowden E3Dv6 hotend, which comes equipped with a Semitec 104GT-2 thermistor. It has a quoted B value of 4267, but the actual value over 25C to 220C is 4388 (quoted source).

Looking at Configuring Firmware documentation on E3D site it says:
For firmware versions 1.16 and earlier, set the B parameter (beta value) to 4388. This value gives better accuracy at typical printing temperatures in the range 190 to 250C than the B value of 4267 quoted in the datasheet.

For firmware versions 1.17 and later, set the B parameter to 4725 and the C parameter to 7.06e-8.

I’m not sure about that C parameter to 7.06e-8, but it doesn’t give an error when used.. I’ve posted on the Duet forum to get an answer

It means I’ll change the B value for temperature sensor 1 from 4138 to 4725 and C from 0 to 7.06e-8
M305 P1 T100000 B4725 C7.06e-8 R4700

This results in two new lines of codes for our config.g file:
M305 P0 T100000 B3950 C0 R4700 ; Set thermistor + ADC parameters for heater 0 ; BED
M305 P1 T100000 B4725 C7.06e-8 R4700 ; Set thermistor + ADC parameters for heater 1 ; Heater 1

So, what does it mean?

Yes, we need to run PID Tuning again… I’ll not post about that, as we just spend 2 hours doing it 🙂

I’ll post the complete Heaters section though:
; Heaters
M143 S320 ; Set maximum heater temperature to 320C
; M301 H0 S1.00 P10 I0.1 D200 T0.4 W180 B30; Use PID on bed heater
M307 H0 A252.2 C635.5 D7 B0
M307 H1 A352.6 C122.2 D8.0 S1 B0
M305 P0 T100000 B3950 C0 R4700 ; Set thermistor for heater 0 ; BED
M305 P1 T100000 B4725 C7.06e-8 R4700 ; Set thermistor for heater 1 ; Heater 1

Using Thermocoupler or PT100 sensor.

Using a Thermocoupler or PT100 sensor is a great way to avoid annoying temperature measuring issues. I normally use either one and is going to make a blog-post about it at a later date.

In both cases we would need an expansions board, which can be bought from the addons page.

Coming up

I had hoped to finish up everything, but this is is for now.

In the next part, i’ll write about the rest of the items in the config.g file

  • Tools
  • Network
  • Fans
  • Custom settings
  • Miscellaneous
Posted on

Duet WiFi – binary “iap4e.bin” not found

Making a short post, as this seems to happen fairly often.

In short, I wanted to update my Duet WiFi Firmware from 1.17c to 1.17e and recieved a pop-up error message while doing so.

iap4e.bin missing

Contrary to previous error messages when updating the three-part firmware, this error prevents the firmware update from completion.

Finding iap4e.bin

At first I thought the missing file ought to be in the RepRapFirmware Repository, but I had no such luck, so went to the next best place: Google.

It turned up a Duet3D wiki page about Updating Firmware where the missing iap4.bin file under the section Fallback procedure #1 with the description:

  • Copy the new DuetWiFiFirmware.bin file to the /sys folder. It must be called exactly DuetWiFiFirmware.bin on the SD card. Also make sure that file iap4e.bin is present in /sys.

Ok, so I now know I need to find the iap4e.bin file, and copy it to the /sys folder on the SD

Back to my Google search, which also returned a post on Duet3D forum named missing iap4e.bin. This in turn pointed to a Duet wiki page labeled Where to get Duet and Duet WiFi firmware and tools.

Download and “install” iap4e.bin

Go to the DietiAPI page the above page linked to, and download the iap4e.bin file.

We can’t yet copy files via the Web Panel, so you have to take out the SD card and insert it into your computer, and copy over the file to the Sys directory.

Restart your controller and reconnect to your Web Panel to see the file lsited under Settings and System Editor


I don’t know why this happens, but at least we can fix it now 🙂

Posted on

Duet WiFi – Generating firmware using Configurator

Configuring our printer for use

  1. Intro to RepRapFirmware
  2. Setup preparations
  3. RepRapFirmware Configuration
    1. Start
    2. General
    3. Motors
      1. Axes setup
    4. Extruders
      1. Motor current
    5. Endstops
    6. Homing Preferences
      1. Z-probe
    7. Heaters
      1. Heaters setup
      2. Tools
    8. Compensation
    9. Network
    10. Cooling Fans
    11. Configuration Finished
    12. Upload Configurations
    13. Conclusion

Intro to RepRapFirmware

Now that we have connected to our Duet WiFi controller and updated all relevant firmware we are going to configure it to our needs. In this case as a classic 3D printer movement mechanisms as a Cartesian source  printer.

I am setting it up same as an Ultimaker 2 works, meaning XY axes are moving up top, and bed are going up and down. Z homes to MAX.

The Duet WiFi uses RepRapFirmware which is drastically different from the Marlin and Smoothieware setup I’m used to, as all setups are done using regular Gcodes and Gcodes specific for RepRapFirmware, which are put into files and in turn are executed (read into memory of the controller) on startup.

You can change any settings by issuing new Gcodes via a Gcode terminal either in the webpanel or by using Pronterface over USB or similar. Any Gcodes issued this way are not retained after a reboot (unless current running configuration is saved).

Duet WiFi terminal in webpanel

Any changes you want kept after reboot must be entered into a file. Either into the general config.g file or as macro files, if you use any such.

It’s a big change from the Marlin and Smoothieware, but luckily we can find a lot of information in the RepRap Firmware FAQ, which is quiet extensive.

Setup preparations

Before continuing we are going to clean up in our files, as some of them are really meant for Delta printers.

Files listed under System Editor tab with description.

  • bed.g is autoleveling for Delta printers – Removing this.
  • config.g our – This is our primary configuration file, where the core configs are stored.
  • deployprobe.g is for deploying a probe for Delta printers – Removing this.
  • DuetWebControl.bin – our Web Interface firmware file.
  • DuetWiFiServer.bin – our WiFi Server firmware file.
  • homedelta.g is a file for homing on a Delta printers – Removing this.
  • iap4e.bin – our Electronics firmware file.
  • pause.g is for pausing the printer.
  • rResume.g Resume file.
  • retractprobe.g is to retract a probe – Removing this.Deleting the following 4 files.

RepRapFirmware Configuration

We are going to use the RepRapFirmware Configuration Tool to do our initial setup and will refer to the Duet WiFi overview I made for my previous blog-post: Duet WiFi controller from the previous Duet WiFi – Intro & Explained.


As you can see, they have a nice and clear start page, where we are going to start our setup by choosing the Custom configuration option and click next.


Next up we setup some basic settings, like board type, firmware version and compatibilty.

Our board is Duet WiFi, and Firmware version is the newest if you updated firmware before this point.

Enable non-volatile memory enables the use of custom commands loaded during startup, which we havn’t put into the firmware – I hanv’t looked much into this to be honest (yet), so leaving it unchecked.*

The compatibility really means how the printer is going to print outputs to terminal when you issue commands, and not as it operates.

In short, it emulates output responses. You can choose from several systems of your chouse: RepRapFirmware, Marlin, Teacup, Sprinter and Repetier.

Marlin is default, but we are selecting RepRapFirmware here.

Type of Ultimaker printer is Cartesian. I’m leaving distance at default and find the exact length of each axis later.

I only changed Firmware compatibility in this step.


In the motors section we have a lot of options. Here’s a screenshot of default settings.

I’m changing the Microstepping for each axis to x32 and enable interpolation.


In order to find steps/mm we will click on the Calculate steps per mm on the far top-right side/corner.

We’ll be presented by a pop-up window where we can insert our parameters.

Our XY motors are the same, using standard 1.8 motors driven by standard GT2 belts using 20-GT2 pulleys.

This leads to 160mm pr steps for x32 microstepping for our X motor.

Click on Y, to check settings and then go to Z.

An 8mm standard (most common cheap) lead screw used on the Ultimakers, also called Trapezoidal screws are rightly named TR8*8 (the ones I have), which means it is 8mm diameter and has, according to this calculator, at pitch of 8mm.

Rightly this leadscrew has a pitch(distance between the raised ridges) of just 2mm and 4 starts (seperate ridges).

Multiplying pitch and starts on a lead-screw equals the length of travel for a full revolution of the screw, which is 8mm.

The last 8 in TR8*8 denotes this travel length. We are using this 8mm as pitch in the configurator.

You can also buy TR8*4 and TR8*2 screws, but the 8mm is the most commonly used and the cheapest.

Click Apply this value botton and the values are automatically inserted into your Steps pr mm section.

Our steps are now updated:

Axes setup

Next we change our Y axis to match X and update maximum for Z axis to 100. I’m leaving the Motor current at 800mA as that is matching what I used on Smoothieware. Drivers are different though, so it might be subject for a future change. But the same applies for  the instantaneous speed change, Maximum speed and Acceleration.

The Motor driver is the variable used in the Gcodes used to setup everything.


I’m using just 1 extruder which is my own Belted Extruder. It is highly geared on it’s own and silent, so I don’t need high microstepping for any of these reasons.

I’ll set it at 32(on) to try out the new driver and change it later if I feel the need. If you follow the above link, and look all the way at the bottom of the page, you can see the steps needed.

In my case I’ll set the steps at 2050 – still need to tune it later.

I’m only changing microstepping and steps here. I really have no idea about the other settings for now, but might change by testing.

Motor current should match my motor just fine.

Motor Current

I have no experience in using this feature, so leaving it at default.

I can see how it might help keep the Z-stage in place if it tends to drop. On the other hand it makes manual movement all but impossible, say if you want to change filament in the middle of a print and need to manually retract and insert new filament.

Subject for change later as much else 🙂


Next stop on our way is configuring our Endstops.

Here’s the Default settings shown.

I always use Normally Closed on my endstops as they trigger if some error happens, like broken wire or switch – Ie. they are carrying a small amount of current through always and if this is broken, the switch is seen as triggered.

The endstops are located at X min and YZ max on my Ultimaker clone, as is regular ultimakers.

Homing Preferences

Making changes to the speed to more closely fit an ultimaker style printer.


Since I do not have a z-probe, I just leave as is and click next.


The default settings for heaters are show here:

I only have 1 heater, so leaving that alone.

I’m raising maximum heater temperature to 320 as I do print Polycarbonate now and then.

People using the full metal E3D hotends should raise it to at least 290c in order to be able to tighten the nozzle as recommended by E3D.

I’m changing the control method of the bed to PID from Bang-bang, as I’m using a powerfull 500w AC heater and it needs to be tightly controlled.

Heaters Setup

Now it gets hairy! In all honesty, I really hope this section is tweaked in the future to make it more userfriendly by implementing some options of thermistors, brands and thermocouplers + pt100 settings.

As it is now It’s completely above all but the most expert users and there’s no links to more userfriendly info, so it will leave most users pretty stumped.

In short we just leave it alone.

The Output scale factor is later modified when do a PID-tuning after applying these configurations.

The Series resistance refers to onboard components, so I’m a bit at a loss why we have this option here.

The first value under Thermistor coefficients is how much resistance your thermistor is having at 25c degrees. Not much worth when using PT100 or Thermocoupler though, but just leaving as is.
Note: I later found I had to put in the same number for Bed as for E0 here.

Second value K, is based on type of thermistor used, while the third C, is coefficent of steinhart-hart equation! I can’t explain this, so just leave as is.

The Sensor channel denotes the channel we connect our sensors to. We leave the Bed sensor channel at ADC0 and E0 at ADC1

Note: You might wonder at my top temperature at 320 and now I use thermistor! I’m normally using a thermocoupler, but using thermistor for the case of this configuration.

From the Duet Wifi documentation on Heater and Thermistor settings, the B value (K) of the Semitec 104GT-2 thermistor is 4388 at 220c.

For the sake of ease, I leave it as is for now and click Next.


Here’s the default settings show for our tools.

For each hotend, or maybe for each color on a multi-color hotend, we define a tool.

I only have a single E3Dv6 on my setup, so leaving Number of tools as is.

I’m putting a mark in Select first tool on start-up, which makes it available as default and define which tool I select, which is just Tool number 1.

I only have 1 extruder E0, so can’t pick and choose any different extruders.

Leaving offset as is and click Next.


Next up is the compensation settings.

This is the section for setting up the popular BLTouch probe, the Duet mini IR probe or other similar system you might have.

Compensation and autolevel is used by many people interchangeably, but that is for another time.

I’m leaving as is, as I have nothing of the sort on this machine, and just press Next.


Here you can disable the network.. maybe you would want this for security reasons and only use it over USB if in a school or company.

I’m configuring the Printer Name as DuetUM2 and do not type a password. It’s really annoying having a password during setup, but do what fits your usage scenario.

You can leave DHCP on, if you want the printer to aquire IP automatically (or if you configure it on your router/dhcp server).

Note how the default gateway is set at the last IP in the range, and not as the first IP which is more commonly accepted standard by Cisco, so you might need to change this as well.

Subnet mask should not be changed in most normal home networks.

Cooling Fans

We have several options for our fans and the setup GUI here, is really nice to handle it.

Before continuing, lets take a look at our Duet WiFi controller from the previous Duet WiFi – Intro & Explained blog-post, to see where the fan connectors are located:


If you want to read some more about Duet WiFi fans there is a nice section about Connecting and configuring fans on Duet Wiki.

In order to choose, we have 1 piece of important information: FAN1 is always on at bootup, so this one is ideally used as heatsink fan for the hotend.

That one picked, we choose FAN0 as our object cooling fan and FAN2 as control for the fans I have on my motors to cool them when my bed is heating up my printer case, as a sort of “passive” heating chamber.

Value: I’m leaving FAN0 at default 30% and set Fan1 and Fan2 at 50%

Invert output: This is required for 4pin pwm fans, so leaving them at No.

Frequency: I don’t honestly know how to figure out what to pick, so leaving it at 500 Hz. By using Mouse-over, it says PWM should be put at 25000 Hz instead.

Thermostatic Control: No for my FAN0 as we need to control this more dynamically to cool our objects. FAN1 and FAN0 is on Yes.

Monitored Heaters: This denotes the heater a fan is looking at when thermostatic control is on. FAN1 which is for Hotend Heatsink, it is set to E0, while FAN2 which is for the fans on my motors, which needs cooling when heated bed is hot, is set to Bed.

Thermostatic mode trigger temperature (heat controlled): Default is 45c, but I’m just used to having it at 50c for Hotend Heatsink, so I’ll do that for FAN1. I put FAN2 at 60c for Bed.

I do not have any Custom settings for config.g now, so just pressing Finish.

Configuration Finished

You’ll be presented with this pop up window with some help text. We are allready using Duet Web Control and is choosing Download files as ZIP.


See this page for further information about the purpose of these files.

Navigate to your downloaded file, which is named

Click here to download the files I just generated: config,zip

Upload Configurations

In your Duet Web Panel, click on Settings and either click on Upload File(s) and pick your, or simply drag and drop the file onto the Upload File(s) section.

The files will be uploaded super fast, so fast I didn’t have time to capture it, and you are presented with a dialogue box about rebooting the Duet. Click Yes.

Lets take a look at our files in Settings -> System Editor

Here we now have a full compliment of files to control our printer.


As it is right now, you should have basic usage of the printer, but many things might need to be modified like:

  • Direction of motor/axis movement
  • Temperature measurements
  • Speed of movement
  • Fans
  • etc

We are going to do the final adjustments in the next blog-post, where we are going to set all of these things right, by digging into the config.g file.