# PCB Maker

Laser etching and milling machine based on Tenlog TL-D3 Pro FDM printer.

## What we’ve done?

Key changes:


1. Display board removed.
2. Control board flashed with Klipper.
3. First toolhead replaced with a 15W laser.
4. Second toolhead replaced with a drill spindle.
5. Entirely reworked power supply circuitry to add safety switches, E-Stop, spindle and laser control.

## Preparing PCB

We share the pretty same workflow as any other PCB fabrication house – you export Gerbers (.gbr) and Excellon (.drl) files, and voilà!

Current limitations are:

* We can’t fabricate double-sided PCBs **yet**. You’re very welcome to help us with it!
* No milling yet :(
* We consistently do 0.3mm tracks.
* Expect ±0.15mm offset on drilling.
* We use 0.6mm drill bit for all PTH/NPTH. You’ll likely need to extend holes manually after.

The following guide is about KiCad, but your CAD of choice must have pretty much all of these features.

### Boundaries & Grid Origin


1. Make sure that you defined PCB boundaries on Edge Cuts layer.
2. Place **Drill (1)** and **Grid (2)** Origins to the same point in PCB designer if not yet. Usually, it’s a left-bottom outer corner of the PCB.![](https://storage.yandexcloud.net/bksp-wiki-assets/uploads/298a2e26-87de-4753-a045-717271c8b2f5/3b8600ba-92dd-40ea-9377-ce35aafc5207/SCR-20250102-tvva.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=YCAJEMO2-DwUmfLoAY9UdwOXD%2F20260911%2Fru-central1-a%2Fs3%2Faws4_request&X-Amz-Date=20260911T130000Z&X-Amz-Expires=86400&X-Amz-Signature=7d80542974aeacc1c67ae7f88e886b431f5be9681c266f88d68d3a6c2fb7749f&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject)

### Jumpers, Vias, and Background Copper

While we don’t support fully-fledged two-layer fabrication, you still can use it for jumpers with Vias. Trick is to either:

* Cut traces on Bg.Cu manually, using PTHs as landmarks.
* Solder jumper wires between those Vias.

 ![Example of jumper trace on Bg.Cu which I've cut manually after engraving](https://storage.yandexcloud.net/bksp-wiki-assets/uploads/298a2e26-87de-4753-a045-717271c8b2f5/84e290b3-f19d-47b2-a775-8d1bf2df224d/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=YCAJEMO2-DwUmfLoAY9UdwOXD%2F20260911%2Fru-central1-a%2Fs3%2Faws4_request&X-Amz-Date=20260911T130000Z&X-Amz-Expires=86400&X-Amz-Signature=eb2c8e0ab255451777aa6f7ff604ef62a01057264ca244acf8596c8f1624bd90&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject " =733x442")

###  Exporting fabrication files

You need to export Gerbers (1) and Drill Files (2) before moving forward to FlatCAM.

 ![Go to "File" → "Fabrication Outputs"](https://storage.yandexcloud.net/bksp-wiki-assets/uploads/298a2e26-87de-4753-a045-717271c8b2f5/08cae6fe-b3a4-42bb-b5ee-d5a2d092f97e/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=YCAJEMO2-DwUmfLoAY9UdwOXD%2F20260911%2Fru-central1-a%2Fs3%2Faws4_request&X-Amz-Date=20260911T130000Z&X-Amz-Expires=86400&X-Amz-Signature=afe72ca9ac6218f4c1c30ecf47eda94465edb42c339b8333878d9dcf94778016&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject)

#### Gerber

 ![](https://storage.yandexcloud.net/bksp-wiki-assets/uploads/298a2e26-87de-4753-a045-717271c8b2f5/ea135647-27fc-432b-90c1-411470331ac2/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=YCAJEMO2-DwUmfLoAY9UdwOXD%2F20260911%2Fru-central1-a%2Fs3%2Faws4_request&X-Amz-Date=20260911T130000Z&X-Amz-Expires=86400&X-Amz-Signature=65089c0f1efc7b05e1a0c13b88ad638d6e482514a31434b7540dedd494233596&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject " =1135x674")

On Gerber Plot dialog make sure to:


1. Check F.Cu layer.
2. Check Edge.Cuts layer.
3. Check “Use drill/place” file origin.
4. Uncheck other layers.

Click “Plot” and you’re done.

#### Drill

 ![](https://storage.yandexcloud.net/bksp-wiki-assets/uploads/298a2e26-87de-4753-a045-717271c8b2f5/d39d27bc-d604-4f4b-aa27-e12c6842b12f/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=YCAJEMO2-DwUmfLoAY9UdwOXD%2F20260911%2Fru-central1-a%2Fs3%2Faws4_request&X-Amz-Date=20260911T130000Z&X-Amz-Expires=86400&X-Amz-Signature=6890199d005699626359c3188281ab93892094c01c958d381f0bc0c822312745&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject " =816x646")

On “Drill Files” dialog:


1. Select “Excellon” as Drill File Format.
2. Select “Drill/place file origin” as Drill Origin.
3. Click on “Generate Drill File”.

### Summary

You now should have four additional files in your project’s directory:

 ![](https://storage.yandexcloud.net/bksp-wiki-assets/uploads/298a2e26-87de-4753-a045-717271c8b2f5/bf792992-1de5-4576-a9d5-65a9cb1c98fa/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=YCAJEMO2-DwUmfLoAY9UdwOXD%2F20260911%2Fru-central1-a%2Fs3%2Faws4_request&X-Amz-Date=20260911T130000Z&X-Amz-Expires=86400&X-Amz-Signature=89da5bf6d90700b86c42e6ef7a16040fc90abb1011865c9f0a1882a95ae837af&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject " =365x245")


1. Gerber for Edge.Cuts layer (PCB boundaries).
2. Gerber for F.Cu layer (front copper layer).
3. Excellon (drill) for NPTH (Non Plating Through Hole).
4. Excellon for PTH (Plated Through Hole).

## FlatCAM

Now we need to convert our fabrication files into GCode for machine.

### Preparing software


1. Install latest version of FlatCAM Beta from [@jpcgt/FlatCAM](https://bitbucket.org/jpcgt/flatcam/downloads/).
2. Clone the [@b4ck5p4c3/pcb-manufacture](https://github.com/b4ck5p4c3/pcb-manufacture) repo.
3. Copy `flatcam/bksp_drill.py` and `flatcam/bksp_engrave.py` files into `lib/preprocessors` directory in your FlatCAM installation. In my case, FlatCAM ended up in Documents folder (idk why, tho 🤷).

### Importing fab files


## Known problems

### My PCB has inner cuts. How to avoid FlatCAM engraving these areas?

After inverting Gerber in FlatCAM you may find your cutout areas filled with green – meaning, they will be engraved, which is huge waste of time.

 ![Cape for BeagleBone with inner cutout for 8P8C connector.](https://storage.yandexcloud.net/bksp-wiki-assets/uploads/298a2e26-87de-4753-a045-717271c8b2f5/a84dc5f9-731f-4ae8-9b7b-81dfe549f636/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=YCAJEMO2-DwUmfLoAY9UdwOXD%2F20260911%2Fru-central1-a%2Fs3%2Faws4_request&X-Amz-Date=20260911T130000Z&X-Amz-Expires=86400&X-Amz-Signature=58046fde876bd8e553275de055f0abb3e6988efe10af5ed1c01d21cc2f266fdc&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject " =721x467")

 ![Excess engraving job generated for this cutout after inverting ](https://storage.yandexcloud.net/bksp-wiki-assets/uploads/298a2e26-87de-4753-a045-717271c8b2f5/f25a400a-4440-4608-817b-af2c10506cfb/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=YCAJEMO2-DwUmfLoAY9UdwOXD%2F20260911%2Fru-central1-a%2Fs3%2Faws4_request&X-Amz-Date=20260911T130000Z&X-Amz-Expires=86400&X-Amz-Signature=f64792b4a7c1398e2a001d9cfccf6e4f7893fa05b6dbca1debe83b935f8fb00e&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject " =1145x737")

To hint FreeCAM not to fill these areas just cover them with zones in your PCB design before exporting Gerber files:

 ![](https://storage.yandexcloud.net/bksp-wiki-assets/uploads/298a2e26-87de-4753-a045-717271c8b2f5/638ce21d-1753-4dab-9844-3113d51d75ff/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=YCAJEMO2-DwUmfLoAY9UdwOXD%2F20260911%2Fru-central1-a%2Fs3%2Faws4_request&X-Amz-Date=20260911T130000Z&X-Amz-Expires=86400&X-Amz-Signature=f489bd3b0383a47ebeea941b82942bfad2b0fe6b5058799f4007c06ddb96d777&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject " =1533x753")


1. Draw a zone using Rectangle tool on the primary copper level (usually, it’s F.Cu).
2. Adjust it to match your cutout. You may need to use multiple Rectangles for this.
3. Check **✅ Filled**, and set **Line Width** to zero for each Rectangle.

After importing your shiny new Gerbers, FlatCAM should consider those areas as “filled with Copper” and won’t fill them.

---

**Documents**

- [BKSP 101](https://wiki.bksp.in/s/public/doc/bksp-101-HvrtlzB32F)
- [Проекты](https://wiki.bksp.in/s/public/doc/proekty-yjWZscgTvo)
- [Infrastructure](https://wiki.bksp.in/s/public/doc/infrastructure-VPKsJwVSVh)
- [Пространство](https://wiki.bksp.in/s/public/doc/prostranstvo-UF1eSbQDi5)
- [Equipment](https://wiki.bksp.in/s/public/doc/equipment-t5MYAVJ8l0)
- [Other](https://wiki.bksp.in/s/public/doc/other-uPW1YJQaRt)