Add KiCad module carrier PCB draft

Introduce an editable KiCad 10 schematic and routed two-layer 82 × 80 mm
layout with local provisional footprints, validation tooling, and
component
research. Keep the RS-232 male-module mapping and mechanical clearances
explicitly provisional pending hardware verification.
This commit is contained in:
2026-09-20 23:14:01 +02:00
parent 8902b25d78
commit 60c1e279d6
58 changed files with 123932 additions and 0 deletions
+36
View File
@@ -0,0 +1,36 @@
{
"$schema": "https://schemas.kicad.org/erc.v1.json",
"coordinate_units": "mm",
"date": "2026-09-20T20:14:47",
"ignored_checks": [
{
"description": "Global label only appears once in the schematic",
"key": "single_global_label"
},
{
"description": "Four connection points are joined together",
"key": "four_way_junction"
},
{
"description": "SPICE model issue",
"key": "simulation_model_issue"
},
{
"description": "Assigned footprint doesn't match footprint filters",
"key": "footprint_filter"
}
],
"included_severities": [
"error",
"warning"
],
"kicad_version": "10.0.6",
"sheets": [
{
"path": "/",
"uuid_path": "/c86e0d56-4290-5f2b-b790-14926c8cdeea",
"violations": []
}
],
"source": "serial-carrier.kicad_sch"
}
+232
View File
@@ -0,0 +1,232 @@
{
"+3V3": [
[
"U1",
"1"
],
[
"U1",
"2"
],
[
"U2",
"1"
],
[
"DS1",
"2"
],
[
"R1",
"1"
],
[
"R2",
"1"
],
[
"R3",
"1"
]
],
"BTN_NEXT": [
[
"U1",
"20"
],
[
"R3",
"2"
],
[
"SW3",
"1"
]
],
"BTN_PREVIOUS": [
[
"U1",
"16"
],
[
"R1",
"2"
],
[
"SW1",
"1"
]
],
"BTN_SELECT": [
[
"U1",
"19"
],
[
"R2",
"2"
],
[
"SW2",
"1"
]
],
"GND": [
[
"U1",
"22"
],
[
"U1",
"23"
],
[
"U1",
"43"
],
[
"U1",
"44"
],
[
"U2",
"2"
],
[
"DS1",
"1"
],
[
"SW1",
"2"
],
[
"SW2",
"2"
],
[
"SW3",
"2"
]
],
"OLED_SCL": [
[
"U1",
"18"
],
[
"DS1",
"3"
]
],
"OLED_SDA": [
[
"U1",
"17"
],
[
"DS1",
"4"
]
],
"RS_CTS": [
[
"U1",
"9"
],
[
"U2",
"9"
]
],
"RS_DCD": [
[
"U1",
"4"
],
[
"U2",
"3"
]
],
"RS_DSR": [
[
"U1",
"5"
],
[
"U2",
"7"
]
],
"RS_DTR": [
[
"U1",
"7"
],
[
"U2",
"6"
]
],
"RS_OFF_N": [
[
"U1",
"15"
],
[
"U2",
"12"
]
],
"RS_RI": [
[
"U1",
"6"
],
[
"U2",
"10"
]
],
"RS_RTS": [
[
"U1",
"8"
],
[
"U2",
"8"
]
],
"RS_RX": [
[
"U1",
"11"
],
[
"U2",
"4"
]
],
"RS_TX": [
[
"U1",
"10"
],
[
"U2",
"5"
]
],
"RS_VALID": [
[
"U1",
"12"
],
[
"U2",
"11"
]
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 152 KiB

@@ -0,0 +1,53 @@
{
"$schema": "https://schemas.kicad.org/drc.v1.json",
"coordinate_units": "mm",
"date": "2026-09-20T23:07:29",
"ignored_checks": [
{
"description": "Footprint has no courtyard defined",
"key": "missing_courtyard"
},
{
"description": "Track endpoint not centered on via",
"key": "track_not_centered_on_via"
},
{
"description": "Tuning profile track geometries",
"key": "tuning_profile_track_geometries"
},
{
"description": "Footprint doesn't match symbol's footprint filters",
"key": "footprint_filters_mismatch"
},
{
"description": "Footprint component type doesn't match footprint pads",
"key": "footprint_type_mismatch"
}
],
"included_severities": [
"error",
"warning",
"exclusion"
],
"kicad_version": "10.0.6",
"schematic_parity": [
{
"description": "Carrier:MAX3243_Reference_Provisional stimmt nicht mit dem Footprint des Symbols () überein.",
"items": [
{
"description": "Footprint U2",
"pos": {
"x": 143.0,
"y": 130.0
},
"uuid": "812387f6-6524-459e-8102-fe9c55122668"
}
],
"severity": "warning",
"type": "footprint_symbol_mismatch"
}
],
"source": "serial-carrier.kicad_pcb",
"unconnected_items": [],
"violations": []
}
@@ -0,0 +1,37 @@
{
"$schema": "https://schemas.kicad.org/drc.v1.json",
"coordinate_units": "mm",
"date": "2026-09-20T22:50:33",
"ignored_checks": [
{
"description": "Footprint has no courtyard defined",
"key": "missing_courtyard"
},
{
"description": "Track endpoint not centered on via",
"key": "track_not_centered_on_via"
},
{
"description": "Tuning profile track geometries",
"key": "tuning_profile_track_geometries"
},
{
"description": "Footprint doesn't match symbol's footprint filters",
"key": "footprint_filters_mismatch"
},
{
"description": "Footprint component type doesn't match footprint pads",
"key": "footprint_type_mismatch"
}
],
"included_severities": [
"error",
"warning",
"exclusion"
],
"kicad_version": "10.0.6",
"schematic_parity": [],
"source": "serial-carrier.kicad_pcb",
"unconnected_items": [],
"violations": []
}
@@ -0,0 +1,911 @@
{
"$schema": "https://schemas.kicad.org/drc.v1.json",
"coordinate_units": "mm",
"date": "2026-09-20T22:39:18",
"ignored_checks": [
{
"description": "Footprint has no courtyard defined",
"key": "missing_courtyard"
},
{
"description": "Track endpoint not centered on via",
"key": "track_not_centered_on_via"
},
{
"description": "Tuning profile track geometries",
"key": "tuning_profile_track_geometries"
},
{
"description": "Footprint doesn't match symbol's footprint filters",
"key": "footprint_filters_mismatch"
},
{
"description": "Footprint component type doesn't match footprint pads",
"key": "footprint_type_mismatch"
}
],
"included_severities": [
"error",
"warning"
],
"kicad_version": "10.0.6",
"schematic_parity": [],
"source": "serial-carrier.kicad_pcb",
"unconnected_items": [
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 19 [/BTN_SELECT] von U1",
"pos": {
"x": 108.0,
"y": 149.72
},
"uuid": "f7b9badd-1db5-4575-9da8-979a7c8f3946"
},
{
"description": "Durchsteckpad 1 [/BTN_SELECT] von SW2",
"pos": {
"x": 155.0,
"y": 168.0
},
"uuid": "574d93e4-d3fc-4c28-b2d5-4e7d8682c22f"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 1 [/BTN_SELECT] von SW2",
"pos": {
"x": 155.0,
"y": 168.0
},
"uuid": "574d93e4-d3fc-4c28-b2d5-4e7d8682c22f"
},
{
"description": "Durchsteckpad 1 [/BTN_SELECT] von SW2",
"pos": {
"x": 161.5,
"y": 168.0
},
"uuid": "0398530b-79dc-45b1-886c-51343182e1d3"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 1 [/BTN_SELECT] von SW2",
"pos": {
"x": 161.5,
"y": 168.0
},
"uuid": "0398530b-79dc-45b1-886c-51343182e1d3"
},
{
"description": "Durchsteckpad 2 [/BTN_SELECT] von R2",
"pos": {
"x": 161.62,
"y": 134.0
},
"uuid": "c118f27f-8ad4-4abe-b9c0-a30a22fe60c9"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 22 [/GND] von U1",
"pos": {
"x": 108.0,
"y": 157.34
},
"uuid": "9d509ec2-7588-4c77-9146-8d03c8646e37"
},
{
"description": "Durchsteckpad 44 [/GND] von U1",
"pos": {
"x": 133.4,
"y": 157.34
},
"uuid": "91b9e8e9-7e2c-43ab-b2ef-ec8ba16a25f1"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 23 [/GND] von U1",
"pos": {
"x": 133.4,
"y": 104.0
},
"uuid": "b66490f6-5d60-415d-babb-215c70511b77"
},
{
"description": "Durchsteckpad 2 [/GND] von U2",
"pos": {
"x": 145.54,
"y": 130.0
},
"uuid": "7744910d-b37b-4fd5-a46a-95ee262d2a08"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 43 [/GND] von U1",
"pos": {
"x": 133.4,
"y": 154.8
},
"uuid": "23b353d7-7ede-43a0-a655-57496d4f8aee"
},
{
"description": "Durchsteckpad 1 [/GND] von DS1",
"pos": {
"x": 152.19,
"y": 137.5
},
"uuid": "0d95ad6d-f278-4240-9618-08ad8fcb5e1c"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 44 [/GND] von U1",
"pos": {
"x": 133.4,
"y": 157.34
},
"uuid": "91b9e8e9-7e2c-43ab-b2ef-ec8ba16a25f1"
},
{
"description": "Durchsteckpad 43 [/GND] von U1",
"pos": {
"x": 133.4,
"y": 154.8
},
"uuid": "23b353d7-7ede-43a0-a655-57496d4f8aee"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 2 [/GND] von SW1",
"pos": {
"x": 143.0,
"y": 172.5
},
"uuid": "cc9a376c-9410-4f75-a7a6-3a849cc384b3"
},
{
"description": "Durchsteckpad 2 [/GND] von SW1",
"pos": {
"x": 149.5,
"y": 172.5
},
"uuid": "24c82a41-4f9f-4c94-aaaf-2a3df71bbd08"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 2 [/GND] von SW1",
"pos": {
"x": 143.0,
"y": 172.5
},
"uuid": "cc9a376c-9410-4f75-a7a6-3a849cc384b3"
},
{
"description": "Durchsteckpad 44 [/GND] von U1",
"pos": {
"x": 133.4,
"y": 157.34
},
"uuid": "91b9e8e9-7e2c-43ab-b2ef-ec8ba16a25f1"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 2 [/GND] von SW1",
"pos": {
"x": 149.5,
"y": 172.5
},
"uuid": "24c82a41-4f9f-4c94-aaaf-2a3df71bbd08"
},
{
"description": "Durchsteckpad 2 [/GND] von SW2",
"pos": {
"x": 155.0,
"y": 172.5
},
"uuid": "970e56ae-cc93-46cd-8807-ccc9cf082aa1"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 1 [/GND] von DS1",
"pos": {
"x": 152.19,
"y": 137.5
},
"uuid": "0d95ad6d-f278-4240-9618-08ad8fcb5e1c"
},
{
"description": "Durchsteckpad 2 [/GND] von U2",
"pos": {
"x": 145.54,
"y": 130.0
},
"uuid": "7744910d-b37b-4fd5-a46a-95ee262d2a08"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 2 [/GND] von SW2",
"pos": {
"x": 155.0,
"y": 172.5
},
"uuid": "970e56ae-cc93-46cd-8807-ccc9cf082aa1"
},
{
"description": "Durchsteckpad 2 [/GND] von SW2",
"pos": {
"x": 161.5,
"y": 172.5
},
"uuid": "2f44f580-c7e4-4f03-ba46-49605735875c"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 2 [/GND] von SW2",
"pos": {
"x": 161.5,
"y": 172.5
},
"uuid": "2f44f580-c7e4-4f03-ba46-49605735875c"
},
{
"description": "Durchsteckpad 2 [/GND] von SW3",
"pos": {
"x": 167.0,
"y": 172.5
},
"uuid": "3cdbd911-6e07-4f86-8887-5953fa3d2a01"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 2 [/GND] von SW3",
"pos": {
"x": 167.0,
"y": 172.5
},
"uuid": "3cdbd911-6e07-4f86-8887-5953fa3d2a01"
},
{
"description": "Durchsteckpad 2 [/GND] von SW3",
"pos": {
"x": 173.5,
"y": 172.5
},
"uuid": "8e780381-cbfb-4f62-ae3b-8b0b8fa2a6a8"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 1 [/+3V3] von U1",
"pos": {
"x": 108.0,
"y": 104.0
},
"uuid": "9aaad355-039f-439b-9cd7-308d07ace02e"
},
{
"description": "Durchsteckpad 2 [/+3V3] von U1",
"pos": {
"x": 108.0,
"y": 106.54
},
"uuid": "2c8cc7c5-7b73-4bc2-a384-b3a5ac459c92"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 1 [/+3V3] von U2",
"pos": {
"x": 143.0,
"y": 130.0
},
"uuid": "f8aafd85-e635-47cd-ba22-ddf4a036d1cd"
},
{
"description": "Durchsteckpad 1 [/+3V3] von R1",
"pos": {
"x": 143.0,
"y": 134.0
},
"uuid": "56ff90bc-b894-4f81-8274-7a34384229e7"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 1 [/+3V3] von U2",
"pos": {
"x": 143.0,
"y": 130.0
},
"uuid": "f8aafd85-e635-47cd-ba22-ddf4a036d1cd"
},
{
"description": "Durchsteckpad 2 [/+3V3] von U1",
"pos": {
"x": 108.0,
"y": 106.54
},
"uuid": "2c8cc7c5-7b73-4bc2-a384-b3a5ac459c92"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 1 [/+3V3] von R2",
"pos": {
"x": 154.0,
"y": 134.0
},
"uuid": "73a249ed-c3b1-46fb-afd5-f8bfe0e3fa65"
},
{
"description": "Durchsteckpad 1 [/+3V3] von R1",
"pos": {
"x": 143.0,
"y": 134.0
},
"uuid": "56ff90bc-b894-4f81-8274-7a34384229e7"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 2 [/+3V3] von DS1",
"pos": {
"x": 154.73,
"y": 137.5
},
"uuid": "62a98206-7a36-4b20-a201-d4ca10b404df"
},
{
"description": "Durchsteckpad 1 [/+3V3] von R2",
"pos": {
"x": 154.0,
"y": 134.0
},
"uuid": "73a249ed-c3b1-46fb-afd5-f8bfe0e3fa65"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 2 [/+3V3] von DS1",
"pos": {
"x": 154.73,
"y": 137.5
},
"uuid": "62a98206-7a36-4b20-a201-d4ca10b404df"
},
{
"description": "Durchsteckpad 1 [/+3V3] von R3",
"pos": {
"x": 165.0,
"y": 134.0
},
"uuid": "72b8a1ea-1fa7-480b-8122-aceb08f4bb4b"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 4 [/RS_DCD] von U1",
"pos": {
"x": 108.0,
"y": 111.62
},
"uuid": "d9f0d2af-a701-43e9-9d1e-58a6c7cb5250"
},
{
"description": "Durchsteckpad 3 [/RS_DCD] von U2",
"pos": {
"x": 148.08,
"y": 130.0
},
"uuid": "d589a6a4-0d53-4c2a-8f68-fb4407d9f10e"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 5 [/RS_DSR] von U1",
"pos": {
"x": 108.0,
"y": 114.16
},
"uuid": "0ceca603-53a8-4a53-85cc-f7f8e7be90e4"
},
{
"description": "Durchsteckpad 7 [/RS_DSR] von U2",
"pos": {
"x": 158.24,
"y": 130.0
},
"uuid": "e2d6b2cb-6025-490c-8371-d7cc34ac37f6"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 6 [/RS_RI] von U1",
"pos": {
"x": 108.0,
"y": 116.7
},
"uuid": "f35f1696-b778-437b-8cce-67b8c4d5f5d0"
},
{
"description": "Durchsteckpad 10 [/RS_RI] von U2",
"pos": {
"x": 165.86,
"y": 130.0
},
"uuid": "e28de6f2-fb85-4849-ba1a-e98e2a231492"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 7 [/RS_DTR] von U1",
"pos": {
"x": 108.0,
"y": 119.24
},
"uuid": "354ab122-85b1-4c9c-9385-d5091fe12303"
},
{
"description": "Durchsteckpad 6 [/RS_DTR] von U2",
"pos": {
"x": 155.7,
"y": 130.0
},
"uuid": "81e8ad67-4bdc-4f57-90b1-68cff6a95261"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 8 [/RS_RTS] von U1",
"pos": {
"x": 108.0,
"y": 121.78
},
"uuid": "55162730-46fd-465d-a1c5-20aed09ed534"
},
{
"description": "Durchsteckpad 8 [/RS_RTS] von U2",
"pos": {
"x": 160.78,
"y": 130.0
},
"uuid": "5c304724-2bc6-409d-9c59-2e40adc557b9"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 9 [/RS_CTS] von U1",
"pos": {
"x": 108.0,
"y": 124.32
},
"uuid": "f75c20f8-d3b5-4c3b-9919-cb044b2da5c3"
},
{
"description": "Durchsteckpad 9 [/RS_CTS] von U2",
"pos": {
"x": 163.32,
"y": 130.0
},
"uuid": "a8411036-6859-4041-84b8-2c80c326c58e"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 10 [/RS_TX] von U1",
"pos": {
"x": 108.0,
"y": 126.86
},
"uuid": "22c323db-7146-44af-951b-04a1d7dbb2fe"
},
{
"description": "Durchsteckpad 5 [/RS_TX] von U2",
"pos": {
"x": 153.16,
"y": 130.0
},
"uuid": "f919098b-4ad7-4600-9e8b-3375a1cff050"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 11 [/RS_RX] von U1",
"pos": {
"x": 108.0,
"y": 129.4
},
"uuid": "6573852d-5714-4c8d-8793-0be87f5a052a"
},
{
"description": "Durchsteckpad 4 [/RS_RX] von U2",
"pos": {
"x": 150.62,
"y": 130.0
},
"uuid": "3d90cce4-14d8-46a0-b560-09524f11698f"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 12 [/RS_VALID] von U1",
"pos": {
"x": 108.0,
"y": 131.94
},
"uuid": "2fbc596b-c88f-4fc6-aa94-5dad4fcac9cc"
},
{
"description": "Durchsteckpad 11 [/RS_VALID] von U2",
"pos": {
"x": 168.4,
"y": 130.0
},
"uuid": "9ad42f44-160f-4aa5-bcf0-a4466c090438"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 15 [/RS_OFF_N] von U1",
"pos": {
"x": 108.0,
"y": 139.56
},
"uuid": "34e1afe9-b3fc-4d3a-9e33-38b32244f19e"
},
{
"description": "Durchsteckpad 12 [/RS_OFF_N] von U2",
"pos": {
"x": 170.94,
"y": 130.0
},
"uuid": "a43ba2f2-477d-4850-87de-e1591119d5ae"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 1 [/BTN_PREVIOUS] von SW1",
"pos": {
"x": 143.0,
"y": 168.0
},
"uuid": "5214c011-545b-4ae7-9cdb-852ade815805"
},
{
"description": "Durchsteckpad 1 [/BTN_PREVIOUS] von SW1",
"pos": {
"x": 149.5,
"y": 168.0
},
"uuid": "84202d30-b2fe-4170-8146-69b68d3b82a1"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 1 [/BTN_PREVIOUS] von SW1",
"pos": {
"x": 149.5,
"y": 168.0
},
"uuid": "84202d30-b2fe-4170-8146-69b68d3b82a1"
},
{
"description": "Durchsteckpad 2 [/BTN_PREVIOUS] von R1",
"pos": {
"x": 150.62,
"y": 134.0
},
"uuid": "8237f507-f5c7-4eb6-9aa1-f46af2981e7c"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 2 [/BTN_PREVIOUS] von R1",
"pos": {
"x": 150.62,
"y": 134.0
},
"uuid": "8237f507-f5c7-4eb6-9aa1-f46af2981e7c"
},
{
"description": "Durchsteckpad 16 [/BTN_PREVIOUS] von U1",
"pos": {
"x": 108.0,
"y": 142.1
},
"uuid": "fc705960-92fa-4d8f-bb0e-ce2b82d1e7fc"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 17 [/OLED_SDA] von U1",
"pos": {
"x": 108.0,
"y": 144.64
},
"uuid": "1f91549c-5cb2-465f-86df-b2f1b0c16ed8"
},
{
"description": "Durchsteckpad 4 [/OLED_SDA] von DS1",
"pos": {
"x": 159.81,
"y": 137.5
},
"uuid": "91a4dcef-1b36-4e3d-a15c-c4578077c27b"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 18 [/OLED_SCL] von U1",
"pos": {
"x": 108.0,
"y": 147.18
},
"uuid": "1c55fd03-0b3e-494f-a37b-6e0b3496cfc9"
},
{
"description": "Durchsteckpad 3 [/OLED_SCL] von DS1",
"pos": {
"x": 157.27,
"y": 137.5
},
"uuid": "704668d0-88bf-4b51-840a-60a35804fafd"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 20 [/BTN_NEXT] von U1",
"pos": {
"x": 108.0,
"y": 152.26
},
"uuid": "e7159c90-4e8d-4b21-8e84-a7f59f793440"
},
{
"description": "Durchsteckpad 1 [/BTN_NEXT] von SW3",
"pos": {
"x": 167.0,
"y": 168.0
},
"uuid": "c67d0b07-c47f-48b3-9e79-7aed82edbbfc"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 1 [/BTN_NEXT] von SW3",
"pos": {
"x": 167.0,
"y": 168.0
},
"uuid": "c67d0b07-c47f-48b3-9e79-7aed82edbbfc"
},
{
"description": "Durchsteckpad 1 [/BTN_NEXT] von SW3",
"pos": {
"x": 173.5,
"y": 168.0
},
"uuid": "62f3da3b-8297-4232-92ee-88f3ce4a7d36"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 1 [/BTN_NEXT] von SW3",
"pos": {
"x": 173.5,
"y": 168.0
},
"uuid": "62f3da3b-8297-4232-92ee-88f3ce4a7d36"
},
{
"description": "Durchsteckpad 2 [/BTN_NEXT] von R3",
"pos": {
"x": 172.62,
"y": 134.0
},
"uuid": "9e9dfe49-4b68-472b-a86c-bfcee913a81b"
}
],
"severity": "error",
"type": "unconnected_items"
}
],
"violations": []
}
@@ -0,0 +1,85 @@
{
"immutable_geometry_nets_pads_linkage_preserved": true,
"board_sha256": "03b69c4084dba328b11e2373c219e8fe462bcb3add934cf9f527214b21bd9cb6",
"independent_min_different_net_or_npth_clearance_mm": 0.2749999999999886,
"closest_items": [
"R2.2:c118f27f-8ad4-4abe-b9c0-a30a22fe60c9",
"99fb402a-445b-4eba-aedf-76b7f0cad042"
],
"min_copper_or_npth_edge_gap_mm": 0.5250000000000057,
"min_rf_gap_mm": 0.025000000000005684,
"min_via_to_other_drilled_hole_gap_mm": 0.8401754250991242,
"track_width_counts": {
"0.25": 425,
"0.5": 144
},
"routed_length_mm_by_net": {
"/BTN_SELECT": 95.16152954766495,
"/GND": 152.2615364335217,
"/+3V3": 106.94219089103528,
"/RS_DCD": 47.76152984055992,
"/RS_DSR": 56.835284377834164,
"/RS_RI": 66.02000635033798,
"/RS_DTR": 52.162796381301995,
"/RS_RTS": 56.23655121147421,
"/RS_CTS": 58.073809511675655,
"/RS_TX": 47.51030692030297,
"/RS_RX": 43.90406233625865,
"/RS_VALID": 64.36573922778403,
"/RS_OFF_N": 67.05000417516253,
"/BTN_PREVIOUS": 86.95076506672746,
"/OLED_SDA": 54.781626385188304,
"/OLED_SCL": 53.30787155502609,
"/BTN_NEXT": 106.4266552277327
},
"tracks": 569,
"vias": 20,
"copper_zones": 0,
"drc_freshly_run": true,
"drc_violations": 0,
"unconnected_items": 0,
"drc_ignored_checks": [
{
"description": "Footprint has no courtyard defined",
"key": "missing_courtyard"
},
{
"description": "Track endpoint not centered on via",
"key": "track_not_centered_on_via"
},
{
"description": "Tuning profile track geometries",
"key": "tuning_profile_track_geometries"
},
{
"description": "Footprint doesn't match symbol's footprint filters",
"key": "footprint_filters_mismatch"
},
{
"description": "Footprint component type doesn't match footprint pads",
"key": "footprint_type_mismatch"
}
],
"overwrite_guard_tests": [
{
"args": [
"--route"
],
"exit_code": 2,
"reason": "route_pcb_draft.py: error: --route requires --overwrite; back up manual routing first"
},
{
"args": [
"--route",
"--overwrite"
],
"exit_code": 2,
"reason": "route_pcb_draft.py: error: existing routing protected; --replace-routes required even for preview"
},
{
"args": [],
"exit_code": 2,
"reason": "route_pcb_draft.py: error: existing routing protected; --replace-routes required even for preview"
}
]
}
@@ -0,0 +1,122 @@
#!/usr/bin/python3
"""Read-only draft audit; needs pcbnew, numpy, shapely and kicad-cli.
Writes fresh DRC and audit JSON reports, never modifies the board.
Independent continuous centreline/radius checks complement KiCad DRC. Restricted
here to the existing circle/axis-aligned rectangular THT pads and straight tracks.
"""
from collections import Counter
import hashlib
import importlib.util
import json
from pathlib import Path
import subprocess
import pcbnew as p
from shapely.geometry import Point, LineString, Polygon, box
ROOT = Path(__file__).resolve().parent.parent
spec = importlib.util.spec_from_file_location('router', ROOT / 'route_pcb_draft.py')
r = importlib.util.module_from_spec(spec)
spec.loader.exec_module(r)
board = p.LoadBoard(str(r.PCB))
original = p.LoadBoard(str(ROOT / 'validation/pcb-routing-input.kicad_pcb'))
assert r.identity(board) == r.identity(original), 'immutable source geometry/linkage changed'
items, holes = [], []
for f in board.GetFootprints():
for pad in f.Pads():
xy = r.pos(pad)
assert pad.GetOrientationDegrees() % 90 == 0
assert pad.GetShape() in (p.PAD_SHAPE_CIRCLE, p.PAD_SHAPE_RECT)
if pad.GetShape() == p.PAD_SHAPE_CIRCLE:
assert pad.GetSize().x == pad.GetSize().y
geom, radius = Point(xy), p.ToMM(pad.GetSize().x) / 2
else:
bb = pad.GetBoundingBox()
geom = box(p.ToMM(bb.GetX()), p.ToMM(bb.GetY()),
p.ToMM(bb.GetRight()), p.ToMM(bb.GetBottom()))
radius = 0
label = f.GetReference() + '.' + pad.GetNumber() + ':' + pad.m_Uuid.AsString()
layers = {l for l in r.LAYERS if pad.IsOnLayer(l)}
items.append((label, pad.GetNetCode(), layers, geom, radius))
if pad.GetDrillSize().x:
assert pad.GetDrillSize().x == pad.GetDrillSize().y
holes.append((label, Point(xy), p.ToMM(pad.GetDrillSize().x) / 2, False))
track_lengths = Counter()
widths = Counter()
for t in board.GetTracks():
is_via = isinstance(t, p.PCB_VIA)
if is_via:
geom, radius, layers = Point(r.pos(t)), p.ToMM(t.GetWidth(p.F_Cu)) / 2, set(r.LAYERS)
assert abs(radius - 0.35) < 1e-8 and t.GetDrillValue() == r.mm(0.3)
holes.append((t.m_Uuid.AsString(), geom, 0.15, True))
else:
geom = LineString([(p.ToMM(t.GetStart().x), p.ToMM(t.GetStart().y)),
(p.ToMM(t.GetEnd().x), p.ToMM(t.GetEnd().y))])
radius, layers = p.ToMM(t.GetWidth()) / 2, {t.GetLayer()}
expected = 0.5 if t.GetNetname() in ('/+3V3', '/GND') else 0.25
assert abs(2 * radius - expected) < 1e-8
widths[str(2 * radius)] += 1
track_lengths[t.GetNetname()] += geom.length
items.append((t.m_Uuid.AsString(), t.GetNetCode(), layers, geom, radius))
min_clearance = float('inf')
closest = None
for i, a in enumerate(items):
for b in items[i + 1:]:
if not a[2].intersection(b[2]) or (a[1] and a[1] == b[1]):
continue
distance = a[3].distance(b[3]) - a[4] - b[4]
if distance < min_clearance:
min_clearance, closest = distance, (a[0], b[0])
assert min_clearance >= 0.25 - 1e-6, (min_clearance, closest)
outline = Polygon([(100,100),(182,100),(182,180),(136,180),(136,161),(100,161)])
rf = box(110, 100, 131, 113)
min_edge, min_rf = float('inf'), float('inf')
for label, net, layers, geom, radius in items:
assert outline.covers(geom), label
edge_gap = outline.boundary.distance(geom) - radius
rf_gap = rf.distance(geom) - radius
min_edge, min_rf = min(min_edge, edge_gap), min(min_rf, rf_gap)
assert edge_gap >= 0.5 - 1e-6, (label, edge_gap)
assert rf_gap > 0, (label, rf_gap)
min_via_hole_gap = float('inf')
for i, a in enumerate(holes):
for b in holes[i + 1:]:
if not (a[3] or b[3]):
continue
gap = a[1].distance(b[1]) - a[2] - b[2]
min_via_hole_gap = min(min_via_hole_gap, gap)
assert gap >= 0.25 - 1e-6, (a[0], b[0], gap)
# Refusal paths must leave the routed board byte-for-byte unchanged.
before = r.PCB.read_bytes()
guards = []
for args in (['--route'], ['--route', '--overwrite'], []):
result = subprocess.run(['/usr/bin/python3', '-B', str(ROOT/'route_pcb_draft.py'), *args],
capture_output=True, text=True, timeout=20)
assert result.returncode == 2, (args, result.stdout, result.stderr)
assert r.PCB.read_bytes() == before
guards.append({'args': args, 'exit_code': result.returncode,
'reason': result.stderr.splitlines()[-1]})
subprocess.run(['kicad-cli', 'pcb', 'drc', '--format', 'json', '--all-track-errors',
'--severity-all', '--exit-code-violations', '-o',
str(ROOT/'validation/pcb-routing-drc.json'), str(r.PCB)],
check=True, timeout=60)
assert r.PCB.read_bytes() == before, 'board changed during audit'
drc = json.loads(ROOT.joinpath('validation/pcb-routing-drc.json').read_text())
assert not drc['violations'] and not drc['unconnected_items']
report = dict(immutable_geometry_nets_pads_linkage_preserved=True,
board_sha256=hashlib.sha256(before).hexdigest(),
independent_min_different_net_or_npth_clearance_mm=min_clearance,
closest_items=closest, min_copper_or_npth_edge_gap_mm=min_edge,
min_rf_gap_mm=min_rf, min_via_to_other_drilled_hole_gap_mm=min_via_hole_gap,
track_width_counts=widths, routed_length_mm_by_net=track_lengths,
tracks=sum(not isinstance(t,p.PCB_VIA) for t in board.GetTracks()),
vias=sum(isinstance(t,p.PCB_VIA) for t in board.GetTracks()),
copper_zones=sum(not z.GetIsRuleArea() for z in board.Zones()),
drc_freshly_run=True,
drc_violations=len(drc['violations']), unconnected_items=len(drc['unconnected_items']),
drc_ignored_checks=drc['ignored_checks'], overwrite_guard_tests=guards)
ROOT.joinpath('validation/pcb-routing-check.json').write_text(json.dumps(report, indent=2)+'\n')
print(json.dumps(report, indent=2))
@@ -0,0 +1,37 @@
{
"$schema": "https://schemas.kicad.org/drc.v1.json",
"coordinate_units": "mm",
"date": "2026-09-20T23:07:33",
"ignored_checks": [
{
"description": "Footprint has no courtyard defined",
"key": "missing_courtyard"
},
{
"description": "Track endpoint not centered on via",
"key": "track_not_centered_on_via"
},
{
"description": "Tuning profile track geometries",
"key": "tuning_profile_track_geometries"
},
{
"description": "Footprint doesn't match symbol's footprint filters",
"key": "footprint_filters_mismatch"
},
{
"description": "Footprint component type doesn't match footprint pads",
"key": "footprint_type_mismatch"
}
],
"included_severities": [
"error",
"warning",
"exclusion"
],
"kicad_version": "10.0.6",
"schematic_parity": [],
"source": "serial-carrier.kicad_pcb",
"unconnected_items": [],
"violations": []
}
@@ -0,0 +1,58 @@
/builddir/build/BUILD/kicad-10.0.6-build/kicad-10.0.6/include/properties/property.h(607): assert "m_choices.GetCount() > 0" failed in PROPERTY_ENUM(): No enum choices defined
/builddir/build/BUILD/kicad-10.0.6-build/kicad-10.0.6/include/properties/property.h(607): assert "m_choices.GetCount() > 0" failed in PROPERTY_ENUM(): No enum choices defined
/builddir/build/BUILD/kicad-10.0.6-build/kicad-10.0.6/include/properties/property.h(607): assert "m_choices.GetCount() > 0" failed in PROPERTY_ENUM(): No enum choices defined
{"net": "/+3V3", "start": "U1.1", "end": "U1.2", "start_mm": [108.0, 104.0], "end_mm": [108.0, 106.54], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 52}
{"net": "/+3V3", "start": "R2.1", "end": "DS1.2", "start_mm": [154.0, 134.0], "end_mm": [154.73, 137.5], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 911}
{"net": "/+3V3", "start": "U2.1", "end": "R1.1", "start_mm": [143.0, 130.0], "end_mm": [143.0, 134.0], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 81}
{"net": "/BTN_NEXT", "start": "SW3.1", "end": "SW3.1", "start_mm": [167.0, 168.0], "end_mm": [173.5, 168.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 131}
{"net": "/BTN_PREVIOUS", "start": "SW1.1", "end": "SW1.1", "start_mm": [149.5, 168.0], "end_mm": [143.0, 168.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 131}
{"net": "/BTN_SELECT", "start": "SW2.1", "end": "SW2.1", "start_mm": [155.0, 168.0], "end_mm": [161.5, 168.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 131}
{"net": "/+3V3", "start": "DS1.2", "end": "R3.1", "start_mm": [154.73, 137.5], "end_mm": [165.0, 134.0], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 5139}
{"net": "/+3V3", "start": "R1.1", "end": "R2.1", "start_mm": [143.0, 134.0], "end_mm": [154.0, 134.0], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 14153}
{"net": "/BTN_SELECT", "start": "SW2.1", "end": "R2.2", "start_mm": [161.5, 168.0], "end_mm": [161.62, 134.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 2039}
{"net": "/BTN_NEXT", "start": "SW3.1", "end": "R3.2", "start_mm": [173.5, 168.0], "end_mm": [172.62, 134.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 12615}
{"net": "/BTN_PREVIOUS", "start": "R1.2", "end": "SW1.1", "start_mm": [150.62, 134.0], "end_mm": [149.5, 168.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 15179}
{"net": "/+3V3", "start": "U1.2", "end": "U2.1", "start_mm": [108.0, 106.54], "end_mm": [143.0, 130.0], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 894511}
{"net": "/RS_RX", "start": "U1.11", "end": "U2.4", "start_mm": [108.0, 129.4], "end_mm": [150.62, 130.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 51516}
{"net": "/BTN_PREVIOUS", "start": "U1.16", "end": "R1.2", "start_mm": [108.0, 142.1], "end_mm": [150.62, 134.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 94479}
{"net": "/RS_DCD", "start": "U1.4", "end": "U2.3", "start_mm": [108.0, 111.62], "end_mm": [148.08, 130.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 266031}
{"net": "/RS_TX", "start": "U1.10", "end": "U2.5", "start_mm": [108.0, 126.86], "end_mm": [153.16, 130.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 175689}
{"net": "/RS_DTR", "start": "U1.7", "end": "U2.6", "start_mm": [108.0, 119.24], "end_mm": [155.7, 130.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 326823}
{"net": "/OLED_SCL", "start": "U1.18", "end": "DS1.3", "start_mm": [108.0, 147.18], "end_mm": [157.27, 137.5], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 82557}
{"net": "/BTN_SELECT", "start": "SW2.1", "end": "U1.19", "start_mm": [155.0, 168.0], "end_mm": [108.0, 149.72], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 147997}
{"net": "/OLED_SDA", "start": "U1.17", "end": "DS1.4", "start_mm": [108.0, 144.64], "end_mm": [159.81, 137.5], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 266428}
{"net": "/RS_DSR", "start": "U1.5", "end": "U2.7", "start_mm": [108.0, 114.16], "end_mm": [158.24, 130.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 372014}
{"net": "/RS_RTS", "start": "U1.8", "end": "U2.8", "start_mm": [108.0, 121.78], "end_mm": [160.78, 130.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 298514}
{"net": "/RS_CTS", "start": "U1.9", "end": "U2.9", "start_mm": [108.0, 124.32], "end_mm": [163.32, 130.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 265272}
{"net": "/RS_RI", "start": "U1.6", "end": "U2.10", "start_mm": [108.0, 116.7], "end_mm": [165.86, 130.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 332506}
{"net": "/RS_VALID", "start": "U1.12", "end": "U2.11", "start_mm": [108.0, 131.94], "end_mm": [168.4, 130.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 348384}
{"net": "/BTN_NEXT", "start": "U1.20", "end": "SW3.1", "start_mm": [108.0, 152.26], "end_mm": [167.0, 168.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 272795}
{"net": "/RS_OFF_N", "start": "U1.15", "end": "U2.12", "start_mm": [108.0, 139.56], "end_mm": [170.94, 130.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 351630}
{"net": "/GND", "start": "U1.44", "end": "U1.43", "start_mm": [133.4, 157.34], "end_mm": [133.4, 154.8], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 52}
{"net": "/GND", "start": "SW2.2", "end": "SW1.2", "start_mm": [155.0, 172.5], "end_mm": [149.5, 172.5], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 111}
{"net": "/GND", "start": "SW2.2", "end": "SW3.2", "start_mm": [161.5, 172.5], "end_mm": [167.0, 172.5], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 111}
{"net": "/GND", "start": "SW2.2", "end": "SW2.2", "start_mm": [155.0, 172.5], "end_mm": [161.5, 172.5], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 131}
{"net": "/GND", "start": "SW3.2", "end": "SW3.2", "start_mm": [167.0, 172.5], "end_mm": [173.5, 172.5], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 131}
{"net": "/GND", "start": "SW1.2", "end": "SW1.2", "start_mm": [149.5, 172.5], "end_mm": [143.0, 172.5], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 131}
{"net": "/GND", "start": "DS1.1", "end": "U2.2", "start_mm": [152.19, 137.5], "end_mm": [145.54, 130.0], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 17468}
{"net": "/GND", "start": "SW1.2", "end": "U1.44", "start_mm": [143.0, 172.5], "end_mm": [133.4, 157.34], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 27488}
{"net": "/GND", "start": "U1.44", "end": "U1.22", "start_mm": [133.4, 157.34], "end_mm": [108.0, 157.34], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 73753}
{"net": "/GND", "start": "U1.43", "end": "DS1.1", "start_mm": [133.4, 154.8], "end_mm": [152.19, 137.5], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 54021}
{"net": "/GND", "start": "U2.2", "end": "U1.23", "start_mm": [145.54, 130.0], "end_mm": [133.4, 104.0], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 98250}
{
"draft_only": true,
"saved": false,
"grid_mm": 0.05,
"clearance_mm": 0.25,
"safety_margin_mm": 0.02,
"via_diameter_mm": 0.7,
"via_drill_mm": 0.3,
"elapsed_seconds": 27.992941715005145,
"routed_tree_edges": 38,
"total_tree_edges": 38,
"tracks": 569,
"vias": 20,
"immutable_identity_sha256": "81def52e6c1d574b4d3ab1a5859a5266b893df0ea6c5b9aa7d7b688cc4a98519",
"input_sha256": "bf94b6c9b00c43a97f933054758a2c9d6541981ae09f2f285dcdb567bd73d9b1",
"validation": "KiCad DRC must be run separately; tree-edge counts are not DRC connectivity"
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,244 @@
{
"$schema": "https://schemas.kicad.org/drc.v1.json",
"coordinate_units": "mm",
"date": "2026-09-20T22:43:07",
"ignored_checks": [
{
"description": "Footprint has no courtyard defined",
"key": "missing_courtyard"
},
{
"description": "Track endpoint not centered on via",
"key": "track_not_centered_on_via"
},
{
"description": "Tuning profile track geometries",
"key": "tuning_profile_track_geometries"
},
{
"description": "Footprint doesn't match symbol's footprint filters",
"key": "footprint_filters_mismatch"
},
{
"description": "Footprint component type doesn't match footprint pads",
"key": "footprint_type_mismatch"
}
],
"included_severities": [
"error",
"warning"
],
"kicad_version": "10.0.6",
"schematic_parity": [],
"source": "serial-carrier.kicad_pcb",
"unconnected_items": [
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 5 [/RS_DSR] von U1",
"pos": {
"x": 108.0,
"y": 114.16
},
"uuid": "0ceca603-53a8-4a53-85cc-f7f8e7be90e4"
},
{
"description": "Durchsteckpad 7 [/RS_DSR] von U2",
"pos": {
"x": 158.24,
"y": 130.0
},
"uuid": "e2d6b2cb-6025-490c-8371-d7cc34ac37f6"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 6 [/RS_RI] von U1",
"pos": {
"x": 108.0,
"y": 116.7
},
"uuid": "f35f1696-b778-437b-8cce-67b8c4d5f5d0"
},
{
"description": "Durchsteckpad 10 [/RS_RI] von U2",
"pos": {
"x": 165.86,
"y": 130.0
},
"uuid": "e28de6f2-fb85-4849-ba1a-e98e2a231492"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 7 [/RS_DTR] von U1",
"pos": {
"x": 108.0,
"y": 119.24
},
"uuid": "354ab122-85b1-4c9c-9385-d5091fe12303"
},
{
"description": "Durchsteckpad 6 [/RS_DTR] von U2",
"pos": {
"x": 155.7,
"y": 130.0
},
"uuid": "81e8ad67-4bdc-4f57-90b1-68cff6a95261"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 8 [/RS_RTS] von U1",
"pos": {
"x": 108.0,
"y": 121.78
},
"uuid": "55162730-46fd-465d-a1c5-20aed09ed534"
},
{
"description": "Durchsteckpad 8 [/RS_RTS] von U2",
"pos": {
"x": 160.78,
"y": 130.0
},
"uuid": "5c304724-2bc6-409d-9c59-2e40adc557b9"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 9 [/RS_CTS] von U1",
"pos": {
"x": 108.0,
"y": 124.32
},
"uuid": "f75c20f8-d3b5-4c3b-9919-cb044b2da5c3"
},
{
"description": "Durchsteckpad 9 [/RS_CTS] von U2",
"pos": {
"x": 163.32,
"y": 130.0
},
"uuid": "a8411036-6859-4041-84b8-2c80c326c58e"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 10 [/RS_TX] von U1",
"pos": {
"x": 108.0,
"y": 126.86
},
"uuid": "22c323db-7146-44af-951b-04a1d7dbb2fe"
},
{
"description": "Durchsteckpad 5 [/RS_TX] von U2",
"pos": {
"x": 153.16,
"y": 130.0
},
"uuid": "f919098b-4ad7-4600-9e8b-3375a1cff050"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 11 [/RS_RX] von U1",
"pos": {
"x": 108.0,
"y": 129.4
},
"uuid": "6573852d-5714-4c8d-8793-0be87f5a052a"
},
{
"description": "Durchsteckpad 4 [/RS_RX] von U2",
"pos": {
"x": 150.62,
"y": 130.0
},
"uuid": "3d90cce4-14d8-46a0-b560-09524f11698f"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 12 [/RS_VALID] von U1",
"pos": {
"x": 108.0,
"y": 131.94
},
"uuid": "2fbc596b-c88f-4fc6-aa94-5dad4fcac9cc"
},
{
"description": "Durchsteckpad 11 [/RS_VALID] von U2",
"pos": {
"x": 168.4,
"y": 130.0
},
"uuid": "9ad42f44-160f-4aa5-bcf0-a4466c090438"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 15 [/RS_OFF_N] von U1",
"pos": {
"x": 108.0,
"y": 139.56
},
"uuid": "34e1afe9-b3fc-4d3a-9e33-38b32244f19e"
},
{
"description": "Durchsteckpad 12 [/RS_OFF_N] von U2",
"pos": {
"x": 170.94,
"y": 130.0
},
"uuid": "a43ba2f2-477d-4850-87de-e1591119d5ae"
}
],
"severity": "error",
"type": "unconnected_items"
}
],
"violations": []
}
@@ -0,0 +1,221 @@
{
"$schema": "https://schemas.kicad.org/drc.v1.json",
"coordinate_units": "mm",
"date": "2026-09-20T22:46:03",
"ignored_checks": [
{
"description": "Footprint has no courtyard defined",
"key": "missing_courtyard"
},
{
"description": "Track endpoint not centered on via",
"key": "track_not_centered_on_via"
},
{
"description": "Tuning profile track geometries",
"key": "tuning_profile_track_geometries"
},
{
"description": "Footprint doesn't match symbol's footprint filters",
"key": "footprint_filters_mismatch"
},
{
"description": "Footprint component type doesn't match footprint pads",
"key": "footprint_type_mismatch"
}
],
"included_severities": [
"error",
"warning"
],
"kicad_version": "10.0.6",
"schematic_parity": [],
"source": "serial-carrier.kicad_pcb",
"unconnected_items": [
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 5 [/RS_DSR] von U1",
"pos": {
"x": 108.0,
"y": 114.16
},
"uuid": "0ceca603-53a8-4a53-85cc-f7f8e7be90e4"
},
{
"description": "Durchsteckpad 7 [/RS_DSR] von U2",
"pos": {
"x": 158.24,
"y": 130.0
},
"uuid": "e2d6b2cb-6025-490c-8371-d7cc34ac37f6"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 6 [/RS_RI] von U1",
"pos": {
"x": 108.0,
"y": 116.7
},
"uuid": "f35f1696-b778-437b-8cce-67b8c4d5f5d0"
},
{
"description": "Durchsteckpad 10 [/RS_RI] von U2",
"pos": {
"x": 165.86,
"y": 130.0
},
"uuid": "e28de6f2-fb85-4849-ba1a-e98e2a231492"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 8 [/RS_RTS] von U1",
"pos": {
"x": 108.0,
"y": 121.78
},
"uuid": "55162730-46fd-465d-a1c5-20aed09ed534"
},
{
"description": "Durchsteckpad 8 [/RS_RTS] von U2",
"pos": {
"x": 160.78,
"y": 130.0
},
"uuid": "5c304724-2bc6-409d-9c59-2e40adc557b9"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 9 [/RS_CTS] von U1",
"pos": {
"x": 108.0,
"y": 124.32
},
"uuid": "f75c20f8-d3b5-4c3b-9919-cb044b2da5c3"
},
{
"description": "Durchsteckpad 9 [/RS_CTS] von U2",
"pos": {
"x": 163.32,
"y": 130.0
},
"uuid": "a8411036-6859-4041-84b8-2c80c326c58e"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 12 [/RS_VALID] von U1",
"pos": {
"x": 108.0,
"y": 131.94
},
"uuid": "2fbc596b-c88f-4fc6-aa94-5dad4fcac9cc"
},
{
"description": "Durchsteckpad 11 [/RS_VALID] von U2",
"pos": {
"x": 168.4,
"y": 130.0
},
"uuid": "9ad42f44-160f-4aa5-bcf0-a4466c090438"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 15 [/RS_OFF_N] von U1",
"pos": {
"x": 108.0,
"y": 139.56
},
"uuid": "34e1afe9-b3fc-4d3a-9e33-38b32244f19e"
},
{
"description": "Durchsteckpad 12 [/RS_OFF_N] von U2",
"pos": {
"x": 170.94,
"y": 130.0
},
"uuid": "a43ba2f2-477d-4850-87de-e1591119d5ae"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 17 [/OLED_SDA] von U1",
"pos": {
"x": 108.0,
"y": 144.64
},
"uuid": "1f91549c-5cb2-465f-86df-b2f1b0c16ed8"
},
{
"description": "Durchsteckpad 4 [/OLED_SDA] von DS1",
"pos": {
"x": 159.81,
"y": 137.5
},
"uuid": "91a4dcef-1b36-4e3d-a15c-c4578077c27b"
}
],
"severity": "error",
"type": "unconnected_items"
},
{
"description": "Missing connection between items",
"items": [
{
"description": "Durchsteckpad 20 [/BTN_NEXT] von U1",
"pos": {
"x": 108.0,
"y": 152.26
},
"uuid": "e7159c90-4e8d-4b21-8e84-a7f59f793440"
},
{
"description": "Leiterbahn [/BTN_NEXT] auf F.Cu, Länge 6,5000 mm",
"pos": {
"x": 167.0,
"y": 168.0
},
"uuid": "97cfdf4d-f068-4e4a-8684-aae638a809ad"
}
],
"severity": "error",
"type": "unconnected_items"
}
],
"violations": []
}
@@ -0,0 +1,70 @@
/builddir/build/BUILD/kicad-10.0.6-build/kicad-10.0.6/include/properties/property.h(607): assert "m_choices.GetCount() > 0" failed in PROPERTY_ENUM(): No enum choices defined
/builddir/build/BUILD/kicad-10.0.6-build/kicad-10.0.6/include/properties/property.h(607): assert "m_choices.GetCount() > 0" failed in PROPERTY_ENUM(): No enum choices defined
/builddir/build/BUILD/kicad-10.0.6-build/kicad-10.0.6/include/properties/property.h(607): assert "m_choices.GetCount() > 0" failed in PROPERTY_ENUM(): No enum choices defined
{"net": "/+3V3", "start": "U1.1", "end": "U1.2", "start_mm": [108.0, 104.0], "end_mm": [108.0, 106.54], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 26}
{"net": "/+3V3", "start": "R2.1", "end": "DS1.2", "start_mm": [154.0, 134.0], "end_mm": [154.73, 137.5], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 239}
{"net": "/+3V3", "start": "U2.1", "end": "R1.1", "start_mm": [143.0, 130.0], "end_mm": [143.0, 134.0], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 41}
{"net": "/BTN_NEXT", "start": "SW3.1", "end": "SW3.1", "start_mm": [167.0, 168.0], "end_mm": [173.5, 168.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 66}
{"net": "/BTN_PREVIOUS", "start": "SW1.1", "end": "SW1.1", "start_mm": [149.5, 168.0], "end_mm": [143.0, 168.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 66}
{"net": "/BTN_SELECT", "start": "SW2.1", "end": "SW2.1", "start_mm": [155.0, 168.0], "end_mm": [161.5, 168.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 66}
{"net": "/+3V3", "start": "DS1.2", "end": "R3.1", "start_mm": [154.73, 137.5], "end_mm": [165.0, 134.0], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 1334}
{"net": "/+3V3", "start": "R1.1", "end": "R2.1", "start_mm": [143.0, 134.0], "end_mm": [154.0, 134.0], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 3711}
{"net": "/BTN_SELECT", "start": "SW2.1", "end": "R2.2", "start_mm": [161.5, 168.0], "end_mm": [161.62, 134.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 681}
{"net": "/BTN_NEXT", "start": "SW3.1", "end": "R3.2", "start_mm": [173.5, 168.0], "end_mm": [172.62, 134.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 3329}
{"net": "/BTN_PREVIOUS", "start": "R1.2", "end": "SW1.1", "start_mm": [150.62, 134.0], "end_mm": [149.5, 168.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 3971}
{"net": "/+3V3", "start": "U1.2", "end": "U2.1", "start_mm": [108.0, 106.54], "end_mm": [143.0, 130.0], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 224476}
{"net": "/RS_RX", "start": "U1.11", "end": "U2.4", "start_mm": [108.0, 129.4], "end_mm": [150.62, 130.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 274662}
{"net": "/BTN_PREVIOUS", "start": "U1.16", "end": "R1.2", "start_mm": [108.0, 142.1], "end_mm": [150.62, 134.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 227867}
{"net": "/RS_DCD", "start": "U1.4", "end": "U2.3", "start_mm": [108.0, 111.62], "end_mm": [148.08, 130.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 201896}
{"net": "/RS_TX", "start": "U1.10", "end": "U2.5", "start_mm": [108.0, 126.86], "end_mm": [153.16, 130.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 271117}
{"net": "/RS_DTR", "start": "U1.7", "end": "U2.6", "start_mm": [108.0, 119.24], "end_mm": [155.7, 130.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 307013}
{"net": "/OLED_SCL", "start": "U1.18", "end": "DS1.3", "start_mm": [108.0, 147.18], "end_mm": [157.27, 137.5], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 127246}
{"net": "/BTN_SELECT", "start": "SW2.1", "end": "U1.19", "start_mm": [155.0, 168.0], "end_mm": [108.0, 149.72], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 73189}
{"net": "/OLED_SDA", "start": "U1.17", "end": "DS1.4", "start_mm": [108.0, 144.64], "end_mm": [159.81, 137.5], "routed": false, "width_mm": 0.25, "power_fallback": false, "expansions": 272010}
{"net": "/RS_DSR", "start": "U1.5", "end": "U2.7", "start_mm": [108.0, 114.16], "end_mm": [158.24, 130.0], "routed": false, "width_mm": 0.25, "power_fallback": false, "expansions": 272046}
{"net": "/RS_RTS", "start": "U1.8", "end": "U2.8", "start_mm": [108.0, 121.78], "end_mm": [160.78, 130.0], "routed": false, "width_mm": 0.25, "power_fallback": false, "expansions": 272010}
{"net": "/RS_CTS", "start": "U1.9", "end": "U2.9", "start_mm": [108.0, 124.32], "end_mm": [163.32, 130.0], "routed": false, "width_mm": 0.25, "power_fallback": false, "expansions": 272000}
{"net": "/RS_RI", "start": "U1.6", "end": "U2.10", "start_mm": [108.0, 116.7], "end_mm": [165.86, 130.0], "routed": false, "width_mm": 0.25, "power_fallback": false, "expansions": 272008}
{"net": "/RS_VALID", "start": "U1.12", "end": "U2.11", "start_mm": [108.0, 131.94], "end_mm": [168.4, 130.0], "routed": false, "width_mm": 0.25, "power_fallback": false, "expansions": 272015}
{"net": "/BTN_NEXT", "start": "U1.20", "end": "SW3.1", "start_mm": [108.0, 152.26], "end_mm": [167.0, 168.0], "routed": false, "width_mm": 0.25, "power_fallback": false, "expansions": 272010}
{"net": "/RS_OFF_N", "start": "U1.15", "end": "U2.12", "start_mm": [108.0, 139.56], "end_mm": [170.94, 130.0], "routed": false, "width_mm": 0.25, "power_fallback": false, "expansions": 272010}
{"net": "/GND", "start": "U1.44", "end": "U1.43", "start_mm": [133.4, 157.34], "end_mm": [133.4, 154.8], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 26}
{"net": "/GND", "start": "SW2.2", "end": "SW1.2", "start_mm": [155.0, 172.5], "end_mm": [149.5, 172.5], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 56}
{"net": "/GND", "start": "SW2.2", "end": "SW3.2", "start_mm": [161.5, 172.5], "end_mm": [167.0, 172.5], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 56}
{"net": "/GND", "start": "SW2.2", "end": "SW2.2", "start_mm": [155.0, 172.5], "end_mm": [161.5, 172.5], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 66}
{"net": "/GND", "start": "SW3.2", "end": "SW3.2", "start_mm": [167.0, 172.5], "end_mm": [173.5, 172.5], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 66}
{"net": "/GND", "start": "SW1.2", "end": "SW1.2", "start_mm": [149.5, 172.5], "end_mm": [143.0, 172.5], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 66}
{"net": "/GND", "start": "DS1.1", "end": "U2.2", "start_mm": [152.19, 137.5], "end_mm": [145.54, 130.0], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 3234}
{"net": "/GND", "start": "SW1.2", "end": "U1.44", "start_mm": [143.0, 172.5], "end_mm": [133.4, 157.34], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 29110}
{"net": "/GND", "start": "U1.44", "end": "U1.22", "start_mm": [133.4, 157.34], "end_mm": [108.0, 157.34], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 16915}
{"net": "/GND", "start": "U1.43", "end": "DS1.1", "start_mm": [133.4, 154.8], "end_mm": [152.19, 137.5], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 57470}
{"net": "/GND", "start": "U2.2", "end": "U1.23", "start_mm": [145.54, 130.0], "end_mm": [133.4, 104.0], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 34158}
22:45:50: Debug: Adding duplicate image handler for 'PNG file'
22:45:50: Debug: Adding duplicate image handler for 'JPEG file'
22:45:50: Debug: Adding duplicate image handler for 'TIFF file'
22:45:50: Debug: Adding duplicate image handler for 'GIF file'
22:45:50: Debug: Adding duplicate image handler for 'PNM file'
22:45:50: Debug: Adding duplicate image handler for 'PCX file'
22:45:50: Debug: Adding duplicate image handler for 'IFF file'
22:45:50: Debug: Adding duplicate image handler for 'Windows icon file'
22:45:50: Debug: Adding duplicate image handler for 'Windows cursor file'
22:45:50: Debug: Adding duplicate image handler for 'Windows animated cursor file'
22:45:50: Debug: Adding duplicate image handler for 'TGA file'
22:45:50: Debug: Adding duplicate image handler for 'XPM file'
{
"draft_only": true,
"saved": true,
"grid_mm": 0.1,
"clearance_mm": 0.25,
"safety_margin_mm": 0.04,
"via_diameter_mm": 0.7,
"via_drill_mm": 0.3,
"elapsed_seconds": 20.799824999005068,
"routed_tree_edges": 30,
"total_tree_edges": 38,
"tracks": 248,
"vias": 13,
"immutable_identity_sha256": "81def52e6c1d574b4d3ab1a5859a5266b893df0ea6c5b9aa7d7b688cc4a98519",
"input_sha256": "ab3f0775dee575a11d06f80996169f5097dfff672b69152ad9b559707f70009b",
"validation": "KiCad DRC must be run separately; tree-edge counts are not DRC connectivity"
}
@@ -0,0 +1,70 @@
/builddir/build/BUILD/kicad-10.0.6-build/kicad-10.0.6/include/properties/property.h(607): assert "m_choices.GetCount() > 0" failed in PROPERTY_ENUM(): No enum choices defined
/builddir/build/BUILD/kicad-10.0.6-build/kicad-10.0.6/include/properties/property.h(607): assert "m_choices.GetCount() > 0" failed in PROPERTY_ENUM(): No enum choices defined
/builddir/build/BUILD/kicad-10.0.6-build/kicad-10.0.6/include/properties/property.h(607): assert "m_choices.GetCount() > 0" failed in PROPERTY_ENUM(): No enum choices defined
{"net": "/+3V3", "start": "U1.1", "end": "U1.2", "start_mm": [108.0, 104.0], "end_mm": [108.0, 106.54], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 52}
{"net": "/+3V3", "start": "R2.1", "end": "DS1.2", "start_mm": [154.0, 134.0], "end_mm": [154.73, 137.5], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 911}
{"net": "/+3V3", "start": "U2.1", "end": "R1.1", "start_mm": [143.0, 130.0], "end_mm": [143.0, 134.0], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 81}
{"net": "/BTN_NEXT", "start": "SW3.1", "end": "SW3.1", "start_mm": [167.0, 168.0], "end_mm": [173.5, 168.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 131}
{"net": "/BTN_PREVIOUS", "start": "SW1.1", "end": "SW1.1", "start_mm": [149.5, 168.0], "end_mm": [143.0, 168.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 131}
{"net": "/BTN_SELECT", "start": "SW2.1", "end": "SW2.1", "start_mm": [155.0, 168.0], "end_mm": [161.5, 168.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 131}
{"net": "/+3V3", "start": "DS1.2", "end": "R3.1", "start_mm": [154.73, 137.5], "end_mm": [165.0, 134.0], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 5139}
{"net": "/+3V3", "start": "R1.1", "end": "R2.1", "start_mm": [143.0, 134.0], "end_mm": [154.0, 134.0], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 14153}
{"net": "/BTN_SELECT", "start": "SW2.1", "end": "R2.2", "start_mm": [161.5, 168.0], "end_mm": [161.62, 134.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 2039}
{"net": "/BTN_NEXT", "start": "SW3.1", "end": "R3.2", "start_mm": [173.5, 168.0], "end_mm": [172.62, 134.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 12615}
{"net": "/BTN_PREVIOUS", "start": "R1.2", "end": "SW1.1", "start_mm": [150.62, 134.0], "end_mm": [149.5, 168.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 15179}
{"net": "/+3V3", "start": "U1.2", "end": "U2.1", "start_mm": [108.0, 106.54], "end_mm": [143.0, 130.0], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 894511}
{"net": "/RS_RX", "start": "U1.11", "end": "U2.4", "start_mm": [108.0, 129.4], "end_mm": [150.62, 130.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 51516}
{"net": "/BTN_PREVIOUS", "start": "U1.16", "end": "R1.2", "start_mm": [108.0, 142.1], "end_mm": [150.62, 134.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 94479}
{"net": "/RS_DCD", "start": "U1.4", "end": "U2.3", "start_mm": [108.0, 111.62], "end_mm": [148.08, 130.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 266031}
{"net": "/RS_TX", "start": "U1.10", "end": "U2.5", "start_mm": [108.0, 126.86], "end_mm": [153.16, 130.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 175689}
{"net": "/RS_DTR", "start": "U1.7", "end": "U2.6", "start_mm": [108.0, 119.24], "end_mm": [155.7, 130.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 326823}
{"net": "/OLED_SCL", "start": "U1.18", "end": "DS1.3", "start_mm": [108.0, 147.18], "end_mm": [157.27, 137.5], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 82557}
{"net": "/BTN_SELECT", "start": "SW2.1", "end": "U1.19", "start_mm": [155.0, 168.0], "end_mm": [108.0, 149.72], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 147997}
{"net": "/OLED_SDA", "start": "U1.17", "end": "DS1.4", "start_mm": [108.0, 144.64], "end_mm": [159.81, 137.5], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 266428}
{"net": "/RS_DSR", "start": "U1.5", "end": "U2.7", "start_mm": [108.0, 114.16], "end_mm": [158.24, 130.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 372014}
{"net": "/RS_RTS", "start": "U1.8", "end": "U2.8", "start_mm": [108.0, 121.78], "end_mm": [160.78, 130.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 298514}
{"net": "/RS_CTS", "start": "U1.9", "end": "U2.9", "start_mm": [108.0, 124.32], "end_mm": [163.32, 130.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 265272}
{"net": "/RS_RI", "start": "U1.6", "end": "U2.10", "start_mm": [108.0, 116.7], "end_mm": [165.86, 130.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 332506}
{"net": "/RS_VALID", "start": "U1.12", "end": "U2.11", "start_mm": [108.0, 131.94], "end_mm": [168.4, 130.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 348384}
{"net": "/BTN_NEXT", "start": "U1.20", "end": "SW3.1", "start_mm": [108.0, 152.26], "end_mm": [167.0, 168.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 272795}
{"net": "/RS_OFF_N", "start": "U1.15", "end": "U2.12", "start_mm": [108.0, 139.56], "end_mm": [170.94, 130.0], "routed": true, "width_mm": 0.25, "power_fallback": false, "expansions": 351630}
{"net": "/GND", "start": "U1.44", "end": "U1.43", "start_mm": [133.4, 157.34], "end_mm": [133.4, 154.8], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 52}
{"net": "/GND", "start": "SW2.2", "end": "SW1.2", "start_mm": [155.0, 172.5], "end_mm": [149.5, 172.5], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 111}
{"net": "/GND", "start": "SW2.2", "end": "SW3.2", "start_mm": [161.5, 172.5], "end_mm": [167.0, 172.5], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 111}
{"net": "/GND", "start": "SW2.2", "end": "SW2.2", "start_mm": [155.0, 172.5], "end_mm": [161.5, 172.5], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 131}
{"net": "/GND", "start": "SW3.2", "end": "SW3.2", "start_mm": [167.0, 172.5], "end_mm": [173.5, 172.5], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 131}
{"net": "/GND", "start": "SW1.2", "end": "SW1.2", "start_mm": [149.5, 172.5], "end_mm": [143.0, 172.5], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 131}
{"net": "/GND", "start": "DS1.1", "end": "U2.2", "start_mm": [152.19, 137.5], "end_mm": [145.54, 130.0], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 17468}
{"net": "/GND", "start": "SW1.2", "end": "U1.44", "start_mm": [143.0, 172.5], "end_mm": [133.4, 157.34], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 27488}
{"net": "/GND", "start": "U1.44", "end": "U1.22", "start_mm": [133.4, 157.34], "end_mm": [108.0, 157.34], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 73753}
{"net": "/GND", "start": "U1.43", "end": "DS1.1", "start_mm": [133.4, 154.8], "end_mm": [152.19, 137.5], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 54021}
{"net": "/GND", "start": "U2.2", "end": "U1.23", "start_mm": [145.54, 130.0], "end_mm": [133.4, 104.0], "routed": true, "width_mm": 0.5, "power_fallback": false, "expansions": 98250}
22:47:09: Debug: Adding duplicate image handler for 'PNG file'
22:47:09: Debug: Adding duplicate image handler for 'JPEG file'
22:47:09: Debug: Adding duplicate image handler for 'TIFF file'
22:47:09: Debug: Adding duplicate image handler for 'GIF file'
22:47:09: Debug: Adding duplicate image handler for 'PNM file'
22:47:09: Debug: Adding duplicate image handler for 'PCX file'
22:47:09: Debug: Adding duplicate image handler for 'IFF file'
22:47:09: Debug: Adding duplicate image handler for 'Windows icon file'
22:47:09: Debug: Adding duplicate image handler for 'Windows cursor file'
22:47:09: Debug: Adding duplicate image handler for 'Windows animated cursor file'
22:47:09: Debug: Adding duplicate image handler for 'TGA file'
22:47:09: Debug: Adding duplicate image handler for 'XPM file'
{
"draft_only": true,
"saved": true,
"grid_mm": 0.05,
"clearance_mm": 0.25,
"safety_margin_mm": 0.02,
"via_diameter_mm": 0.7,
"via_drill_mm": 0.3,
"elapsed_seconds": 26.517815405000874,
"routed_tree_edges": 38,
"total_tree_edges": 38,
"tracks": 569,
"vias": 20,
"immutable_identity_sha256": "81def52e6c1d574b4d3ab1a5859a5266b893df0ea6c5b9aa7d7b688cc4a98519",
"input_sha256": "41643d6089dae5ef2eee1a2071a6d11ae4c00f3c922eddfeaafff619fc5fab19",
"validation": "KiCad DRC must be run separately; tree-edge counts are not DRC connectivity"
}
@@ -0,0 +1,665 @@
{
"draft_only": true,
"saved": true,
"grid_mm": 0.05,
"clearance_mm": 0.25,
"safety_margin_mm": 0.02,
"via_diameter_mm": 0.7,
"via_drill_mm": 0.3,
"elapsed_seconds": 26.517815405000874,
"connections": [
{
"net": "/+3V3",
"start": "U1.1",
"end": "U1.2",
"start_mm": [
108.0,
104.0
],
"end_mm": [
108.0,
106.54
],
"routed": true,
"width_mm": 0.5,
"power_fallback": false,
"expansions": 52
},
{
"net": "/+3V3",
"start": "R2.1",
"end": "DS1.2",
"start_mm": [
154.0,
134.0
],
"end_mm": [
154.73,
137.5
],
"routed": true,
"width_mm": 0.5,
"power_fallback": false,
"expansions": 911
},
{
"net": "/+3V3",
"start": "U2.1",
"end": "R1.1",
"start_mm": [
143.0,
130.0
],
"end_mm": [
143.0,
134.0
],
"routed": true,
"width_mm": 0.5,
"power_fallback": false,
"expansions": 81
},
{
"net": "/BTN_NEXT",
"start": "SW3.1",
"end": "SW3.1",
"start_mm": [
167.0,
168.0
],
"end_mm": [
173.5,
168.0
],
"routed": true,
"width_mm": 0.25,
"power_fallback": false,
"expansions": 131
},
{
"net": "/BTN_PREVIOUS",
"start": "SW1.1",
"end": "SW1.1",
"start_mm": [
149.5,
168.0
],
"end_mm": [
143.0,
168.0
],
"routed": true,
"width_mm": 0.25,
"power_fallback": false,
"expansions": 131
},
{
"net": "/BTN_SELECT",
"start": "SW2.1",
"end": "SW2.1",
"start_mm": [
155.0,
168.0
],
"end_mm": [
161.5,
168.0
],
"routed": true,
"width_mm": 0.25,
"power_fallback": false,
"expansions": 131
},
{
"net": "/+3V3",
"start": "DS1.2",
"end": "R3.1",
"start_mm": [
154.73,
137.5
],
"end_mm": [
165.0,
134.0
],
"routed": true,
"width_mm": 0.5,
"power_fallback": false,
"expansions": 5139
},
{
"net": "/+3V3",
"start": "R1.1",
"end": "R2.1",
"start_mm": [
143.0,
134.0
],
"end_mm": [
154.0,
134.0
],
"routed": true,
"width_mm": 0.5,
"power_fallback": false,
"expansions": 14153
},
{
"net": "/BTN_SELECT",
"start": "SW2.1",
"end": "R2.2",
"start_mm": [
161.5,
168.0
],
"end_mm": [
161.62,
134.0
],
"routed": true,
"width_mm": 0.25,
"power_fallback": false,
"expansions": 2039
},
{
"net": "/BTN_NEXT",
"start": "SW3.1",
"end": "R3.2",
"start_mm": [
173.5,
168.0
],
"end_mm": [
172.62,
134.0
],
"routed": true,
"width_mm": 0.25,
"power_fallback": false,
"expansions": 12615
},
{
"net": "/BTN_PREVIOUS",
"start": "R1.2",
"end": "SW1.1",
"start_mm": [
150.62,
134.0
],
"end_mm": [
149.5,
168.0
],
"routed": true,
"width_mm": 0.25,
"power_fallback": false,
"expansions": 15179
},
{
"net": "/+3V3",
"start": "U1.2",
"end": "U2.1",
"start_mm": [
108.0,
106.54
],
"end_mm": [
143.0,
130.0
],
"routed": true,
"width_mm": 0.5,
"power_fallback": false,
"expansions": 894511
},
{
"net": "/RS_RX",
"start": "U1.11",
"end": "U2.4",
"start_mm": [
108.0,
129.4
],
"end_mm": [
150.62,
130.0
],
"routed": true,
"width_mm": 0.25,
"power_fallback": false,
"expansions": 51516
},
{
"net": "/BTN_PREVIOUS",
"start": "U1.16",
"end": "R1.2",
"start_mm": [
108.0,
142.1
],
"end_mm": [
150.62,
134.0
],
"routed": true,
"width_mm": 0.25,
"power_fallback": false,
"expansions": 94479
},
{
"net": "/RS_DCD",
"start": "U1.4",
"end": "U2.3",
"start_mm": [
108.0,
111.62
],
"end_mm": [
148.08,
130.0
],
"routed": true,
"width_mm": 0.25,
"power_fallback": false,
"expansions": 266031
},
{
"net": "/RS_TX",
"start": "U1.10",
"end": "U2.5",
"start_mm": [
108.0,
126.86
],
"end_mm": [
153.16,
130.0
],
"routed": true,
"width_mm": 0.25,
"power_fallback": false,
"expansions": 175689
},
{
"net": "/RS_DTR",
"start": "U1.7",
"end": "U2.6",
"start_mm": [
108.0,
119.24
],
"end_mm": [
155.7,
130.0
],
"routed": true,
"width_mm": 0.25,
"power_fallback": false,
"expansions": 326823
},
{
"net": "/OLED_SCL",
"start": "U1.18",
"end": "DS1.3",
"start_mm": [
108.0,
147.18
],
"end_mm": [
157.27,
137.5
],
"routed": true,
"width_mm": 0.25,
"power_fallback": false,
"expansions": 82557
},
{
"net": "/BTN_SELECT",
"start": "SW2.1",
"end": "U1.19",
"start_mm": [
155.0,
168.0
],
"end_mm": [
108.0,
149.72
],
"routed": true,
"width_mm": 0.25,
"power_fallback": false,
"expansions": 147997
},
{
"net": "/OLED_SDA",
"start": "U1.17",
"end": "DS1.4",
"start_mm": [
108.0,
144.64
],
"end_mm": [
159.81,
137.5
],
"routed": true,
"width_mm": 0.25,
"power_fallback": false,
"expansions": 266428
},
{
"net": "/RS_DSR",
"start": "U1.5",
"end": "U2.7",
"start_mm": [
108.0,
114.16
],
"end_mm": [
158.24,
130.0
],
"routed": true,
"width_mm": 0.25,
"power_fallback": false,
"expansions": 372014
},
{
"net": "/RS_RTS",
"start": "U1.8",
"end": "U2.8",
"start_mm": [
108.0,
121.78
],
"end_mm": [
160.78,
130.0
],
"routed": true,
"width_mm": 0.25,
"power_fallback": false,
"expansions": 298514
},
{
"net": "/RS_CTS",
"start": "U1.9",
"end": "U2.9",
"start_mm": [
108.0,
124.32
],
"end_mm": [
163.32,
130.0
],
"routed": true,
"width_mm": 0.25,
"power_fallback": false,
"expansions": 265272
},
{
"net": "/RS_RI",
"start": "U1.6",
"end": "U2.10",
"start_mm": [
108.0,
116.7
],
"end_mm": [
165.86,
130.0
],
"routed": true,
"width_mm": 0.25,
"power_fallback": false,
"expansions": 332506
},
{
"net": "/RS_VALID",
"start": "U1.12",
"end": "U2.11",
"start_mm": [
108.0,
131.94
],
"end_mm": [
168.4,
130.0
],
"routed": true,
"width_mm": 0.25,
"power_fallback": false,
"expansions": 348384
},
{
"net": "/BTN_NEXT",
"start": "U1.20",
"end": "SW3.1",
"start_mm": [
108.0,
152.26
],
"end_mm": [
167.0,
168.0
],
"routed": true,
"width_mm": 0.25,
"power_fallback": false,
"expansions": 272795
},
{
"net": "/RS_OFF_N",
"start": "U1.15",
"end": "U2.12",
"start_mm": [
108.0,
139.56
],
"end_mm": [
170.94,
130.0
],
"routed": true,
"width_mm": 0.25,
"power_fallback": false,
"expansions": 351630
},
{
"net": "/GND",
"start": "U1.44",
"end": "U1.43",
"start_mm": [
133.4,
157.34
],
"end_mm": [
133.4,
154.8
],
"routed": true,
"width_mm": 0.5,
"power_fallback": false,
"expansions": 52
},
{
"net": "/GND",
"start": "SW2.2",
"end": "SW1.2",
"start_mm": [
155.0,
172.5
],
"end_mm": [
149.5,
172.5
],
"routed": true,
"width_mm": 0.5,
"power_fallback": false,
"expansions": 111
},
{
"net": "/GND",
"start": "SW2.2",
"end": "SW3.2",
"start_mm": [
161.5,
172.5
],
"end_mm": [
167.0,
172.5
],
"routed": true,
"width_mm": 0.5,
"power_fallback": false,
"expansions": 111
},
{
"net": "/GND",
"start": "SW2.2",
"end": "SW2.2",
"start_mm": [
155.0,
172.5
],
"end_mm": [
161.5,
172.5
],
"routed": true,
"width_mm": 0.5,
"power_fallback": false,
"expansions": 131
},
{
"net": "/GND",
"start": "SW3.2",
"end": "SW3.2",
"start_mm": [
167.0,
172.5
],
"end_mm": [
173.5,
172.5
],
"routed": true,
"width_mm": 0.5,
"power_fallback": false,
"expansions": 131
},
{
"net": "/GND",
"start": "SW1.2",
"end": "SW1.2",
"start_mm": [
149.5,
172.5
],
"end_mm": [
143.0,
172.5
],
"routed": true,
"width_mm": 0.5,
"power_fallback": false,
"expansions": 131
},
{
"net": "/GND",
"start": "DS1.1",
"end": "U2.2",
"start_mm": [
152.19,
137.5
],
"end_mm": [
145.54,
130.0
],
"routed": true,
"width_mm": 0.5,
"power_fallback": false,
"expansions": 17468
},
{
"net": "/GND",
"start": "SW1.2",
"end": "U1.44",
"start_mm": [
143.0,
172.5
],
"end_mm": [
133.4,
157.34
],
"routed": true,
"width_mm": 0.5,
"power_fallback": false,
"expansions": 27488
},
{
"net": "/GND",
"start": "U1.44",
"end": "U1.22",
"start_mm": [
133.4,
157.34
],
"end_mm": [
108.0,
157.34
],
"routed": true,
"width_mm": 0.5,
"power_fallback": false,
"expansions": 73753
},
{
"net": "/GND",
"start": "U1.43",
"end": "DS1.1",
"start_mm": [
133.4,
154.8
],
"end_mm": [
152.19,
137.5
],
"routed": true,
"width_mm": 0.5,
"power_fallback": false,
"expansions": 54021
},
{
"net": "/GND",
"start": "U2.2",
"end": "U1.23",
"start_mm": [
145.54,
130.0
],
"end_mm": [
133.4,
104.0
],
"routed": true,
"width_mm": 0.5,
"power_fallback": false,
"expansions": 98250
}
],
"routed_tree_edges": 38,
"total_tree_edges": 38,
"tracks": 569,
"vias": 20,
"immutable_identity_sha256": "81def52e6c1d574b4d3ab1a5859a5266b893df0ea6c5b9aa7d7b688cc4a98519",
"input_sha256": "41643d6089dae5ef2eee1a2071a6d11ae4c00f3c922eddfeaafff619fc5fab19",
"validation": "KiCad DRC must be run separately; tree-edge counts are not DRC connectivity"
}
@@ -0,0 +1,139 @@
# Two-layer draft routing result
Date: 2026-09-20. KiCad 10.0.6; system `/usr/bin/python3`.
## Saved result
Actual copper routing is saved in `../serial-carrier.kicad_pcb`, not just a preview
or an exported proposal. **38/38 required spanning-tree connections across 17
multi-pad nets routed; KiCad reports 0 unconnected items, 0 errors, 0 warnings.**
Intentional single-pad `unconnected-(...)` nets retain their original names and
are not connected to anything else.
- Two copper layers, F.Cu and B.Cu.
- 569 straight track segments: 425 at 0.25 mm for signals and 144 at 0.5 mm for
+3V3/GND. No narrow power-track fallback was necessary.
- 20 through vias, 0.7 mm copper diameter / 0.3 mm drill.
- No copper pours: all ground connections were routed explicitly.
- Original RF rule area, x110..131 / y100..113 mm on both copper layers, preserved.
No tracks, vias or fills enter the reservation. Minimum copper-to-reservation
gap measured independently is 0.025 mm; this is geometric compliance with the
specified provisional boundary, **not validation of an antenna's RF needs**.
- All 9 electrical footprints and 4 standalone mounting footprints preserved.
Pad positions, shapes, sizes, drills, types, nets, functions, pin types and UUIDs;
footprint placement, orientation, library IDs, values, UUIDs and schematic UUID
paths; net table, outline and RF rule-area geometry/flags match the input.
- Generator, README, schematic, project and libraries were not edited by routing.
No external network dependency or manufacturing exports were used.
## Validation performed
From `hardware/PCB`:
```sh
kicad-cli pcb drc --format json --refill-zones --save-board -o validation/pcb-routing-drc.json serial-carrier.kicad_pcb
kicad-cli pcb drc --format json --all-track-errors --severity-all --exit-code-violations -o validation/pcb-routing-all-drc.json serial-carrier.kicad_pcb
/usr/bin/python3 -B validation/pcb-routing-check.py
```
Both DRC runs: **0 violations and 0 unconnected items**. No DRC settings or
exclusions were added or changed. Existing project rules specify 0.25 mm minimum
clearance, 0.5 mm copper-edge clearance, 0.25 mm minimum track width and 0.7 mm
minimum via diameter.
Independent continuous-geometry audit (`pcb-routing-check.json`):
| Check | Measured minimum | Requirement |
|---|---:|---:|
| Different-net copper / copper-to-NPTH clearance | 0.275 mm | 0.25 mm |
| Copper or NPTH edge to board edge | 0.525 mm | 0.5 mm |
| Copper / NPTH edge to RF reserve | 0.025 mm | No intersection |
| Via drill edge to another drilled hole edge | 0.840175 mm | 0.25 mm |
The audit uses exact straight-line/point/rectangle distance calculations with
copper radii, rather than the router's raster masks. It also verifies dimensions,
source-preservation invariants, and three overwrite-refusal cases. Requires
locally installed `pcbnew`, NumPy and Shapely; the router itself only needs
`pcbnew` and NumPy.
DRC still honors the project's pre-existing ignored checks:
`missing_courtyard`, `track_not_centered_on_via`,
`tuning_profile_track_geometries`, `footprint_filters_mismatch`, and
`footprint_type_mismatch`. `--severity-all` does not enable ignored checks.
The routing subtask compared electrical UUID linkage and pad-net assignments
with the input board. Subsequent integration also ran fresh schematic-parity DRC
and added missing symbol metadata fields to the PCB without changing copper.
That check reports exactly one expected U2 footprint warning (provisional PCB
footprint versus intentionally blank schematic assignment); no net mismatch.
See `pcb-parity-drc.json` and `pcb-validation-summary.json`.
## Method and bounded passes
`../route_pcb_draft.py` uses a two-layer 8-direction raster A* search, an explicit
via cost, exact-pad-centre terminal stubs, conservative foreign-copper and hole
obstacles, and only collinear path compression. It preserves the L-shaped edge
and RF reservation. Per-net minimum spanning trees connect every physical pad,
including duplicate switch contacts; short links precede longer links and GND is
last. It does not optimize return-current paths, topology or total via count.
1. Initial 0.1 mm raster / 0.04 mm safety margin / 250,000 expansions per search:
29/38 connections; DRC 0 violations, 9 unconnected.
2. Increased search allowance to 1,200,000 expansions: 30/38; DRC 0 violations,
8 unconnected. Some raster header passages were blocked, not just expensive.
3. Final 0.05 mm raster / 0.02 mm additional safety margin, with 0.25 mm physical
clearance unchanged: 38/38 in approximately 26.5 seconds; DRC fully connected.
Each pass had a 240-second routing deadline. No unresolved routing remains.
A KiCad Python binding ownership problem in the first replacement attempt caused
an exception/segfault before any board save. Replacement now uses `board.Delete`
instead of `board.Remove`; the subsequent save and no-save rerun both passed.
The known startup PROPERTY_ENUM assertions do not prevent validation.
## Rerun safety
By default the script never saves. The existing routed board is protected even
from a preview unless `--replace-routes` is given. A preview can be run with:
```sh
/usr/bin/python3 -B route_pcb_draft.py --replace-routes --seconds 240
```
This exact no-save workflow was tested: it again found 38/38 connections, 569
segments and 20 vias, and left the board byte-for-byte unchanged.
**The following command discards all existing/manual tracks and vias**, then
replaces them with fresh draft routing. Back up manual work first:
```sh
/usr/bin/python3 -B route_pcb_draft.py --route --overwrite --replace-routes --seconds 240 --max-expansions 1200000
```
The script refuses a PCB-editor lock, unexpected outline/RF/board structure,
unsupported pad orientation/layers, unapproved existing routes, or detected board
changes before save. Candidate serialization must preserve immutable geometry
and linkage before replacing the board. It deliberately does not run DRC itself:
rerun the validation commands after any routing change. Runtime/expansion limits
can produce a partial board; inspect both the run report and actual DRC, not just
the script exit status.
## Evidence and remaining limitations
- `pcb-routing-input.kicad_pcb`: unrouted input snapshot, after baseline DRC save.
- `pcb-routing-baseline.json`: 38 unconnected / no violations before routing.
- `pcb-routing-pass1-drc.json`, `pcb-routing-pass2-drc.json`: intermediate DRC.
- `pcb-routing-pass2.log`, `pcb-routing-pass3.log`: bounded routing progress.
- `pcb-routing-run.json`: final saved-route metrics and connection list.
- `pcb-routing-drc.json`, `pcb-routing-all-drc.json`: final KiCad DRC evidence.
- `pcb-routing-check.py`, `pcb-routing-check.json`: repeatable independent audit.
- `pcb-routing-dry-run.log`: successful final no-save reproduction.
Routing-only DRC-saved snapshot SHA-256 (before integration copied schematic
metadata fields): `bf94b6c9b00c43a97f933054758a2c9d6541981ae09f2f285dcdb567bd73d9b1`.
The current post-integration hash is recorded by `pcb-routing-check.json`;
geometry, pad-net linkage and copper are unchanged by the metadata copy.
**Still DRAFT / NOT FOR FABRICATION.** Provisional module/connector geometry,
antenna envelope, assembly/courtyard clearances, USB access, male RS-232 connector
fit, physical pin mapping, power integrity, EMI and hardware operation are not
qualified by routing or DRC. All previously documented mechanical/electrical
release gates remain. No physical-device or manufacturing validation performed.
@@ -0,0 +1,604 @@
<?xml version="1.0" encoding="UTF-8"?>
<export version="E">
<design>
<source>/home/mscholz/Repos/ESP32_serial_swiss_army_knife/hardware/PCB/serial-carrier.kicad_sch</source>
<date>2026-09-20T23:07:27</date>
<tool>Eeschema 10.0.6-1.fc44</tool>
<sheet number="1" name="/" tstamps="/">
<title_block>
<title>ESP32 Serial Swiss Army Knife - Module Carrier</title>
<company/>
<rev>A0 DRAFT</rev>
<date>2026-09-20</date>
<source>serial-carrier.kicad_sch</source>
<comment number="1" value="Not fabrication-ready: provisional module footprints and male RS-232 mapping"/>
<comment number="2" value=""/>
<comment number="3" value=""/>
<comment number="4" value=""/>
<comment number="5" value=""/>
<comment number="6" value=""/>
<comment number="7" value=""/>
<comment number="8" value=""/>
<comment number="9" value=""/>
</title_block>
</sheet>
</design>
<components>
<comp ref="DS1">
<value>128x64 I2C OLED / 0x3C</value>
<footprint>Carrier:OLED_26mm_I2C_Provisional</footprint>
<fields>
<field name="Status">Module outline/header/display user fit-verified; pad/drill fit provisional</field>
<field name="Footprint">Carrier:OLED_26mm_I2C_Provisional</field>
<field name="Datasheet"/>
<field name="Description"/>
</fields>
<libsource lib="Carrier" part="OLED_I2C_26mm" description="User fit-verified 26 mm OLED; front/top header GND VCC SCL SDA"/>
<property name="Status" value="Module outline/header/display user fit-verified; pad/drill fit provisional"/>
<property name="Sheetname" value="serial-carrier"/>
<property name="Sheetfile" value="serial-carrier.kicad_sch"/>
<sheetpath names="/" tstamps="/"/>
<tstamps>0ae411c1-94cc-5551-9037-1d59c01a8ee5</tstamps>
<units>
<unit name="A">
<pins>
<pin num="1"/>
<pin num="2"/>
<pin num="3"/>
<pin num="4"/>
</pins>
</unit>
</units>
</comp>
<comp ref="R1">
<value>2.2k 1%</value>
<footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</footprint>
<fields>
<field name="Rating">At least 0.125 W; exact resistor MPN pending</field>
<field name="Footprint">Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</field>
<field name="Datasheet"/>
<field name="Description"/>
</fields>
<libsource lib="Carrier" part="R" description="Resistor, axial DIN0207 footprint; exact MPN pending"/>
<property name="Rating" value="At least 0.125 W; exact resistor MPN pending"/>
<property name="Sheetname" value="serial-carrier"/>
<property name="Sheetfile" value="serial-carrier.kicad_sch"/>
<sheetpath names="/" tstamps="/"/>
<tstamps>defb78eb-632f-5f9d-a59d-dffbb1d31dec</tstamps>
<units>
<unit name="A">
<pins>
<pin num="1"/>
<pin num="2"/>
</pins>
</unit>
</units>
</comp>
<comp ref="R2">
<value>2.2k 1%</value>
<footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</footprint>
<fields>
<field name="Rating">At least 0.125 W; exact resistor MPN pending</field>
<field name="Footprint">Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</field>
<field name="Datasheet"/>
<field name="Description"/>
</fields>
<libsource lib="Carrier" part="R" description="Resistor, axial DIN0207 footprint; exact MPN pending"/>
<property name="Rating" value="At least 0.125 W; exact resistor MPN pending"/>
<property name="Sheetname" value="serial-carrier"/>
<property name="Sheetfile" value="serial-carrier.kicad_sch"/>
<sheetpath names="/" tstamps="/"/>
<tstamps>405055c0-35ab-5334-ad4d-30d45c5ef6f2</tstamps>
<units>
<unit name="A">
<pins>
<pin num="1"/>
<pin num="2"/>
</pins>
</unit>
</units>
</comp>
<comp ref="R3">
<value>2.2k 1%</value>
<footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</footprint>
<fields>
<field name="Rating">At least 0.125 W; exact resistor MPN pending</field>
<field name="Footprint">Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</field>
<field name="Datasheet"/>
<field name="Description"/>
</fields>
<libsource lib="Carrier" part="R" description="Resistor, axial DIN0207 footprint; exact MPN pending"/>
<property name="Rating" value="At least 0.125 W; exact resistor MPN pending"/>
<property name="Sheetname" value="serial-carrier"/>
<property name="Sheetfile" value="serial-carrier.kicad_sch"/>
<sheetpath names="/" tstamps="/"/>
<tstamps>78f9a74f-5d91-5687-b50e-68176333df23</tstamps>
<units>
<unit name="A">
<pins>
<pin num="1"/>
<pin num="2"/>
</pins>
</unit>
</units>
</comp>
<comp ref="SW1">
<value>B3F-1000</value>
<footprint>Button_Switch_THT:SW_TH_Tactile_Omron_B3F-100x</footprint>
<fields>
<field name="Manufacturer">Omron</field>
<field name="MPN">B3F-1000</field>
<field name="Function">Previous / back</field>
<field name="Procurement">Live stock not verified</field>
<field name="Footprint">Button_Switch_THT:SW_TH_Tactile_Omron_B3F-100x</field>
<field name="Datasheet"/>
<field name="Description"/>
</fields>
<libsource lib="Carrier" part="SW_NO" description="Normally open contact; footprint duplicates pads 1 and 2 for internally common terminal pairs"/>
<property name="Manufacturer" value="Omron"/>
<property name="MPN" value="B3F-1000"/>
<property name="Function" value="Previous / back"/>
<property name="Procurement" value="Live stock not verified"/>
<property name="Sheetname" value="serial-carrier"/>
<property name="Sheetfile" value="serial-carrier.kicad_sch"/>
<sheetpath names="/" tstamps="/"/>
<tstamps>dd5f1f75-0093-55fc-9814-437ed26871eb</tstamps>
<units>
<unit name="A">
<pins>
<pin num="1"/>
<pin num="2"/>
</pins>
</unit>
</units>
</comp>
<comp ref="SW2">
<value>B3F-1000</value>
<footprint>Button_Switch_THT:SW_TH_Tactile_Omron_B3F-100x</footprint>
<fields>
<field name="Manufacturer">Omron</field>
<field name="MPN">B3F-1000</field>
<field name="Function">Select / confirm</field>
<field name="Procurement">Live stock not verified</field>
<field name="Footprint">Button_Switch_THT:SW_TH_Tactile_Omron_B3F-100x</field>
<field name="Datasheet"/>
<field name="Description"/>
</fields>
<libsource lib="Carrier" part="SW_NO" description="Normally open contact; footprint duplicates pads 1 and 2 for internally common terminal pairs"/>
<property name="Manufacturer" value="Omron"/>
<property name="MPN" value="B3F-1000"/>
<property name="Function" value="Select / confirm"/>
<property name="Procurement" value="Live stock not verified"/>
<property name="Sheetname" value="serial-carrier"/>
<property name="Sheetfile" value="serial-carrier.kicad_sch"/>
<sheetpath names="/" tstamps="/"/>
<tstamps>c522a716-55a4-584d-a12e-ab135b4c08eb</tstamps>
<units>
<unit name="A">
<pins>
<pin num="1"/>
<pin num="2"/>
</pins>
</unit>
</units>
</comp>
<comp ref="SW3">
<value>B3F-1000</value>
<footprint>Button_Switch_THT:SW_TH_Tactile_Omron_B3F-100x</footprint>
<fields>
<field name="Manufacturer">Omron</field>
<field name="MPN">B3F-1000</field>
<field name="Function">Next</field>
<field name="Procurement">Live stock not verified</field>
<field name="Footprint">Button_Switch_THT:SW_TH_Tactile_Omron_B3F-100x</field>
<field name="Datasheet"/>
<field name="Description"/>
</fields>
<libsource lib="Carrier" part="SW_NO" description="Normally open contact; footprint duplicates pads 1 and 2 for internally common terminal pairs"/>
<property name="Manufacturer" value="Omron"/>
<property name="MPN" value="B3F-1000"/>
<property name="Function" value="Next"/>
<property name="Procurement" value="Live stock not verified"/>
<property name="Sheetname" value="serial-carrier"/>
<property name="Sheetfile" value="serial-carrier.kicad_sch"/>
<sheetpath names="/" tstamps="/"/>
<tstamps>35caa6bb-42a6-512c-848c-f1e4457aa97f</tstamps>
<units>
<unit name="A">
<pins>
<pin num="1"/>
<pin num="2"/>
</pins>
</unit>
</units>
</comp>
<comp ref="U1">
<value>HW678 / S3-N16R8</value>
<footprint>Carrier:HW678_2x22_Provisional</footprint>
<fields>
<field name="Status">Header geometry nominal; outline/antenna clearance pending</field>
<field name="Pin_numbering">Left 1-22; right 23-44; both top-to-bottom, antenna up</field>
<field name="Footprint">Carrier:HW678_2x22_Provisional</field>
<field name="Datasheet"/>
<field name="Description"/>
</fields>
<libsource lib="Carrier" part="HW678_N16R8" description="HW-678 V0.0.0 / N16R8 carrier interface; project numbering; onboard USB/regulator retained"/>
<property name="Status" value="Header geometry nominal; outline/antenna clearance pending"/>
<property name="Pin_numbering" value="Left 1-22; right 23-44; both top-to-bottom, antenna up"/>
<property name="Sheetname" value="serial-carrier"/>
<property name="Sheetfile" value="serial-carrier.kicad_sch"/>
<sheetpath names="/" tstamps="/"/>
<tstamps>3ab265d0-7fd3-5891-94eb-d39426c6a8a3</tstamps>
<units>
<unit name="A">
<pins>
<pin num="1"/>
<pin num="2"/>
<pin num="3"/>
<pin num="4"/>
<pin num="5"/>
<pin num="6"/>
<pin num="7"/>
<pin num="8"/>
<pin num="9"/>
<pin num="10"/>
<pin num="11"/>
<pin num="12"/>
<pin num="13"/>
<pin num="14"/>
<pin num="15"/>
<pin num="16"/>
<pin num="17"/>
<pin num="18"/>
<pin num="19"/>
<pin num="20"/>
<pin num="21"/>
<pin num="22"/>
<pin num="23"/>
<pin num="24"/>
<pin num="25"/>
<pin num="26"/>
<pin num="27"/>
<pin num="28"/>
<pin num="29"/>
<pin num="30"/>
<pin num="31"/>
<pin num="32"/>
<pin num="33"/>
<pin num="34"/>
<pin num="35"/>
<pin num="36"/>
<pin num="37"/>
<pin num="38"/>
<pin num="39"/>
<pin num="40"/>
<pin num="41"/>
<pin num="42"/>
<pin num="43"/>
<pin num="44"/>
</pins>
</unit>
</units>
</comp>
<comp ref="U2">
<value>Adafruit MAX3243 / male 6253</value>
<fields>
<field name="Status">VERIFY male header numbering; footprint intentionally unassigned</field>
<field name="Datasheet_source">adafruit-research.md; reference female 5988 CAD</field>
<field name="Footprint"/>
<field name="Datasheet"/>
<field name="Description"/>
</fields>
<libsource lib="Carrier" part="MAX3243_Module_Reference" description="Adafruit male 6253 intended; physical numbering from published female 5988 CAD, VERIFY MALE"/>
<property name="Status" value="VERIFY male header numbering; footprint intentionally unassigned"/>
<property name="Datasheet_source" value="adafruit-research.md; reference female 5988 CAD"/>
<property name="Sheetname" value="serial-carrier"/>
<property name="Sheetfile" value="serial-carrier.kicad_sch"/>
<sheetpath names="/" tstamps="/"/>
<tstamps>1127195e-e393-5d1d-9119-b25d10556144</tstamps>
<units>
<unit name="A">
<pins>
<pin num="1"/>
<pin num="2"/>
<pin num="3"/>
<pin num="4"/>
<pin num="5"/>
<pin num="6"/>
<pin num="7"/>
<pin num="8"/>
<pin num="9"/>
<pin num="10"/>
<pin num="11"/>
<pin num="12"/>
</pins>
</unit>
</units>
</comp>
</components>
<libparts>
<libpart lib="Carrier" part="HW678_N16R8">
<description>HW-678 V0.0.0 / N16R8 carrier interface; project numbering; onboard USB/regulator retained</description>
<fields>
<field name="Reference">U</field>
<field name="Value">HW678_N16R8</field>
<field name="Footprint">Carrier:HW678_2x22_Provisional</field>
<field name="Datasheet"/>
<field name="Description">HW-678 V0.0.0 / N16R8 carrier interface; project numbering; onboard USB/regulator retained</field>
</fields>
<pins>
<pin num="1" name="3V3" type="power_out"/>
<pin num="2" name="3V3" type="passive"/>
<pin num="3" name="EN" type="input"/>
<pin num="4" name="GPIO4" type="input"/>
<pin num="5" name="GPIO5" type="input"/>
<pin num="6" name="GPIO6" type="input"/>
<pin num="7" name="GPIO7" type="output"/>
<pin num="8" name="GPIO15" type="output"/>
<pin num="9" name="GPIO16" type="input"/>
<pin num="10" name="GPIO17" type="output"/>
<pin num="11" name="GPIO18" type="input"/>
<pin num="12" name="GPIO8" type="input"/>
<pin num="13" name="GPIO3" type="bidirectional"/>
<pin num="14" name="GPIO46" type="bidirectional"/>
<pin num="15" name="GPIO9" type="bidirectional"/>
<pin num="16" name="GPIO10" type="input"/>
<pin num="17" name="GPIO11" type="bidirectional"/>
<pin num="18" name="GPIO12" type="output"/>
<pin num="19" name="GPIO13" type="input"/>
<pin num="20" name="GPIO14" type="input"/>
<pin num="21" name="5V" type="passive"/>
<pin num="22" name="GND" type="power_out"/>
<pin num="23" name="GND" type="passive"/>
<pin num="24" name="GPIO43" type="bidirectional"/>
<pin num="25" name="GPIO44" type="bidirectional"/>
<pin num="26" name="GPIO1" type="bidirectional"/>
<pin num="27" name="GPIO2" type="bidirectional"/>
<pin num="28" name="GPIO42" type="bidirectional"/>
<pin num="29" name="GPIO41" type="bidirectional"/>
<pin num="30" name="GPIO40" type="bidirectional"/>
<pin num="31" name="GPIO39" type="bidirectional"/>
<pin num="32" name="GPIO38" type="bidirectional"/>
<pin num="33" name="GPIO37" type="bidirectional"/>
<pin num="34" name="GPIO36" type="bidirectional"/>
<pin num="35" name="GPIO35" type="bidirectional"/>
<pin num="36" name="GPIO0" type="bidirectional"/>
<pin num="37" name="GPIO45" type="bidirectional"/>
<pin num="38" name="GPIO48" type="bidirectional"/>
<pin num="39" name="GPIO47" type="bidirectional"/>
<pin num="40" name="GPIO21" type="bidirectional"/>
<pin num="41" name="GPIO20" type="bidirectional"/>
<pin num="42" name="GPIO19" type="bidirectional"/>
<pin num="43" name="GND" type="passive"/>
<pin num="44" name="GND" type="passive"/>
</pins>
</libpart>
<libpart lib="Carrier" part="MAX3243_Module_Reference">
<description>Adafruit male 6253 intended; physical numbering from published female 5988 CAD, VERIFY MALE</description>
<fields>
<field name="Reference">U</field>
<field name="Value">MAX3243_Module_Reference</field>
<field name="Footprint"/>
<field name="Datasheet"/>
<field name="Description">Adafruit male 6253 intended; physical numbering from published female 5988 CAD, VERIFY MALE</field>
</fields>
<pins>
<pin num="1" name="Vin" type="power_in"/>
<pin num="2" name="GND" type="power_in"/>
<pin num="3" name="DCD" type="output"/>
<pin num="4" name="RX" type="output"/>
<pin num="5" name="TX" type="input"/>
<pin num="6" name="DTR" type="input"/>
<pin num="7" name="DSR" type="output"/>
<pin num="8" name="RTS" type="input"/>
<pin num="9" name="CTS" type="output"/>
<pin num="10" name="RI" type="output"/>
<pin num="11" name="VLD" type="output"/>
<pin num="12" name="OFF_N" type="input"/>
</pins>
</libpart>
<libpart lib="Carrier" part="OLED_I2C_26mm">
<description>User fit-verified 26 mm OLED; front/top header GND VCC SCL SDA</description>
<fields>
<field name="Reference">DS</field>
<field name="Value">OLED_I2C_26mm</field>
<field name="Footprint">Carrier:OLED_26mm_I2C_Provisional</field>
<field name="Datasheet"/>
<field name="Description">User fit-verified 26 mm OLED; front/top header GND VCC SCL SDA</field>
</fields>
<pins>
<pin num="1" name="GND" type="power_in"/>
<pin num="2" name="VCC" type="power_in"/>
<pin num="3" name="SCL" type="input"/>
<pin num="4" name="SDA" type="bidirectional"/>
</pins>
</libpart>
<libpart lib="Carrier" part="R">
<description>Resistor, axial DIN0207 footprint; exact MPN pending</description>
<fields>
<field name="Reference">R</field>
<field name="Value">R</field>
<field name="Footprint">Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</field>
<field name="Datasheet"/>
<field name="Description">Resistor, axial DIN0207 footprint; exact MPN pending</field>
</fields>
<pins>
<pin num="1" name="" type="passive"/>
<pin num="2" name="" type="passive"/>
</pins>
</libpart>
<libpart lib="Carrier" part="SW_NO">
<description>Normally open contact; footprint duplicates pads 1 and 2 for internally common terminal pairs</description>
<fields>
<field name="Reference">SW</field>
<field name="Value">SW_NO</field>
<field name="Footprint">Button_Switch_THT:SW_TH_Tactile_Omron_B3F-100x</field>
<field name="Datasheet"/>
<field name="Description">Normally open contact; footprint duplicates pads 1 and 2 for internally common terminal pairs</field>
</fields>
<pins>
<pin num="1" name="" type="passive"/>
<pin num="2" name="" type="passive"/>
</pins>
</libpart>
</libparts>
<libraries>
<library logical="Carrier">
<uri>${KIPRJMOD}/Carrier.kicad_sym</uri>
</library>
</libraries>
<nets>
<net code="1" name="/+3V3" class="Power">
<node ref="DS1" pin="2" pinfunction="VCC_2" pintype="power_in"/>
<node ref="R1" pin="1" pintype="passive"/>
<node ref="R2" pin="1" pintype="passive"/>
<node ref="R3" pin="1" pintype="passive"/>
<node ref="U1" pin="1" pinfunction="3V3_1" pintype="power_out"/>
<node ref="U1" pin="2" pinfunction="3V3_2" pintype="passive"/>
<node ref="U2" pin="1" pinfunction="Vin_1" pintype="power_in"/>
</net>
<net code="2" name="/BTN_NEXT" class="Default">
<node ref="R3" pin="2" pintype="passive"/>
<node ref="SW3" pin="1" pintype="passive"/>
<node ref="U1" pin="20" pinfunction="GPIO14_20" pintype="input"/>
</net>
<net code="3" name="/BTN_PREVIOUS" class="Default">
<node ref="R1" pin="2" pintype="passive"/>
<node ref="SW1" pin="1" pintype="passive"/>
<node ref="U1" pin="16" pinfunction="GPIO10_16" pintype="input"/>
</net>
<net code="4" name="/BTN_SELECT" class="Default">
<node ref="R2" pin="2" pintype="passive"/>
<node ref="SW2" pin="1" pintype="passive"/>
<node ref="U1" pin="19" pinfunction="GPIO13_19" pintype="input"/>
</net>
<net code="5" name="/GND" class="Power">
<node ref="DS1" pin="1" pinfunction="GND_1" pintype="power_in"/>
<node ref="SW1" pin="2" pintype="passive"/>
<node ref="SW2" pin="2" pintype="passive"/>
<node ref="SW3" pin="2" pintype="passive"/>
<node ref="U1" pin="22" pinfunction="GND_22" pintype="power_out"/>
<node ref="U1" pin="23" pinfunction="GND_23" pintype="passive"/>
<node ref="U1" pin="43" pinfunction="GND_43" pintype="passive"/>
<node ref="U1" pin="44" pinfunction="GND_44" pintype="passive"/>
<node ref="U2" pin="2" pinfunction="GND_2" pintype="power_in"/>
</net>
<net code="6" name="/OLED_SCL" class="Default">
<node ref="DS1" pin="3" pinfunction="SCL_3" pintype="input"/>
<node ref="U1" pin="18" pinfunction="GPIO12_18" pintype="output"/>
</net>
<net code="7" name="/OLED_SDA" class="Default">
<node ref="DS1" pin="4" pinfunction="SDA_4" pintype="bidirectional"/>
<node ref="U1" pin="17" pinfunction="GPIO11_17" pintype="bidirectional"/>
</net>
<net code="8" name="/RS_CTS" class="Default">
<node ref="U1" pin="9" pinfunction="GPIO16_9" pintype="input"/>
<node ref="U2" pin="9" pinfunction="CTS_9" pintype="output"/>
</net>
<net code="9" name="/RS_DCD" class="Default">
<node ref="U1" pin="4" pinfunction="GPIO4_4" pintype="input"/>
<node ref="U2" pin="3" pinfunction="DCD_3" pintype="output"/>
</net>
<net code="10" name="/RS_DSR" class="Default">
<node ref="U1" pin="5" pinfunction="GPIO5_5" pintype="input"/>
<node ref="U2" pin="7" pinfunction="DSR_7" pintype="output"/>
</net>
<net code="11" name="/RS_DTR" class="Default">
<node ref="U1" pin="7" pinfunction="GPIO7_7" pintype="output"/>
<node ref="U2" pin="6" pinfunction="DTR_6" pintype="input"/>
</net>
<net code="12" name="/RS_OFF_N" class="Default">
<node ref="U1" pin="15" pinfunction="GPIO9_15" pintype="bidirectional"/>
<node ref="U2" pin="12" pinfunction="OFF_N_12" pintype="input"/>
</net>
<net code="13" name="/RS_RI" class="Default">
<node ref="U1" pin="6" pinfunction="GPIO6_6" pintype="input"/>
<node ref="U2" pin="10" pinfunction="RI_10" pintype="output"/>
</net>
<net code="14" name="/RS_RTS" class="Default">
<node ref="U1" pin="8" pinfunction="GPIO15_8" pintype="output"/>
<node ref="U2" pin="8" pinfunction="RTS_8" pintype="input"/>
</net>
<net code="15" name="/RS_RX" class="Default">
<node ref="U1" pin="11" pinfunction="GPIO18_11" pintype="input"/>
<node ref="U2" pin="4" pinfunction="RX_4" pintype="output"/>
</net>
<net code="16" name="/RS_TX" class="Default">
<node ref="U1" pin="10" pinfunction="GPIO17_10" pintype="output"/>
<node ref="U2" pin="5" pinfunction="TX_5" pintype="input"/>
</net>
<net code="17" name="/RS_VALID" class="Default">
<node ref="U1" pin="12" pinfunction="GPIO8_12" pintype="input"/>
<node ref="U2" pin="11" pinfunction="VLD_11" pintype="output"/>
</net>
<net code="18" name="unconnected-(U1-5V-Pad21)" class="Default">
<node ref="U1" pin="21" pinfunction="5V_21" pintype="passive+no_connect"/>
</net>
<net code="19" name="unconnected-(U1-EN-Pad3)" class="Default">
<node ref="U1" pin="3" pinfunction="EN_3" pintype="input+no_connect"/>
</net>
<net code="20" name="unconnected-(U1-GPIO0-Pad36)" class="Default">
<node ref="U1" pin="36" pinfunction="GPIO0_36" pintype="bidirectional+no_connect"/>
</net>
<net code="21" name="unconnected-(U1-GPIO1-Pad26)" class="Default">
<node ref="U1" pin="26" pinfunction="GPIO1_26" pintype="bidirectional+no_connect"/>
</net>
<net code="22" name="unconnected-(U1-GPIO2-Pad27)" class="Default">
<node ref="U1" pin="27" pinfunction="GPIO2_27" pintype="bidirectional+no_connect"/>
</net>
<net code="23" name="unconnected-(U1-GPIO3-Pad13)" class="Default">
<node ref="U1" pin="13" pinfunction="GPIO3_13" pintype="bidirectional+no_connect"/>
</net>
<net code="24" name="unconnected-(U1-GPIO19-Pad42)" class="Default">
<node ref="U1" pin="42" pinfunction="GPIO19_42" pintype="bidirectional+no_connect"/>
</net>
<net code="25" name="unconnected-(U1-GPIO20-Pad41)" class="Default">
<node ref="U1" pin="41" pinfunction="GPIO20_41" pintype="bidirectional+no_connect"/>
</net>
<net code="26" name="unconnected-(U1-GPIO21-Pad40)" class="Default">
<node ref="U1" pin="40" pinfunction="GPIO21_40" pintype="bidirectional+no_connect"/>
</net>
<net code="27" name="unconnected-(U1-GPIO35-Pad35)" class="Default">
<node ref="U1" pin="35" pinfunction="GPIO35_35" pintype="bidirectional+no_connect"/>
</net>
<net code="28" name="unconnected-(U1-GPIO36-Pad34)" class="Default">
<node ref="U1" pin="34" pinfunction="GPIO36_34" pintype="bidirectional+no_connect"/>
</net>
<net code="29" name="unconnected-(U1-GPIO37-Pad33)" class="Default">
<node ref="U1" pin="33" pinfunction="GPIO37_33" pintype="bidirectional+no_connect"/>
</net>
<net code="30" name="unconnected-(U1-GPIO38-Pad32)" class="Default">
<node ref="U1" pin="32" pinfunction="GPIO38_32" pintype="bidirectional+no_connect"/>
</net>
<net code="31" name="unconnected-(U1-GPIO39-Pad31)" class="Default">
<node ref="U1" pin="31" pinfunction="GPIO39_31" pintype="bidirectional+no_connect"/>
</net>
<net code="32" name="unconnected-(U1-GPIO40-Pad30)" class="Default">
<node ref="U1" pin="30" pinfunction="GPIO40_30" pintype="bidirectional+no_connect"/>
</net>
<net code="33" name="unconnected-(U1-GPIO41-Pad29)" class="Default">
<node ref="U1" pin="29" pinfunction="GPIO41_29" pintype="bidirectional+no_connect"/>
</net>
<net code="34" name="unconnected-(U1-GPIO42-Pad28)" class="Default">
<node ref="U1" pin="28" pinfunction="GPIO42_28" pintype="bidirectional+no_connect"/>
</net>
<net code="35" name="unconnected-(U1-GPIO43-Pad24)" class="Default">
<node ref="U1" pin="24" pinfunction="GPIO43_24" pintype="bidirectional+no_connect"/>
</net>
<net code="36" name="unconnected-(U1-GPIO44-Pad25)" class="Default">
<node ref="U1" pin="25" pinfunction="GPIO44_25" pintype="bidirectional+no_connect"/>
</net>
<net code="37" name="unconnected-(U1-GPIO45-Pad37)" class="Default">
<node ref="U1" pin="37" pinfunction="GPIO45_37" pintype="bidirectional+no_connect"/>
</net>
<net code="38" name="unconnected-(U1-GPIO46-Pad14)" class="Default">
<node ref="U1" pin="14" pinfunction="GPIO46_14" pintype="bidirectional+no_connect"/>
</net>
<net code="39" name="unconnected-(U1-GPIO47-Pad39)" class="Default">
<node ref="U1" pin="39" pinfunction="GPIO47_39" pintype="bidirectional+no_connect"/>
</net>
<net code="40" name="unconnected-(U1-GPIO48-Pad38)" class="Default">
<node ref="U1" pin="38" pinfunction="GPIO48_38" pintype="bidirectional+no_connect"/>
</net>
</nets>
</export>
@@ -0,0 +1,47 @@
{
"carrier_bounds_mm": [
82,
80
],
"copper_layers": 2,
"draft_thickness_mm": 1.6,
"electrical_footprints": 9,
"proposed_M3_mounts": 4,
"physical_DRC_violations": 0,
"unconnected_items": 0,
"schematic_pad_nets_match": true,
"known_parity_warning": "U2 provisional female-reference footprint assigned on PCB only; schematic footprint intentionally blank",
"ignored_DRC_checks": [
{
"description": "Footprint has no courtyard defined",
"key": "missing_courtyard"
},
{
"description": "Track endpoint not centered on via",
"key": "track_not_centered_on_via"
},
{
"description": "Tuning profile track geometries",
"key": "tuning_profile_track_geometries"
},
{
"description": "Footprint doesn't match symbol's footprint filters",
"key": "footprint_filters_mismatch"
},
{
"description": "Footprint component type doesn't match footprint pads",
"key": "footprint_type_mismatch"
}
],
"not_validated": [
"male module pin map/fit",
"assembly envelope and heights",
"header/socket fit",
"RF performance and antenna clearance",
"power/return-path integrity",
"USB power path",
"OLED pull-ups",
"fabrication process",
"hardware operation"
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 1.3 MiB

+604
View File
@@ -0,0 +1,604 @@
<?xml version="1.0" encoding="UTF-8"?>
<export version="E">
<design>
<source>/home/mscholz/Repos/ESP32_serial_swiss_army_knife/hardware/PCB/serial-carrier.kicad_sch</source>
<date>2026-09-20T20:14:45</date>
<tool>Eeschema 10.0.6-1.fc44</tool>
<sheet number="1" name="/" tstamps="/">
<title_block>
<title>ESP32 Serial Swiss Army Knife - Module Carrier</title>
<company/>
<rev>A0 DRAFT</rev>
<date>2026-09-20</date>
<source>serial-carrier.kicad_sch</source>
<comment number="1" value="Not fabrication-ready: provisional module footprints and male RS-232 mapping"/>
<comment number="2" value=""/>
<comment number="3" value=""/>
<comment number="4" value=""/>
<comment number="5" value=""/>
<comment number="6" value=""/>
<comment number="7" value=""/>
<comment number="8" value=""/>
<comment number="9" value=""/>
</title_block>
</sheet>
</design>
<components>
<comp ref="DS1">
<value>128x64 I2C OLED / 0x3C</value>
<footprint>Carrier:OLED_26mm_I2C_Provisional</footprint>
<fields>
<field name="Status">Module outline/header/display user fit-verified; pad/drill fit provisional</field>
<field name="Footprint">Carrier:OLED_26mm_I2C_Provisional</field>
<field name="Datasheet"/>
<field name="Description"/>
</fields>
<libsource lib="Carrier" part="OLED_I2C_26mm" description="User fit-verified 26 mm OLED; front/top header GND VCC SCL SDA"/>
<property name="Status" value="Module outline/header/display user fit-verified; pad/drill fit provisional"/>
<property name="Sheetname" value="serial-carrier"/>
<property name="Sheetfile" value="serial-carrier.kicad_sch"/>
<sheetpath names="/" tstamps="/"/>
<tstamps>0ae411c1-94cc-5551-9037-1d59c01a8ee5</tstamps>
<units>
<unit name="A">
<pins>
<pin num="1"/>
<pin num="2"/>
<pin num="3"/>
<pin num="4"/>
</pins>
</unit>
</units>
</comp>
<comp ref="R1">
<value>2.2k 1%</value>
<footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</footprint>
<fields>
<field name="Rating">At least 0.125 W; exact resistor MPN pending</field>
<field name="Footprint">Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</field>
<field name="Datasheet"/>
<field name="Description"/>
</fields>
<libsource lib="Carrier" part="R" description="Resistor, axial DIN0207 footprint; exact MPN pending"/>
<property name="Rating" value="At least 0.125 W; exact resistor MPN pending"/>
<property name="Sheetname" value="serial-carrier"/>
<property name="Sheetfile" value="serial-carrier.kicad_sch"/>
<sheetpath names="/" tstamps="/"/>
<tstamps>defb78eb-632f-5f9d-a59d-dffbb1d31dec</tstamps>
<units>
<unit name="A">
<pins>
<pin num="1"/>
<pin num="2"/>
</pins>
</unit>
</units>
</comp>
<comp ref="R2">
<value>2.2k 1%</value>
<footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</footprint>
<fields>
<field name="Rating">At least 0.125 W; exact resistor MPN pending</field>
<field name="Footprint">Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</field>
<field name="Datasheet"/>
<field name="Description"/>
</fields>
<libsource lib="Carrier" part="R" description="Resistor, axial DIN0207 footprint; exact MPN pending"/>
<property name="Rating" value="At least 0.125 W; exact resistor MPN pending"/>
<property name="Sheetname" value="serial-carrier"/>
<property name="Sheetfile" value="serial-carrier.kicad_sch"/>
<sheetpath names="/" tstamps="/"/>
<tstamps>405055c0-35ab-5334-ad4d-30d45c5ef6f2</tstamps>
<units>
<unit name="A">
<pins>
<pin num="1"/>
<pin num="2"/>
</pins>
</unit>
</units>
</comp>
<comp ref="R3">
<value>2.2k 1%</value>
<footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</footprint>
<fields>
<field name="Rating">At least 0.125 W; exact resistor MPN pending</field>
<field name="Footprint">Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</field>
<field name="Datasheet"/>
<field name="Description"/>
</fields>
<libsource lib="Carrier" part="R" description="Resistor, axial DIN0207 footprint; exact MPN pending"/>
<property name="Rating" value="At least 0.125 W; exact resistor MPN pending"/>
<property name="Sheetname" value="serial-carrier"/>
<property name="Sheetfile" value="serial-carrier.kicad_sch"/>
<sheetpath names="/" tstamps="/"/>
<tstamps>78f9a74f-5d91-5687-b50e-68176333df23</tstamps>
<units>
<unit name="A">
<pins>
<pin num="1"/>
<pin num="2"/>
</pins>
</unit>
</units>
</comp>
<comp ref="SW1">
<value>B3F-1000</value>
<footprint>Button_Switch_THT:SW_TH_Tactile_Omron_B3F-100x</footprint>
<fields>
<field name="Manufacturer">Omron</field>
<field name="MPN">B3F-1000</field>
<field name="Function">Previous / back</field>
<field name="Procurement">Live stock not verified</field>
<field name="Footprint">Button_Switch_THT:SW_TH_Tactile_Omron_B3F-100x</field>
<field name="Datasheet"/>
<field name="Description"/>
</fields>
<libsource lib="Carrier" part="SW_NO" description="Normally open contact; footprint duplicates pads 1 and 2 for internally common terminal pairs"/>
<property name="Manufacturer" value="Omron"/>
<property name="MPN" value="B3F-1000"/>
<property name="Function" value="Previous / back"/>
<property name="Procurement" value="Live stock not verified"/>
<property name="Sheetname" value="serial-carrier"/>
<property name="Sheetfile" value="serial-carrier.kicad_sch"/>
<sheetpath names="/" tstamps="/"/>
<tstamps>dd5f1f75-0093-55fc-9814-437ed26871eb</tstamps>
<units>
<unit name="A">
<pins>
<pin num="1"/>
<pin num="2"/>
</pins>
</unit>
</units>
</comp>
<comp ref="SW2">
<value>B3F-1000</value>
<footprint>Button_Switch_THT:SW_TH_Tactile_Omron_B3F-100x</footprint>
<fields>
<field name="Manufacturer">Omron</field>
<field name="MPN">B3F-1000</field>
<field name="Function">Select / confirm</field>
<field name="Procurement">Live stock not verified</field>
<field name="Footprint">Button_Switch_THT:SW_TH_Tactile_Omron_B3F-100x</field>
<field name="Datasheet"/>
<field name="Description"/>
</fields>
<libsource lib="Carrier" part="SW_NO" description="Normally open contact; footprint duplicates pads 1 and 2 for internally common terminal pairs"/>
<property name="Manufacturer" value="Omron"/>
<property name="MPN" value="B3F-1000"/>
<property name="Function" value="Select / confirm"/>
<property name="Procurement" value="Live stock not verified"/>
<property name="Sheetname" value="serial-carrier"/>
<property name="Sheetfile" value="serial-carrier.kicad_sch"/>
<sheetpath names="/" tstamps="/"/>
<tstamps>c522a716-55a4-584d-a12e-ab135b4c08eb</tstamps>
<units>
<unit name="A">
<pins>
<pin num="1"/>
<pin num="2"/>
</pins>
</unit>
</units>
</comp>
<comp ref="SW3">
<value>B3F-1000</value>
<footprint>Button_Switch_THT:SW_TH_Tactile_Omron_B3F-100x</footprint>
<fields>
<field name="Manufacturer">Omron</field>
<field name="MPN">B3F-1000</field>
<field name="Function">Next</field>
<field name="Procurement">Live stock not verified</field>
<field name="Footprint">Button_Switch_THT:SW_TH_Tactile_Omron_B3F-100x</field>
<field name="Datasheet"/>
<field name="Description"/>
</fields>
<libsource lib="Carrier" part="SW_NO" description="Normally open contact; footprint duplicates pads 1 and 2 for internally common terminal pairs"/>
<property name="Manufacturer" value="Omron"/>
<property name="MPN" value="B3F-1000"/>
<property name="Function" value="Next"/>
<property name="Procurement" value="Live stock not verified"/>
<property name="Sheetname" value="serial-carrier"/>
<property name="Sheetfile" value="serial-carrier.kicad_sch"/>
<sheetpath names="/" tstamps="/"/>
<tstamps>35caa6bb-42a6-512c-848c-f1e4457aa97f</tstamps>
<units>
<unit name="A">
<pins>
<pin num="1"/>
<pin num="2"/>
</pins>
</unit>
</units>
</comp>
<comp ref="U1">
<value>HW678 / S3-N16R8</value>
<footprint>Carrier:HW678_2x22_Provisional</footprint>
<fields>
<field name="Status">Header geometry nominal; outline/antenna clearance pending</field>
<field name="Pin_numbering">Left 1-22; right 23-44; both top-to-bottom, antenna up</field>
<field name="Footprint">Carrier:HW678_2x22_Provisional</field>
<field name="Datasheet"/>
<field name="Description"/>
</fields>
<libsource lib="Carrier" part="HW678_N16R8" description="HW-678 V0.0.0 / N16R8 carrier interface; project numbering; onboard USB/regulator retained"/>
<property name="Status" value="Header geometry nominal; outline/antenna clearance pending"/>
<property name="Pin_numbering" value="Left 1-22; right 23-44; both top-to-bottom, antenna up"/>
<property name="Sheetname" value="serial-carrier"/>
<property name="Sheetfile" value="serial-carrier.kicad_sch"/>
<sheetpath names="/" tstamps="/"/>
<tstamps>3ab265d0-7fd3-5891-94eb-d39426c6a8a3</tstamps>
<units>
<unit name="A">
<pins>
<pin num="1"/>
<pin num="2"/>
<pin num="3"/>
<pin num="4"/>
<pin num="5"/>
<pin num="6"/>
<pin num="7"/>
<pin num="8"/>
<pin num="9"/>
<pin num="10"/>
<pin num="11"/>
<pin num="12"/>
<pin num="13"/>
<pin num="14"/>
<pin num="15"/>
<pin num="16"/>
<pin num="17"/>
<pin num="18"/>
<pin num="19"/>
<pin num="20"/>
<pin num="21"/>
<pin num="22"/>
<pin num="23"/>
<pin num="24"/>
<pin num="25"/>
<pin num="26"/>
<pin num="27"/>
<pin num="28"/>
<pin num="29"/>
<pin num="30"/>
<pin num="31"/>
<pin num="32"/>
<pin num="33"/>
<pin num="34"/>
<pin num="35"/>
<pin num="36"/>
<pin num="37"/>
<pin num="38"/>
<pin num="39"/>
<pin num="40"/>
<pin num="41"/>
<pin num="42"/>
<pin num="43"/>
<pin num="44"/>
</pins>
</unit>
</units>
</comp>
<comp ref="U2">
<value>Adafruit MAX3243 / male 6253</value>
<fields>
<field name="Status">VERIFY male header numbering; footprint intentionally unassigned</field>
<field name="Datasheet_source">adafruit-research.md; reference female 5988 CAD</field>
<field name="Footprint"/>
<field name="Datasheet"/>
<field name="Description"/>
</fields>
<libsource lib="Carrier" part="MAX3243_Module_Reference" description="Adafruit male 6253 intended; physical numbering from published female 5988 CAD, VERIFY MALE"/>
<property name="Status" value="VERIFY male header numbering; footprint intentionally unassigned"/>
<property name="Datasheet_source" value="adafruit-research.md; reference female 5988 CAD"/>
<property name="Sheetname" value="serial-carrier"/>
<property name="Sheetfile" value="serial-carrier.kicad_sch"/>
<sheetpath names="/" tstamps="/"/>
<tstamps>1127195e-e393-5d1d-9119-b25d10556144</tstamps>
<units>
<unit name="A">
<pins>
<pin num="1"/>
<pin num="2"/>
<pin num="3"/>
<pin num="4"/>
<pin num="5"/>
<pin num="6"/>
<pin num="7"/>
<pin num="8"/>
<pin num="9"/>
<pin num="10"/>
<pin num="11"/>
<pin num="12"/>
</pins>
</unit>
</units>
</comp>
</components>
<libparts>
<libpart lib="Carrier" part="HW678_N16R8">
<description>HW-678 V0.0.0 / N16R8 carrier interface; project numbering; onboard USB/regulator retained</description>
<fields>
<field name="Reference">U</field>
<field name="Value">HW678_N16R8</field>
<field name="Footprint">Carrier:HW678_2x22_Provisional</field>
<field name="Datasheet"/>
<field name="Description">HW-678 V0.0.0 / N16R8 carrier interface; project numbering; onboard USB/regulator retained</field>
</fields>
<pins>
<pin num="1" name="3V3" type="power_out"/>
<pin num="2" name="3V3" type="passive"/>
<pin num="3" name="EN" type="input"/>
<pin num="4" name="GPIO4" type="input"/>
<pin num="5" name="GPIO5" type="input"/>
<pin num="6" name="GPIO6" type="input"/>
<pin num="7" name="GPIO7" type="output"/>
<pin num="8" name="GPIO15" type="output"/>
<pin num="9" name="GPIO16" type="input"/>
<pin num="10" name="GPIO17" type="output"/>
<pin num="11" name="GPIO18" type="input"/>
<pin num="12" name="GPIO8" type="input"/>
<pin num="13" name="GPIO3" type="bidirectional"/>
<pin num="14" name="GPIO46" type="bidirectional"/>
<pin num="15" name="GPIO9" type="bidirectional"/>
<pin num="16" name="GPIO10" type="input"/>
<pin num="17" name="GPIO11" type="bidirectional"/>
<pin num="18" name="GPIO12" type="output"/>
<pin num="19" name="GPIO13" type="input"/>
<pin num="20" name="GPIO14" type="input"/>
<pin num="21" name="5V" type="passive"/>
<pin num="22" name="GND" type="power_out"/>
<pin num="23" name="GND" type="passive"/>
<pin num="24" name="GPIO43" type="bidirectional"/>
<pin num="25" name="GPIO44" type="bidirectional"/>
<pin num="26" name="GPIO1" type="bidirectional"/>
<pin num="27" name="GPIO2" type="bidirectional"/>
<pin num="28" name="GPIO42" type="bidirectional"/>
<pin num="29" name="GPIO41" type="bidirectional"/>
<pin num="30" name="GPIO40" type="bidirectional"/>
<pin num="31" name="GPIO39" type="bidirectional"/>
<pin num="32" name="GPIO38" type="bidirectional"/>
<pin num="33" name="GPIO37" type="bidirectional"/>
<pin num="34" name="GPIO36" type="bidirectional"/>
<pin num="35" name="GPIO35" type="bidirectional"/>
<pin num="36" name="GPIO0" type="bidirectional"/>
<pin num="37" name="GPIO45" type="bidirectional"/>
<pin num="38" name="GPIO48" type="bidirectional"/>
<pin num="39" name="GPIO47" type="bidirectional"/>
<pin num="40" name="GPIO21" type="bidirectional"/>
<pin num="41" name="GPIO20" type="bidirectional"/>
<pin num="42" name="GPIO19" type="bidirectional"/>
<pin num="43" name="GND" type="passive"/>
<pin num="44" name="GND" type="passive"/>
</pins>
</libpart>
<libpart lib="Carrier" part="MAX3243_Module_Reference">
<description>Adafruit male 6253 intended; physical numbering from published female 5988 CAD, VERIFY MALE</description>
<fields>
<field name="Reference">U</field>
<field name="Value">MAX3243_Module_Reference</field>
<field name="Footprint"/>
<field name="Datasheet"/>
<field name="Description">Adafruit male 6253 intended; physical numbering from published female 5988 CAD, VERIFY MALE</field>
</fields>
<pins>
<pin num="1" name="Vin" type="power_in"/>
<pin num="2" name="GND" type="power_in"/>
<pin num="3" name="DCD" type="output"/>
<pin num="4" name="RX" type="output"/>
<pin num="5" name="TX" type="input"/>
<pin num="6" name="DTR" type="input"/>
<pin num="7" name="DSR" type="output"/>
<pin num="8" name="RTS" type="input"/>
<pin num="9" name="CTS" type="output"/>
<pin num="10" name="RI" type="output"/>
<pin num="11" name="VLD" type="output"/>
<pin num="12" name="OFF_N" type="input"/>
</pins>
</libpart>
<libpart lib="Carrier" part="OLED_I2C_26mm">
<description>User fit-verified 26 mm OLED; front/top header GND VCC SCL SDA</description>
<fields>
<field name="Reference">DS</field>
<field name="Value">OLED_I2C_26mm</field>
<field name="Footprint">Carrier:OLED_26mm_I2C_Provisional</field>
<field name="Datasheet"/>
<field name="Description">User fit-verified 26 mm OLED; front/top header GND VCC SCL SDA</field>
</fields>
<pins>
<pin num="1" name="GND" type="power_in"/>
<pin num="2" name="VCC" type="power_in"/>
<pin num="3" name="SCL" type="input"/>
<pin num="4" name="SDA" type="bidirectional"/>
</pins>
</libpart>
<libpart lib="Carrier" part="R">
<description>Resistor, axial DIN0207 footprint; exact MPN pending</description>
<fields>
<field name="Reference">R</field>
<field name="Value">R</field>
<field name="Footprint">Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal</field>
<field name="Datasheet"/>
<field name="Description">Resistor, axial DIN0207 footprint; exact MPN pending</field>
</fields>
<pins>
<pin num="1" name="" type="passive"/>
<pin num="2" name="" type="passive"/>
</pins>
</libpart>
<libpart lib="Carrier" part="SW_NO">
<description>Normally open contact; footprint duplicates pads 1 and 2 for internally common terminal pairs</description>
<fields>
<field name="Reference">SW</field>
<field name="Value">SW_NO</field>
<field name="Footprint">Button_Switch_THT:SW_TH_Tactile_Omron_B3F-100x</field>
<field name="Datasheet"/>
<field name="Description">Normally open contact; footprint duplicates pads 1 and 2 for internally common terminal pairs</field>
</fields>
<pins>
<pin num="1" name="" type="passive"/>
<pin num="2" name="" type="passive"/>
</pins>
</libpart>
</libparts>
<libraries>
<library logical="Carrier">
<uri>${KIPRJMOD}/Carrier.kicad_sym</uri>
</library>
</libraries>
<nets>
<net code="1" name="/+3V3" class="Default">
<node ref="DS1" pin="2" pinfunction="VCC_2" pintype="power_in"/>
<node ref="R1" pin="1" pintype="passive"/>
<node ref="R2" pin="1" pintype="passive"/>
<node ref="R3" pin="1" pintype="passive"/>
<node ref="U1" pin="1" pinfunction="3V3_1" pintype="power_out"/>
<node ref="U1" pin="2" pinfunction="3V3_2" pintype="passive"/>
<node ref="U2" pin="1" pinfunction="Vin_1" pintype="power_in"/>
</net>
<net code="2" name="/BTN_NEXT" class="Default">
<node ref="R3" pin="2" pintype="passive"/>
<node ref="SW3" pin="1" pintype="passive"/>
<node ref="U1" pin="20" pinfunction="GPIO14_20" pintype="input"/>
</net>
<net code="3" name="/BTN_PREVIOUS" class="Default">
<node ref="R1" pin="2" pintype="passive"/>
<node ref="SW1" pin="1" pintype="passive"/>
<node ref="U1" pin="16" pinfunction="GPIO10_16" pintype="input"/>
</net>
<net code="4" name="/BTN_SELECT" class="Default">
<node ref="R2" pin="2" pintype="passive"/>
<node ref="SW2" pin="1" pintype="passive"/>
<node ref="U1" pin="19" pinfunction="GPIO13_19" pintype="input"/>
</net>
<net code="5" name="/GND" class="Default">
<node ref="DS1" pin="1" pinfunction="GND_1" pintype="power_in"/>
<node ref="SW1" pin="2" pintype="passive"/>
<node ref="SW2" pin="2" pintype="passive"/>
<node ref="SW3" pin="2" pintype="passive"/>
<node ref="U1" pin="22" pinfunction="GND_22" pintype="power_out"/>
<node ref="U1" pin="23" pinfunction="GND_23" pintype="passive"/>
<node ref="U1" pin="43" pinfunction="GND_43" pintype="passive"/>
<node ref="U1" pin="44" pinfunction="GND_44" pintype="passive"/>
<node ref="U2" pin="2" pinfunction="GND_2" pintype="power_in"/>
</net>
<net code="6" name="/OLED_SCL" class="Default">
<node ref="DS1" pin="3" pinfunction="SCL_3" pintype="input"/>
<node ref="U1" pin="18" pinfunction="GPIO12_18" pintype="output"/>
</net>
<net code="7" name="/OLED_SDA" class="Default">
<node ref="DS1" pin="4" pinfunction="SDA_4" pintype="bidirectional"/>
<node ref="U1" pin="17" pinfunction="GPIO11_17" pintype="bidirectional"/>
</net>
<net code="8" name="/RS_CTS" class="Default">
<node ref="U1" pin="9" pinfunction="GPIO16_9" pintype="input"/>
<node ref="U2" pin="9" pinfunction="CTS_9" pintype="output"/>
</net>
<net code="9" name="/RS_DCD" class="Default">
<node ref="U1" pin="4" pinfunction="GPIO4_4" pintype="input"/>
<node ref="U2" pin="3" pinfunction="DCD_3" pintype="output"/>
</net>
<net code="10" name="/RS_DSR" class="Default">
<node ref="U1" pin="5" pinfunction="GPIO5_5" pintype="input"/>
<node ref="U2" pin="7" pinfunction="DSR_7" pintype="output"/>
</net>
<net code="11" name="/RS_DTR" class="Default">
<node ref="U1" pin="7" pinfunction="GPIO7_7" pintype="output"/>
<node ref="U2" pin="6" pinfunction="DTR_6" pintype="input"/>
</net>
<net code="12" name="/RS_OFF_N" class="Default">
<node ref="U1" pin="15" pinfunction="GPIO9_15" pintype="bidirectional"/>
<node ref="U2" pin="12" pinfunction="OFF_N_12" pintype="input"/>
</net>
<net code="13" name="/RS_RI" class="Default">
<node ref="U1" pin="6" pinfunction="GPIO6_6" pintype="input"/>
<node ref="U2" pin="10" pinfunction="RI_10" pintype="output"/>
</net>
<net code="14" name="/RS_RTS" class="Default">
<node ref="U1" pin="8" pinfunction="GPIO15_8" pintype="output"/>
<node ref="U2" pin="8" pinfunction="RTS_8" pintype="input"/>
</net>
<net code="15" name="/RS_RX" class="Default">
<node ref="U1" pin="11" pinfunction="GPIO18_11" pintype="input"/>
<node ref="U2" pin="4" pinfunction="RX_4" pintype="output"/>
</net>
<net code="16" name="/RS_TX" class="Default">
<node ref="U1" pin="10" pinfunction="GPIO17_10" pintype="output"/>
<node ref="U2" pin="5" pinfunction="TX_5" pintype="input"/>
</net>
<net code="17" name="/RS_VALID" class="Default">
<node ref="U1" pin="12" pinfunction="GPIO8_12" pintype="input"/>
<node ref="U2" pin="11" pinfunction="VLD_11" pintype="output"/>
</net>
<net code="18" name="unconnected-(U1-5V-Pad21)" class="Default">
<node ref="U1" pin="21" pinfunction="5V_21" pintype="passive+no_connect"/>
</net>
<net code="19" name="unconnected-(U1-EN-Pad3)" class="Default">
<node ref="U1" pin="3" pinfunction="EN_3" pintype="input+no_connect"/>
</net>
<net code="20" name="unconnected-(U1-GPIO0-Pad36)" class="Default">
<node ref="U1" pin="36" pinfunction="GPIO0_36" pintype="bidirectional+no_connect"/>
</net>
<net code="21" name="unconnected-(U1-GPIO1-Pad26)" class="Default">
<node ref="U1" pin="26" pinfunction="GPIO1_26" pintype="bidirectional+no_connect"/>
</net>
<net code="22" name="unconnected-(U1-GPIO2-Pad27)" class="Default">
<node ref="U1" pin="27" pinfunction="GPIO2_27" pintype="bidirectional+no_connect"/>
</net>
<net code="23" name="unconnected-(U1-GPIO3-Pad13)" class="Default">
<node ref="U1" pin="13" pinfunction="GPIO3_13" pintype="bidirectional+no_connect"/>
</net>
<net code="24" name="unconnected-(U1-GPIO19-Pad42)" class="Default">
<node ref="U1" pin="42" pinfunction="GPIO19_42" pintype="bidirectional+no_connect"/>
</net>
<net code="25" name="unconnected-(U1-GPIO20-Pad41)" class="Default">
<node ref="U1" pin="41" pinfunction="GPIO20_41" pintype="bidirectional+no_connect"/>
</net>
<net code="26" name="unconnected-(U1-GPIO21-Pad40)" class="Default">
<node ref="U1" pin="40" pinfunction="GPIO21_40" pintype="bidirectional+no_connect"/>
</net>
<net code="27" name="unconnected-(U1-GPIO35-Pad35)" class="Default">
<node ref="U1" pin="35" pinfunction="GPIO35_35" pintype="bidirectional+no_connect"/>
</net>
<net code="28" name="unconnected-(U1-GPIO36-Pad34)" class="Default">
<node ref="U1" pin="34" pinfunction="GPIO36_34" pintype="bidirectional+no_connect"/>
</net>
<net code="29" name="unconnected-(U1-GPIO37-Pad33)" class="Default">
<node ref="U1" pin="33" pinfunction="GPIO37_33" pintype="bidirectional+no_connect"/>
</net>
<net code="30" name="unconnected-(U1-GPIO38-Pad32)" class="Default">
<node ref="U1" pin="32" pinfunction="GPIO38_32" pintype="bidirectional+no_connect"/>
</net>
<net code="31" name="unconnected-(U1-GPIO39-Pad31)" class="Default">
<node ref="U1" pin="31" pinfunction="GPIO39_31" pintype="bidirectional+no_connect"/>
</net>
<net code="32" name="unconnected-(U1-GPIO40-Pad30)" class="Default">
<node ref="U1" pin="30" pinfunction="GPIO40_30" pintype="bidirectional+no_connect"/>
</net>
<net code="33" name="unconnected-(U1-GPIO41-Pad29)" class="Default">
<node ref="U1" pin="29" pinfunction="GPIO41_29" pintype="bidirectional+no_connect"/>
</net>
<net code="34" name="unconnected-(U1-GPIO42-Pad28)" class="Default">
<node ref="U1" pin="28" pinfunction="GPIO42_28" pintype="bidirectional+no_connect"/>
</net>
<net code="35" name="unconnected-(U1-GPIO43-Pad24)" class="Default">
<node ref="U1" pin="24" pinfunction="GPIO43_24" pintype="bidirectional+no_connect"/>
</net>
<net code="36" name="unconnected-(U1-GPIO44-Pad25)" class="Default">
<node ref="U1" pin="25" pinfunction="GPIO44_25" pintype="bidirectional+no_connect"/>
</net>
<net code="37" name="unconnected-(U1-GPIO45-Pad37)" class="Default">
<node ref="U1" pin="37" pinfunction="GPIO45_37" pintype="bidirectional+no_connect"/>
</net>
<net code="38" name="unconnected-(U1-GPIO46-Pad14)" class="Default">
<node ref="U1" pin="14" pinfunction="GPIO46_14" pintype="bidirectional+no_connect"/>
</net>
<net code="39" name="unconnected-(U1-GPIO47-Pad39)" class="Default">
<node ref="U1" pin="39" pinfunction="GPIO47_39" pintype="bidirectional+no_connect"/>
</net>
<net code="40" name="unconnected-(U1-GPIO48-Pad38)" class="Default">
<node ref="U1" pin="38" pinfunction="GPIO48_38" pintype="bidirectional+no_connect"/>
</net>
</nets>
</export>
+8
View File
@@ -0,0 +1,8 @@
Native schematic validation passed.
KiCad ERC: zero reported errors/warnings; no project exclusions added.
17 connected nets, 9 components; exact net memberships verified.
15 firmware GPIO definitions independently checked against exported pin functions.
All 44 MCU header pins accounted for; USB/UART0/5V/PSRAM pins unused on carrier.
PDF and SVG exported successfully.
Not validated: male-module physical mapping, power budget/path, OLED pull-ups,
selected connector fit, PCB DRC/layout, procurement, or assembled hardware.