DEI.
Week 08 · Fab Academy 2026 · Lab Rwanda

Electronics Production

Fabricating a custom ESP32-S3 PCB from scratch. I milled the board on a CNC machine using Mods and Candle, then mounted every component by hand and tested it until it ran.

The Board

Hero Shot

This is the finished ESP32-S3 board I made this week: milled, stuffed, soldered, and tested working.

finished working ESP32-S3 board
finished working ESP32-S3 board
Overview

Introduction

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

I split the work into two main stages: preparing and milling the PCB, then assembling components onto the finished board. Each stage needed care, from setting up the tool path in Mods to probing the CNC bed and mounting small SMD components.

PCB Milling
CNC milling the copper board using the tool path generated from the KiCad SVG export through 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. See our full group assignment page.

Working as a group, we ran test cuts on our CNC milling setup to find the smallest trace width, clearance, drill size, and tool size it can reliably produce. The full write up lives on our group assignment page. These are the machine settings we settled on for in house boards.

Design ruleValueNotes
Tool size (isolation)0.2 mm V bit30 degree engraving bit for trace isolation
Min trace width0.4 mmThinner traces lifted or broke during milling
Min clearance0.4 mmGap between copper that the bit can clear in one pass
Drill size0.8 mm to 1.0 mmThrough hole pads and mounting holes
Cut tool1.0 mm flat end millUsed for the board outline cut out
Mill depth0.1 mm to 0.15 mmIsolation depth into the copper, set per height map

Sending a board to a board house. We also documented the workflow for ordering a PCB from an outside board house instead of milling it. The steps are: export the Gerber and drill files from KiCad, zip them together, open the board house website (for example JLCPCB or PCBWay), upload the zip, and the site shows a preview of every copper, silkscreen and drill layer. Then you choose the board size, number of copper layers, thickness, colour and quantity, check the price, and place the order. The main difference from milling is that the design rules are tighter and set by the board house, so you read their capability sheet before exporting.

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 I designed in Electronics Design Week. I milled it on the CNC machine, assembled all the components, and verified the board works correctly.

Software & Hardware

Tools Used

The production workflow relied on a small, focused set of tools. Each one handled a specific stage, from file preparation through physical milling and assembly.

ToolRoleNotes
KiCadPCB design sourceSVG exported from the PCB Editor for milling input
Mods ProjectTool path generationmodsproject.org inverts the 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
Solder Wick + MultimeterRework and testingClearing solder bridges and checking continuity
Process

Production Workflow

The full process split 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 and testing.

Phase 01
PCB Preparation & Milling
Step 01
Export PCB Design as SVG
I opened the completed ESP32-S3 board in KiCad's PCB Editor. I used File then Plot to export the front copper layer as an SVG file. This vector format keeps the trace geometry exact and is the input format Mods Project needs.
KiCad PCB EditorSVG ExportFront Copper Layer
Exporting the PCB as SVG from the KiCad Plot dialog
Exporting the board as an SVG from the KiCad Plot dialog
Step 02
Prepare the Tool Path in Mods
I went to modsproject.org and opened the PCB milling workflow. I uploaded the exported SVG file, then set three key parameters before calculating the tool path:
  • 01 Invert the PCB. This flips the image so the milling paths remove copper around the traces instead of the traces themselves.
  • 02 Set tool size. I entered the diameter of the milling bit so Mods calculates accurate clearances around each trace.
  • 03 Calculate. Mods generates the isolation routing paths from the SVG geometry and the tool size, then I exported the G-code.
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 and leave them standing on the board.

Mods interface
Mods interface
Step 03
Set Up Candle CNC
I installed and launched Candle CNC. I imported the G-code file from Mods and checked that the tool path preview in Candle matched the board layout I expected before I touched the machine.
Candle CNCG-code ImportToolpath Preview
Candle CNC
Candle CNC
Step 04
Secure the PCB Material
I placed the copper clad FR4 blank onto the CNC machine bed. I secured it firmly with double sided tape and clamps so it could not move during milling. Even a slight shift would throw the traces out of line 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.

PCB material secured on bed
PCB material secured on bed
Step 05
Probing & Height Map
I used Candle's built in probing routine to set the machine origin, the X, Y, and Z zero point. Then I ran an automatic height probing scan across the board surface. Candle uses this height map to adjust the Z depth while milling, so it follows any warp or unevenness in the FR4 blank. This is what keeps the trace depth even across the whole board.
Z ProbingHeight MapSurface CompensationXYZ Origin
probing routine
probing routine
height map result
height map result
Step 06
Milling the PCB
I started the milling job in Candle. The CNC machine ran the isolation routing passes, removing copper between the traces to reveal the board layout. I watched the whole process closely for any trouble, like a broken bit, material lift, or the tool path drifting, and I was ready to pause the moment something looked wrong.
Isolation RoutingCopper RemovalCNC MillingProcess Monitoring
The CNC milling the copper PCB
The CNC bit cutting the isolation paths into the copper board
freshly milled board
freshly milled board
Phase 02
Component Assembly
Step 07
Inspect & Clean the Board
After milling I inspected the board under good light. I checked all the traces for continuity and made sure no copper bridges were left between adjacent pads. Then I cleaned the surface with isopropyl alcohol to clear the FR4 dust and get it ready for soldering.
Visual InspectionIPA CleaningTrace Check
cleaned board inspection
cleaned board inspection
Step 08
Component Placement & Soldering
I placed all the components following the KiCad layout. I started with the smallest SMD passives, the resistors and capacitors, then the voltage regulator, and finally the ESP32-S3 module. I added plenty of flux before soldering each part, and used a fine tip iron at a controlled temperature to avoid lifting a pad or making a cold joint.
SMD SolderingESP32-S3FluxFine Tip Iron
component placement
component placement
soldering in progress
soldering in progress
completed assembled board
completed assembled board
Step 09
Testing the Board is Functional
With the board fully assembled I connected it to a computer over USB and opened the Arduino IDE. I selected the ESP32-S3 board target and the correct COM port, then uploaded a basic blink sketch to check the microcontroller was alive, the power regulation was stable, and the UART programming interface worked.
  • 01 Hold BOOT. I pressed and held the BOOT button to put the ESP32-S3 into programming mode.
  • 02 Upload sketch. I clicked Upload in the Arduino IDE, which compiles and flashes the firmware over UART.
  • 03 Press EN. I tapped the EN reset button to leave programming mode and run the new firmware.
  • 04 Verify output. I confirmed the LED blinks at the expected interval and watched the Serial Monitor for the boot messages.
Arduino IDEESP32-S3 TargetBlink SketchSerial MonitorBOOT + EN Buttons

This is the exact test sketch I uploaded to check the board was alive. You can copy it and try it on yours.

board_test.inocopy
int ledPin = 2;

void setup() {
  Serial.begin(115200);
  pinMode(ledPin, OUTPUT);
  Serial.println("Board is alive");
}

void loop() {
  digitalWrite(ledPin, HIGH);
  delay(500);
  digitalWrite(ledPin, LOW);
  delay(500);
  Serial.println("blink");
}

Result: The board accepted the firmware upload, the LED blinked as expected, and the Serial Monitor printed clean boot output. That confirmed the power section, the MCU, and the programming interface all work. The board is functional.

Arduino IDE upload success
Arduino IDE upload success
board LED blinking
board LED blinking
Serial Monitor output
Serial Monitor output
Working board · functional and tested
Working board · functional and tested
What Went Wrong

Problems and Fixes

Nothing went perfectly the first time. Here are the real problems I hit and exactly how I solved each one.

Problem 01
Traces came out uneven and some did not cut through
On my first milling pass the copper FR4 blank was slightly warped, so one corner cut too deep and the opposite corner barely scratched the copper. Some traces stayed connected when they should have been isolated.
Fix: I ran Candle's height probing scan across the whole board before milling. The height map let the machine raise and lower the Z axis to follow the surface, so every trace cut to the same depth on the second attempt.
Warped BlankHeight Map
Problem 02
The board shifted during milling
Partway through the first job the blank moved a little because the tape underneath had not stuck flat, which threw the traces off alignment.
Fix: I cleaned the bed and the back of the blank with isopropyl alcohol, laid fresh double sided tape with no air gaps, and added a clamp on each side. The blank stayed put for the rest of the cut.
FixturingTapeClamps
Problem 03
A solder bridge between two ESP32-S3 pins
The ESP32-S3 has tight pin spacing. After soldering, the board would not enumerate over USB, and under the microscope I found two adjacent pins bridged with solder.
Fix: I added flux over the bridge, dragged it clear with solder wick, and checked continuity with a multimeter to confirm the short was gone. The board enumerated right after.
Solder BridgeSolder WickContinuity Check
Problem 04
Upload kept failing
The first few upload attempts in Arduino IDE timed out and never flashed.
Fix: The chip was not in programming mode. I held the BOOT button, clicked Upload, and pressed EN to reset once the flash finished. After that the sketch uploaded every time.
BOOT + ENProgramming Mode
Results

Outcome

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

By the end of the week the custom ESP32-S3 board was milled, fully stuffed, and tested. It accepted firmware, blinked its LED, and printed over Serial, so the board is functional.

Takeaways

Conclusion

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

The biggest lessons came from the milling stage. I learned why probing and height mapping are not optional if you want even trace depth, and how a small fixturing mistake turns straight into a dead board. The assembly stage taught me to solder small components slowly and methodically, and the rework taught me to trust the multimeter when a board will not enumerate.

CNC Milling Mods Project Candle CNC Height Mapping SMD Assembly ESP32-S3 PCB Fabrication Soldering
Files

Downloadable files

← Week 06 · Electronics Design All Assignments →