Week 08 Fab Academy 2026 · Lab Rwanda

Electronics
Production

Fabricating a custom ESP32-S3 PCB from scratch — milling the board with a CNC machine using Mods and Candle, then mounting all components by hand.

MCUESP32-S3
MillingCNC Machine
ToolpathMods Project
Status✓ Board Milled
ESP32-S3PCB MillingMods ProjectCandle CNCSVG ExportToolpathHeight MapProbingComponent Assembly ESP32-S3PCB MillingMods ProjectCandle CNCSVG ExportToolpathHeight MapProbingComponent Assembly
Overview

Introduction

During Electronics Production week, I brought the ESP32-S3 board designed in Electronics Design Week into physical reality. This week was entirely hands-on — using CNC milling software, a milling machine, and steady hands to go from a digital PCB file to a real, assembled board.

The work was organized into two main stages: preparing and milling the PCB, then assembling components onto the finished board. Each stage demanded precision — from configuring toolpaths in Mods to probing the CNC bed and mounting fine-pitch SMD components.

🖨️
PCB Milling
CNC milling the copper board using toolpaths generated from the KiCad SVG export via Mods and Candle.
🗺️
Height Mapping
Probing the CNC bed surface and generating a height map to compensate for material unevenness across the board.
🔧
Component Assembly
Placing and soldering the ESP32-S3 and all support components onto the freshly milled PCB.
This Week

Assignments

Group Assignment
Characterize the design rules for your in-house PCB production process. Submit a PCB design to a board house.

Working as a group, we documented the minimum trace width, clearance, drill size, and other design constraints our CNC milling setup can reliably produce — essential reference data for designing boards that actually mill correctly.

Individual Assignment
Make and test an embedded microcontroller system that you designed. Extra credit: make it with another process.

For my individual work, I fabricated the custom ESP32-S3 board designed in Electronics Design Week — milling it on the CNC machine, assembling all components, and verifying the board functions correctly.

Software & Hardware

Tools Used

The production workflow relied on a small, focused set of tools — each handling a specific stage from file preparation through physical milling and assembly.

ToolRoleNotes
KiCadPCB design sourceSVG exported from the PCB Editor for milling input
Mods ProjectToolpath generationmodsproject.org — inverts PCB, sets tool size, calculates paths
Candle CNCMachine controlImports G-code, handles probing and height map compensation
CNC Milling MachinePhysical fabricationEngraving bit used for copper trace isolation
Soldering IronComponent assemblyFine-tip for SMD components; flux applied throughout
Process

Production Workflow

The full process divided cleanly into two phases. Phase 1 covers everything needed to go from KiCad file to a freshly milled copper board. Phase 2 covers component assembly.

Phase 01
PCB Preparation & Milling
Step 01
Export PCB Design as SVG
Opened the completed ESP32-S3 board in KiCad's PCB Editor. Used File → Plot to export the front copper layer as an SVG file. This vector format preserves trace geometry precisely and is the required input format for Mods Project.
KiCad PCB EditorSVG ExportFront Copper Layer
🖼️
Add image — KiCad SVG export
Step 02
Prepare Toolpaths in Mods
Navigated to modsproject.org and opened the PCB milling workflow. Uploaded the exported SVG file, then configured three key parameters before calculating toolpaths:
  • 01 Invert the PCB — flips the image so the milling paths correctly remove copper around traces rather than the traces themselves.
  • 02 Set tool size — entered the diameter of the milling bit to calculate accurate trace-width clearances.
  • 03 Calculate toolpaths — Mods generates the isolation routing paths based on the SVG geometry and tool parameters.
modsproject.orgInvert PCBTool SizeToolpath Calculation

Why invert? The SVG from KiCad shows copper as filled areas. Mods needs to know what to remove — so inverting the image tells the milling bit to cut around the traces, leaving them proud on the board.

🖼️
Add image — Mods interface
🖼️
Add image — toolpath preview
Step 03
Set Up Candle CNC
Installed and launched Candle CNC (alternatively OpenBuilds Control). Imported the G-code file exported from Mods. Verified the toolpath preview in Candle matched the expected board layout before touching the machine.
Candle CNCG-code ImportToolpath Preview
🖼️
Add image — Candle CNC with G-code loaded
Step 04
Secure the PCB Material
Placed the copper-clad FR4 blank onto the CNC machine bed. Secured it firmly using double-sided tape and / or clamps to prevent any movement during milling. Even slight shifting would misalign traces and ruin the board.
FR4 BlankDouble-Sided TapeBed Fixturing

Critical: The material must be completely flat and immovable. Any flex or shift during the milling pass will cause trace width errors or broken connections.

🖼️
Add image — PCB material secured on bed
Step 05
Probing & Height Map
Used Candle's built-in probing routine to set the machine origin (X, Y, Z zero point). Then ran an automatic height probing scan across the board surface. Candle uses this height map to dynamically adjust the Z depth during milling, compensating for any warp or unevenness in the FR4 blank — critical for consistent trace depth across the full board area.
Z ProbingHeight MapSurface CompensationXYZ Origin
🖼️
Add image — probing routine
🖼️
Add image — height map result
Step 06
Milling the PCB
Started the milling job in Candle. The CNC machine ran the isolation routing passes, removing copper between traces to reveal the board layout. Monitored the entire process closely to catch any issues — bit breakage, material lift, or unexpected toolpath deviations — and paused immediately if anything looked wrong.
Isolation RoutingCopper RemovalCNC MillingProcess Monitoring
🖼️
Add image — milling in progress
🖼️
Add image — freshly milled board
Phase 02
Component Assembly
Step 07
Inspect & Clean the Board
After milling, carefully inspected the board under good lighting. Checked all traces for continuity and verified no copper bridges remained between adjacent pads. Cleaned the board surface with isopropyl alcohol to remove FR4 dust and prepare for soldering.
Visual InspectionIPA CleaningTrace Check
🖼️
Add image — cleaned board inspection
Step 08
Component Placement & Soldering
Placed all components following the KiCad layout — starting with the smallest SMD passives (resistors, capacitors), then the voltage regulator, and finally the ESP32-S3 module. Applied flux generously before soldering each component. Used a fine-tip iron at controlled temperature to avoid pad lift or cold joints.
SMD SolderingESP32-S3FluxFine-Tip Iron
🖼️
Add image — component placement
🖼️
Add image — soldering in progress
🖼️
Add image — completed assembled board
Step 09
Testing — Uploading Sample Code
With the board fully assembled, connected it to a computer via USB and opened the Arduino IDE. Selected the ESP32-S3 board target and the correct COM port. Uploaded a basic blink sketch to verify the microcontroller was alive, the power regulation was stable, and the UART programming interface was working correctly.
  • 01 Hold BOOT — press and hold the BOOT button to put the ESP32-S3 into programming mode.
  • 02 Upload sketch — click Upload in Arduino IDE; the IDE compiles and flashes the firmware over UART.
  • 03 Press EN — tap the EN (reset) button to exit programming mode and run the new firmware.
  • 04 Verify output — confirmed the LED blinks at the expected interval and checked the Serial Monitor for any boot messages.
Arduino IDEESP32-S3 TargetBlink SketchSerial MonitorBOOT + EN Buttons

Result: The board accepted the firmware upload successfully, the LED blinked as expected, and the Serial Monitor confirmed clean boot output — validating that the power section, MCU, and programming interface all work correctly.

🖼️
Add image — Arduino IDE upload success
🖼️
Add image — board LED blinking
🖼️
Add image — Serial Monitor output
Results

Outcome

MCU
ESP32-S3
Fabrication
CNCMilled
Toolpath
ModsProject
Height Map
Applied
Assembly
Complete
Board Status
✓ Ready

By the end of the week, the custom ESP32-S3 board was successfully milled and all components mounted — ready for firmware upload and functional testing in the following weeks.

Takeaways

Conclusion

This week bridged the gap between digital design and physical hardware. Taking a KiCad file all the way through toolpath generation, CNC milling, and hand soldering gave me a full picture of how PCBs are actually made in a digital fabrication lab.

The most important lessons came from the milling stage — understanding why probing and height mapping are non-negotiable for consistent trace depth, and how even small fixturing mistakes translate directly into unusable boards. The assembly stage reinforced careful, methodical soldering practice for fine-pitch components.

CNC Milling Mods Project Candle CNC Height Mapping SMD Assembly ESP32-S3 PCB Fabrication Soldering
← Week 06 · Electronics Design All Assignments →