Week 06 · 10/14

Electronics production

I milled and soldered my servo board from week 05. I milled six boards, and the last one does not move a servo yet.

00 · Starting point

The board from week 05

KiCad 3D render of the week 05 servo board seen from above: three servo headers on the left with long pins pointing out over the board edge, the XIAO at the top right, the button, the jumpers, the capacitors, the power header and three mounting holes Fusion model in X-ray view from an angle: a transparent box with the board at the bottom, three servos on a deck, three stepped cams, and three square pins with cubes on top rising through a transparent platform
Left: the board I designed in week 05, rendered in KiCad. Right: the base it sits in, modeled in Fusion (X-ray view).

This board is the controller of my final project, Pixelize the Earth. The Fusion model shows what it is for. The board sits at the bottom of the base, on standoffs. Above it, three servos hang through a deck. Each servo turns a stepped cam, and a pin with a cube (a voxel) on top rides on the cam, so when the servo turns, the cube moves up and down. The board is the part that tells each servo how far to turn. Last week I designed it to drive three servos from an XIAO RP2040, with an external 5 V supply for the servos. I call it version 1.

My process this week was: export the board from KiCad as Gerber files, turn them into black and white images with gerber2img, load the images into the milling machine software, mill, then solder.

00 · Process

How I mill a board

This is the milling process I followed for every board this week, from the Gerber files to a finished board. The machine is the Roland SRM-20 at ArchShop, driven by mods. The three cuts use two end mills: a 1/64″ for the traces, and a 1/32″ for the holes and the outline.

  1. Prepare the files

    1. Export the Gerber files from KiCad.
    2. Open them in gerber2img. Start with the edge cut and lock its origin and dimensions, so that every image shares them. Check that the images are black and white, then export trace.png, drill.png and edge-cut.png.

  2. Set up the machine

    3. Open the SRM-20 program in mods.
    4. Install the 1/64″ end mill, which is for trace.png.
    5. Fix the board to the machine bed with double-sided tape.
    6. In mods, select the 1/64″ end mill.
    7. Measure the origin of the board.

  3. Mill the traces

    8. Lower the end mill until it touches the copper board.
    9. Calculate the toolpath, then preview it.
    10. Send the file to the machine to start milling.
    11. When it finishes, vacuum the dust so that the board surface is clean.

    1/64″ · trace.png · steps 8–11 repeat for every cut
  4. Drill the holes

    12. Change to the 1/32″ end mill and select it in mods. Load drill.png.
    13. Repeat steps 8–11.

    1/32″ · drill.png
  5. Cut out the board

    14. Keep the 1/32″ end mill and load edge-cut.png. Repeat steps 8–11 to cut the board out.

    1/32″ · edge-cut.png
  6. Finish by hand

    15. Pry the board off the bed with a scraper.
    16. Trim the leftover material that was not cut through around the edges, using cutters.
    17. Sand the four edges flat with a sander.
    18. The circuit board is finished.

01 · Version 1

Five hours on a board that did not work

The first milling worked well enough. The one problem was the drill step with the 1/32″ end mill: three holes did not go through. That does not change how the board works, so I left that board as it was. Later I changed the end mill and milled version 1 again. This time the holes went through, and I sanded the edges. I soldered this second board.

Hands changing the end mill in the milling machine with a hex key
Changing the end mill.
Time-lapse of a milling run.
Version 1 board on the machine bed after the first milling, with the traces cut
The first milling of version 1, on the machine bed.

Soldering

Soldering was the hardest part of the week. The surface-mount resistors and capacitors are tiny, and the XIAO pads are small. I soldered under a microscope.

Parts list for version 1

DesignatorPartFootprint (fab library)Qty
C1100uF electrolytic (Panasonic EEE-FN1E101UL)CP_Elec_100uF_Panasonic_EEE-FN1E101UL1
C210uFC_12061
J1, J2, J3Servo (pin header 1x3)PinHeader_01x03_P2.54mm_Horizontal_SMD3
J4Servo_5V_in (pin header 1x2)PinHeader_01x02_P2.54mm_Horizontal_SMD1
JP1, JP20R jumperJumper_12062
M1Seeed XIAO RP2040SeeedStudio_XIAO_RP20401
SW1Omron tactile switchButton_Omron_B3SN_6.0x6.0mm1
The milled version 1 board on a table with three MG90S servos, pin headers and an XIAO RP2040 ready to be soldered
The board, the servos and the parts before soldering.
Microscope view of the XIAO pads soldered onto the traces of the board
Soldering the XIAO pads, seen on the microscope screen.
Microscope view of two surface-mount jumper resistors soldered across traces below the XIAO
The two jumper resistors, on the microscope screen.

Then I made a mistake. The big 100 µF electrolytic capacitor has a positive and a negative leg, and I did not realize that, so I soldered it the wrong way round. It was not easy to take off again.

Version 1 board with the XIAO, four headers, the 100 microfarad capacitor and two jumper resistors soldered on
Version 1 with the parts soldered. The 100 µF capacitor is on the wrong way round.

Measuring

With the multimeter, I found a short: GND was connected to another part of the board. I think solder joined GND to a neighbouring pad, but I did not find the exact place. I decided this board had a problem, and I gave up on it after about five hours.

Three boards on a table: the soldered version 1 at the top, an unsoldered milled board at the lower left, and a cut copper blank at the lower right
The end of the first day. The soldered version 1 is at the top; the other two are unsoldered.

02 · Version 2

Simplify, then improve the footprint

Version 1 felt too complicated and soldering it was too hard, so I simplified it. Version 2 drives two servos instead of three, and has no external power supply. Part of the reason was that I did not know where I would get an external supply. I expect the XIAO can power two servos from USB, but this is an inference from the specifications. I have not tested it.

Soldering was so difficult that I also adjusted the footprint of the XIAO: the pad size and the thermal relief. I drew my own footprint of the XIAO RP2040 and made its pads bigger, which leaves more room to work with the soldering iron. I also added thermal relief to the GND pads, so they are easier to heat. Thermal relief helped.

KiCad 3D render of version 2 at an angle: the XIAO in the middle, a three-pin servo header on each side with long pins, the 100 microfarad capacitor, a button and a small SMD capacitor on a dark green board with two mounting holes KiCad 3D render of version 2 seen from above: the XIAO in the middle, a three-pin servo header on each side, the capacitor C1 at the right, the button SW1 at the bottom and two mounting holes
Version 2 in KiCad (angled and top view). The render shows every part; the boards in the photos below have only some of them soldered.
Version 2 board on the milling machine bed after milling, with the longer XIAO pads visible
Version 2 on the machine, with the longer XIAO pads.

03 · Version 2 · Milling

The drill holes kept moving

After the traces were cut, the drill holes were shifted from the traces. I changed some parameters, calculated the toolpath again and milled again. I did this twice, and the result was the same, so I was frustrated.

Version 2 board on the machine after milling, with the drill holes shifted from where they should be relative to the traces
First failed version 2: the drill holes are shifted.

So I went back to the files. In gerber2img I had forgotten to lock the origin and the dimensions. My three images, the traces, the drill holes and the edge cut, therefore had different origins and different sizes, which shifted them against each other. The milling settings were never the problem. After I locked the origin and the dimensions, the holes lined up with the traces.

The gerber2img web page showing the black and white trace render of version 2, with the Origin and Dimensions fields grayed out and locked
gerber2img with the origin and the dimensions locked (the lock icons at the right of the two fields), so that every file I drop in keeps the same alignment.
Black and white image of the traces of version 2 Black and white image of the drill holes of version 2: two columns of seven small holes and two large mounting holes Black and white image of the edge cut of version 2: a rounded rectangle
The three images from gerber2img, all with the same origin and dimensions. From left to right: traces, drill holes, edge cut.

04 · Version 2 · Soldering

Everything was right, and it still did not light up

With that good board I soldered the parts: the 100 µF capacitor, the small SMD capacitor, two pin headers and the XIAO. I did not solder the switch, so its pads are empty. I checked the board and found nothing wrong.

Parts list for version 2

DesignatorPartFootprint (fab library)Qty
C1100uF electrolytic (Panasonic EEE-FN1E101UL)CP_Elec_100uF_Panasonic_EEE-FN1E101UL1
C210uFC_12061
J1, J2Servo (pin header 1x3)PinHeader_01x03_P2.54mm_Horizontal_SMD2
M1Seeed XIAO RP2040SeeedStudio_XIAO_RP20401
SW1Omron tactile switchButton_Omron_B3SN_6.0x6.0mm1
The bare version 2 board on a wooden bench with a pin header and the 100 microfarad capacitor beside it
The good version 2 board with the parts ready.
Version 2 board with the XIAO, the 100 microfarad capacitor and two pin headers soldered on, with two empty switch pads at the top
Version 2 with the parts soldered, except the switch (the two empty pads at the top).

Then I plugged in the power, and the LED on the XIAO did not light. I tried a computer and I tried a wall outlet, and neither worked. To see if the problem was the board or the XIAO, I plugged USB-C directly into the XIAO, without the board. It did not light either. The XIAO was dead.

This was very frustrating. Everything looked correct, and it still did not work. I do not know if the XIAO was already broken from the factory, or if I broke it while soldering. I cannot tell these apart.

Two boards side by side powered by USB-C: on the left version 1 with a lit green LED on the XIAO, on the right version 2 with an unlit XIAO
Left: version 1, where the XIAO works but the board has the short. Right: version 2, where the board is good but the XIAO is dead.

05 · Where it stands

A good board, a good MCU, and no servo movement

I found another day and milled version 2 once more. This time the milling was very good. I took the board out of the surrounding stock.

The latest version 2 board on a wooden bench with a pair of cutters beside it, after the surrounding stock was removed
The latest version 2: milled, and then taken out of the surrounding stock.

This time I used a new XIAO, and I confirmed that it works. I did not have enough time to solder every part, so I soldered only the XIAO and a pin header, and tried to connect a servo. The servo did not move, and I do not know why yet. I will look into it next week and try to get the whole path working.

The latest version 2 board with the XIAO soldered in place and a three-pin header at the bottom edge
The current state: the XIAO and one header are soldered.
The latest version 2 board with a servo plugged into its three-pin header by a cable, lying next to an MG90S servo
The latest version 2 with a servo connected. The servo did not move.
Six milled boards on a black table: three unsoldered boards in the top row, the soldered version 1 in the middle, two soldered version 2 boards at the right, and a servo connected to each of the two boards at the edges
The boards I milled this week, with the servos I tried to connect.

06 · Board house

What if a board house made it?

Milling and soldering took most of my week, so on 2026-10-21 I went through JLCPCB’s online quote for version 2, from the Gerber files to the shopping cart. I did not place an order.

Upload and assembly options

I uploaded output.zip (the Gerber and drill files from KiCad). JLCPCB detected a 2-layer board of 36.4 × 46 mm. I asked for 5 boards, green, 1.6 mm, HASL with lead, and assembly of the top side only with Standard PCBA. The number of assembled boards has to be 2 to 5, and I used 2. JLCPCB adds edge rails (the board becomes 70 × 70.4 mm), which I would break off by hand.

JLCPCB online PCB quote page with the version 2 board detected as a 2-layer 36.4 by 46 mm board, 5 boards for 4 dollars JLCPCB PCB Assembly options: Standard PCBA, assemble top side, quantity from 2 to 5, edge rails added by JLCPCB
Left: the board after uploading the Gerber files. Right: the assembly options.

BOM and part placements

I uploaded the BOM and the CPL (part positions): BOM and CPL. JLCPCB matched 4 of the 5 parts. The XIAO (M1) has no part in stock, so I would solder it myself. In the 3D view, the pin headers J1 and J2 first pointed the wrong way, and I rotated them until the pins pointed out over the board edge. The table lists the parts I matched, checked in JLCPCB’s parts library on the same day; stock changes, so I would check again before ordering.

JLCPCB bill of materials page: C1, C2, J1 and J2, and SW1 matched to LCSC parts, and M1 unmatched with no part selected JLCPCB 3D view of the board with the pin headers J1 and J2 pointing out over the board edge, the capacitor C1 and the switch SW1
Left: the BOM, with M1 unmatched. Right: the 3D view after rotating J1 and J2.
DesignatorPartLCSCJLCPCB typeStock
C1100 µF, 25 V, 6.3 × 5.8 mm SMD electrolytic. Panasonic EEEFK1E101SP instead of my EEE-FN1E101UL (C1881501, 0 in stock). Same electrical values and size.C178540Extended9,026
C210 µF, 1206 ceramic. Samsung CL31A106KBHNNNE, rated 50 V.C13585Basic2,311,199
J1, J21×3 right-angle SMD pin header, 2.54 mm. HX PZ2.54-1x3P WT. I did not check its pads against my footprint.C46061676Extended21,682
SW1Omron B3SN-3012P, 6 × 6 mm tactile switch, instead of my B3SN-3112P (C306883, 0 in stock). I did not check that the pads are the same.C306881Extended11,113
M1Seeed XIAO RP2040 module. The parts library lists it (C9900177322 and C9900176459), but both have 0 in stock. JLCPCB shows “No Part Selected” for it, so it would not be assembled and I solder it myself.C9900177322Extended0

Quote

The 2 assembled boards come out of the 5, so I would get 5 boards in total. Most of the assembly price is fixed cost: setup and stencil are $34.02 and the parts only $4.15. Shipping is almost as much as the assembly.

5 bare boards$4.00
Assembly, 2 boards$44.98 (setup $25.75, stencil $8.27, feeders loading $6.20, components $4.15, packaging $0.50, SMT assembly $0.11)
Shipping (estimated)$31.59
Coupon−$10.00
Subtotal$70.57, estimated shipping date 2026-10-25
JLCPCB quote page with the charge details: PCB 4 dollars and Standard PCBA 44.98 dollars split into setup fee, stencil, components, feeders loading fee, SMT assembly and packaging fee JLCPCB shopping cart with 5 PCBs and 2 standard PCBA, merchandise 48.98, shipping 31.59, coupon minus 10, subtotal 70.57 dollars
Left: the charge details. Right: the shopping cart.

07 · What I learned

What I will do differently

  • Test the MCU first. Plug the XIAO into USB-C on its own before soldering anything.
  • Lock the origin and dimensions in gerber2img. The traces, the drill holes and the edge cut must share them, or the holes will be shifted.
  • Check polarity before soldering. An electrolytic capacitor has a positive and a negative leg.
  • Make the pads bigger. My own XIAO footprint with longer pads, and thermal relief on the GND pads, helped. It did not make soldering easy.
  • Soldering was the biggest problem of the week. The tiny SMD resistors and capacitors were the hardest. For a more complex board, I will try ordering the board, and maybe the assembled board (PCBA), from JLCPCB, so that they solder the parts.

08

AI usage

I used Claude (Claude Code) to organize my notes into this page and to convert and resize the photos. I also used the KiCad MCP server Konnect with Claude to help me create the simplified version 2 of the board. The milling, the soldering, the debugging, and what happened and how it felt are mine.