Close
0%
0%

Heavy Desktop Mill

A robust and easy-to-build Cnc tabletop milling machine for precision work and soft metals machining

Similar projects worth following
- Hybrid setup can be used with handwheels or as CNC.
- Optimized axis travel for a reasonably sized working surface 250x150x150
- Over sized structure for soft metals without challenges
- Classic milling machine structure for accurate machining suitable for precision machining (like pcb)
- Limited degrees of liberty for easy tuning
- Functional dimensions rely on known dimensions with low tolerances (such as the thickness of a profile or a linear guide.
- Easy to make with no milling (only drill and cut off aluminium sheet and profile)
- Cute :)

This machine was built with minimal tooling. I will complete the project with photos of the manufacturing process, 3D plans, the adjustment process, and examples of finished parts.

The machine has been operational since August 2024, but I continue to improve it, and not all the photos are up to date. I have redone the wiring, the controller, the Z-axis, etc. I will update all the photos as soon as possible.

Design and Manufacturing Principles

This machine was designed as a versatile tool capable of performing most small machining tasks typically encountered in a small amateur or professional workshop. It fits well in a compact workshop or laboratory.

Structure and Kinematics

I opted against a router-style structure because it is less rigid and significantly harder to calibrate. The classic structure of conventional milling machines (XY+Z) offers several advantages compared to a router structure (Y+XZ). First, the X and Y axes are interconnected, making it much easier to adjust their perpendicularity. The X and Y rail planes are naturally parallel. Second, and more importantly, the classic structure has fewer degrees of freedom, meaning fewer adjustments are required.

Additionally, each adjustment affects only one axis at a time. On a router, adjusting the Y-axis can disrupt the Z-axis, making the calibration process more complex and requiring more tools.

During the design phase, I focused on ensuring the machine could be finely and easily adjusted by following these principles:

  • Minimize joints and the number of parts, avoiding components like angle brackets.
  • Avoid thickness adjustments (e.g., no shims); all adjustments are rotational.
  • Contact surfaces influencing kinematics are never machined surfaces, as no cutting process at my disposal guarantees perfect perpendicularity or parallelism.

First version

Rigidity

The entire structure is oversized for enhanced rigidity. I used 20mm-thick plates and heavy-duty aluminum profiles designed for structural applications. For instance, the head profile measures 80x160mm and weighs 2kg on its own. The entire structure is assembled using 8mm screws, allowing for secure clamping.

Detailed adjustment instructions will be provided.

20mm vs 40mm strong profile

Manufacturing

I assembled this milling machine with minimal tooling:

  • A drill press.
  • A ruler, compass, and carbide scribers.
  • An angle grinder to size the linear guide rails.
  • Pre-cut and dimensioned aluminum profiles and plates.
  • A dial gauge with a stand for assembly and calibration.

Compactness and Work Area

Routers typically offer a larger work area compared to the classic structure. To maximize the working area, I did not use standard bearing blocks for the SFU1204 ball screws:

  • The assembly is reversed compared to the recommended setup: the fixed bearing block is placed opposite the motor, and there is no floating bearing.

  • The fixed bearing journal is reduced from 10mm to 8mm.

  • This means the ball screw is not a standard SFU, but it is still relatively easy to source.

  • Standard SFU screws can be used, but this would require adapting the design and accepting either a larger machine or a reduced travel range.

Specifications

  • Footprint: 500x500x500mm
  • Work area: 250x150x150mm
  • Linear guides: 4x HGR15 on all three axes
  • Motors: NEMA 22, 1.8Nm or 1.2Nm closed-loop
  • Controller: FluidNC with CNCjs on a Raspberry Pi
  • Speed: At least 4000mm/min
  • Verified machining capacity: 1mm cuts with a 6mm end mill, achieving 0.01mm precision with the current spindle.

  • 1
    Manufacturing and building instructions

    Manufacturing Parts

    The entire machine is made of aluminum plates and profiles with drilled holes, with no complex parts requiring machine tools like a milling machine or lathe. All components can be ordered pre-cut to size and drilled with the tools you have available.

    For positioning the drill holes, I used traditional methods with a compass, a graduated ruler, a square, and carbide scribers. A reference edge and origin point are chosen, and axes are marked out from this point.

    Precision is important but manageable. When drilling, I typically add 0.5mm to the bolt diameter (e.g., M6 = 6.5mm) and aim for at least 0.5mm accuracy when marking.

    Once marked, the drill hole locations are center-punched.

    The countersinking for bolts is done using countersinking tools. For M8 bolt countersinks, a good drill and ideally a drill press are required.

    Assembly and Adjustment

    I drill the screw passages for the rails and bearing blocks at the last stage, using a dial gauge to ensure the rails are perfectly parallel.

    The principle is straightforward: I drill and mount the first rail parallel to one side of the frame, clamp the second rail, and ensure it is parallel to the first using a dial gauge. Once the position is perfect, I center-punch the locations with an adjusted-diameter carbide scribe.

    The rest of the assembly is straightforward. Once the machine is assembled, it needs to be adjusted.

  • 2
    Fine adjustment of geometry

    Fine-tuning is crucial as it determines the precision of machining geometry.

    It also impacts surface finish quality, noise, and the lifespan of cutting tools.

    Adjustment with shims or by rotation

    Connections between two elements typically involve planar contact with screws. There are two types of adjustments: rotation of parts by pivoting them against each other and the use of shims.

    Shims can be a nightmare if you don’t have a set of sheets with different thicknesses. That’s why I favored rotational adjustments during the design phase.

    Degrees of freedom

    I define a degree of freedom as the possibility of rotational adjustment around an axis. The ideal structure minimizes the degrees of freedom and reduces the number of parts.

    It’s also important that adjustments follow the machining XYZ coordinate system. Moreover, it’s far more practical for an adjustment to affect only one axis. If a rotational adjustment affects two axes, the process becomes more complex and time-consuming.

    On this milling machine, there are four degrees of freedom:

    • Perpendicularity of the X and Y axes
    • Perpendicularity of the X and Z axes
    • Perpendicularity of the Y and Z axes
    • Coaxiality of the Z-axis with the spindle axis

    Tooling

    I use a dial indicator with a magnetic base and a DIY dial indicator holder. You can make your own; it doesn’t require precision.

    Adjustment process

    • Red: screws to tighten/loosen. Always remember to work in rotation; one screw should always be tighter than the others.
    • Yellow: the movement to apply. The movement should be as long as possible with minimal dial indicator displacement. Less than 0.05 over 50–100 mm provides excellent precision.
    • Green: control points.
    1. Place a precision square on the table and adjust its position so one edge is // to the X-axis.

    2. Move the dial indicator along the Y-axis and adjust the Y-axis. => The X-axis is now perpendicular to the Y-axis.

    3. Materialize the spindle’s Z-axis by inserting a pin or drill bit. Check the spindle’s concentricity (it’s not always perfect).

    4. Adjust the // between the spindle axis and the Z-axis rails. => The Z-axis rails are now // to the spindle’s Z-axis.

    5. In the final step, the perpendicularity of the X and Z axes relative to Z is adjusted simultaneously. Mount the dial indicator holder in the spindle. => The machine is now perfectly aligned along all axes.

  • 3
    Stepper Packpack

    The mechanical part being more or less finalized, I had time to think about the electrical part and the control system.

    The goal is to get rid of the large plastic junction box and minimize cables as much as possible while keeping it readable and maintainable.

    First step: wiring to the motor. I opted for an integrated closed-loop driver. The driver receives the step/dir signals from the controller and handles the rest.

    The driver can communicate via RS485 for programming or feedback (position, current, etc.). I plan to use RS485 later, so it needs to be wired now.

    I also route the MIN and MAX limit switch signals through the same cable.

    In the end, there are 9 conductors for the signals reaching the motor. I use a DB9 connector, integrated into a small enclosure mounted on the motor.

View all 4 instructions

Enjoy this project?

Share

Discussions

SoLongSidekick wrote 01/24/2025 at 11:17 point

Great design and write up my dude, but I was shocked at your choice of spindle. I have a desktop mill myself that I'm souping up specifically for PCB production and it came with a 500w DC spindle very similar to yours. These cheap spindles are notorious for having a shitload of runout and mine was no exception, to the point that I had resigned myself to spending another ~$300 for a proper VFD / 80mm spindle combo. What's the runout like on your machine? I'd love to not have to upgrade to a spindle that makes my machine look comical due to being like 3/4 the size of the entire machine (3020 but I plan on moving to 3040 when I swap the leadscrews for ballscrews) since I don't plan on doing really anything but PCB production. And since they're so much cheaper than typical spindles swapping them out as they become less precise shouldn't be a huge deal - depending on how quickly that happens obviously. 

Can I ask why you decided to pitch for closed loop steppers? They don't offer any increase in precision or accuracy unless the motors start skipping steps, and while I guess that is possible the NEMA23s should be more than powerful enough. Also, I see you put together a custom version of the FluidNC pendant, what changes did you make? I love the use of the M5 Dial and the skeuomorphism of the enclosure, but looks are a far second to functionality on something like this. I also have a (relatively) weak laser mounted alongside the spindle that I use to create solder mask and silkscreen without having to remove the PCB so having extra controllability is always good. I also haven't touched FluidNC yet, do you know if it allows the use of commercially available toolsetters?

Thanks in advance.

  Are you sure? yes | no

Rinar wrote 01/24/2025 at 12:45 point

Hi @SoLongSidekick!

** Indeed, those spindles aren’t perfect, but:

I’ve never had issues with runout on these spindles (it’s a brushless motor, not pure DC), though I do sometimes replace the collet chuck with a higher-quality one. I’ve measured a runout of about 0.01 to 0.02 mm on the last two spindles I’ve had.

The power is more than sufficient for aluminum (I rarely exceed 400W even on heavy passes in aluminum with a 6mm end mill), and the torque is much better than on more powerful VFD spindles. The only real issue with these spindles is the bearings. They’re too small and of poor quality, so you need to replace the spindle or the bearings every year. On the other hand, VFD spindles are bulky, heavy, have low torque, spin way too fast, and are very noisy.

To be honest, I’ve been searching for months for a spindle that’s better suited to this machine. Ideally, a 4-pole 1000W brushless spindle at 12,000 RPM with four bearings would be perfect, but those cost at least $800. The best compromise I’ve found is a high-frequency ER20 spindle with four bearings at 6,000 RPM. It’s a good option, but it’s really too slow for PCB work.

** On choosing closed-loop steppers:

- Improved homing and probing accuracy: down to a few microns.

- Better handling of acceleration and overshoot correction during direction changes, which is noticeable on PCBs.

- The controller can momentarily increase the current, boosting torque beyond the motor’s rated maximum (4A for a 2.8A motor).

- Current sensing gives insight into cutting forces.

- Better separation of high and low currents: the drivers are integrated into the motors, so the current doesn’t pass through the controller.

- Saves space in the controller since I don’t need bulky 4A drivers.

- The controller has a 4,000 PPR encoder, so it knows its absolute position. I plan to update FluidNC to reflect absolute position during manual operation.

** On my custom FluidNC controller:

I made it because I didn’t need drivers and wanted as many IOs as possible for buttons, LEDs, the pendant, and communication with the motors. I initially used an MKS DLC32, but it was a nightmare to wire since I wanted a single cable to handle the motor, RS485 for the controller, and the limit switches.

I’m currently completely redoing the electronics. I’ll update the project once I have something finalized.

** About the FluidDial:

It’s vanilla—I didn’t modify it. Unfortunately, it burned out for reasons I don’t understand. I don’t plan to buy another M5 Dial and will instead go for a proper pulse encoder. I’ll handle that once the controller is finished.

** Regarding toolsetters and lasers:

I’m not sure. I haven’t wired my laser yet. FluidNC allows selecting multiple tools (spindles, lasers, etc.) and naturally adjusting the length using a probe. However, I haven’t looked into it in depth. I noticed that the latest beta versions have improved M6 management, but I haven’t explored further.

  Are you sure? yes | no

SoLongSidekick wrote 3 days ago point

Thanks for the reply. Yeah I've found a few different spindle options, but they're all 80mm which looks hilarious on a machine of this size. I wonder what would be more accurate: closed loop motors or using two motors per axis to take advantage of Fluid's auto-squaring. I've also noticed that almost every high quality mill I see uses the moving gantry design as opposed to bed slinger. Do you have any idea why? I would assume it would be worse because the gantry isn't as robust.

  Are you sure? yes | no

Frantisek Havluj wrote 01/18/2025 at 05:23 point

Hello @Rinar , I have been looking for a machine like this for years and I am not happy about anything comercially available. So I am contemplating on building my own and your project looks exactly like what I need. Price is very reasonable and I really like your commitment to quality instead of focusing on low cost. However, while having my toes dipped in various maker areas I am a complete noob in machining and precision construction, but I am very eager to learn! So I have two questions: do you think I can build it (being an engineer and somewhat capable tinkerer, but without mechanical engineering background and experience) and would you please be able to provide some advice as I am going on? I would be more than glad to document my process and I think it might become an interesting resource for other less-skilled hackers. Anyway, hats off! It looks really really really good.

  Are you sure? yes | no

Rinar wrote 01/24/2025 at 11:40 point

Thank you @Frantisek Havluj for your message. Regarding my background, I have a mechanical engineering education. It’s not my profession, but I do have some basic knowledge of design and manufacturing. I’m also fairly handy. Before designing this machine, I tinkered quite a bit with low-end Chinese routers, which helped me get comfortable with the electronics and better understand my needs and the mechanical constraints.

This machine was designed from the start to be simple to build, but naturally, it’s always a challenge. I believe a good tinkerer who knows how to mark, drill straight, and tap threads should be able to manage it. I’ve included some photos to document the main steps.

I’d be very happy to see this milling machine inspire others, and of course, I’d be glad to follow your project and answer your questions.

  Are you sure? yes | no

dekutree64 wrote 01/13/2025 at 14:26 point

Very nice design and writeup!

What is the total weight of the machine? And approximate cost of components?

From what I can see, it still needs a few more features. Dials on the hand wheels, pause/resume buttons, and individual enable/disable switches for each stepper motor (or can that be done from the LCD?). It is very useful to be able to e.g. pause and switch off Z stepper, pull the tool up out of a hole and clean out chips/apply lubricant, and then put it back down exactly where it was and resume. Or manually operate Z with precision for drilling holes. I only do shallow drilling with CNC due to the unpredictability of chip jamming.

Is the spindle electrically isolated from the bed? I don't know how I could live if mine wasn't, because I use electrical contact for probing, for zeroing Z after each tool change, and with a rod in the spindle for centering on internal or external features. I also have an LED connected to the spindle so it lights up when contact is made for manual operation.

I also recommend protecting the Y rails from chips. My covers are just sheets of typing paper coated with box tape, and stuck to the machine with blue masking tape. Surprisingly effective. It does hang over the Y knob annoyingly when moved forward, but not really a big deal.

  Are you sure? yes | no

Rinar wrote 01/13/2025 at 15:24 point

Hello @dekutree64,

Thank you for your comment. I see you've thoroughly analyzed the machine and pointed out areas for improvement.

I haven’t weighed the machine, but it probably weighs around 35 kg.

The question of cost is a bit tricky for me because, on one hand, I reused parts from another machine, but on the other hand, I ordered most components from a German supplier who does excellent cutting and finishing work but is probably not the cheapest. Using the same profiles as mine, outsourcing the cutting in Europe, and sourcing quality components (steppers, linear guides, etc.), I think the machine would cost between $2000 and $3000. That’s an estimate for European pricing. By being a bit resourceful, I think the cost could be reduced to around $1500.

The control system isn’t finalized. I’m currently using a FluidNC controller and a Raspberry Pi running CNCjs. For the interface, I have a FluidDial (https://github.com/bdring/FluidDial) visible in some photos and a numeric keypad inspired by this project (https://github.com/mariolukas/cncjs-pendant-numpad). The Raspberry Pi touchscreen and the keypad let me handle the essentials: disabling motors, controlling the spindle, overrides, etc.

But I plan to redo everything. My goal, since I have closed-loop stepper motors that know their absolute positions, is to update the controller's work coordinates when I reactivate the motors. Not a big deal, and the machine will be realy hybrid. I’ll update the project when I have something to show.

No, my spindle isn’t isolated. I went with an isolated probe setup using optocouplers, an LED, and a buzzer  (which is also very convenient). For PCBs, I use a acrylic glass spoilboard. But you’re right, having an isolated spindle is a good idea. I’ll definitely consider doing that.

And yes, chips are a problem. Like you, I’m using paper for now. I made a vinyl bellows fixed with magnets, but it’s not great. The design allows for a acrylic glass sheet between the X and Y axes using pillars rather than a plate. It’s still an option, but I didn’t want to complicate things too much.

Thank you for your message, it gives me the motivation to continue and develop the project further.

  Are you sure? yes | no

dekutree64 wrote 01/13/2025 at 18:41 point

Oh yeah, with closed loop you don't need physical dials. And that would be convenient having it hold its exact position when reactivated, so you can use the steppers as axis locks when manual machining. Mine jumps a small amount when the steppers are reactivated, depending on where it is in the stepping cycle.

I tried making a bellows/accordion cover on my lathe out of paper and box tape, but it's too stiff and doesn't work very well, plus is a pain to get chips out of the folds. I recommend keeping them flat on the mill, so they can be vacuumed clean in a few seconds. But no can do on the lathe where it would either be too short to cover enough of the rails, or run into the headstock when working near the chuck. I might try one of those telescoping sheet metal types next.

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates