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.

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):

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.

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