Week 12 - Mechanical and Machine Design
This week we have the following tasks to complete:
- design a machine that includes mechanism+actuation+automation+application
- build the mechanical parts and operate it manually
- document the group project and your individual contribution
- actuate and automate your machine
- document the group project and your individual contribution
Group Assignment
The weekly group assignment can be accessed here.
I corporate with Jarni and Richard. We decided to build a small form factor cnc mill where we got some inspiration from the Pico V2. We aim to primarily use the machine for milling PCBs with a minimum trace width of 0.4 mm. Additionally, we want it to be capable of engraving soft limestone, if feasible. The machine bed should have a minimum working area of 150 mm × 100 mm to accommodate our standard metric PCB stock, or at least 5" × 4" for imperial-sized stock.
Design
To allow for workpiece clamping and flexibility in material dimensions, we defined a minimum working area of 160 mm × 120 mm × 15 mm. The overall machine dimensions should not exceed 350 mm × 300 mm × 400 mm.
Initial Concept
I began designing the X-axis first, as I already had a clear vision in mind for this subassembly. My design was inspired by both the Pico V2 and the Prusa MK4S. The X-axis consists of seven custom parts and various standard components.
The motion system includes two 8 mm steel guide rods with three linear bearings. Movement is driven by a stepper motor with an integrated T8 lead screw and two opposing T8 nuts.
A carriage connects the drive system to the guide system.
On each side, a mounting plate connects the assembly to the frame. To allow slight adjustment of the guide rod position, small clamps are attached to both plates.
The Z-axis was more complex to develop. I considered three design approaches:
- Use a compliant system similar to the Pico V2
- Adapt the design of the X-stage by resizing it
- Implement a variation of the X-stage design where the sled is not centered and the mounting plates are nested inside one another
I chose the third option. The first would have required a full redesign of the X-axis and a larger sled to embed the Z-axis stepper motor. Otherwise, large levers would form between the motor and load, reducing travel. The second approach was mechanically solid, but it required the Y-axis stepper motor to move with the Z-axis, increasing mass and loading. The third option offered a good compromise: only the spindle would move, reducing moving mass.
However, this came with trade-offs. The theoretical Z-travel was limited to just 10 mm. It could be extended by increasing the height of the moving parts, but this introduces new challenges. Most components were still suitable for manufacturing from 5 mm sheet metal. The design was more complex and required innovative thinking, especially as the guide rods also needed to move. In the end, the result was only slightly more compact than the second option.
During assembly, we realized this design was not optimal, but we lacked time for a complete redesign. A larger Z-travel would have allowed us to engrave thicker materials such as stone plates. Although the travel remains small, we can adjust the X-axis position within the frame to effectively change the Z-axis position relative to the machine bed, enabling the machining of materials with varying thicknesses.
To integrate standard components, I used Inventor’s internal library. For more specific parts not included—such as the LM8UU bearing and the RepRap A4988 driver board—I sourced models externally. We modeled other components, like the stepper motors, ourselves, as suitable CAD models were not readily available. These were relatively easy to reverse engineer.
Note that the RepRap model contains incorrect driver boards, but this is not critical. Since the electronics enclosure will not be placed close to the drivers, small dimensional inaccuracies (e.g., heatsinks being slightly offset) are not a concern.
For the trapezoidal screw bushings, I considered using parts from igus, but we ultimately did not 3D print them due to time constraints.
Adding end stops to the X- and Y-axes was straightforward, as I was able to design a single mounting plate that could be directly attached to the frame. While the solution may not be the most elegant, it is functional, the components are simple, and the position of the end stops can be easily adjusted.
Installing the end stop on the Z-axis was slightly more complex. I wanted to avoid unnecessary movement of the end stop, so it needed to be mounted to one of the static parts connected to the X-sled. This resulted in a slightly unstable mounting, but the solution is functional and all surrounding components remain easy to manufacture.
X-Axis Challenges
The main challenge in the X-axis was minimizing backlash between the T8 nuts and the lead screw. Without access to precision anti-backlash nuts, we decided to use two standard T8 nuts in opposition—one fixed, one adjustable—to tune the axial tension. The goal was to apply enough preload to eliminate play without restricting the motor's movement.
Initially, I used T8 nuts from the Prusa system, assuming they were precise. However, I underestimated the amount of play—acceptable in the Z-axis of a 3D printer, but problematic for milling applications. I designed a sled that supports this anti-backlash configuration, and it performed better than expected.
However, another issue emerged with the clamping mechanism for the linear bearings. The bearing mounts, combined with the Z-axis attachment, caused the top and bottom of the sled to deform when tightened, misallying the Z-axis rods. This introduced unwanted tension and friction. We mitigated the issue by slightly modifying the clamps due to time constraints, but a proper solution was not implemented.
The biggest production challenge was dimensional tolerance. We encountered inconsistency across different Prusament filaments and printer settings. Although we performed tolerance testing in Week 05, differing slicer settings between printers led to unintentional variance. After extensive testing, we identified the tolerances required for reliable part fit.
Z-Axis Challenges
The Z-axis had to be both compact and lightweight, yet rigid. These goals often conflict, so a balance had to be found. Knowing that 3D-printed parts alone might not offer sufficient rigidity, I designed components that could later be milled without extensive material removal, maintaining manufacturability and cost-efficiency.
The tolerance issues encountered on the X-axis also affected the Z-axis, as both were produced concurrently under similar conditions. The interdependencies between both axes made the Z-axis even more sensitive to dimensional accuracy and mechanical fit.
During a short break at the end of the manufacturing process, I also designed a set of rubber feet to be 3D printed from TPU. These feet help ensure that the milling machine does not slide easily on the table surface.
Preparing the Electronics
To control the machine, we use a RepRap controller board that originally operates on 12 V with DRV8825 stepper motor drivers. Later, we will modify the system to run on 24 V. Some boards support switching between 12 V and 24 V supply voltages.
First, I installed the included heatsinks onto the DRV8825 drivers. Be careful not to accidentally create shorts between pins when attaching the heatsinks.
Next, I installed four jumpers underneath each driver to configure the board for 1/32 microstepping. Then, I placed the drivers on top. This setup may vary depending on the specific driver and desired microstepping resolution. Always ensure the drivers are oriented correctly, as different driver types may require different orientations. In theory, only three drivers are needed for the X, Y, and Z axes. However, to prevent losing the remaining drivers, I installed them on the RepRap board as well—this has no negative effect on the system.
After that, I connected the included display using ribbon cables, first to the adapter board and then to the RepRap controller.
Next, the power cord needs to be partially stripped of its insulation. When using stranded wire, it is good practice to strip only a few millimeters of the inner insulation. This allows you to grip the loosened part and twist the strands, preventing them from fraying during assembly. If your wire stripper doesn’t allow for this precision, you should carefully twist the strands manually after stripping.
In the following step, I crimped fork cable lugs onto the power cord to prepare for connection to the PSU. For this, I used a crimping tool with dies suitable for insulated terminals and wire cross-sections of 0.5–1.5 mm² (22–18 AWG), typically the red die. I placed the fork lug into the crimping die and slightly closed the tool to hold the lug in place. After inserting the stripped wire (ensuring the insulation is properly removed), I fully closed the crimping tool.
The finished power cord looks like this. If your cable does not already have a plug, you will need to install one. In our case, this step was not necessary. If needed, check compatibility with your cable, such as the cross-section, and determine whether fork lugs or wire end ferrules are required.
I repeated the same steps for the power cable from the PSU to the RepRap. Fork cable lugs were installed on the PSU side, and wire end ferrules were crimped on the RepRap side. The process is similar to crimping fork lugs, except it requires a different crimping tool designed for wire end ferrules.
Testing
Initial testing began with a basic G-code program to move the machine in a circular motion. This was executed in free space (without contact to any surface) to avoid collisions and potential damage to the machine. The G-code was written in a plain text file and saved with the .nc
extension using Visual Studio Code.
Subsequently, the test was repeated using a pen temporarily fixed to the spindle to evaluate the accuracy of the plotted circle. To accommodate this, the code was slightly modified to include commands for lowering the Z-axis before the circular movement and raising it afterwards.
G21 ; unit in mm
G91 ; absolute mode
G0 X80 Y60 F800 ; move to center position
G0 Z-7 F100 ; lower z-axis
G2 X0 Y0 I-20 J0 F800 ; circle clockwise, I = radius
G0 Z7 F100 ; raise z-axis
M30 ; end program
Using a circle as a test path is effective because it requires simultaneous movement of both the X and Y axes with varying interpolation ratios. This makes it easy to visually detect calibration errors. The plotted result was surprisingly accurate.
The next step was to perform an actual milling test. Since one of the main goals of the project was PCB milling, a piece of FR1 board was used to replicate the test with further modifications. First, the circle diameter was reduced. Multiple tests were conducted while iteratively adjusting the feed rate, as the initial settings were overly optimistic.
Additionally, the spindle voltage was increased to achieve higher RPMs. During the initial tests, the spindle produced excessive noise, indicating insufficient speed. Along with reducing the feed rate, the depth of cut was also minimized, as the machine experienced significant vibration. The end mill frequently bounced off the material, resulting in poor cutting performance.
The final working version of the G-code was as follows:
G21 ; unit in mm
G90 ; relative mode
G92 X0 Y0 Z0 ; set origin
G0 Z-0.2 F100 ; lower z-axis (Z-1mm; Z-0.5mm; Z-0,2mm)
G2 X0 Y0 I-5 J0 F50 ; circle clockwise, I = radius (F600; F100; F50)
G91 ; absolute mode
G0 Z8.5 F100 ; raise z axis
G28 X ; move x axis away
G0 X0 Y138 F1000 ; move y axis in the front position
M30 ; end program
The final milling results were sobering. Although many parameters could still be optimized to improve performance, there are inherent design flaws in the machine that fundamentally limit its capabilities. Nevertheless, building a machine from scratch was a highly rewarding experience.
The design of the linear guidance system was especially educational. While I had previously seen these systems in action on 3D printers, laser cutters, CNC mills, and lathes, this project allowed me to develop a deep, hands-on understanding of how to design and manufacture them. It also revealed practical challenges and consequences of specific design decisions—insights that are difficult to gain from theory alone.
What I Learned This Week
- If a subassembly contains joints in Inventor 2025, it is not possible to manipulate its position directly within the main assembly without entering the subassembly itself.
- Operating a self-built machine is an effective way to experiment with G-code commands and deepen understanding of CNC control.
- When sleep-deprived and exhausted, I can unexpectedly come up with interesting quotes:
“I need something to clear my mind, so I designed some rubber feet.” — Benedikt, 27.04., 21:50 - Working alone on a group project can be demotivating. In contrast, working side by side with teammates is highly motivating and productive.
- I learned the English terms for Aderendhülsen (“wire end ferrules”) and Gabelkabelschuh (“fork cable lug”).
What I Want to Improve Next Week
- Our time management was far from ideal. Everyone had other commitments, making it difficult to coordinate schedules. However, once we did manage to meet, the sessions were highly productive and enjoyable.
Design Files
JarBeRi CNC project files
plot circle
mill circle
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