The original post that I made became obsolete once the BIGTREETECH SKR Mini E3 board was released, so I decided to update it with the new information.

The main difference is that you no longer need the Pin 27  board to add the BLTouch. You can use the SKR Mini E3 board from BIGTREETECH. It includes the connections for the BLTouch as well as silent stepper motor drivers to keep your printer quiet (and it's very quiet). There's also room on board for RGB LEDs, but I haven't done anything with those, yet. The new v2.0 of the board even supports dual z motors.

Here is the revised parts list:

Start by printing the BLTouch mount.

Adjustable BLTouch mount for the Ender 3 (and Ender 3 Pro)

The wiring on the SKR Mini board lines up with the original Ender 3 main board (except you must swap the fans), so you can just replace it easily. The BLTouch plugs into the SKR Mini board as shown in the image below. These images were taken from the BIGTREETECH GitHub site.

Recommended wiring for BLTouch on the SKR mini E3 v1.2
Recommended BLTouch wiring for the SKR mini E3 v2.0

It is recommended that you use the Z endstop as the BLTouch switch instead of the alternate wiring method.

Once you get the wiring correct, visit the BIGTREETECH GitHub and follow the instructions for your board.

Mine were here.

I use VSCode for PlatformIO and easily edited my Configuration.h file to suit my needs for the BLTouch. I had some issues compiling and the error messages were misleading. If you enable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, make sure you also uncomment #define Z_SAFE_HOMING

Michael Laws of TeachingTech has done a great video of the new SKR Mini E3 v2.0 board. I have embedded it here for convenience (this video is not my own, it is from Michael Laws at Teaching Tech - please support him on Patreon):

I think for firmware, your best option is to download the Marlin firmware from the Marlin GitHub. You can find the configuration files for Ender 3 for the various SKR boards in the config folder.

Original post:

I purchased the BLTouch so that I could have an auto-leveling (auto-tramming) 3D printer bed. Manually tramming the bed (making sure that the bed is even with the X-Axis) is difficult, if not impossible, to do when your printer has a bowed print bed. My Ender 3 seems to have this common problem.

Based on a suggestion in the comments from Mike Rich, I have posted my firmware on Google drive. You will need to set your BLTouch offsets in Configuration.h starting at line 778. You will also need the Pin 27 adapter.

Update: I recommend going with a board upgrade (SKR Mini E3 Board) that has a BLTouch port on it already rather than going through all of this. It also uses TMC2209 motor drivers to make your printer quieter and doesn't require the Pin 27 adapter. The loudest thing on my printer are the cooling fans. It's very quiet now. This board also supports UART mode for the TMC2209's as well as NeoPixel color LEDs.

Here is the parts list for the upgrade (Amazon associate links):

Before you can install the BLTouch, you have to upgrade the firmware in the printer so that it is supported. Before you can upgrade the firmware, you have to burn a bootloader (you only have to burn the bootloader once, then you can flash your firmware as many times as needed after that). Here is a great video that taught me how to do it (these videos are not my own, they are from Michael Laws at Teaching Tech - please support him on Patreon):

Wiring Diagram for BLTouch on SKR Mini E3 (Created by Michael Laws of Teaching Tech)

Previous Post describing method for using the Pin 27 Adapter and Arduino to flash new firmware:

Here is the wiring diagram from that video by Michael Laws of Teaching Tech:

Wiring diagram for burning bootloader from Teaching Tech

In order to connect the Arduino to the Ender 3 main board, you will need jumper wires.

Note: You don't have to stop there with the Arduino. There are a lot of fun projects on the Internet involving Arduino coding. Here are a few from my site:

Once I followed those instructions and burned my bootloader, I followed Teaching Tech's great video on installing the BLTouch on the Ender 3.

I used this mount from Thingiverse:

Adjustable BLTouch mount for the Ender 3 (and Ender 3 Pro)

Unfortunately, my BLTouch came with the wrong connector end, so I had to cut wires. I had to make my own wire by cutting the BLTouch switch wires and soldering them to the original Z-stop wire. It was easy to do, but keep this in mind if you don't own a soldering iron. The worst case scenario is to twist the wires together and use electrical tape. It will be inside the case of the printer, so you won't see it. Since I had a soldering iron and heat shrink tubing, I went ahead and did it that way.

If you have to cut your z endstop connector, here's how you wire it up:

Looking at the Ender 3 connector from the side with the tabs on it (with the holes facing down), the BLTouch white wire goes on the left.

BLTouch sensor wire soldered to original Z-axis end stop wire
Helping hands to the rescue
stripped and ready to be soldered

After installing the BLTouch, I manually leveled the bed using a piece of paper. Then, I used the menu options on the printer to set the Z offset. This menu option is only visible while the printer is printing. I used the bed leveling STL from CHEP to calibrate the offset while it was printing. Be careful that you don't go too low and damage your bed. Once you've set your Z offset and your first layer looks good, don't forget to save the configuration so your printer will keep it in memory after you turn it off.

I then printed a calibration cube. Things worked out OK, but I think I'm over-extruding. I need to tune my printer some more, but now that I have an upgraded firmware, I can get everything tuned correctly.

I did set my BLTouch Mesh Generation to use 25 points instead of 9. I found that 9 points wasn't enough to get the best results. It takes longer to generate the mesh (it adds at least a minute or two to the print time), but the results have been worth it.

Update: After flashing vanilla Marlin 1.1.4, my mesh generation is working better with 9 points (3x3).

While I was busy improving my printer, I also installed OctoPrint on my Raspberry Pi and hooked it up to the printer. I did this mainly so I could send prints to it directly from Cura. I got tired of saving it to the SD card, walking back to the printer, inserting the card, selecting the print, and then repeating the process for each print. This is much more efficient. I don't have to babysit the first layer because I now have an auto bed leveling sensor.

My 3D printing life just got a lot better.

OctoPrint user interface

I ordered a Raspberry Pi camera and 2' extension cable for it, but it won't be here until Thursday. In the mean time, I'm using a very old Microsoft web cam that I had lying around. It has terrible resolution, but it's neat to see the print from my computer.

Update: I have the Pi Cam installed and it's working very well with OctoPrint. It has much better resolution and makes great time lapse footage.

GCode viewer showing the current state of the layer