I know, a CNC mill ain’t a laser cutter. But it’s as close as it gets for me in the foreseen future.
Don’t get me wrong, I’m still happy with printing 3D stuff in plastic. As matter of fact, I used far more printed parts during the build of my new CNC mill than I had planned in the beginning. But there are quite some situations, when printed plastic just isn’t the best choice material for an object.
That’s where usually laser cutters, plasma torches and water jets come in. Or, in case of a poor, lone DIY warrior, a home made CNC mill.
I looked for an open source CNC machine which would be able to mill wood (mostly plywood and MDF), acrylic and maybe even aluminum.
The internet is full of DIY CNC mills, but only a few people publish plans and/or enough technical data. There are some kits, but I didn’t want buy a kit, since I already had many parts for a CNC mill lying around (high torque stepper motors and Pololu A4983 motor drivers from a dead end project of mine, waiting for recycling, a bunch of precision rods from old scanners and printers). Also I love to plan and build stuff by myself.
Eventually I stumbled upon the website of the Mantis CNC mill. This mill is open source and kits are available for sale.
I liked the compact size and use of wood for the main construction. However, there are several things, I don’t like:
For my taste, there’s way too much glueing involved in the construction. Although this makes the build process easier, glueing stuff together with epoxy means also there won’t be any chance for adjustments later. They even glue one of the stepper motors to the back of the machine….
The Z axis construction is made for a -glued in- custom spindle. No easy way to attach other tools, like a Dremel or maybe an extruder on the machine.
The Mantis’ work area was a little bit too small for me.
The whole construction and plans are in imperial measure. No offense, but I’m a very happy user of the metric system.
That said, I used the Mantis plans as base for my own, custom plans.
I slightly scaled the parts up and “rounded” them to the next metric measure. The 10″x4″ build platform became a 300 x 150 mm build platform and so on.
In order to keep track of the changed parts and the construction as a whole, I constructed the machine in a 3D application:
I also changed the construction of the Z axis in order to provide a more versatile base for different tools. The Z stepper motor sits on top of the Z axis in my construction (and isn’t glued to the back of the X axis plate).
Based on my 3D drawing, I wrote a BOM for the wooden parts. I use 16mm MDF and the whole material cost less than 10€ in my local hardware store (already cut to size).
Here are some pictures from the build process. Building a LCD (and a micro joystick switch) directly into the machine was part of the plan from the beginning.
One thing, I wasn’t sure about were the bushings. Since they uses bush bearings in the original Mantis construction, I ordered some sintered bronze bushings together with the acme threads.
Despite all precautions and match drilling all holes for the precision rods, I wasn’t very happy with the results when first assembling the x axis.
The slide was much too sluggish (see following video). So I decided to go back to proven mechanics and designed Mendel-style linear bearings for all three axis.
Since there isn’t too much room for the bearings (especially at the Z axis), I designed the printed ball bearing retainers as low profile as possible. The “inner” ball bearings are halfway sunk in the base plate.
This not only keeps the assembly as low as possible, but also guarantees the same height reference for the fixed bearings (the axle sits directly on the plate). All upper bearings are adjustable.
Here’s a short video with a comparison of both bearing styles. I guess, bush bearings are only usable when the whole construction is manufactured by CNC machines…
The build platform is (same as in the Mantis construction) a sandwich of two boards of the same size. The linear bearings and the acme rod are attached to the lower board. That way, the upper board can be easily replaced in case of an accident or maybe if a heated build platform is needed in the future.
I drilled a grid of 4mm holes in the upper board, each with its own drive-in nut. The grid then can be used to easily attach a workpiece on the build platform by using scew clamps or directly bolting the piece down.
As spindle, I attached my Dremel to the Z stage. I printed an upper and lower clamp on my Makerbot Cupcake, which hold the Dremel gentle and tight on the Z axis.
For a while I planned to use RAMPS electronics from UltiMachine to drive the three steppers (and any extruders in the future). But ever since I looked in the store, the PCB was out of stock. In addition to that, I already had a Seeeduino Mega lying around, which I liked to use for this job and which is not shield compatible with the Arduino Mega. Finally I needed some custom connections for the LCD, the joystick switch and the emergency stop button, I built into the mill.
So I decided to go for my own, custom RAMPS shield for the Seeeduino Mega.
Based on the open source design of the UltiMachine RAMPS electronics, I started to design the new Seeeduino shield.
The board design is far from finished yet! Meanwhile I started to put the electronics onto a big breadboard on the backside of the mill.
As soon as the circuits are working correctly and the schematics are fully tested, I’ll manufacture the final shield PCB. But this might still take a while and I’ll definitely write at least one other blog post about this topic.
So far, the breadboard contains only three Pololu A4983 boards for the steppers, as well as connectors for three endstop switches and some additional components for the LCD and switches.
I currently use mechanical endstops for the three axes. I’m still not sure if I’m happy with these. Maybe I’ll switch to opto endstops later, since I have the feeling, that they are much more accurate.
I used the newest version of the RepRap firmware as a starting point. I very much like the acceleration feature for the cartesian system. Originally I thought I’d use the RepRap firmware more or less unchanged and just add code for the LCD and switches.
But it turned out quickly, that I’d need to make bigger changes to the firmware in order to implement some features I planned (e.g. jogging with the joystick switch etc.).
One thing came to another, I started to re-write some parts, added some code in the G-Code parser which is important for milling (G2, G3, G81 etc.). Then I started to throw out obsolete code and to redesign other code in order to implement stuff more object oriented…
Long story short, the firmware tuns out to be more based on the RepRap firmware than to be just an extended variant.
I have plans to go even further and to try to implement G41/G42 functionality (Cutter Radius Compensation). In order to do so, the G-Code parser needs a lot changes and extended functionality.
In order to keep my focus on the functionality important for milling, all 5D-extruder support is currently removed from the firmware. I’ll definitely add this code again later, when the milling code is working.
I’ll also publish my version of the firmware as open source, of course. But I’ll need some more time to further stabilize and clean up the code before that. Please stay tuned.
Finally, here’s a video of the mill’s first real cut and a short demo of the LCD menu system of the current firmware:
Recently, I wrote about one of my designs in a “non-3d-printing” web forum. Since most people over there didn’t know anything about stuff like MakerBot or RepRap, I was asked a lot of questions on 3d printing lately.
One frequent type of question was about the stability and rigidity of printed objects.
Of course, there is the normally pitched answer “it’s the same stuff Legos are made of”. And (at least in case of ABS printing) this is certainly true. But almost anytime I give (or hear) this answer, I think: … well, it depends.
Although 3D printed objects are likely out of ABS, there is one huge difference between 3D printed objects and injection mold Legos: Printed objects are layered. So when it comes to rigidity, they are much more like wood than like “atomic” Legos.
That’s why I prefer to compare printed objects -regarding rigidity- with wooden parts instead Legos.
In my experience, it’s quite important to consider the layer orientation of a printed part during the design process. When building wooden objects, a stressed span is less likely to fail if tension is applied along the grain, rather than across the grain.
The same is true when printing 3D objects.
Of course, sometimes you need to compromise in order to print a complex object in one piece. And this might be ok as long as the “against the grain” parts aren’t stressed too much.
But sometimes it is way better to split a complex object into two or more parts and bolt (or glue) them together after printing, in order to get the layers into the “best” orientation for each part.
One of many examples of compound objects (to gain more rigidity) is the Adrian’s geared Mendel extruder:
Technically, it woudn’t be a problem to print the base plate, the stepper motor retainer and even most of the gear retainer as one single, complex object. But then you’d have to decide in which direction you’d print the object. Besides some restrictions due to overhangs, the main problem would be that either the base plate or the motor & gear retainers would loose a lot of their rigidity when not printed “with the grain”. By breaking down the complex object into 3 or 4 parts, the whole thing not only gets easier to print, but also the assembled full object gains a lot of stability.
However, I recently began to wonder, if I could do some test to measure the strength of similar printed objects, depending on the orientation they are printed in.
To measure the rigidity and strength of printed objects, I decided to print a basic shape in different print orientations and then use a rack to rip the objects apart, measuring the needed force.
Given a basic “monolith” shaped object, there are three different ways to print:
1. laying down on it’s face:
This would be the “natural” orientation to print such an object for most of us 3D printer operators. Besides much less problems with printing the infill, this orientation also puts the “grain” along the widest span of the object.
2. laying on it’s side:
Although this changes the order of layers, the grain still runs along the widest span. So (besides likely more problems with printing the narrow infill), the resulting object should be as rigid and stable as an object printed laying on it’s face (1.)
3. standing upright:
Printing a tall object this way usually means trouble. Not only the longest side of the object will be against the grain (and thus more likely to chip off under load), it’s also harder to print thin, tall objects on a FDM printer like the Makerbot or Reprap for several reasons.
But sometimes there’s no good way around printing a tall object in upright orientation,…
And then there was a fourth way to print a tall object. I had this idea a while ago and really wanted to finally try it: The object is still printed in upright orientation, but using some kind of “interlock” between the infill layers. See the following cross sections:
Instead of using a normal infill like this:
… the infill would printed in an alterning pattern like this:
As far as I know, this kind of layer-crossing infill isn’t supported yet by any slice’n’dice utility out there.
In order to generate Gcode for the test objects, I wrote a little Perl command line tool. This script generates Gcode for “2001: A Space Odyssey” style monoliths in three different types:
“Mode 0” – The object is printed laying down on it’s face (see above “1.”) with a normal 100% infill.
“Mode 1” – The object is printed in upright position with a normal 100% infill.
“Mode 2” – The object is printed in upright position with the above described interlocking “bonding infill”.
Calling the script without arguments, shows a short usage text:
Usage: ./monolith.pl --mode <mode> --out <output path>
[--lw <layer width>] [--lh <layer height>] [--fr <feedrate>]
[--lenf <length factor>] [--depf <depth factor>]
[--heif <height factor>] [--preface <path to preface file>]
Mode: 0 = flat
1 = high
2 = bonded
Size: lenf/depf/heif are factors of layer width
Defaults are 10 x 40 x 90 (1:4:9)
There are two mandatory attributes:
–mode defines the orientation of the object on the build platform and the infill algorithm.
–out sets an output file for the generated gcode.
So the simplest way of using the script is like this:
./monolith.pl --mode 1 --out outfile.gcode
This would generate a file (“outfile.gcode”), containing the gcode for the default monolith, printed in upright orientation with a normal 100% infill.
You can easily adjust the gcode for your needs (or your printer’s specific extruder specs) by using the optional arguments. For instance, use –lh to set a custom layer height (default is .45mm) or –lw to set a custom layer with (in mm! If not set, the script automatically calculates the layer width by multiplying the layer height by 1.4).
Since the script doesn’t generate any startup code or temperature settings, you probably want to use the –preface argument to insert custom preface gcode at the beginning of the output file. I simply use the standard preface gcode file, I also use as preface in my Skeinforge settings.
I started with objects in the default dimensions of the script and a simple unmotorized version of the rack. But it turned out, that the printed objects were way too stable for the tests and that using the rack with a wrench was really time consuming.
The pocket balance I use to measure the pulling force has it’s maximum at 25kg (about 56 lbs). During my first tests, the Mode 0 monolith chipped off at 20kg.
The Mode 2 monolith was even more stable: I was able to crank the rack up to it’s 25kg limit without breaking the monolith (with it’s grain across the pulling force!). I let the whole setup sit for a while, just to check if the monolith would withstand the pulling force for longer than just a few moments.
After about 5 to 6 minutes the rack finally snapped. But it wasn’t the monolith that cracked, it was the wooden base, holding the monolith…
So I printed the monoliths a little bit thinner (using the –depf argument).
Because of the thinner shape (and the resulting issues with still hot ABS in lower layers), the printed objects had slightly different dimensions (although the gcode used the same dimensions). I decided to adjust the –depf argument for each mode, so the resulting objects had the same dimensions after printing. On my Makerbot, this resulted in printing the Mode 0 monolith with –depf 8, the Mode 1 monolith with –depf 6 and the Mode 2 monolith with –-depf 5.
With these settings, I got the 3 types of monoliths, all with the same thickness of 4.6mm.
I also improved the rack by using an electric screwdriver as motor:
The monoliths were clamped to the other end of the rack:
With the thinner monoliths and the motorization, the rack worked much better and smoother:
Here are the results of my tests:
Mode 0: 14.5kg
Mode 1: 8.5kg
Mode 2: 12kg (!)
As expected, the Mode 0 object was the sturdiest.
I’m still surprised, how stable the upright printed object (Mode 1) was. I guess, using more common infill rates (like 15 or 20%) lowers the rigidity of such objects immensely and the results would be much more than I expected. Printing the objects with an 100% infill seems really to make sense if you need a maximum of stability. I guess it would be great if there was a way to manually define parts of an object to be printed with a higher infill rate than the rest of the object.
A great success was the test of the Mode 2 object. Interlocking the infill really seems to make a big difference. The object was much closer to the stability of the Mode 0 object than the Mode 1 object. Maybe there will be a way to generate such type of infill with Skeinforge in the future…
During my tests, I ripped apart a lot more monoliths than just the three above. Although the other objects weren’t all the same size and thickness (and thus not easily comparable to the above standardized objects), the reults of the other tests went all in the same direction (Mode 0 strongest, Mode 1 weakest, Mode 2 much stronger than Mode 1).
I’ll probably try some skeinforged monoliths, with different infill rates, in the future…