Installing a BLTouch on an Ender 3 Pro

I recently purchased a Creality Ender 3 Pro 3D printer as an “upgrade” to my Monoprice Select Mini Pro printer. There were a few reasons I decided to do this:

  1. Larger print area. While the Select Mini Pro is a great little printer, I am limited to what I can print and I’ve started getting interested in printing lithophanes which can get a bit larger than the printer can handle.
  2. Automatic bed leveling has no fallback. The Mini Pro uses an inductive sensor for automatic bed leveling and if that fails, I either have to replace it or am pretty much out of luck (someone has posted instructions on how to level the bed if the sensor fails, but it is a tad cumbersome).
  3. No ability to switch out the build plate for glass or another material. I’ve done a lot of reading about 3D printing and people swear by glass build plates and the Select Mini Pro doesn’t make it easy to add one. A shim has to be added to the Z axis limit switch and then you have to figure out the bed leveling.
  4. Limited to what filament types can be used. The printer has a maximum build plate temperature of 70°C and limited nozzle temperature which can limit the filaments used. Also, I’ve read that while some people have had success with TPU (a flexible filament), it may not work so well.
  5. No ability to modify the firmware for different features. The Ender 3 runs the Marlin firmware which is open source and can be easily modified.

In any case, I’ve read about manual bed leveling and while doable, it seems like a lot of work and I like easy! After setting up the printer and running it for a few days, I decided to install the BLTouch automatic bed leveling probe. In the weeks leading up to setting up the printer and the probe, I had read numerous articles and watched a number of videos on the subject, so I thought I was prepared for it. Parts of the setup seemed a bit daunting, but nothing I couldn’t handle.

The first step to installing the probe was printing out a mount for it. Thingiverse has a number of options. I settled on this mount as it was adjustable. Printing it and attaching the BLTouch was quite easy; I didn’t have the right size M3 screw, so I had to cut off a longer one.

After attaching the BLTouch, I had to run the extension wires through the sleeve that had the other wires. This was a little bit of a pain. The only mistake I made here that bit me later on is that the extension cable became disconnected and the BLTouch failed to operate causing the nozzle to hit the build plate. Oops. The lesson here was to hot glue the connectors together so that any jiggling of the cables wouldn’t cause them to disconnect. The second lesson is to always make sure the BLTouch performs its self test when the printer powers up.

Fhew, I’m exhausted just writing that up! After the wires were run, I had to attach them to the motherboard. The BLTouch has 2 connections; the first is done through a pin 27 connector and is just unplug the LCD cable, plug in the connector, plug in the LCD again and attach the 3 wires from the BLTouch making sure the orientation was correct by verifying the labeled pins were attached to the correct, color coded wires. The second part of attaching to the motherboard was to replace the Z axis end stop. The extension cable I bought had a non-keyed connector that just plugged in. Unfortunately it wasn’t a secure connection so I used hot glue on it the first time I connected it. On my second poke at the motherboard (due to troubleshooting the connector that came loose as I mentioned earlier), I decided to just cut the wires on the Z axis end stop, solder on the extension cable and use some heat shrink tubing. I had to make sure the white wire was towards the front and the black wire was towards the back. This was a much better connection and has less of a chance of coming close. After I buttoned up the motherboard, it was onto the firmware.

Once I initially got the printer setup and running properly, I upgraded the firmware mostly to know that I had thermal runaway protection and had the latest changes. Compiling the firmware was straightforward and explained in various posts and videos. Most of the posts talk about installing the initial firmware with a bootloader using an Arduino board. As I don’t have any Arduino boards around, I opted for installing using a Raspberry Pi 3B that I purchased to run OctoPrint. I used this guide which was easy to follow and perform the initial install. The printer didn’t come with a boot loader which required the extra steps to install the firmware the first time; why this was done, I have no idea. Over the course of a few days, I managed to pick the options I wanted for my firmware. Unfortunately my Creality 1.1.4 board doesn’t have much space on it, so I had to disable SD card support. This wasn’t a big deal as I do all my printing through OctoPrint. Using the base Ender 3 Marlin 2.0.1 example, I made the following changes:

Old Configuration.h:

    #define SHOW_CUSTOM_BOOTSCREEN
    #define BAUDRATE 115200
    #define CUSTOM_MACHINE_NAME "Ender-3"
    //#define BLTOUCH
    #define NOZZLE_TO_PROBE_OFFSET { 10, 10, 0 }
    #define MIN_PROBE_EDGE 10
    #define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z
    #define Z_CLEARANCE_DEPLOY_PROBE   10 // Z Clearance for Deploy/Stow
    //#define Z_MIN_PROBE_REPEATABILITY_TEST
    //#define PROBING_FANS_OFF          // Turn fans off when probing
    //#define AUTO_BED_LEVELING_BILINEAR
    //#define RESTORE_LEVELING_AFTER_G28
    //#define LEVEL_BED_CORNERS'
    //#define Z_SAFE_HOMING
    #define SDSUPPORT
    //#define NOZZLE_PARK_FEATURE
    //#define SLIM_LCD_MENUS

New Configuration.h:

    //#define SHOW_CUSTOM_BOOTSCREEN
    #define BAUDRATE 250000
    #define CUSTOM_MACHINE_NAME "Ender 3 Pro"
    #define BLTOUCH
    #define NOZZLE_TO_PROBE_OFFSET { -44, -16, 0 }
    #define MIN_PROBE_EDGE 44
    #define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z / 5
    #define Z_CLEARANCE_DEPLOY_PROBE   15 // Z Clearance for Deploy/Stow
    #define Z_MIN_PROBE_REPEATABILITY_TEST
    #define PROBING_FANS_OFF          // Turn fans off when probing
    #define AUTO_BED_LEVELING_BILINEAR
    #define RESTORE_LEVELING_AFTER_G28
    #define LEVEL_BED_CORNERS
    #define Z_SAFE_HOMING
    //#define SDSUPPORT
    #define NOZZLE_PARK_FEATURE
    #define SLIM_LCD_MENUS

Old Configuration_adv.h:

    //#define BABYSTEP_DISPLAY_TOTAL          // Display total babysteps since last G28
    //#define BABYSTEP_ZPROBE_OFFSET          // Combine M851 Z and Babystepping
      //#define BABYSTEP_ZPROBE_GFX_OVERLAY   // Enable graphical overlay on Z-offset editor
    //#define ADVANCED_PAUSE_FEATURE

New Configuration_adv.h:

    #define BABYSTEP_DISPLAY_TOTAL          // Display total babysteps since last G28
    #define BABYSTEP_ZPROBE_OFFSET          // Combine M851 Z and Babystepping
      #define BABYSTEP_ZPROBE_GFX_OVERLAY   // Enable graphical overlay on Z-offset editor
    #define ADVANCED_PAUSE_FEATURE

Downloading the firmware after the first install was easily done through OctoPrint without having to install jumper wires and remove the motherboard. It is so easy that I made changes, recompiled, and uploaded new firmware a few times.

Was I done yet? Of course not! I hadn’t even leveled the bed! Some guides say to add a G29 command to Cura settings which runs the auto bed leveling on every print. Auto bed leveling is slow and that’s just a waste of time. So I decided that I’ll just level the bed every few days. I started up the printer, did an Auto Home, verified that touching the probe sent the hot end up (if it didn’t, I would have stopped the printer). Using OctoPrint, I sent

G28; auto home

G29 L50 R150 F50 B150 T V4

to the printer to start the auto bed leveling. This sets a bit wider grid than the default G29 command. Then I sent a

M500

command to store the settings.

M501

to read the settings back.

Was I finally done? Nope. The next piece in the BLTouch configuration was to properly set the Z Probe offset. This is the distance between the bottom of the nozzle and the bottom of the probe. The probe is, obviously, slightly higher than the nozzle (so that it doesn’t drag). Most guides say to start at zero, print a first layer, adjust the Babystep Z, use the M851 command and then store the setting. I did this and after a number of adjustments, got things printing quite well. However, after reading this manual bed leveling guide, I realized that there was a slightly easier way. Basically if I have an object of a known size, i.e. a cube that I use calipers to measure the height, raise the Z axis (using the controls on the printer), put the cube directly under the nozzle and adjust the Z axis so that the nozzle barely touches the cube, I’d know exactly the Z Probe Offset. If the cube is say 15 mm tall and the Z axis shows 15.88 mm, I’d set the Z Probe Offset to be -0.88 mm. So much less guess work in this. Don’t forget to store the settings after setting the Z Probe Offset. Since my settings are pretty good using the Babystep Z (with my firmware options simply called Z Probe Offset), I haven’t actually tried using a cube of known size to set the offset.

Lastly, I used the Level Bed Corners menu option I enabled in the firmware to manually level the bed as well as I could and then re-did auto bed leveling so that the firmware would have less to compensate. In addition, I used the OctoPrint Bed Level Visualizer plugin to see how close I got to a level bed. I know that the bed is going to warp at some point, but for now I have a pretty flat and level build plate.

Even after I had everything setup, I discovered that my bed was much higher on the right side even though when I had manually leveled it, it was pretty good. It turns out that my X gantry was loose so the right side was higher than the left. There are plenty of videos that explain how tighten this; don’t follow the Creality video as it is pretty useless.

To summarize, here are my tips:

  • Use hot glue on the extension cable connectors.
  • Splice in (and solder) the extension cable connectors (black and white wires) to the Z axis end stop.
  • Compile your own firmware so that you can get the settings you want.
  • Don’t put the G29 code in your Cura profile as that is a waste of time; level your bed every few days if needed.
  • Manually level your bed after everything is setup and then re-run auto bed leveling.
  • Check to make sure that your X gantry is tight.
  • Use a known height object, i.e. a cube to set the Z Probe Offset.

Of course, follow my directions/tips at your own risk. I’m not an expert at this and am not responsible for any problems arising from your use of this information! I thought I had everything working well until I managed to crash the nozzle into my bed (I now have a nice dent in the bed that I’ll bed around to replacing someday).

Good luck as getting BLTouch working properly isn’t an easy task, but hopefully worth it in the long run!

7 Replies to “Installing a BLTouch on an Ender 3 Pro”

  1. Excellent post !
    It is a good compilation of many articles on the web. This one is for me the master.
    I do not really understand #define MIN_PROBE_EDGE 44. Would it -44 instead of 44 ?

  2. Hi Scott,

    Have a look in your article, it is 44 instead -44. I will put -44 in mine.
    All the best

  3. Finally it can’t be negative, will spent more time looking at the definition of this constant.

    1. It is a value which makes sense to be negative only if NOZZLE is used as PROBE. Then I understand.

Leave a Reply

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.