Week 07 - Computer-Controlled Machining

This week we have the following tasks to complete:

  • do your lab's safety training
  • test runout, alignment, fixturing, speeds, feeds, materials and toolpaths for your machine
  • make (design+mill+assemble) something big (~meter-scale)
  • optional: don't use fasteners or glue
  • optional: include curved surfaces

Group Assignment

The weekly group assignment can be accessed here.

Runout

We measure something between 0,05 mm and 0,075 mm but like I said the way we measurent have so much error potential that I wouldn't take this measurements for real. To evaluate spindle runout, we used a dial indicator mounted on a fixed holder. Ideally, a 0.001 mm (1 micron) dial indicator would be used for precise measurement, but we only had access to a 0.01 mm (10 micron) indicator. As a result, we did not expect highly accurate readings. Additionally, the measurement was taken on the outer surface of the chuck, which is roughly equivalent to using a straight test rod—but without the certainty that the rod itself is perfectly true. In such a setup, any measured runout could originate from the rod rather than the spindle. However, we assumed the chuck to be reasonably concentric with the spindle for this approximation.

runout 01-02

We observed a runout between 0.05 mm and 0.075 mm. However, due to the limitations of our setup and the potential for various sources of error, these measurements should be considered approximate and not highly reliable.

Alignment

To verify that the spindle is perpendicular to the machine bed, we mounted a dial indicator onto a rotating arm attached to the spindle and swept it across the surface of the bed. If the spindle is not perfectly perpendicular, the dial indicator will show variations in height as it moves, indicating misalignment.

However, this method involves several potential sources of error. Most importantly, we could not confirm that the machine bed itself is perfectly flat—unlike a granite surface plate, a precision-machined cast iron table, or a milled steel machine bed. Since our bed is made of MDF, it is highly sensitive to humidity and temperature, which can cause slight warping. Additionally, the arm used to hold the dial indicator was 3D-printed, which introduces a significant risk of flex and play in the setup, further affecting measurement accuracy.

alignment 01

Design Ideas and Requirements

The core idea is to create two shelves—one for the Prusa XL and another for all other 3D printers in our lab—featuring ample storage space for Euro boxes, potentially with drawer slides for easier access. We already use boxes from Auer Packaging, so a key design requirement is ensuring that these boxes fit perfectly, both with and without drawers. The drawers are currently optional and may be added later. To better visualize the concept, I used 3D models of potential boxes found on GrabCAD, designed by Gergely DEGI.
Another essential requirement is a dedicated SLA workspace to contain any mess associated with resin printing. In a future iteration, adding a door and ventilation system to this area would be beneficial.
Due to the limited space in the room, standard doors are not an option. A vertical sliding door would be ideal, as a regular sliding door would not work—the SLA workspace is significantly larger than the FFF printer area, meaning the door wouldn't have enough space to slide completely. Fold-up and flap doors are also impractical due to their large size. A rolling door would be an alternative but is considerably more expensive than a vertical sliding door.
The base material for the shelves will be 2500 x 1500 x 18 mm beech plywood, which is currently more affordable than birch plywood. Previously, birch was imported cheaply from Russia, but due to the war, its availability in Central Europe has decreased, making it even more expensive than beech plywood. The Prusa XL shelf will be made entirely from this material, while the second shelf will use 2500 x 1500 x 9 mm plywood for the back panels.
Some integrated lighting and power management would be beneficial. I plan to use Neopixel strips for illumination and additional UV LEDs in the SLA area to cure any unwanted resin spills.
For the Prusa XL shelf, I need to consider the height of my final project so it can be directly integrated underneath the Prusa XL. While it would be possible to build the project into the shelf itself, I aim to keep it as autonomous as possible.

prusa xl shelf 01

Joints

For selecting suitable joints, our local instructor Ferdi recommended the overview from Winterdienst, which provides an excellent introduction with examples of nearly every joint type imaginable—and even more.
To ensure a perfect fit, a comb test, similar to the one used in Week 03, is necessary. It is highly recommended to test the chosen joints before milling everything, as sanding down imperfect fits would take an excessive amount of time, and time is limited. A small laser-cut model can also be useful to verify that everything aligns correctly. Parametric design is essential—otherwise, adjusting dimensions later would be extremely tedious.
Initially, I decided to use visible joints, as they are easier to mill, even though they may not look as clean as hidden joints. To validate the design, I also created a small test joint that includes all the joints used in the Prusa XL shelf for testing purposes.

test joint 01-02

Dogbones

To minimize post-processing of the milled parts, inner corners must be optimized so they can be machined without interference. This is achieved by adding dogbones, which function similarly to undercuts. They allow sharp external corners to fit into the round internal corners created by the end mill. The radius of these inner corners corresponds to the radius of the tool used to mill the contour. In this project, I created the dogbones manually. However, they can also be generated automatically using such as this Fusion 360 plugin or the FreeCAD CAM dogbone dress-up.

There are several approaches to designing dogbones:

  1. Place the center of the dogbone directly on the theoretical (sharp) corner.
  2. Position the center on one edge, at a distance equal to half the radius of the tool from the other edge.
  3. Position the center along the bisecting angle, such that the theoretical corner becomes a point on the circumference of the resulting circle.

Ferdi recommended the third method, as it produces the cleanest visual result and removes the least amount of material.

Nesting

I manually nested my parts in an assembly in Inventor and then imported the .iam file into Fusion 360 to program the G-code for the CNC.

nesting 01

First Interaction with the Machine an Milling

The machine has a work area of 1500 mm × 2400 mm. Most of our base material consists of 1500 mm × 2400 mm × 18 mm sheets, so we needed to cut 100 mm from each sheet using the plunge saw.
Since our sheets were not stored perfectly, they were slightly bent. On our first attempt, the vacuum table was not strong enough to pull them down and straighten them. We decided to flip the sheet over so that gravity would assist the vacuum table in flattening it—this worked perfectly.

cnc 01-02

We also "tested" the vacuum bed, with the conclusion that the sheet was completely immobilized. Even without the vacuum, the friction between the MDF waste board and the plywood sheet made it difficult to move.

The vacuum table pulls air through the MDF waste board, requiring a vacuum pump. At the moment, the correctly dimensioned pump was in use by a customer, so we used a smaller 7.5 kW pump instead. Next to it, you can see a larger 5.5 kW pump (twice) with a silencer, which was connected to another machine at CNC Multitool.

cnc 04-06

For milling, we used a 6 mm crosscut/compression end mill, which needed to be inserted into the collet using the corresponding wrench.

cnc 07-09

The machine features a 9 kW spindle and can switch between the spindle and an oscillating knife. A unique feature of this machine is its automated dust shoe, which can move up and down automatically.

cnc 10

To start the machine:
1. Switch the big red main switch to "ON."
2. Start the PC using the small push button next to the emergency switch.
3. Open UCCNC, a highly customizable control software, which CNC Multitool adapted for their machine.

cnc 11-14

After starting UCCNC, it is critical to not close the small pop-up window. Just minimize it and then hit RESET in the bottom right.

cnc 15-16

The program interface looks like this:

cnc 17

To ensure that the soft limits are correct, we need to perform a reference run for all axes by pressing the big button to the right of the coordinates. This process occurs at the XY machine origin, located at the rear left corner of the machine bed.

cnc 18-19

On the left side, hovering over the blue area with white arrows opens the jog menu, which is used to move the machine manually—for example, when setting the work origin. This menu has two modes:
- Static → Moves the machine while holding the button.
- Steps → Moves the machine incrementally (0.001 mm, 0.01 mm, 0.1 mm, and 1 mm).
The Jog Feed setting adjusts the manual movement speed of the machine.

cnc 20

Next, we set the work origin by moving to the desired position and zeroing the X and Y coordinates using the small buttons next to them.

cnc 21

After this, we let the machine automatically measure the tool for Z = 0.

If no fancy sensor is available, the same process can be done manually using a piece of paper. Lower the end mill slowly until the paper just barely stops moving.

For demonstration purposes, we moved the machine manually.

The MDI line allows for manual G-code input while the machine is idle. When attempting to move the tool manually, the machine automatically starts the spindle, dust collector, and vacuum. This prevents damage when switching between the spindle and the oscillating knife.

cnc 25-26

Next, we inserted a USB stick with our G-code and opened it using the "Open File" button. A pop-up window appeared, requesting the removal of the "carpet" (the underlay for the oscillating knife).

cnc 27-28

With the "Edit File" button, the G-code can be directly edited in the newly opened window.

cnc 29-30

Before running the G-code, we ensured that our post-processor was configured correctly. G28 (home) commands were removed to prevent the dust shoe from crashing into the tool holder, since it does not automatically retract when homing.

Then we started...

...and completely messed up. The end mill plunged straight into the material, through the waste board, and scratched the rubber mat of the vacuum table.

Luckily, nothing more than an ugly hole happened. The tool remained in perfect condition.

cnc 32-33

The machine detected an issue with the Z-axis, triggering an error mode on the corresponding control card. To reset this, we had to turn off and restart the machine, which was fastest by pressing the emergency stop and then resetting it.

cnc 34-35

To prevent future issues, we set Z = 0 manually. Most likely, the machine was programmed for Tool 1 with a much longer flute length. After restarting the G-code, everything worked perfectly.

cnc 36-37

We adjusted the feed rate to 800 mm/s and the RPM to 7000, with a step-down of 6 mm. The machine is robust and fast, but we were cautious to avoid damage and were not under heavy time pressure.

cnc 38

The process looks like that:

The same error occurred repeatedly while drilling the holes.

Initially, we had no idea why this issue occurred. We had previously set the Z-zero manually without any problems. To complete the parts, we ended up drilling the holes manually using G-code commands. I extracted the coordinates directly from the G-code file. While this is definitely not the intended workflow, it allowed me to finish machining the first parts.

The next day, we identified the root cause of the issue. Upon reviewing our G-code, we discovered that the post-processor had introduced some errors. Specifically, the tool length measured by the machine was being overwritten by a value sourced from the Fusion 360 tool library. To resolve this, I used an alternative post-processor provided by CNC-Multitool, which we verified together with the company. It was fascinating to gain insight into how post-processors are structured. Previously, they had been a complete black box to me. I learned that the standard CNC-Multitool post-processors are much simpler and cleaner, as they are tailored to the specific needs of their machines and regular customers. In contrast, the original post-processor we used was far more complex, designed to be "universal" and compatible with multi-axis machining (e.g., 4th-axis, 5th-axis), which our machine does not support. After switching post-processors, the problematic G-code commands were no longer generated. None of the other participants encountered these issues, likely because I was the first to run the job and encountered all the problems upfront. Fortunately, the remaining parts on the second sheet were machined without any further issues.

Post-Processing

After milling, I cleaned the machine using a vacuum and removed the finished parts.

prusa 04

Because I used a vacuum bed and the parts were large, flat, and contained very few holes, I was able to mill without tabs. This meant I didn’t have to break or saw the parts out of the stock. However, I still had to do some post-processing. Due to minor unevenness in the MDF sacrificial bed, a few areas had "elephant foot" artifacts—small uncut sections or material fringes. These were easily removed with sandpaper.

prusa 05-06

Sanding

To remove all unwanted edges and burrs, I used sanding blocks, including a DIY sanding stick made from a thin polymer rod with double-sided tape and sandpaper. This was especially useful for cleaning the inside edges of the finger joints. One firm stroke in the direction of the burrs was usually enough to shear them off cleanly. This was particularly important on the outer edges.

prusa 07-09

For larger surfaces, I used an orbital sander—two passes with 120-grit sandpaper followed by one pass with 240-grit. Proper PPE, such as a dust mask and ear protection, was worn throughout.

prusa 10

Afterward, I used a cordless palm sander to repeat the process along the edges. Initially, I only intended to sand the visible sides, but it was so satisfying that I ended up sanding all the edges.

prusa 11

Assembly

The first step in assembly involved correcting a mistake. I had not confirmed the position of one of the test combs, which left an unwanted hole. Fortunately, I still had the Fusion 360 file. I transferred the geometry to a new part and used the Offset and Radian tools in Autodesk Inventor to create the toolpath outline. I combined this with measurements taken from the physical part and printed the model in nominal size. It fit perfectly with no play and is currently held in place by friction. Later, I will glue it in place with wood glue.

prusa 12

I started the main assembly by placing the back panel on the floor for easier access. Then, I installed the shelves.

prusa 13-15

The fit was tight, requiring force to fully engage the joints. Initially, I used a wooden mallet and a scrap piece of wood, but I eventually switched to a regular hammer with a wooden strip, which worked better—especially close to the floor—due to more precise striking and better leverage.

prusa 16-18

Next, the side panels were inserted approximately 80% of the way. At this point, it's important that the joints between the back and the sides are not fully seated yet.

prusa 19

Gluing

Glue was applied inside the finger joint pockets before completing the assembly. I avoided applying glue on all mating surfaces to prevent excessive mess and because the joints fit very tightly, leaving little room for glue anyway. I used body clamps to fully seat the joints.

prusa 20-21

Once the first set of clamps was removed, I flipped the shelf and re-clamped it from the other side.

prusa 22-23

Additional clamps ensured the structure remained flat and square.

prusa 24-25

More clamps were added to perfect alignment. Excess glue was wiped away using a damp finger. Paper towels or cardboard also work well for this purpose.

prusa 26-27

The assembled shelf looked like this:

prusa 28-29

Due to a limited number of clamps, I glued the top and bottom panels separately. Moving the shelf required assistance from Niclas, as the object had become too bulky to handle alone.

prusa 30-31

The final assembly steps followed the same process as before.

prusa 32-33

Sanding

After the glue had dried, I sanded the outer joints to ensure they were completely flush with the adjacent panels.
The final result looked like this:

prusa 34

Finishing

wip

Additional Milling

I milled some parts for a master's thesis experiment using our small CNC mill, the Carvera from Makera. Different probes made from various materials and thicknesses were required. I started with the largest parts, which were made from 10 mm acrylic. Milling acrylic with a 1/8" end mill was slightly challenging because the preset for plastic in Makera didn’t work at all. By the second hole, signs of melting were already visible. To fix this, I adjusted the settings, primarily reducing the RPM to 5600 and setting a feed rate of 400 mm/min, which worked reasonably well with occasional cooling. I added a small amount of WD40 to aid cooling, but a slower feed rate of 250 mm/min proved to be more effective. Even then, some cooling was necessary. It was much easier to apply coolant from an open container, such as a glass, using a brush or pipette, rather than using a spray can, which created a mess and required extensive cleaning afterward. For the step-down, I opted for a small increment of 0.5 mm, which is suitable for soft materials.
In preparation for the upcoming electronics production assignment, Ferdi and I collaborated to design a small vacuum table for our Carvera, making PCB milling significantly easier. We also integrated dowel pins to ensure perfect alignment with the machine bed each time, as well as for precise positioning of the copper board. This setup allows for easy two-sided PCB milling.

vacuum table 01-04

What went wrong this week

I used a not suiting post processor for our machine, which results in the crashing issues I described before.

What I learn this week

  • Turning a machine off, waiting a day, and turning it back on can solve almost any problem. Initially, I encountered connection issues with the Carvera—it would enter an auto-connection loop, followed by extended idling, and then repeat the process indefinitely. Turning the machine off for a short while didn’t help, but leaving it off overnight resolved the issue. I’m not sure why this happened, and I couldn't reproduce the error, but in the end, it worked, which is what matters most to me.
  • Spraying a very small amount of lubricant from a spray can is quite difficult.
  • In Inventor, you can use the rectangular selection tool to choose all the profiles you want to extrude. Using construction lines for elements you don’t want to include in the extrusion process is extremely helpful and can save a lot of time.
  • Sleeping on a problem often leads to better solutions than overthinking it repeatedly.
  • How much unnecessary code is add it to "universal" post processors.

What I want to improve next week

Design Files

prusa xl shelf


To create this page, I used ChatGPT to check my syntax and grammar.

Copyright 2025 < Benedikt Feit > - Creative Commons Attribution Non Commercial

Source code hosted at gitlab.fabcloud.org