Introduction: Custom 3D Printer Extruder
After building a CNC Mill and turning it into a 3D printer, I found that I couldn't easily purchase an extruder I liked. They all seemed cheap and poorly designed. Often the bearing in the tensioner didn't line up with the gear on the motor which didn't line up with the hole for the filament. So each one required a complete disassembly to get right and even then, they were a pain to use.
So I decided to design my own. I wanted something unique and durable. And it had to have the two best features of a 3D printer - a part cooling fan and an auto bed leveling sensor. Of course, it had to have a reliable tensioner so it would be easy to load and unload filament, too.
These are the plans that I came up with.
Step 1: The Design
The main support structure of the design was to be milled out of a solid block of aluminum. This would provide the durability while remaining light, easily machinable by most mills, and I could build the heatsink into it. It's also where all of the components would mount to: the stepper motor, the heatsink fan, the part cooling fan, and the tensioner. I also wanted to incorporate the BLTouch into this design. So I built in a separate small block that it would mount to as well as provide the second mounting hole for the part cooling fan.
Step 2: Get the Parts
Donor Extruder - It's easiest to just use one of these MK8 extruders for parts since they come with the stepper motor, extruder gear, heater block, nozzle, heater cartridge and temperature sensor.
Aluminum - Block of aluminum for machining frame
BLTouch - Auto bed leveling sensor - optional. Make sure you're getting a genuine one. There are some knockoffs that are pretty low quality, or so I hear.
Filament tube - For this design, I insert a tube through the heat sink to carry the filament from the motor down to the heater block.
I 3D printed a couple parts for this so you will need some means of making the tensioner bracket as well as the shroud that routes the air from the part cooling fan onto the actual part. More on that in a bit.
Step 3: Machine the Aluminum Block
The aluminum mounting block is definitely the trickiest part to get right. The first one I made was borderline unusable so be very careful to machine each feature correctly. There's not a lot of room for error here.
Also pay attention to the hole drilled vertically through the center of the block that the filament passes through. The bottom inch or so is tapped to an M6. Then the two-ish inches above it is clearance for a tube (see picture) that the filament will go in to carry it through the heat-sink. Then the very top has a seat so this tube is essentially sandwiched between that and the heater block.
Step 4: Print the Other Components
Here are the .stl files for the tensioner (hammer looking thing), the BLTouch bracket (can alternatively be machined pretty easily from the leftover aluminum from the frame), and the fan shroud (definitely printed).
Step 5: Gather All of the Pieces
Here is the layout of all of the pieces that assemble to make the extruder.
Step 6: Mount to Your 3D Printer
I made a custom mount. There are two M4 holes in the side of the aluminum block that are meant to be used for mounting holes. So whatever printer you're using, you can create something to use here. I had to use a rather large bracket to attach my print head to my printer because, well, long story short the printer used to be a mill.
The attached drawing shows two 4mm THRU holes with a 1" spacing for mounting to your printer.
Step 7: Adjust Your Firmware
You'll need to adjust your Marlin firmware in order to compensate for the BLTouch. Here is a link to antclabs manual for it.
However, this is what I did.
~Line 475
#define USE_ZMIN_PLUG // For BLTouch
~Line 501
#define Z_MIN_PROBE_ENDSTOP_INVERTING false
~Line 687
#define X_PROBE_OFFSET_FROM_EXTRUDER 26 // X offset: -left +right [of the nozzle]
#define Y_PROBE_OFFSET_FROM_EXTRUDER 3 // Y offset: -front +behind [the nozzle]
#define Z_PROBE_OFFSET_FROM_EXTRUDER 1.7 // Z offset: -below +above [the nozzle]
~Line 1117
#define EEPROM_SETTINGS // Enable for M500 and M501 commands
~Line 1762
#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
~Line 1767
#define SERVO_DELAY {300, 300, 300}
Step 8: Win
It works!