Why Make a 3D Printer From Scratch?
During my first two years of high school I figured out that the most effective way for me to learn new skills was to attempt to solve a problem that would require those skills. I have been around 3D printers since middle school and received an Ender 3 for my 15th birthday. After a year of tinkering and learning first hand the many issues with desktop 3D printers I began thinking about designing my own 3D printer. Another facet of this project was attempting to design something I could scale into a small business, which is what originally spawned this website and will help explain some of my design choices described below.
A quick demo of an early iteration of the printer printing in mirror mode for the first time:
My Approach:
Planning and Scope
Design
Firmware
Slicer
1.Planning:
To begin I researched what other 3D printers on the market cost and set a goal for the final product’s material cost to be no more than $1500. This limitation made the planning for this project one of optimization, specifically of maximizing functionality for price. This is why I chose an IDEX system, which could double the functionality of the printer while only adding the cost of an additional extruder system and a larger control board to support it. Many other decisions were made in the a similar way as I created a prioritized list of features based on how much functionality they added to the printer per dollar. Another example of this is the bed system. I wanted automatic bed leveling (ABL), which was a higher priority than a flexible bed system. However, by using a flexible bed system I could use an inductance sensor for ABL rather than a more expensive integrated touch sensors or physical switches. I could then also use an aluminum build plate instead of a glass one which is preferable in this application because I could use a less powerful, and therefore cheaper PCB heating element on the bed because aluminum is a much better thermal conductor than glass. More features, less cost. These are the kind of things I had to identify in the planning phase, otherwise the solution space would just be too large to approach from a design perspective. The last thing I did in the planning phase was source all of the major components and get a good price estimate. At the end of the planning phase the major components and materials for the printer added up to around $1300, with the last $200 being left for fasteners and other small components.
2. Design:
The overarching constraints on this design were my access to tools (basic hand tools and an Ender 3) and the cost constraints I set for myself. As per my design process, I broke apart the design of the printer into the extruders, X-Axis, Y-Axis, Z-Axis, and frame in that order. I attempted to reuse the same fasteners and suppliers for as many parts as possible to cut down on shipping costs and the number of tools needed to service the machine. I used an excel spreadsheet to keep track of all of the parts I had sourced as I designed which saved a lot of time when it was time to order everything and allowed me to track where I was relative to my budget.
Extruders:
One of the major appeals of an IDEX setup is the ability to print flexibles with integrated solid hubs or supports. This meant a dual gear, direct drive system would be preferable. However, the alternative to such a system is the lighter weight, and therefore faster print speeds, of a Bowden tube system. In designing my own extruder, my solution to this was designing a direct drive system and integrating a 3:1 gear ratio with a smaller pancake stepper to drive it. This would decrease the weight of the extruders while increasing torque without any major speed related consequences due to the relatively slow speeds extruders run at. The major problem I ran into and the reason I ended up using the new-at-the-time Hemera extruders was packaging and price. My custom extruders would greatly increase the vertical footprint of the X-axis and increase its weight where the Hemera’s custom stepper motor and gearset allows it to save on space while offering a similar price as my custom solution. Overall the Hemeras were the better choice at the time; however, they did cause some problems because E3D does not sell a mirrored version of the Hemera which forced me to design two completely different carriage mounting solutions and part cooling ducts to keep the nozzles in line horizontally. On top of this the size of the stepper motor on the Hemera is still overkill given it also has an integrated 3:1 ratio, which isn’t necessarily a bad thing, just not optimal from a weight perspective. For these reasons I am planning to look into a custom solution once again in the near future.
My initial custom extruder
My implementation of the Hemera extruder
X-Axis:
Most of the additional complexity that comes from an IDEX setup shows in the X-Axis where two independent belts have to run in close enough proximity for the two extruder heads to interface with. As a result of this complexity the X-Axis went through 3 design iterations and has been an area of constant improvement, mostly for ease of access and repair. The wider linear motion system uses 12mm linear rods and Vesconite Hi-Lube bushings. Linear rods were an obvious choice over linear rails. Linear rails would allow the frame to be smaller and the axes to be lighter, but are also well outside the price point of the printer. I chose to standardize around 12mm diameter rods over the more commonly used 8mm rods to prevent bowing over the span of the long X-Axis and account for the weight of the large build plate for the Z-Axis. So far I have been happy with this design except for belt tensioning. Though I spent a lot of time thinking about more reliable ways of tensioning the belts I ultimately haven’t landed on anything I’m completely satisfied with, so another area of improvement.
Y-Axis:
The most important part of the Y-Axis is how it interfaces with the frame. Because all of the custom parts are 3D printed, these parts must be designed to be strong enough to take abuse without cracking and rigid enough to handle the quick accelerations of the relatively heavy Y-Axis carriage without excessive vibration. For these reasons all of the corner brackets are pretty substantial.
Z-Axis:
The Z-Axis has actually been the axis that has caused me the most trouble. The heavy bed being cantilevered as it is makes the interface with the frame of the Z-Axis to the rods critical. I initially had issues with tolerances being too tight around the small vertical aluminum extrusions that interface with the linear bushings which caused the 3D printed parts to crack during instillation. I then had issues with the entire build plate vibrating due to slop in how the bearings mount into the 3D printed parts and I had difficulty lining up the T-nuts in the aluminum extrusion when changing out the 3D printed parts with the Z-Axis still mounted in the printer. These issues have been solved but I’m still not completely happy with how the Z-Axis mounts to the bottom of the frame as it’s difficult to access which is important for aligning the Z-Axis with the center of the machine and making sure it’s perpendicular to the X and Y-Axis. To me this is calling for another complete redesign.
3. Firmware:
Writing the firmware to make the workflow for IDEX printing as easy as traditional 3D printing methods proved to be difficult. Duet, the manufacturer of the mainboard used in the printer, has documented some of the ways their firmware can support an IDEX configuration. However, this documentation does not detail how to apply these methods for duplicate or mirrored printing. The IDEX print modes work by taking the standard g-code commands from a standard slicer and then translating and applying them to the U-Axis (second X-Axis) in a specific way depending on the selected tool. This allows the printer to be slicer agnostic as long as the slicer has the capability to encode tool commands, which most do. It was fairly trivial to get the U-Axis to follow or mirror the movements of the X-Axis, the difficult part was translating the coordinate system accordingly. For example, if the left extruder is selected (T0) and a G0 X0 command is sent, the tool will move such that the nozzle is in the center of the bed. This means for the individual extruders the coordinate system is centered on the bed, where X-150 or U-150 is the left side of the bed, X0 or U0 is the center of the bed, and X150 or U150 is the right side of the bed. The importance of the coordinate system being centered on the bed is that these values for X and U are the same. This becomes much more complicated when we now try to make a tool that has the X-Axis and U-Axis moving at the same time with a defined offset between them (duplicate mode). Now we have to move our extruders to a centered position on the bed a defined distance apart from each other and then set the coordinate system to 0 for both the X and U axis at that location (X offset at 0, U offset to -L where L is the length of the horizontal axis endstop to endstop). This way when we link the axes, basically telling the firmware to take commands for the X-Axis and apply them directly to the U-Axis, X0 will still be at the center of the bed, the position of both extruders will read the same value, and the offset between them will be maintained. This is easier to understand and visualize if you think of the two extruders as now being physically linked, with the center of this combined carriage being centered on the bed at X0. The mirror mode translations are even more complex and though I got it working I did so mostly through trail and error. At some point I plan to go back and try to make sense of how I did it and write up some documentation so hopefully other people trying to build their own Duet powered IDEX printers can reference it and avoid a lot of headache.
4. Slicer:
During the development of this printer, I failed to consider the challenges setting up a slicer would pose. In hindsight this should have been obvious as most IDEX printers have their own dedicated slicers and for good reason. However, this wasn’t an option for me given the timeline of the project (hopefully “done” by college) and I was already very familiar with Cura so that’s what I ran with. I eventually figured out that by setting up 3 different “printers” in Cura with different startup and ending G-Code command sequences I could utilize all of the potential features of the IDEX setup. These 3 printers are defined as a standard dual extrusion printer, a single extruder printer with start and end G-Code corresponding to duplicate mode, and another single extruder printer with start and end G-Code corresponding to mirror mode. In these single extruder print modes (mirror and duplicate) a single part is positioned on one half of the bed and sliced and the rest of the magic happens on the firmware side. Though workable, in its current state this system takes some setup, a bit of getting used to, and some understanding of G-Code to fully utilize some more advanced IDEX specific settings.
Viability of Inertial Dampening in 3D Printing (Research at WPI)
C-term of Freshman year at WPI I picked up a for credit independent study project under professor Rosendo where I designed, implemented, and tested the viability of an inertial dampening system on this 3D printer. The central problem is the relatively slow print speeds of large, industrial FDM 3D printers when compared to high-end hobby grade desktop FDM printers due to industrial printers’ axes and print heads needing to be heavy in order to maintain consistency and tolerances over longer distances and larger prints. These heavy axes greatly limit the accelerations the print head can undergo before resonant frequencies from the machine’s frame and motion system cause the print head to vibrate leaving ripples in the part, a phenomenon also commonly called ringing or ghosting. Inertial dampening has the potential to greatly reduce this effect at the cost of the motor power required to drive the system, a constraint which is much easier to design around.
Within the context of IDEX machines, this dampening can be achieved without the implementation of additional axes or weight to the X-axis as this effect can be achieved simply by printing in mirror mode. In this case I also implemented a set of weights that interface with the bottom of the Y-axis belts to achieve dampening on both axes. An accelerometer was mounted on the print head to measure the effectiveness of the system and 7 trials were performed including undampened X (a), Y (c), and compound X-Y (e) movements, dampened X (b), Y (d), and compound X-Y (f) movements, and an undampened X-Y compound movement with the ZVDDD input shaper applied (g). The data was then compiled and analyzed to find that this method of inertial dampening decreased the amplitude of resonant frequencies experienced by the printhead by 38% in the 10-100 Hz range (short band) and by 74% in the 10-1000 Hz range (long band). Shown below is the data: