CNC & Laser Workshop
building a capable workshop machine from scratch, one layer at a time
The TwoTrees TTC450 is a compact aluminium-frame router with a 460×460 mm work area, ball-screw axes, a 500 W spindle, an ESP32-based controller, and a 20 W diode laser module. It can mill, engrave flat stock, and engrave round objects on the rotary — all on the same machine.
What started as a routine firmware upgrade turned into a series of tools I had to write because they did not exist yet. This page collects the blog posts that document each step, in the order they happened.
Starting point: replacing the firmware
The stock firmware required flashing a separate binary every time I switched between CNC and laser mode — five minutes with a USB cable each way. FluidNC eliminates that: CNC and laser are two YAML files on the board; switching is one serial command. The full migration walkthrough covers the flash backup, partition analysis, and complete YAML configs for both modes — and explains why the TS35 touchscreen went dark the moment FluidNC came up for the first time.
Restoring the display
FluidNC had no support for the MKS TS35 screen and upstream had declined to add it. Rather than tape over the display, I wrote a plugin: a full LVGL control panel — DRO, jog pad, SD file browser, work offsets, console — running on Core 0 while FluidNC runs on Core 1. The detail that made the rest possible is a tab extension API: every plugin below adds its own page without touching the display code. The full writeup covers the LVGL setup, the FreeRTOS queue architecture, and the extension model.
Wireless jogging
With a working screen, jogging still meant bending over the machine and pressing keys. A PS5 DualSense controller was sitting unused nearby, so I turned it into a wireless pendant. The blog post covers the BT Classic HID pairing, HID report parsing, and how stick and button state maps to configurable jog steps and feed overrides.
Tool changes and probing
Wireless jogging exposed the next friction: every tool change meant manual re-zeroing and mentally tracking length offsets. I wrote an M6 workflow plugin that handles the guided pause, moves to the change position, measures the new tool length via the ETS probe, and resumes — no operator math. The post covers the complete sequence. A companion touch plate plugin handles workpiece corner and center zeroing (post coming).
Safety and laser work
Tool changes revealed a safety gap: the TMC2209 drivers have StallGuard load registers but nothing was reading them. A stall during probing or a tight cut caused lost steps before any alarm fired. The StallGuard monitor plugin reads SG_RESULT in real time and injects a Feed Hold the moment a stall is detected — the post explains how the threshold is tuned per axis.
For laser work, I kept placing bets on where a job would land. A laser frame preview plugin traces the bounding box at configurable power before the job runs — from a dry run at 0 % to a faint mark on masking tape. Covered in this post.
Machine setup
Posts covering the physical machine, workholding, and the spoilboard setup are in progress.
CAD/CAM and tooling
Notes on bit selection, FreeCAD tool libraries, and the connection between measured tool geometry and the AutoZero/toolchange plugins are in progress.
Repositories
| Repository | What it contains |
|---|---|
| fluidnc-ttc450 | Firmware build system, YAML configs, pre-built releases |
| fluidnc-ts35display | TS35 touchscreen display plugin |
| fluidnc-gamepad | DualSense Bluetooth jog pendant plugin |
| fluidnc-toolchange | M6 manual tool change plugin |
| fluidnc-autozero | Touch plate probing plugin |
| fluidnc-laser-frame | Laser bounding box preview plugin |
| fluidnc-stallguard | TMC2209 StallGuard safety monitor plugin |
Blog posts
All posts in this project. Posts not yet covered in the narrative above are marked.