From 75a01817e7d10799940823be626732c2eed87734 Mon Sep 17 00:00:00 2001 From: Krzysztof Jamroz Date: Sun, 13 Sep 2026 12:11:59 +0200 Subject: [PATCH 01/12] docs(pcb): add main-control-board README --- hardware/README.md | 4 ++++ hardware/boards/main-control-board/README.md | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 hardware/boards/main-control-board/README.md diff --git a/hardware/README.md b/hardware/README.md index 34f7935..d79d913 100644 --- a/hardware/README.md +++ b/hardware/README.md @@ -4,6 +4,10 @@ KiCad PCB projects for Tiny Engineer. Boards live under `boards//`. Prefer the same name for the directory and the KiCad project. +| Board | Role | +| --- | --- | +| [`main-control-board`](boards/main-control-board/) | Draft interconnect / carrier (header sockets for existing modules) | + Contribution rules, KiCad version, what to commit, ERC/DRC, and PR expectations: [docs/pcb.md](../docs/pcb.md). Pre-PR checklist: [docs/pcb.md#checklist](../docs/pcb.md#checklist). This tree is KiCad source only. Robot electrical reference (pinout, wiring, BOM) is [`docs/hardware/`](../docs/hardware/README.md). Firmware drivers are `src/hardware/`. diff --git a/hardware/boards/main-control-board/README.md b/hardware/boards/main-control-board/README.md new file mode 100644 index 0000000..9ab955d --- /dev/null +++ b/hardware/boards/main-control-board/README.md @@ -0,0 +1,17 @@ +# main-control-board + +Carrier PCB that reducing jumper wiring: existing modules plug in on pin headers. + +- **Status:** draft +- **KiCad:** 10 +- **Interfaces:** header sockets for the Waveshare ESP32-C3-Zero, Adafruit PCA9685, MAX98357A, SSD1306 OLED, Adafruit 5993 USB-C breakout, and five servo 3-pin plugs; shared I2C, I2S, +5V, 3V3, and GND +- **Assumptions:** nets follow [`docs/hardware/`](../../../docs/hardware/README.md) (keep servo **+5V** off logic **3V3**; common GND). No schematic or layout yet. KiCad project name will match this directory. +- **Built:** not manufactured + +## Direction + +First revision is sockets only. Design in KiCad 10, then fabricate, so the robot is wired on a board instead of Dupont harnesses. + +Later revisions may integrate some or all of those functions onto this PCB and drop the plug-in modules. Electrical reference stays in `docs/hardware/` until a schematic is merged. + +Contribution rules: [`docs/pcb.md`](../../../docs/pcb.md). From 79470fecc01ae4ec9cf4e14e36e8686af9d54611 Mon Sep 17 00:00:00 2001 From: "coderabbitai[bot]" <136622811+coderabbitai[bot]@users.noreply.github.com> Date: Sun, 13 Sep 2026 11:55:54 +0000 Subject: [PATCH 02/12] docs(pcb): document control board connections and test status --- hardware/boards/main-control-board/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hardware/boards/main-control-board/README.md b/hardware/boards/main-control-board/README.md index 9ab955d..fa1f984 100644 --- a/hardware/boards/main-control-board/README.md +++ b/hardware/boards/main-control-board/README.md @@ -4,9 +4,10 @@ Carrier PCB that reducing jumper wiring: existing modules plug in on pin headers - **Status:** draft - **KiCad:** 10 -- **Interfaces:** header sockets for the Waveshare ESP32-C3-Zero, Adafruit PCA9685, MAX98357A, SSD1306 OLED, Adafruit 5993 USB-C breakout, and five servo 3-pin plugs; shared I2C, I2S, +5V, 3V3, and GND +- **Interfaces:** header sockets for the Waveshare ESP32-C3-Zero, Adafruit PCA9685, MAX98357A, SSD1306 OLED, Adafruit 5993 USB-C breakout, and five servo 3-pin plugs; shared I2C (ESP32 GP0/GP1 → PCA9685 and SSD1306 OLED); point-to-point I2S (ESP32 GP2/GP3/GP4 → MAX98357A BCLK/LRC/DIN); USB D+/D− (5993 → ESP32 GP19/GP18); MAX98357A SPK+/SPK− → speaker; +5V, 3V3, and GND - **Assumptions:** nets follow [`docs/hardware/`](../../../docs/hardware/README.md) (keep servo **+5V** off logic **3V3**; common GND). No schematic or layout yet. KiCad project name will match this directory. - **Built:** not manufactured +- **Tested:** not tested ## Direction From 588f8a9833b8410849058603da9ae26cb93662a7 Mon Sep 17 00:00:00 2001 From: Krzysztof Jamroz Date: Sun, 13 Sep 2026 16:27:21 +0200 Subject: [PATCH 03/12] feat(pcb): add kicad project and symbols of modules --- hardware/.gitignore | 1 + hardware/boards/main-control-board/README.md | 5 +- .../symbols/tiny_engineer_modules.kicad_sym | 955 ++++++++++++++++++ .../main-control-board.kicad_pcb | 2 + .../main-control-board.kicad_pro | 448 ++++++++ .../main-control-board.kicad_sch | 14 + .../boards/main-control-board/sym-lib-table | 4 + 7 files changed, 1427 insertions(+), 2 deletions(-) create mode 100644 hardware/.gitignore create mode 100644 hardware/boards/main-control-board/libraries/symbols/tiny_engineer_modules.kicad_sym create mode 100644 hardware/boards/main-control-board/main-control-board.kicad_pcb create mode 100644 hardware/boards/main-control-board/main-control-board.kicad_pro create mode 100644 hardware/boards/main-control-board/main-control-board.kicad_sch create mode 100644 hardware/boards/main-control-board/sym-lib-table diff --git a/hardware/.gitignore b/hardware/.gitignore new file mode 100644 index 0000000..7664704 --- /dev/null +++ b/hardware/.gitignore @@ -0,0 +1 @@ +*.bak \ No newline at end of file diff --git a/hardware/boards/main-control-board/README.md b/hardware/boards/main-control-board/README.md index fa1f984..00b7f3a 100644 --- a/hardware/boards/main-control-board/README.md +++ b/hardware/boards/main-control-board/README.md @@ -1,11 +1,12 @@ # main-control-board -Carrier PCB that reducing jumper wiring: existing modules plug in on pin headers. +Carrier PCB that reduces jumper wiring: existing modules plug in on pin headers. - **Status:** draft - **KiCad:** 10 - **Interfaces:** header sockets for the Waveshare ESP32-C3-Zero, Adafruit PCA9685, MAX98357A, SSD1306 OLED, Adafruit 5993 USB-C breakout, and five servo 3-pin plugs; shared I2C (ESP32 GP0/GP1 → PCA9685 and SSD1306 OLED); point-to-point I2S (ESP32 GP2/GP3/GP4 → MAX98357A BCLK/LRC/DIN); USB D+/D− (5993 → ESP32 GP19/GP18); MAX98357A SPK+/SPK− → speaker; +5V, 3V3, and GND -- **Assumptions:** nets follow [`docs/hardware/`](../../../docs/hardware/README.md) (keep servo **+5V** off logic **3V3**; common GND). No schematic or layout yet. KiCad project name will match this directory. +- **Assumptions:** nets follow [`docs/hardware/`](../../../docs/hardware/README.md) (keep servo **+5V** off logic **3V3**; common GND). Schematic and PCB are empty KiCad 10 stubs. Custom module symbols live in [`libraries/symbols/tiny_engineer_modules.kicad_sym`](libraries/symbols/tiny_engineer_modules.kicad_sym). ESP32-C3-Zero symbol pin numbers are Waveshare **header pads** (pad 1 = 5V, numbered anticlockwise from USB), not the ESP32-C3 QFN package. +- **ERC / DRC:** empty schematic and PCB; both checks clean (no nets, no copper). Re-run when schematic and layout land. - **Built:** not manufactured - **Tested:** not tested diff --git a/hardware/boards/main-control-board/libraries/symbols/tiny_engineer_modules.kicad_sym b/hardware/boards/main-control-board/libraries/symbols/tiny_engineer_modules.kicad_sym new file mode 100644 index 0000000..56c95f7 --- /dev/null +++ b/hardware/boards/main-control-board/libraries/symbols/tiny_engineer_modules.kicad_sym @@ -0,0 +1,955 @@ +(kicad_symbol_lib + (version 20251024) + (generator "kicad_symbol_editor") + (generator_version "10.0") + (symbol "Adafruit_PCA9685_Module" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (duplicate_pin_numbers_are_jumpers no) + (property "Reference" "U" + (at 5.334 9.144 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (symbol "Adafruit_PCA9685_Module_1_1" + (rectangle + (start -12.7 7.62) + (end 12.7 -7.62) + (stroke + (width 0) + (type solid) + ) + (fill + (type background) + ) + ) + (text "Adafruit PCA9685" + (at -3.556 0.254 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin power_in line + (at 0 -10.16 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 15.24 3.81 180) + (length 2.54) + (name "OE" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 1.27 180) + (length 2.54) + (name "SCL" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 -1.27 180) + (length 2.54) + (name "SDA" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 15.24 -3.81 180) + (length 2.54) + (name "VCC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 10.16 270) + (length 2.54) + (name "V+" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "ESP32_C3_Zero_Dev_Board" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (duplicate_pin_numbers_are_jumpers no) + (property "Reference" "U" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "ESP32-C3-ZERO" + (at 0.508 -3.302 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "https://www.waveshare.com/wiki/ESP32-C3-Zero" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "Waveshare ESP32-C3-Zero module header, pads numbered anticlockwise from USB. Pad 1=5V, 2=GND, 3=3V3, 4-14=GP0-GP10, 15=USB_DM (GPIO18), 16=USB_DP (GPIO19), 17=RX (GPIO20), 18=TX (GPIO21). Not the ESP32-C3 QFN package pinout." + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (symbol "ESP32_C3_Zero_Dev_Board_1_1" + (rectangle + (start -15.24 11.43) + (end 15.24 -11.43) + (stroke + (width 0) + (type solid) + ) + (fill + (type background) + ) + ) + (pin power_in line + (at 0 13.97 270) + (length 2.54) + (name "5V" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -13.97 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_out line + (at -17.78 10.16 0) + (length 2.54) + (name "3V3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -17.78 2.54 0) + (length 2.54) + (name "GP0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -17.78 0 0) + (length 2.54) + (name "GP1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -17.78 -2.54 0) + (length 2.54) + (name "GP2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -17.78 -5.08 0) + (length 2.54) + (name "GP3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -17.78 -7.62 0) + (length 2.54) + (name "GP4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -17.78 -10.16 0) + (length 2.54) + (name "GP5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -10.16 180) + (length 2.54) + (name "GP6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -7.62 180) + (length 2.54) + (name "GP7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "11" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -5.08 180) + (length 2.54) + (name "GP8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -2.54 180) + (length 2.54) + (name "GP9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "13" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 0 180) + (length 2.54) + (name "GP10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "14" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 2.54 180) + (length 2.54) + (name "USB_DM" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "15" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 5.08 180) + (length 2.54) + (name "USB_DP" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "16" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 7.62 180) + (length 2.54) + (name "RX" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "17" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 10.16 180) + (length 2.54) + (name "TX" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "18" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "MAX98357_Module" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (duplicate_pin_numbers_are_jumpers no) + (property "Reference" "U" + (at 12.446 -4.572 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (symbol "MAX98357_Module_1_1" + (rectangle + (start -11.4299 6.35) + (end 11.43 -6.35) + (stroke + (width 0) + (type solid) + ) + (fill + (type background) + ) + ) + (text "MAX98357" + (at 6.858 7.366 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin bidirectional line + (at -13.97 5.08 0) + (length 2.54) + (name "LRC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -13.97 2.54 0) + (length 2.54) + (name "BCLK" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -13.97 0 0) + (length 2.54) + (name "DIN" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -13.97 -2.54 0) + (length 2.54) + (name "GAIN" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -13.97 -5.08 0) + (length 2.54) + (name "SD" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -8.89 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 8.89 270) + (length 2.54) + (name "Vin" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "Waceshare_OLED_09_Module" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (duplicate_pin_numbers_are_jumpers no) + (property "Reference" "U" + (at 9.144 9.398 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (symbol "Waceshare_OLED_09_Module_1_1" + (rectangle + (start -17.78 5.08) + (end 17.78 -5.08) + (stroke + (width 0) + (type solid) + ) + (fill + (type background) + ) + ) + (text "OLED 0.9 I2C" + (at 14.732 6.604 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin power_in line + (at 0 7.62 270) + (length 2.54) + (name "VCC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -7.62 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 1.27 180) + (length 2.54) + (name "SDA" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 -1.27 180) + (length 2.54) + (name "SCL" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) +) diff --git a/hardware/boards/main-control-board/main-control-board.kicad_pcb b/hardware/boards/main-control-board/main-control-board.kicad_pcb new file mode 100644 index 0000000..ccd82d6 --- /dev/null +++ b/hardware/boards/main-control-board/main-control-board.kicad_pcb @@ -0,0 +1,2 @@ +(kicad_pcb (version 20260206) (generator "pcbnew") (generator_version "10.0") +) \ No newline at end of file diff --git a/hardware/boards/main-control-board/main-control-board.kicad_pro b/hardware/boards/main-control-board/main-control-board.kicad_pro new file mode 100644 index 0000000..c4e9089 --- /dev/null +++ b/hardware/boards/main-control-board/main-control-board.kicad_pro @@ -0,0 +1,448 @@ +{ + "board": { + "3dviewports": [], + "ipc2581": { + "bom_rev": "", + "dist": "", + "distpn": "", + "internal_id": "", + "mfg": "", + "mpn": "", + "sch_revision": "" + }, + "layer_pairs": [], + "layer_presets": [], + "viewports": [] + }, + "boards": [], + "component_class_settings": { + "assignments": [], + "meta": { + "version": 0 + }, + "sheet_component_classes": { + "enabled": false + } + }, + "cvpcb": { + "equivalence_files": [] + }, + "erc": { + "erc_exclusions": [], + "meta": { + "version": 0 + }, + "pin_map": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 2 + ], + [ + 0, + 2, + 0, + 1, + 0, + 0, + 1, + 0, + 2, + 2, + 2, + 2 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 2 + ], + [ + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 1, + 1, + 2 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 2 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2 + ], + [ + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 2 + ], + [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 2 + ], + [ + 0, + 2, + 1, + 2, + 0, + 0, + 1, + 0, + 2, + 2, + 2, + 2 + ], + [ + 0, + 2, + 0, + 1, + 0, + 0, + 1, + 0, + 2, + 0, + 0, + 2 + ], + [ + 0, + 2, + 1, + 1, + 0, + 0, + 1, + 0, + 2, + 0, + 0, + 2 + ], + [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ] + ], + "rule_severities": { + "bus_definition_conflict": "error", + "bus_entry_needed": "error", + "bus_to_bus_conflict": "error", + "bus_to_net_conflict": "error", + "different_unit_footprint": "error", + "different_unit_net": "error", + "duplicate_reference": "error", + "duplicate_sheet_names": "error", + "endpoint_off_grid": "warning", + "extra_units": "error", + "field_name_whitespace": "warning", + "footprint_filter": "ignore", + "footprint_link_issues": "warning", + "four_way_junction": "ignore", + "ground_pin_not_ground": "warning", + "hier_label_mismatch": "error", + "isolated_pin_label": "warning", + "label_dangling": "error", + "label_multiple_wires": "warning", + "lib_symbol_issues": "warning", + "lib_symbol_mismatch": "warning", + "missing_bidi_pin": "warning", + "missing_input_pin": "warning", + "missing_power_pin": "error", + "missing_unit": "warning", + "multiple_net_names": "warning", + "net_not_bus_member": "warning", + "no_connect_connected": "warning", + "no_connect_dangling": "warning", + "pin_not_connected": "error", + "pin_not_driven": "error", + "pin_to_pin": "warning", + "power_pin_not_driven": "error", + "same_local_global_label": "warning", + "similar_label_and_power": "warning", + "similar_labels": "warning", + "similar_power": "warning", + "simulation_model_issue": "ignore", + "single_global_label": "ignore", + "stacked_pin_name": "warning", + "unannotated": "error", + "unconnected_wire_endpoint": "warning", + "undefined_netclass": "error", + "unit_value_mismatch": "error", + "unresolved_variable": "error", + "wire_dangling": "error" + } + }, + "libraries": { + "pinned_footprint_libs": [], + "pinned_symbol_libs": [] + }, + "meta": { + "filename": "main-control-board.kicad_pro", + "version": 3 + }, + "net_settings": { + "classes": [ + { + "bus_width": 12, + "clearance": 0.2, + "diff_pair_gap": 0.25, + "diff_pair_via_gap": 0.25, + "diff_pair_width": 0.2, + "line_style": 0, + "microvia_diameter": 0.3, + "microvia_drill": 0.1, + "name": "Default", + "pcb_color": "rgba(0, 0, 0, 0.000)", + "priority": 2147483647, + "schematic_color": "rgba(0, 0, 0, 0.000)", + "track_width": 0.2, + "tuning_profile": "", + "via_diameter": 0.6, + "via_drill": 0.3, + "wire_width": 6 + } + ], + "meta": { + "version": 5 + }, + "net_colors": null, + "netclass_assignments": null, + "netclass_patterns": [] + }, + "pcbnew": { + "last_paths": { + "idf": "", + "netlist": "", + "plot": "", + "specctra_dsn": "", + "step": "", + "vrml": "" + }, + "page_layout_descr_file": "" + }, + "schematic": { + "annotate_start_num": 0, + "annotation": { + "method": 0, + "sort_order": 0 + }, + "bom_export_filename": "${PROJECTNAME}.csv", + "bom_fmt_presets": [], + "bom_fmt_settings": { + "field_delimiter": ",", + "keep_line_breaks": false, + "keep_tabs": false, + "name": "CSV", + "ref_delimiter": ",", + "ref_range_delimiter": "", + "string_delimiter": "\"" + }, + "bom_presets": [], + "bom_settings": { + "exclude_dnp": false, + "fields_ordered": [ + { + "group_by": false, + "label": "Reference", + "name": "Reference", + "show": true + }, + { + "group_by": false, + "label": "Qty", + "name": "${QUANTITY}", + "show": true + }, + { + "group_by": true, + "label": "Value", + "name": "Value", + "show": true + }, + { + "group_by": true, + "label": "DNP", + "name": "${DNP}", + "show": true + }, + { + "group_by": true, + "label": "Exclude from BOM", + "name": "${EXCLUDE_FROM_BOM}", + "show": true + }, + { + "group_by": true, + "label": "Exclude from Board", + "name": "${EXCLUDE_FROM_BOARD}", + "show": true + }, + { + "group_by": true, + "label": "Exclude from Simulation", + "name": "${EXCLUDE_FROM_SIM}", + "show": true + }, + { + "group_by": true, + "label": "Exclude from Position Files", + "name": "${EXCLUDE_FROM_POS_FILES}", + "show": true + }, + { + "group_by": true, + "label": "Footprint", + "name": "Footprint", + "show": true + }, + { + "group_by": false, + "label": "Datasheet", + "name": "Datasheet", + "show": true + } + ], + "filter_string": "", + "group_symbols": true, + "include_excluded_from_bom": true, + "name": "Default Editing", + "sort_asc": true, + "sort_field": "Reference" + }, + "bus_aliases": {}, + "connection_grid_size": 50.0, + "drawing": { + "dashed_lines_dash_length_ratio": 12.0, + "dashed_lines_gap_length_ratio": 3.0, + "default_line_thickness": 6.0, + "default_text_size": 50.0, + "field_names": [], + "hop_over_size_choice": 0, + "intersheets_ref_own_page": false, + "intersheets_ref_prefix": "", + "intersheets_ref_short": false, + "intersheets_ref_show": false, + "intersheets_ref_suffix": "", + "junction_size_choice": 3, + "label_size_ratio": 0.375, + "operating_point_overlay_i_precision": 3, + "operating_point_overlay_i_range": "~A", + "operating_point_overlay_v_precision": 3, + "operating_point_overlay_v_range": "~V", + "overbar_offset_ratio": 1.23, + "pin_symbol_size": 25.0, + "text_offset_ratio": 0.15 + }, + "legacy_lib_dir": "", + "legacy_lib_list": [], + "meta": { + "version": 1 + }, + "page_layout_descr_file": "", + "plot_directory": "", + "reuse_designators": true, + "subpart_first_id": 65, + "subpart_id_separator": 0, + "top_level_sheets": [ + { + "filename": "main-control-board.kicad_sch", + "name": "main-control-board", + "uuid": "82a78d11-58ff-455c-a94e-f7463ce9fc2e" + } + ], + "used_designators": "", + "variants": [] + }, + "sheets": [ + [ + "82a78d11-58ff-455c-a94e-f7463ce9fc2e", + "main-control-board" + ] + ], + "text_variables": {}, + "tuning_profiles": { + "meta": { + "version": 0 + }, + "tuning_profiles_impedance_geometric": [] + } +} diff --git a/hardware/boards/main-control-board/main-control-board.kicad_sch b/hardware/boards/main-control-board/main-control-board.kicad_sch new file mode 100644 index 0000000..cbbfd86 --- /dev/null +++ b/hardware/boards/main-control-board/main-control-board.kicad_sch @@ -0,0 +1,14 @@ +(kicad_sch + (version 20260306) + (generator "eeschema") + (generator_version "10.0") + (uuid "82a78d11-58ff-455c-a94e-f7463ce9fc2e") + (paper "A4") + (lib_symbols) + (sheet_instances + (path "/" + (page "1") + ) + ) + (embedded_fonts no) +) diff --git a/hardware/boards/main-control-board/sym-lib-table b/hardware/boards/main-control-board/sym-lib-table new file mode 100644 index 0000000..f975faf --- /dev/null +++ b/hardware/boards/main-control-board/sym-lib-table @@ -0,0 +1,4 @@ +(sym_lib_table + (version 7) + (lib (name "TinyEngineerModules") (type "KiCad") (uri "${KIPRJMOD}/libraries/symbols/tiny_engineer_modules.kicad_sym") (options "") (descr "")) +) From 5c9d919c4e2ee01e0ce871200e1f097c959f4e7c Mon Sep 17 00:00:00 2001 From: Krzysztof Jamroz Date: Sun, 13 Sep 2026 17:38:57 +0200 Subject: [PATCH 04/12] fix(pcb): update properties and pin types in tiny_engineer_modules.kicad_sym --- .../symbols/tiny_engineer_modules.kicad_sym | 40 ++++++++----------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/hardware/boards/main-control-board/libraries/symbols/tiny_engineer_modules.kicad_sym b/hardware/boards/main-control-board/libraries/symbols/tiny_engineer_modules.kicad_sym index 56c95f7..46a2e2d 100644 --- a/hardware/boards/main-control-board/libraries/symbols/tiny_engineer_modules.kicad_sym +++ b/hardware/boards/main-control-board/libraries/symbols/tiny_engineer_modules.kicad_sym @@ -18,8 +18,8 @@ ) ) ) - (property "Value" "" - (at 0 0 0) + (property "Value" "Adafruit PCA9685" + (at -1.778 0 0) (show_name no) (do_not_autoplace no) (effects @@ -73,14 +73,6 @@ (type background) ) ) - (text "Adafruit PCA9685" - (at -3.556 0.254 0) - (effects - (font - (size 1.27 1.27) - ) - ) - ) (pin power_in line (at 0 -10.16 90) (length 2.54) @@ -117,7 +109,7 @@ ) ) ) - (pin bidirectional line + (pin input line (at 15.24 1.27 180) (length 2.54) (name "SCL" @@ -199,7 +191,7 @@ (in_pos_files yes) (duplicate_pin_numbers_are_jumpers no) (property "Reference" "U" - (at 0 0 0) + (at -0.254 2.286 0) (show_name no) (do_not_autoplace no) (effects @@ -209,7 +201,7 @@ ) ) (property "Value" "ESP32-C3-ZERO" - (at 0.508 -3.302 0) + (at 0.254 -1.016 0) (show_name no) (do_not_autoplace no) (effects @@ -230,7 +222,7 @@ ) ) (property "Datasheet" "https://www.waveshare.com/wiki/ESP32-C3-Zero" - (at 0 0 0) + (at 30.734 -19.304 0) (show_name no) (do_not_autoplace no) (hide yes) @@ -240,8 +232,8 @@ ) ) ) - (property "Description" "Waveshare ESP32-C3-Zero module header, pads numbered anticlockwise from USB. Pad 1=5V, 2=GND, 3=3V3, 4-14=GP0-GP10, 15=USB_DM (GPIO18), 16=USB_DP (GPIO19), 17=RX (GPIO20), 18=TX (GPIO21). Not the ESP32-C3 QFN package pinout." - (at 0 0 0) + (property "Description" "Waveshare ESP32-C3-Zero module header, pads numbered anticlockwise from USB" + (at 46.736 -16.002 0) (show_name no) (do_not_autoplace no) (hide yes) @@ -606,7 +598,7 @@ ) ) ) - (property "Value" "" + (property "Value" "MAX98357A" (at 0 0 0) (show_name no) (do_not_autoplace no) @@ -669,7 +661,7 @@ ) ) ) - (pin bidirectional line + (pin input line (at -13.97 5.08 0) (length 2.54) (name "LRC" @@ -687,7 +679,7 @@ ) ) ) - (pin bidirectional line + (pin input line (at -13.97 2.54 0) (length 2.54) (name "BCLK" @@ -705,7 +697,7 @@ ) ) ) - (pin bidirectional line + (pin input line (at -13.97 0 0) (length 2.54) (name "DIN" @@ -723,7 +715,7 @@ ) ) ) - (pin bidirectional line + (pin input line (at -13.97 -2.54 0) (length 2.54) (name "GAIN" @@ -741,7 +733,7 @@ ) ) ) - (pin bidirectional line + (pin input line (at -13.97 -5.08 0) (length 2.54) (name "SD" @@ -814,7 +806,7 @@ ) ) ) - (property "Value" "" + (property "Value" "Waveshare 0.91 OLED" (at 0 0 0) (show_name no) (do_not_autoplace no) @@ -931,7 +923,7 @@ ) ) ) - (pin bidirectional line + (pin input line (at 20.32 -1.27 180) (length 2.54) (name "SCL" From c4cb630d8cd991c1057bb42e9b928b1c4eb52deb Mon Sep 17 00:00:00 2001 From: Krzysztof Jamroz Date: Sun, 13 Sep 2026 17:53:53 +0200 Subject: [PATCH 05/12] feat(pcb): add footprints for Tiny Engineer modules - Introduced new KiCad footprints for the Adafruit PCA9685 Module, ESP32 C3 Zero Dev Board, and MAX98357 Module. --- .../boards/main-control-board/fp-lib-table | 4 + .../Adafruit_PCA9685_Module.kicad_mod | 407 ++++++++++++ .../ESP32_C3_Zero_Dev_Board.kicad_mod | 628 ++++++++++++++++++ .../MAX98357_Module.kicad_mod | 340 ++++++++++ 4 files changed, 1379 insertions(+) create mode 100644 hardware/boards/main-control-board/fp-lib-table create mode 100644 hardware/boards/main-control-board/libraries/footprints/tiny_engineer_modules.pretty/Adafruit_PCA9685_Module.kicad_mod create mode 100644 hardware/boards/main-control-board/libraries/footprints/tiny_engineer_modules.pretty/ESP32_C3_Zero_Dev_Board.kicad_mod create mode 100644 hardware/boards/main-control-board/libraries/footprints/tiny_engineer_modules.pretty/MAX98357_Module.kicad_mod diff --git a/hardware/boards/main-control-board/fp-lib-table b/hardware/boards/main-control-board/fp-lib-table new file mode 100644 index 0000000..e05f5c0 --- /dev/null +++ b/hardware/boards/main-control-board/fp-lib-table @@ -0,0 +1,4 @@ +(fp_lib_table + (version 7) + (lib (name "TinyEngineerModules") (type "KiCad") (uri "${KIPRJMOD}/libraries/footprints/tiny_engineer_modules.pretty") (options "") (descr "")) +) diff --git a/hardware/boards/main-control-board/libraries/footprints/tiny_engineer_modules.pretty/Adafruit_PCA9685_Module.kicad_mod b/hardware/boards/main-control-board/libraries/footprints/tiny_engineer_modules.pretty/Adafruit_PCA9685_Module.kicad_mod new file mode 100644 index 0000000..1c77541 --- /dev/null +++ b/hardware/boards/main-control-board/libraries/footprints/tiny_engineer_modules.pretty/Adafruit_PCA9685_Module.kicad_mod @@ -0,0 +1,407 @@ +(footprint "Adafruit_PCA9685_Module" + (version 20260206) + (generator "pcbnew") + (generator_version "10.0") + (layer "F.Cu") + (property "Reference" "REF**" + (at 0 -0.5 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "0b8816e1-16d9-4b9f-9f5e-90f83a1a1480") + (effects + (font + (size 1 1) + (thickness 0.12) + ) + ) + ) + (property "Value" "Adafruit_PCA9685_Module" + (at 0 1 0) + (unlocked yes) + (layer "F.Fab") + (uuid "52c98522-0380-44b9-aec2-b0f3215ec781") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "6fd55ec6-aa45-402f-82dc-c2f4ed1300fe") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "48788a5f-d18b-497d-87c9-867175dd81bb") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (attr through_hole) + (duplicate_pad_numbers_are_jumpers no) + (fp_line + (start -31.85 -11.4) + (end 30.65 -11.4) + (stroke + (width 0.1) + (type default) + ) + (layer "F.SilkS") + (uuid "f3f98697-6dd4-4a43-a929-879ef6bda2c6") + ) + (fp_line + (start -31.85 14) + (end -31.85 -11.4) + (stroke + (width 0.1) + (type default) + ) + (layer "F.SilkS") + (uuid "65a58129-01c2-4bb6-a558-1c42f92a8291") + ) + (fp_line + (start 30.65 -11.4) + (end 30.65 14) + (stroke + (width 0.1) + (type default) + ) + (layer "F.SilkS") + (uuid "7e34bde9-cefa-407b-9b87-625c718425f7") + ) + (fp_line + (start 30.65 14) + (end -31.85 14) + (stroke + (width 0.1) + (type default) + ) + (layer "F.SilkS") + (uuid "d221ba25-345c-45fc-b0e3-ef7e954260fd") + ) + (fp_poly + (pts + (xy 30.65 -11.4) (xy -31.85 -11.4) (xy -31.85 14) (xy 30.65 14) + ) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.CrtYd") + (uuid "cb9a72dc-25e2-46c9-a75f-9dc2574af40e") + ) + (fp_text user "GND" + (at -29.21 -5.08 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "fcf22a4f-0ff5-4627-8a2f-85c56ac28ddf") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "OE" + (at -29.21 -2.54 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "de4ed263-7541-4f5a-9654-5d9ac6b1d58a") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "SCL" + (at -29.21 0 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "a66f5a74-eecf-4bad-8c27-e08cd06bca0b") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "SDA" + (at -29.21 2.54 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "6cd64e89-4ee3-48a5-b529-d7c5e4b86e1a") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "VCC" + (at -29.21 5.08 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "8ff170b8-60d8-4839-a29a-33fa5420332b") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "V+" + (at -29.21 7.62 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "c6a4a51c-e4bf-455a-9e84-892ad40b6ce0") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "GND" + (at 26.67 -5.08 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "6290b4c5-5522-4068-b8d2-e8a0bb6e3842") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "OE" + (at 26.67 -2.54 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "b449d352-8e2b-42b9-af7f-0a42b24b63ce") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "SCL" + (at 26.67 0 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "220f35e9-cac2-49bc-adf1-3a36e0290248") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "SDA" + (at 26.67 2.54 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "24f7ac0c-2128-4f34-ace0-89ac395f8a47") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "VCC" + (at 26.67 5.08 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "4e45ce56-db8b-45fa-8b1a-44821bf812b0") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "V+" + (at 26.67 7.62 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "c0440ac9-6234-4ae3-9bd7-6fe690e552c5") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "${REFERENCE}" + (at 0 2.5 0) + (unlocked yes) + (layer "F.Fab") + (uuid "d1cef346-0bcc-4e78-a0df-872c733082e5") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "1" thru_hole roundrect + (at -30.48 -5.08) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (roundrect_rratio 0.1470588235) + (uuid "5d3dbc88-6786-4e60-bd1a-76eb5c397f48") + ) + (pad "1" thru_hole roundrect + (at 27.94 -5.08) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (roundrect_rratio 0.1470588235) + (uuid "79b29996-10c3-4556-b6f6-f58a8d35d569") + ) + (pad "2" thru_hole circle + (at -30.48 -2.54) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "b0ddd118-3925-4e42-a9eb-2e23b10fe40a") + ) + (pad "2" thru_hole circle + (at 27.94 -2.54) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "78b1bd3d-b770-4185-ae00-de539f6f3c42") + ) + (pad "3" thru_hole circle + (at -30.48 0) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "b3dd9cae-4c9c-41e8-976c-469b913a29f5") + ) + (pad "3" thru_hole circle + (at 27.94 0) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "26903363-3659-4ad3-929a-9b800be35e9f") + ) + (pad "4" thru_hole circle + (at -30.48 2.54) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "a7d8cc71-ff4f-46b0-8c35-f4b492fe3bce") + ) + (pad "4" thru_hole circle + (at 27.94 2.54) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "126decff-533e-4886-87d4-2f1ee37ae6ff") + ) + (pad "5" thru_hole circle + (at -30.48 5.08) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "a829b0f5-7ef4-4600-a982-0c84eaa7f1bd") + ) + (pad "5" thru_hole circle + (at 27.94 5.08) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "d957b0dc-75bc-4dd9-ae1a-c6ca2741904e") + ) + (pad "6" thru_hole circle + (at -30.48 7.62) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "ce4783c0-5fbf-4c5a-a506-7ed8c2e96835") + ) + (pad "6" thru_hole circle + (at 27.94 7.62) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "d1464df3-fe2b-4268-93f4-317d7dfbd664") + ) + (zone + (layer "F.Fab") + (uuid "4ac4ff56-a25b-4226-8669-2f728de7735f") + (hatch edge 0.5) + (connect_pads + (clearance 0) + ) + (min_thickness 0.25) + (keepout + (tracks allowed) + (vias allowed) + (pads not_allowed) + (copperpour allowed) + (footprints not_allowed) + ) + (placement + (enabled no) + (sheetname "") + ) + (fill + (thermal_gap 0.5) + (thermal_bridge_width 0.5) + (island_removal_mode 0) + ) + (polygon + (pts + (xy -31.85 -11.4) (xy 30.65 -11.4) (xy 30.65 14) (xy -31.85 14) + ) + ) + ) + (embedded_fonts no) +) diff --git a/hardware/boards/main-control-board/libraries/footprints/tiny_engineer_modules.pretty/ESP32_C3_Zero_Dev_Board.kicad_mod b/hardware/boards/main-control-board/libraries/footprints/tiny_engineer_modules.pretty/ESP32_C3_Zero_Dev_Board.kicad_mod new file mode 100644 index 0000000..a0c9f4e --- /dev/null +++ b/hardware/boards/main-control-board/libraries/footprints/tiny_engineer_modules.pretty/ESP32_C3_Zero_Dev_Board.kicad_mod @@ -0,0 +1,628 @@ +(footprint "ESP32_C3_Zero_Dev_Board" + (version 20260206) + (generator "pcbnew") + (generator_version "10.0") + (layer "F.Cu") + (property "Reference" "REF**" + (at 0 13 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "a95cfa09-ddb9-466c-b267-8c72eaf2dabe") + (effects + (font + (size 1 1) + (thickness 0.12) + ) + ) + ) + (property "Value" "ESP32_C3_Zero_Dev_Board" + (at -0.1 15.24 0) + (unlocked yes) + (layer "F.Fab") + (uuid "0f3b6c68-ceda-4f93-9dec-87ba1c36146b") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "6957737b-2974-483e-85d5-147bbca40e79") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "abe504cb-9d73-40b2-b0db-b930bf56d13f") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (attr through_hole) + (duplicate_pad_numbers_are_jumpers no) + (fp_line + (start -9.5 -11.9) + (end 9.3 -11.9) + (stroke + (width 0.1) + (type default) + ) + (layer "F.SilkS") + (uuid "84e6b9fc-a114-4f1e-a61d-839b923e533c") + ) + (fp_line + (start -9.5 11.9) + (end -9.5 -11.9) + (stroke + (width 0.1) + (type default) + ) + (layer "F.SilkS") + (uuid "1bd345a8-686d-422f-ac0a-3f5a6a77bad5") + ) + (fp_line + (start -4.6 -13.4) + (end -4.6 -11.9) + (stroke + (width 0.1) + (type dot) + ) + (layer "F.SilkS") + (uuid "d1cc8e22-abda-4da3-b578-aca76aea90a3") + ) + (fp_line + (start -4.6 -13.4) + (end 4.4 -13.4) + (stroke + (width 0.1) + (type dot) + ) + (layer "F.SilkS") + (uuid "8116e6b2-6e96-4675-a2a2-1b96244020df") + ) + (fp_line + (start 4.4 -13.4) + (end 4.4 -11.9) + (stroke + (width 0.1) + (type dot) + ) + (layer "F.SilkS") + (uuid "d4a824f1-1236-4bdc-aca3-365b4731e405") + ) + (fp_line + (start 9.3 -11.9) + (end 9.3 11.9) + (stroke + (width 0.1) + (type default) + ) + (layer "F.SilkS") + (uuid "60a447f4-40da-4141-b7ee-092e4e21acbb") + ) + (fp_line + (start 9.3 11.9) + (end -9.5 11.9) + (stroke + (width 0.1) + (type default) + ) + (layer "F.SilkS") + (uuid "951d0944-c9f9-4335-9d5d-e3b3007a0785") + ) + (fp_rect + (start -6.6 6.5) + (end 6.6 11.4) + (stroke + (width 0.1) + (type dot) + ) + (fill no) + (layer "F.SilkS") + (uuid "3b59eb34-e2d8-4bd6-82e5-54751ac754ee") + ) + (fp_poly + (pts + (xy -9.5 -11.9) (xy -9.5 11.9) (xy 9.3 11.9) (xy 9.3 -11.9) + ) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.CrtYd") + (uuid "119b2070-6014-4041-9e0a-0554078a90d0") + ) + (fp_text user "5V" + (at -6.35 -10.16 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "61489827-f509-4d13-990c-695810878311") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "GND" + (at -6.35 -7.62 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "c081275b-49b5-42ed-b156-c8a1c883019a") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "3V3" + (at -6.35 -5.08 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "fbd7f3cd-45a9-4dc5-9f72-95b505968f22") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "GP0" + (at -6.35 -2.54 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "bce3a55f-7668-4ccf-8e75-c57e1e0f52ad") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "GP1" + (at -6.35 0 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "eda1c0ab-cd9a-4474-893e-f9bf19ce7f9a") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "GP2" + (at -6.35 2.54 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "7f11e3a6-bf22-4c6a-8f52-e37304c25690") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "GP3" + (at -6.35 5.08 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "1d29365e-6b15-408c-a7fc-09bec74a0541") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "GP4" + (at -6.35 7.62 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "f1df89b4-6e0b-4161-a173-e125c6b1f4fd") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "GP5" + (at -6.35 10.16 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "870f9f0c-95c7-4fcb-bdf6-05443daab73c") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "USB" + (at -1.3 -12.2 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "143c54ff-0885-453f-bbbb-cc4e490c8fe8") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left bottom) + ) + ) + (fp_text user "ANT" + (at 0 9.1 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "ab1ef04d-f505-4d28-b24a-bae6ad41c17c") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + ) + ) + (fp_text user "TX" + (at 6.35 -10.16 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "c9d0889f-891b-4d87-9e02-fc622e8072ae") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "RX" + (at 6.35 -7.62 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "13f832c7-0875-45cd-854d-44035c81681c") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "USB DP" + (at 6.35 -5.08 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "d6c283f1-3429-43b6-9c51-b6bef48d94f2") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "USB DM" + (at 6.35 -2.54 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "0813f3a5-a5cf-4d2e-a471-0251a44bd386") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "GP10" + (at 6.35 0 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "cc1a992c-87f1-47b3-b514-6dd34db8afad") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "GP9" + (at 6.35 2.54 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "8305b386-4289-4efb-9ec8-972772729b59") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "GP8" + (at 6.35 5.08 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "45c74698-ea31-4c8e-bb23-414d6a0f2760") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "GP7" + (at 6.35 7.62 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "8ad47244-9deb-48f3-a1cf-7da3443b479b") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "GP6" + (at 6.35 10.16 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "88207855-d7df-4dc3-afec-63635f60ec6e") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "${REFERENCE}" + (at -0.1 17.78 0) + (unlocked yes) + (layer "F.Fab") + (uuid "37b52785-0181-4240-95fe-f9098cad7577") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "1" thru_hole roundrect + (at -7.62 -10.16) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (roundrect_rratio 0.15) + (uuid "6f29c076-3c73-4adf-97d2-279f25b7f65f") + ) + (pad "2" thru_hole circle + (at -7.62 -7.62) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "a9310cf3-8605-4a2d-80ee-6d8937f20f43") + ) + (pad "3" thru_hole circle + (at -7.62 -5.08) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "752ec01f-6030-4206-9096-d681374b35a4") + ) + (pad "4" thru_hole circle + (at -7.62 -2.54) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "a5906c90-4a6e-47f4-9711-3b5b90b6561f") + ) + (pad "5" thru_hole circle + (at -7.62 0) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "3b346b86-1a5c-4c85-8dfd-c411e17683ca") + ) + (pad "6" thru_hole circle + (at -7.62 2.54) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "81efee36-9116-41f4-85e7-f544f285c22b") + ) + (pad "7" thru_hole circle + (at -7.62 5.08) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "353ed785-cece-4f85-822a-f26fe068750a") + ) + (pad "8" thru_hole circle + (at -7.62 7.62) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "e6f15655-8075-4df8-bc22-901ef1afcd05") + ) + (pad "9" thru_hole circle + (at -7.62 10.16) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "9fcaa4d3-595b-4656-90ab-bfb55a709d52") + ) + (pad "10" thru_hole circle + (at 7.62 10.16) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "993209ad-644d-4a61-a039-7dd8de580dc9") + ) + (pad "11" thru_hole circle + (at 7.62 7.62) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "943c5432-45b0-4a15-94f6-8e49feb41fe8") + ) + (pad "12" thru_hole circle + (at 7.62 5.08) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "08c0b910-01a5-4201-ab9e-647a695bdef7") + ) + (pad "13" thru_hole circle + (at 7.62 2.54) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "97c34e51-01ac-4f08-bb62-3839c62ea2d0") + ) + (pad "14" thru_hole circle + (at 7.62 0) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "6c424ae0-a3b2-4c5f-a607-6f8bc4aee769") + ) + (pad "15" thru_hole circle + (at 7.62 -2.54) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "c522fbb7-cf60-4ddc-ba37-5fe2795cfa3c") + ) + (pad "16" thru_hole circle + (at 7.62 -5.08) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "1a3ce6af-c811-42aa-b27d-b7283b2e021d") + ) + (pad "17" thru_hole circle + (at 7.62 -7.62) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "c81dd2b7-0498-49d6-8cc3-de248b51e0ad") + ) + (pad "18" thru_hole circle + (at 7.62 -10.16) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "d2089de2-ce0c-43f2-86f0-5bfa3d62d5f2") + ) + (zone + (layers "F.Cu" "B.Cu") + (uuid "0c8d1ec9-a649-4a8b-9391-140bc1075aee") + (hatch edge 0.5) + (connect_pads + (clearance 0) + ) + (min_thickness 0.25) + (keepout + (tracks not_allowed) + (vias not_allowed) + (pads not_allowed) + (copperpour not_allowed) + (footprints allowed) + ) + (placement + (enabled no) + (sheetname "") + ) + (fill + (thermal_gap 0.5) + (thermal_bridge_width 0.5) + (island_removal_mode 0) + ) + (polygon + (pts + (xy -6.66 5) (xy 6.4 5) (xy 6.4 12.8) (xy -6.66 12.8) + ) + ) + ) + (zone + (layer "F.Fab") + (uuid "61ab9364-dcd8-45f6-b9fc-bff55e725ba0") + (hatch edge 0.5) + (connect_pads + (clearance 0) + ) + (min_thickness 0.25) + (keepout + (tracks allowed) + (vias allowed) + (pads not_allowed) + (copperpour allowed) + (footprints not_allowed) + ) + (placement + (enabled no) + (sheetname "") + ) + (fill + (thermal_gap 0.5) + (thermal_bridge_width 0.5) + (island_removal_mode 0) + ) + (polygon + (pts + (xy -9.5 -11.9) (xy 9.3 -11.9) (xy 9.3 11.9) (xy -9.5 11.9) + ) + ) + ) + (embedded_fonts no) +) diff --git a/hardware/boards/main-control-board/libraries/footprints/tiny_engineer_modules.pretty/MAX98357_Module.kicad_mod b/hardware/boards/main-control-board/libraries/footprints/tiny_engineer_modules.pretty/MAX98357_Module.kicad_mod new file mode 100644 index 0000000..ebb6664 --- /dev/null +++ b/hardware/boards/main-control-board/libraries/footprints/tiny_engineer_modules.pretty/MAX98357_Module.kicad_mod @@ -0,0 +1,340 @@ +(footprint "MAX98357_Module" + (version 20260206) + (generator "pcbnew") + (generator_version "10.0") + (layer "F.Cu") + (property "Reference" "REF**" + (at 2.5 0 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "28491e90-7f4a-4d78-bca4-3ec86b4d4116") + (effects + (font + (size 1 1) + (thickness 0.12) + ) + ) + ) + (property "Value" "MAX98357_Module" + (at 0 10 0) + (unlocked yes) + (layer "F.Fab") + (uuid "b5002ee8-3da0-4c80-bc98-165b192a79c7") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "2b93341e-5299-4b09-a866-c10ae0f613e0") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "9c2d7593-a453-44f7-b6bd-a47d226029fe") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (attr through_hole) + (duplicate_pad_numbers_are_jumpers no) + (fp_line + (start -9.35 -8.95) + (end 9.35 -8.95) + (stroke + (width 0.1) + (type default) + ) + (layer "F.SilkS") + (uuid "de7ef516-122b-4260-af79-e713f585ec12") + ) + (fp_line + (start -9.35 8.75) + (end -9.35 -8.95) + (stroke + (width 0.1) + (type default) + ) + (layer "F.SilkS") + (uuid "23a3855d-1c76-4dd6-acb5-cec4c8ffd687") + ) + (fp_line + (start 9.35 -8.95) + (end 9.35 8.75) + (stroke + (width 0.1) + (type default) + ) + (layer "F.SilkS") + (uuid "ae43a8f8-7518-4e9d-8b3d-2760a01be468") + ) + (fp_line + (start 9.35 8.75) + (end -9.35 8.75) + (stroke + (width 0.1) + (type default) + ) + (layer "F.SilkS") + (uuid "4c9c1ecc-e569-46c2-beb5-3bd05e687f68") + ) + (fp_rect + (start -9.35 -8.95) + (end 9.35 8.75) + (stroke + (width 0.1) + (type default) + ) + (fill no) + (layer "F.SilkS") + (uuid "14acfdb1-6436-4711-8f40-902eeebc3a01") + ) + (fp_line + (start -9.35 -8.95) + (end 9.35 -8.95) + (stroke + (width 0.1) + (type default) + ) + (layer "F.CrtYd") + (uuid "763ac5a5-2ea3-4ffc-978d-28213a5af370") + ) + (fp_line + (start -9.35 8.75) + (end -9.35 -8.95) + (stroke + (width 0.1) + (type default) + ) + (layer "F.CrtYd") + (uuid "98b5389e-f869-4570-a658-6c85a4c22dff") + ) + (fp_line + (start 9.35 -8.95) + (end 9.35 8.75) + (stroke + (width 0.1) + (type default) + ) + (layer "F.CrtYd") + (uuid "7b5799cb-3dd0-4f6d-997b-4d00d2180819") + ) + (fp_line + (start 9.35 8.75) + (end -9.35 8.75) + (stroke + (width 0.1) + (type default) + ) + (layer "F.CrtYd") + (uuid "d13a7f36-dc22-497a-bea7-5b2c120ae031") + ) + (fp_text user "LRC" + (at -6.35 -7.5 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "93d3de84-bd66-4441-a345-b3c23a0eaecc") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "BCLK" + (at -6.35 -5 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "d66f2a0d-b05a-4c60-a5fa-9c48f9715227") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "DIN" + (at -6.35 -2.5 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "05280327-8c86-434d-a932-9f30a65c9e39") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "GAIN" + (at -6.35 0 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "8a7b4ab8-9fc5-453d-b192-ffcb23976158") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "SD" + (at -6.35 2.5 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "338031ba-3c3b-4ff3-912b-f0c29c9723ec") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "GND" + (at -6.35 5 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "edfa28e6-0dab-4912-9e85-c6ebe3150d39") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "Vin" + (at -6.35 7.5 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "9fb2035b-33ca-4743-8778-6046de7691dd") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "${REFERENCE}" + (at 0 12.5 0) + (unlocked yes) + (layer "F.Fab") + (uuid "5e465cfc-8527-4219-b2f2-68cf2a55be8a") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "1" thru_hole roundrect + (at -7.5 -7.5) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (roundrect_rratio 0.1470588235) + (uuid "34f10d78-02f8-4ff4-bd01-35ae4e3c8516") + ) + (pad "2" thru_hole circle + (at -7.5 -5) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "6c87f91e-dff1-4d5a-8c0c-ed51b5b5bfc3") + ) + (pad "3" thru_hole circle + (at -7.5 -2.5) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "c62ded49-c077-410c-8c4c-903330ce14c3") + ) + (pad "4" thru_hole circle + (at -7.5 0) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "a4271a54-d33c-4773-883c-4d119697f072") + ) + (pad "5" thru_hole circle + (at -7.5 2.5) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "ed708f78-1adc-492f-830e-b64f169d567c") + ) + (pad "6" thru_hole circle + (at -7.5 5) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "1b8a2713-4f8f-46de-ac8f-547544a7a2ac") + ) + (pad "7" thru_hole circle + (at -7.5 7.5) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "d3e11af6-2e30-4e13-a063-c4e25a9507b4") + ) + (zone + (layer "F.Fab") + (uuid "3cc5f05d-230d-47df-9563-e152c53013cb") + (hatch edge 0.5) + (connect_pads + (clearance 0) + ) + (min_thickness 0.25) + (keepout + (tracks allowed) + (vias allowed) + (pads not_allowed) + (copperpour allowed) + (footprints not_allowed) + ) + (placement + (enabled no) + (sheetname "") + ) + (fill + (thermal_gap 0.5) + (thermal_bridge_width 0.5) + (island_removal_mode 0) + ) + (polygon + (pts + (xy -9.35 -8.95) (xy 9.35 -8.95) (xy 9.35 8.75) (xy -9.35 8.75) + ) + ) + ) + (embedded_fonts no) +) From 8097c16ed1a47eb2f3582390078a32bf3acd55ec Mon Sep 17 00:00:00 2001 From: Krzysztof Jamroz Date: Sun, 13 Sep 2026 19:53:04 +0200 Subject: [PATCH 06/12] feat(pcb): add pcb schematic --- REUSE.toml | 5 + docs/hardware/components.md | 2 +- docs/hardware/interfaces.md | 4 +- docs/hardware/pinout.md | 5 +- docs/hardware/servos.md | 4 +- docs/hardware/testing.md | 2 +- docs/hardware/wiring.md | 6 +- hardware/boards/main-control-board/README.md | 9 +- .../symbols/tiny_engineer_modules.kicad_sym | 4 +- .../main-control-board.kicad_pro | 234 +- .../main-control-board.kicad_sch | 3769 ++++++++++++++++- include/pins.h | 4 +- 12 files changed, 4025 insertions(+), 23 deletions(-) diff --git a/REUSE.toml b/REUSE.toml index 309f2a9..2bb5b58 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -26,6 +26,11 @@ path = "hardware/boards/**" SPDX-FileCopyrightText = "2026 Krzysztof Jamroz" SPDX-License-Identifier = "CERN-OHL-S-2.0" +[[annotations]] +path = "hardware/boards/main-control-board/**" +SPDX-FileCopyrightText = "2026 Krzysztof Jamroz" +SPDX-License-Identifier = "CERN-OHL-S-2.0" + [[annotations]] path = "hardware/LICENSE" SPDX-License-Identifier = "CERN-OHL-S-2.0" diff --git a/docs/hardware/components.md b/docs/hardware/components.md index ed1d68f..774617b 100644 --- a/docs/hardware/components.md +++ b/docs/hardware/components.md @@ -52,7 +52,7 @@ Constants cited below match [`include/pins.h`](../../include/pins.h). | Interface | I2C | | Address | `0x40` (`PCA9685_ADDRESS` in firmware). A0–A5 pads can change this | | PWM | 12-bit, firmware `setPWMFreq(50)` | -| Important pins | As drawn: **5V** (servo-rail in), **V+** (to servo 5V), **VCC** (3V3 logic), **GND**, **SDA**, **SCL**, **PWM**. OE not drawn | +| Important pins | As drawn: **5V** (servo-rail in), **V+** (to servo 5V), **VCC** (3V3 logic), **GND**, **SDA**, **SCL**, **PWM**, **OE** (GP5) | | Channels used | 0–4 (five servos). 5–15 unused | | Limits | **V+** and **VCC** must stay separate. Do not jumper servo power onto logic VCC on this robot | | Firmware note | Detection at `0x40` is a **hard fail** in the bring-up test | diff --git a/docs/hardware/interfaces.md b/docs/hardware/interfaces.md index 3348aed..77ca118 100644 --- a/docs/hardware/interfaces.md +++ b/docs/hardware/interfaces.md @@ -57,13 +57,13 @@ Generated by **PCA9685**, not by ESP32 LEDC/MCPWM. ESP32 GPIO is not wired to servo SIG lines. -### PCA9685 output enable (optional) +### PCA9685 output enable | Signal | ESP32 GPIO | Notes | | --- | --- | --- | | OE | GPIO5 / GP5 | **Active LOW** — outputs enabled. Firmware drives **HIGH** during PCA9685 init, then **LOW** after neutral PWM is written | -Controlled only when `PCA9685_OE_WIRED = true` in [`include/pins.h`](../../include/pins.h). Default `false`: OE pin unused (Adafruit breakout pull-down keeps outputs enabled). Wire GP5 → PCA9685 **OE** and set the flag to block invalid PWM during boot and flash resets. +Wired on main-control-board (`PCA9685_OE_WIRED = true` in [`include/pins.h`](../../include/pins.h)). Blocks invalid PWM during boot and flash resets. ## USB diff --git a/docs/hardware/pinout.md b/docs/hardware/pinout.md index eafa914..27f197a 100644 --- a/docs/hardware/pinout.md +++ b/docs/hardware/pinout.md @@ -11,7 +11,7 @@ Source of truth: [`include/pins.h`](../../include/pins.h). This file must match | I2S BCLK | **GPIO2** (diagram **GP2**) | `I2S_BCLK` | MAX98357A BCLK | | I2S LRCLK / WS | **GPIO3** (diagram **GP3**) | `I2S_LRC` | MAX98357A **LRC** | | I2S DATA OUT | **GPIO4** (diagram **GP4**) | `I2S_DIN` | MAX98357A DIN | -| PCA9685 OE (optional) | **GPIO5** (diagram **GP5**) | `PCA9685_OE_PIN` | PCA9685 **OE** when `PCA9685_OE_WIRED` | +| PCA9685 OE | **GPIO5** (diagram **GP5**) | `PCA9685_OE_PIN` | PCA9685 **OE** (`PCA9685_OE_WIRED`) | | Built-in WS2812 RGB | **GPIO10** | `RGB_LED_PIN` | onboard LED only | Logic level: **3.3 V**. @@ -30,7 +30,6 @@ Logic level: **3.3 V**. | GPIO | Status | Notes | | --- | --- | --- | -| GPIO5 | **Optional** | PCA9685 **OE** when wired; set `PCA9685_OE_WIRED = true` in `pins.h` | | GPIO6 | Free | Unused | | GPIO7 | Free | Unused | | GPIO8 | Free | Unused | @@ -60,7 +59,7 @@ Power pads (not GPIO): **5V**, **GND**, **3V3**. | `OLED_WIDTH` / `OLED_HEIGHT` | 128 / 32 | Display | | `SERVO_MIN_US` / `SERVO_MAX_US` | 800 / 2200 | Electrical PWM span | | `SERVO_BOOT_SPEED_DEG_S` | 35 | Boot centering / sleep-pose rate (deg/s) | -| `PCA9685_OE_WIRED` | `false` | Set `true` after wiring GP5 → PCA9685 OE | +| `PCA9685_OE_WIRED` | `true` | GP5 → PCA9685 OE on main-control-board | ## Pin allocation rules diff --git a/docs/hardware/servos.md b/docs/hardware/servos.md index 843aee1..abc985d 100644 --- a/docs/hardware/servos.md +++ b/docs/hardware/servos.md @@ -47,12 +47,12 @@ Verified in [`include/pins.h`](../../include/pins.h) and [`include/servos.h`](.. On every boot (and after each flash reset): -1. **Optional OE** — if `PCA9685_OE_WIRED`, GP5 disables PCA9685 outputs before I2C init. +1. **OE** — `PCA9685_OE_WIRED` is true on main-control-board: GP5 disables PCA9685 outputs before I2C init. 2. **Early init** — PCA9685 is probed and configured immediately after `Wire.begin`, before OLED, settings, or Wi-Fi. 3. **Neutral park** — all channels receive mid-pulse PWM while OE is still disabled (if wired), then outputs enable. 4. **Smooth boot moves** — `centerAllServos()` and sleep-inertia pose use `servoMoveAllSmoothTo()` at `SERVO_BOOT_SPEED_DEG_S` (35°/s), not instant snaps. -Set `PCA9685_OE_WIRED = true` in [`include/pins.h`](../../include/pins.h) after wiring GP5 → PCA9685 **OE**. OE is **active LOW** on the Adafruit breakout. +GP5 → PCA9685 **OE** is wired on main-control-board (`PCA9685_OE_WIRED = true` in [`include/pins.h`](../../include/pins.h)). OE is **active LOW** on the Adafruit breakout. ## Motion modes diff --git a/docs/hardware/testing.md b/docs/hardware/testing.md index ee35ad4..55d1290 100644 --- a/docs/hardware/testing.md +++ b/docs/hardware/testing.md @@ -19,7 +19,7 @@ Build/flash: project root README (`pio run`, `pio run -t upload`, serial 115200) | --- | --- | | Built-in WS2812 | Green ready (GPIO10) | | I2C init | `Wire.begin` on GPIO0/GPIO1 | -| PCA9685 | Probe `0x40` early; park neutral; optional OE on GP5 | +| PCA9685 | Probe `0x40` early; park neutral; OE on GP5 (`PCA9685_OE_WIRED`) | | OLED | Probe `0x3C`, init (optional) | | Wi-Fi | STA connect from saved NVS credentials, or setup AP `TinyEngineer-XXXX` when unset/failed; mDNS `{hostname}.local` after STA connect | | MAX98357A / I2S | `I2S.begin` 44.1 kHz 16-bit stereo | diff --git a/docs/hardware/wiring.md b/docs/hardware/wiring.md index 4d984e0..bb65981 100644 --- a/docs/hardware/wiring.md +++ b/docs/hardware/wiring.md @@ -49,7 +49,7 @@ On Adafruit PCA9685, header/terminal **V+** is normally the same servo rail as t | ESP32-C3-Zero | GP2 | MAX98357A | BCLK | I2S bit clock | | ESP32-C3-Zero | GP3 | MAX98357A | LRC | I2S word select | | ESP32-C3-Zero | GP4 | MAX98357A | DIN | I2S data | -| ESP32-C3-Zero | GP5 | PCA9685 | OE | Optional output enable (see [interfaces.md](interfaces.md)) | +| ESP32-C3-Zero | GP5 | PCA9685 | OE | Output enable (see [interfaces.md](interfaces.md)) | | PCA9685 | PWM | Servo | SIG | Servo PWM | | PCA9685 | V+ | Servo | 5V | Servo power | | PCA9685 | GND (servo side) | Servo | GND | Servo ground | @@ -127,9 +127,9 @@ ESP32-C3-Zero, unused in the PNG: **GP6, GP7, GP8, GP9, GP10, GP20, GP21** -GP5 = optional PCA9685 OE (not in PNG). GP9 = BOOT, GP10 = onboard WS2812. GP18/GP19 = native USB — wire from 5993 D−/D+ even if the base PNG omits them. See [pinout.md](pinout.md). +GP5 = PCA9685 OE on main-control-board (`PCA9685_OE_WIRED`). GP9 = BOOT, GP10 = onboard WS2812. GP18/GP19 = native USB — wire from 5993 D−/D+ even if the base PNG omits them. See [pinout.md](pinout.md). -PCA9685 **OE** optional on GP5 — not drawn on base PNG. MAX98357A **GAIN** / **SD** not wired (breakout defaults). **SPK+** / **SPK-** not drawn. +PCA9685 **OE** is GP5 on this board. MAX98357A **GAIN** / **SD** not wired (breakout defaults). **SPK+** / **SPK-** not drawn. ## Not on the drawing diff --git a/hardware/boards/main-control-board/README.md b/hardware/boards/main-control-board/README.md index 00b7f3a..97923c6 100644 --- a/hardware/boards/main-control-board/README.md +++ b/hardware/boards/main-control-board/README.md @@ -2,11 +2,12 @@ Carrier PCB that reduces jumper wiring: existing modules plug in on pin headers. +- **Purpose:** interconnect / carrier with header sockets for the existing modules - **Status:** draft - **KiCad:** 10 -- **Interfaces:** header sockets for the Waveshare ESP32-C3-Zero, Adafruit PCA9685, MAX98357A, SSD1306 OLED, Adafruit 5993 USB-C breakout, and five servo 3-pin plugs; shared I2C (ESP32 GP0/GP1 → PCA9685 and SSD1306 OLED); point-to-point I2S (ESP32 GP2/GP3/GP4 → MAX98357A BCLK/LRC/DIN); USB D+/D− (5993 → ESP32 GP19/GP18); MAX98357A SPK+/SPK− → speaker; +5V, 3V3, and GND -- **Assumptions:** nets follow [`docs/hardware/`](../../../docs/hardware/README.md) (keep servo **+5V** off logic **3V3**; common GND). Schematic and PCB are empty KiCad 10 stubs. Custom module symbols live in [`libraries/symbols/tiny_engineer_modules.kicad_sym`](libraries/symbols/tiny_engineer_modules.kicad_sym). ESP32-C3-Zero symbol pin numbers are Waveshare **header pads** (pad 1 = 5V, numbered anticlockwise from USB), not the ESP32-C3 QFN package. -- **ERC / DRC:** empty schematic and PCB; both checks clean (no nets, no copper). Re-run when schematic and layout land. +- **Interfaces:** header sockets for the Waveshare ESP32-C3-Zero, Adafruit PCA9685, MAX98357A, SSD1306 OLED, and Adafruit 5993 USB-C breakout; shared I2C (ESP32 GP0/GP1 → PCA9685 and SSD1306 OLED); point-to-point I2S (ESP32 GP2/GP3/GP4 → MAX98357A BCLK/LRC/DIN); USB D+/D− (5993 → ESP32 GP19/GP18); PCA9685 OE ← GP5; +5V, 3V3, and GND. Servo 3-pin plugs and speaker terminals stay on the modules this revision. +- **Assumptions:** nets follow [`docs/hardware/`](../../../docs/hardware/README.md) (keep servo **+5V** off logic **3V3**; common GND). Custom module symbols live in [`libraries/symbols/tiny_engineer_modules.kicad_sym`](libraries/symbols/tiny_engineer_modules.kicad_sym). ESP32-C3-Zero symbol pin numbers are Waveshare **header pads** (pad 1 = 5V, numbered anticlockwise from USB), not the ESP32-C3 QFN package. +- **ERC / DRC:** schematic ERC after this pass; PCB is still an empty stub (DRC N/A until layout). - **Built:** not manufactured - **Tested:** not tested @@ -14,6 +15,6 @@ Carrier PCB that reduces jumper wiring: existing modules plug in on pin headers. First revision is sockets only. Design in KiCad 10, then fabricate, so the robot is wired on a board instead of Dupont harnesses. -Later revisions may integrate some or all of those functions onto this PCB and drop the plug-in modules. Electrical reference stays in `docs/hardware/` until a schematic is merged. +Later revisions may integrate some or all of those functions onto this PCB and drop the plug-in modules. Contribution rules: [`docs/pcb.md`](../../../docs/pcb.md). diff --git a/hardware/boards/main-control-board/libraries/symbols/tiny_engineer_modules.kicad_sym b/hardware/boards/main-control-board/libraries/symbols/tiny_engineer_modules.kicad_sym index 46a2e2d..6213431 100644 --- a/hardware/boards/main-control-board/libraries/symbols/tiny_engineer_modules.kicad_sym +++ b/hardware/boards/main-control-board/libraries/symbols/tiny_engineer_modules.kicad_sym @@ -790,7 +790,7 @@ ) (embedded_fonts no) ) - (symbol "Waceshare_OLED_09_Module" + (symbol "Waveshare_OLED_09_Module" (exclude_from_sim no) (in_bom yes) (on_board yes) @@ -849,7 +849,7 @@ ) ) ) - (symbol "Waceshare_OLED_09_Module_1_1" + (symbol "Waveshare_OLED_09_Module_1_1" (rectangle (start -17.78 5.08) (end 17.78 -5.08) diff --git a/hardware/boards/main-control-board/main-control-board.kicad_pro b/hardware/boards/main-control-board/main-control-board.kicad_pro index c4e9089..829d605 100644 --- a/hardware/boards/main-control-board/main-control-board.kicad_pro +++ b/hardware/boards/main-control-board/main-control-board.kicad_pro @@ -1,6 +1,238 @@ { "board": { "3dviewports": [], + "design_settings": { + "defaults": { + "apply_defaults_to_fp_barcodes": false, + "apply_defaults_to_fp_dimensions": false, + "apply_defaults_to_fp_fields": false, + "apply_defaults_to_fp_shapes": false, + "apply_defaults_to_fp_text": false, + "board_outline_line_width": 0.05, + "copper_line_width": 0.2, + "copper_text_italic": false, + "copper_text_size_h": 1.5, + "copper_text_size_v": 1.5, + "copper_text_thickness": 0.3, + "copper_text_upright": false, + "courtyard_line_width": 0.05, + "dimension_precision": 4, + "dimension_units": 3, + "dimensions": { + "arrow_length": 1270000, + "extension_offset": 500000, + "keep_text_aligned": true, + "suppress_zeroes": true, + "text_position": 0, + "units_format": 0 + }, + "fab_line_width": 0.1, + "fab_text_italic": false, + "fab_text_size_h": 1.0, + "fab_text_size_v": 1.0, + "fab_text_thickness": 0.15, + "fab_text_upright": false, + "other_line_width": 0.1, + "other_text_italic": false, + "other_text_size_h": 1.0, + "other_text_size_v": 1.0, + "other_text_thickness": 0.15, + "other_text_upright": false, + "pads": { + "drill": 0.8, + "height": 1.27, + "width": 1.27 + }, + "silk_line_width": 0.1, + "silk_text_italic": false, + "silk_text_size_h": 1.0, + "silk_text_size_v": 1.0, + "silk_text_thickness": 0.1, + "silk_text_upright": false, + "zones": { + "border_display_style": 2, + "border_hatch_pitch": 0.5, + "corner_radius": 0.0, + "corner_smoothing": 0, + "fill_mode": 0, + "hatch_gap": 1.5, + "hatch_orientation": 0.0, + "hatch_smoothing_level": 0, + "hatch_smoothing_value": 0.1, + "hatch_thickness": 1.0, + "min_clearance": 0.5, + "min_island_area": 10.0, + "min_thickness": 0.25, + "pad_connection": 1, + "remove_islands": 0, + "thermal_relief_gap": 0.5, + "thermal_relief_spoke_width": 0.5 + } + }, + "diff_pair_dimensions": [], + "drc_exclusions": [], + "meta": { + "version": 2 + }, + "rule_severities": { + "annular_width": "error", + "clearance": "error", + "connection_width": "warning", + "copper_edge_clearance": "error", + "copper_sliver": "warning", + "courtyards_overlap": "error", + "creepage": "error", + "diff_pair_gap_out_of_range": "error", + "diff_pair_uncoupled_length_too_long": "error", + "drill_out_of_range": "error", + "duplicate_footprints": "warning", + "extra_footprint": "warning", + "footprint": "error", + "footprint_filters_mismatch": "ignore", + "footprint_symbol_field_mismatch": "warning", + "footprint_symbol_mismatch": "warning", + "footprint_type_mismatch": "ignore", + "hole_clearance": "error", + "hole_to_hole": "warning", + "holes_co_located": "warning", + "invalid_outline": "error", + "isolated_copper": "warning", + "item_on_disabled_layer": "error", + "items_not_allowed": "error", + "length_out_of_range": "error", + "lib_footprint_issues": "warning", + "lib_footprint_mismatch": "warning", + "malformed_courtyard": "error", + "microvia_drill_out_of_range": "error", + "mirrored_text_on_front_layer": "warning", + "missing_courtyard": "ignore", + "missing_footprint": "warning", + "missing_tuning_profile": "warning", + "net_conflict": "warning", + "nonmirrored_text_on_back_layer": "warning", + "npth_inside_courtyard": "error", + "padstack": "warning", + "pth_inside_courtyard": "error", + "shorting_items": "error", + "silk_edge_clearance": "warning", + "silk_over_copper": "warning", + "silk_overlap": "warning", + "skew_out_of_range": "error", + "solder_mask_bridge": "error", + "starved_thermal": "error", + "text_height": "warning", + "text_on_edge_cuts": "error", + "text_thickness": "warning", + "through_hole_pad_without_hole": "error", + "too_many_vias": "error", + "track_angle": "error", + "track_dangling": "warning", + "track_not_centered_on_via": "ignore", + "track_on_post_machined_layer": "error", + "track_segment_length": "error", + "track_width": "error", + "tracks_crossing": "error", + "tuning_profile_track_geometries": "ignore", + "unconnected_items": "error", + "unresolved_variable": "error", + "via_dangling": "warning", + "zones_intersect": "error" + }, + "rules": { + "max_error": 0.005, + "min_clearance": 0.0, + "min_connection": 0.0, + "min_copper_edge_clearance": 0.5, + "min_groove_width": 0.0, + "min_hole_clearance": 0.25, + "min_hole_to_hole": 0.25, + "min_microvia_diameter": 0.2, + "min_microvia_drill": 0.1, + "min_resolved_spokes": 2, + "min_silk_clearance": 0.0, + "min_text_height": 0.8, + "min_text_thickness": 0.08, + "min_through_hole_diameter": 0.3, + "min_track_width": 0.2, + "min_via_annular_width": 0.1, + "min_via_diameter": 0.5, + "solder_mask_to_copper_clearance": 0.0, + "use_height_for_length_calcs": true + }, + "teardrop_options": [ + { + "td_onpthpad": true, + "td_onroundshapesonly": false, + "td_onsmdpad": true, + "td_ontrackend": false, + "td_onvia": true + } + ], + "teardrop_parameters": [ + { + "td_allow_use_two_tracks": true, + "td_curve_segcount": 0, + "td_height_ratio": 1.0, + "td_length_ratio": 0.5, + "td_maxheight": 2.0, + "td_maxlen": 1.0, + "td_on_pad_in_zone": false, + "td_target_name": "td_round_shape", + "td_width_to_size_filter_ratio": 0.9 + }, + { + "td_allow_use_two_tracks": true, + "td_curve_segcount": 0, + "td_height_ratio": 1.0, + "td_length_ratio": 0.5, + "td_maxheight": 2.0, + "td_maxlen": 1.0, + "td_on_pad_in_zone": false, + "td_target_name": "td_rect_shape", + "td_width_to_size_filter_ratio": 0.9 + }, + { + "td_allow_use_two_tracks": true, + "td_curve_segcount": 0, + "td_height_ratio": 1.0, + "td_length_ratio": 0.5, + "td_maxheight": 2.0, + "td_maxlen": 1.0, + "td_on_pad_in_zone": false, + "td_target_name": "td_track_end", + "td_width_to_size_filter_ratio": 0.9 + } + ], + "track_widths": [], + "tuning_pattern_settings": { + "diff_pair_defaults": { + "corner_radius_percentage": 80, + "corner_style": 1, + "max_amplitude": 1.0, + "min_amplitude": 0.2, + "single_sided": false, + "spacing": 1.0 + }, + "diff_pair_skew_defaults": { + "corner_radius_percentage": 80, + "corner_style": 1, + "max_amplitude": 1.0, + "min_amplitude": 0.2, + "single_sided": false, + "spacing": 0.6 + }, + "single_track_defaults": { + "corner_radius_percentage": 80, + "corner_style": 1, + "max_amplitude": 1.0, + "min_amplitude": 0.2, + "single_sided": false, + "spacing": 0.6 + } + }, + "via_dimensions": [], + "zones_allow_external_fillets": false + }, "ipc2581": { "bom_rev": "", "dist": "", @@ -8,7 +240,7 @@ "internal_id": "", "mfg": "", "mpn": "", - "sch_revision": "" + "sch_revision": "v1" }, "layer_pairs": [], "layer_presets": [], diff --git a/hardware/boards/main-control-board/main-control-board.kicad_sch b/hardware/boards/main-control-board/main-control-board.kicad_sch index cbbfd86..e2fc443 100644 --- a/hardware/boards/main-control-board/main-control-board.kicad_sch +++ b/hardware/boards/main-control-board/main-control-board.kicad_sch @@ -2,9 +2,3774 @@ (version 20260306) (generator "eeschema") (generator_version "10.0") - (uuid "82a78d11-58ff-455c-a94e-f7463ce9fc2e") + (uuid "ede99216-bb86-4aec-876e-63688c114483") (paper "A4") - (lib_symbols) + (title_block + (title "TinyEngineer PCB") + (date "2026-09-12") + (rev "v1") + ) + (lib_symbols + (symbol "Connector:Conn_01x04_Socket" + (pin_names + (offset 1.016) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (duplicate_pin_numbers_are_jumpers no) + (property "Reference" "J" + (at 0 5.08 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Conn_01x04_Socket" + (at 0 -7.62 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "Generic connector, single row, 01x04, script generated" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "ki_locked" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "ki_keywords" "connector" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "ki_fp_filters" "Connector*:*_1x??_*" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (symbol "Conn_01x04_Socket_1_1" + (polyline + (pts + (xy -1.27 2.54) (xy -0.508 2.54) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 0) (xy -0.508 0) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -2.54) (xy -0.508 -2.54) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -5.08) (xy -0.508 -5.08) + ) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 2.032) + (mid -0.5058 2.54) + (end 0 3.048) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -0.508) + (mid -0.5058 0) + (end 0 0.508) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -3.048) + (mid -0.5058 -2.54) + (end 0 -2.032) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 -5.588) + (mid -0.5058 -5.08) + (end 0 -4.572) + (stroke + (width 0.1524) + (type default) + ) + (fill + (type none) + ) + ) + (pin passive line + (at -5.08 2.54 0) + (length 3.81) + (name "Pin_1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 0 0) + (length 3.81) + (name "Pin_2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -2.54 0) + (length 3.81) + (name "Pin_3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -5.08 -5.08 0) + (length 3.81) + (name "Pin_4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "TinyEngineerModules:Adafruit_PCA9685_Module" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (duplicate_pin_numbers_are_jumpers no) + (property "Reference" "U" + (at 5.334 9.144 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Adafruit PCA9685" + (at -1.778 0 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (symbol "Adafruit_PCA9685_Module_1_1" + (rectangle + (start -12.7 7.62) + (end 12.7 -7.62) + (stroke + (width 0) + (type solid) + ) + (fill + (type background) + ) + ) + (pin power_in line + (at 0 -10.16 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 15.24 3.81 180) + (length 2.54) + (name "OE" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 15.24 1.27 180) + (length 2.54) + (name "SCL" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 -1.27 180) + (length 2.54) + (name "SDA" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 15.24 -3.81 180) + (length 2.54) + (name "VCC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 10.16 270) + (length 2.54) + (name "V+" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "TinyEngineerModules:ESP32_C3_Zero_Dev_Board" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (duplicate_pin_numbers_are_jumpers no) + (property "Reference" "U" + (at -0.254 2.286 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "ESP32-C3-ZERO" + (at 0.254 -1.016 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "https://www.waveshare.com/wiki/ESP32-C3-Zero" + (at 30.734 -19.304 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "Waveshare ESP32-C3-Zero module header, pads numbered anticlockwise from USB" + (at 46.736 -16.002 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (symbol "ESP32_C3_Zero_Dev_Board_1_1" + (rectangle + (start -15.24 11.43) + (end 15.24 -11.43) + (stroke + (width 0) + (type solid) + ) + (fill + (type background) + ) + ) + (pin power_in line + (at 0 13.97 270) + (length 2.54) + (name "5V" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -13.97 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_out line + (at -17.78 10.16 0) + (length 2.54) + (name "3V3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -17.78 2.54 0) + (length 2.54) + (name "GP0" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -17.78 0 0) + (length 2.54) + (name "GP1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -17.78 -2.54 0) + (length 2.54) + (name "GP2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -17.78 -5.08 0) + (length 2.54) + (name "GP3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -17.78 -7.62 0) + (length 2.54) + (name "GP4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at -17.78 -10.16 0) + (length 2.54) + (name "GP5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -10.16 180) + (length 2.54) + (name "GP6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -7.62 180) + (length 2.54) + (name "GP7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "11" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -5.08 180) + (length 2.54) + (name "GP8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 -2.54 180) + (length 2.54) + (name "GP9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "13" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 0 180) + (length 2.54) + (name "GP10" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "14" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 2.54 180) + (length 2.54) + (name "USB_DM" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "15" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 5.08 180) + (length 2.54) + (name "USB_DP" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "16" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 7.62 180) + (length 2.54) + (name "RX" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "17" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 17.78 10.16 180) + (length 2.54) + (name "TX" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "18" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "TinyEngineerModules:MAX98357_Module" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (duplicate_pin_numbers_are_jumpers no) + (property "Reference" "U" + (at 12.446 -4.572 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "MAX98357A" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (symbol "MAX98357_Module_1_1" + (rectangle + (start -11.4299 6.35) + (end 11.43 -6.35) + (stroke + (width 0) + (type solid) + ) + (fill + (type background) + ) + ) + (text "MAX98357" + (at 6.858 7.366 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin input line + (at -13.97 5.08 0) + (length 2.54) + (name "LRC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -13.97 2.54 0) + (length 2.54) + (name "BCLK" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -13.97 0 0) + (length 2.54) + (name "DIN" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -13.97 -2.54 0) + (length 2.54) + (name "GAIN" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at -13.97 -5.08 0) + (length 2.54) + (name "SD" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -8.89 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 8.89 270) + (length 2.54) + (name "Vin" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "TinyEngineerModules:Waveshare_OLED_09_Module" + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (duplicate_pin_numbers_are_jumpers no) + (property "Reference" "U" + (at 9.144 9.398 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "Waveshare 0.91 OLED" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (symbol "Waveshare_OLED_09_Module_1_1" + (rectangle + (start -17.78 5.08) + (end 17.78 -5.08) + (stroke + (width 0) + (type solid) + ) + (fill + (type background) + ) + ) + (text "OLED 0.9 I2C" + (at 14.732 6.604 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin power_in line + (at 0 7.62 270) + (length 2.54) + (name "VCC" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin power_in line + (at 0 -7.62 90) + (length 2.54) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 20.32 1.27 180) + (length 2.54) + (name "SDA" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin input line + (at 20.32 -1.27 180) + (length 2.54) + (name "SCL" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "power:+3.3V" + (power global) + (pin_numbers + (hide yes) + ) + (pin_names + (offset 0) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (duplicate_pin_numbers_are_jumpers no) + (property "Reference" "#PWR" + (at 0 -3.81 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "+3.3V" + (at 0 3.556 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+3.3V\"" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (symbol "+3.3V_0_1" + (polyline + (pts + (xy -0.762 1.27) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0.762 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "+3.3V_1_1" + (pin power_in line + (at 0 0 90) + (length 0) + (name "" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "power:+5V" + (power global) + (pin_numbers + (hide yes) + ) + (pin_names + (offset 0) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (duplicate_pin_numbers_are_jumpers no) + (property "Reference" "#PWR" + (at 0 -3.81 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "+5V" + (at 0 3.556 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+5V\"" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (symbol "+5V_0_1" + (polyline + (pts + (xy -0.762 1.27) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0.762 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "+5V_1_1" + (pin power_in line + (at 0 0 90) + (length 0) + (name "" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "power:GND" + (power global) + (pin_numbers + (hide yes) + ) + (pin_names + (offset 0) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (duplicate_pin_numbers_are_jumpers no) + (property "Reference" "#PWR" + (at 0 -6.35 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "GND" + (at 0 -3.81 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "Power symbol creates a global label with name \"GND\" , ground" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (symbol "GND_0_1" + (polyline + (pts + (xy 0 0) (xy 0 -1.27) (xy 1.27 -1.27) (xy 0 -2.54) (xy -1.27 -1.27) (xy 0 -1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "GND_1_1" + (pin power_in line + (at 0 0 270) + (length 0) + (name "" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + (symbol "power:PWR_FLAG" + (power global) + (pin_numbers + (hide yes) + ) + (pin_names + (offset 0) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (duplicate_pin_numbers_are_jumpers no) + (property "Reference" "#FLG" + (at 0 1.905 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "PWR_FLAG" + (at 0 3.81 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "Special symbol for telling ERC where power comes from" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "ki_keywords" "flag power" + (at 0 0 0) + (show_name no) + (do_not_autoplace no) + (hide yes) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (symbol "PWR_FLAG_0_0" + (pin power_out line + (at 0 0 90) + (length 0) + (name "" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (symbol "PWR_FLAG_0_1" + (polyline + (pts + (xy 0 0) (xy 0 1.27) (xy -1.016 1.905) (xy 0 2.54) (xy 1.016 1.905) (xy 0 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (embedded_fonts no) + ) + ) + (junction + (at 227.33 92.71) + (diameter 0) + (color 0 0 0 0) + (uuid "2a6fdd7d-5846-42c4-911d-20bbeac9f8e3") + ) + (junction + (at 217.17 90.17) + (diameter 0) + (color 0 0 0 0) + (uuid "95517e64-94e3-4176-889a-1f8d362e5d4a") + ) + (junction + (at 100.33 87.63) + (diameter 0) + (color 0 0 0 0) + (uuid "b6908943-26b6-4393-9531-c298a41db6bb") + ) + (junction + (at 92.71 90.17) + (diameter 0) + (color 0 0 0 0) + (uuid "b7dbe18b-1f18-4a58-8313-4973c518bff1") + ) + (no_connect + (at 138.43 137.16) + (uuid "0be2d26f-9570-4d66-8f11-62ccd655ec9e") + ) + (no_connect + (at 173.99 92.71) + (uuid "5f09b727-0712-4ce9-8a68-309759f95975") + ) + (no_connect + (at 173.99 95.25) + (uuid "6ffc117c-5c4b-41a4-be44-04eaa006788a") + ) + (no_connect + (at 173.99 97.79) + (uuid "7218efb9-5e63-4409-8a3a-7c703d4b1ff8") + ) + (no_connect + (at 173.99 100.33) + (uuid "9da25426-07fd-47a8-99d8-50eae430ae38") + ) + (no_connect + (at 138.43 139.7) + (uuid "c5d1b4a2-8fcf-444f-9263-eae5ec8a7662") + ) + (no_connect + (at 173.99 80.01) + (uuid "d1e02bb4-e881-4365-b6aa-08797a65587e") + ) + (no_connect + (at 173.99 90.17) + (uuid "e82179fc-3b08-4bd6-8706-2d59a5ecfc63") + ) + (no_connect + (at 173.99 82.55) + (uuid "f0c1e006-3bc2-44ba-b103-3279944d9cc4") + ) + (wire + (pts + (xy 173.99 85.09) (xy 227.33 85.09) + ) + (stroke + (width 0) + (type default) + ) + (uuid "002024f3-5a63-48fa-994f-8fd9ac3f483b") + ) + (wire + (pts + (xy 92.71 55.88) (xy 92.71 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1252d2e9-3b77-47c7-887a-d79254c75e16") + ) + (wire + (pts + (xy 133.35 97.79) (xy 138.43 97.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "12f063ee-9ebb-4b40-a859-18ee9683f87f") + ) + (wire + (pts + (xy 227.33 99.06) (xy 227.33 92.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "135f6f17-0276-46ac-a64e-1d7f26c4a0b9") + ) + (wire + (pts + (xy 96.52 92.71) (xy 81.28 92.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "1c8c1d7d-2407-4473-adcc-a0ef17c94ad5") + ) + (wire + (pts + (xy 100.33 53.34) (xy 100.33 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "23067120-70b0-4941-b743-9108b8fbcb62") + ) + (wire + (pts + (xy 217.17 90.17) (xy 227.33 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "273b64a6-c832-4e4f-989e-e082c485adbc") + ) + (wire + (pts + (xy 133.35 134.62) (xy 133.35 97.79) + ) + (stroke + (width 0) + (type default) + ) + (uuid "3840acad-f6b7-4adb-88de-e3abe019237e") + ) + (wire + (pts + (xy 223.52 92.71) (xy 227.33 92.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "509b00bb-e49f-44fe-856c-4ae08b570393") + ) + (wire + (pts + (xy 86.36 55.88) (xy 92.71 55.88) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5264cfbe-137c-486b-816f-fd045d61ac90") + ) + (wire + (pts + (xy 217.17 99.06) (xy 217.17 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "527eb20f-fc07-40bf-981e-e3cf15bf80b1") + ) + (wire + (pts + (xy 128.27 92.71) (xy 138.43 92.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5b73faf0-4e2f-483e-a37b-fa85803880d9") + ) + (wire + (pts + (xy 138.43 100.33) (xy 88.9 100.33) + ) + (stroke + (width 0) + (type default) + ) + (uuid "5e78f923-0316-493f-acc1-acabdbb270f4") + ) + (wire + (pts + (xy 138.43 129.54) (xy 130.81 129.54) + ) + (stroke + (width 0) + (type default) + ) + (uuid "6ca120fc-98dd-43e0-9af3-856d5bcf12ed") + ) + (wire + (pts + (xy 214.63 90.17) (xy 217.17 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "86ba20b3-0e27-48fd-a5ca-d71f04d1ee18") + ) + (wire + (pts + (xy 138.43 134.62) (xy 133.35 134.62) + ) + (stroke + (width 0) + (type default) + ) + (uuid "873840cf-86af-4470-b6b1-4f084ba320a0") + ) + (wire + (pts + (xy 100.33 87.63) (xy 96.52 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9cab3d55-d052-427a-ba62-6490318d8bab") + ) + (wire + (pts + (xy 92.71 90.17) (xy 138.43 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "9f72b453-2431-42a2-9be0-149e9394b10f") + ) + (wire + (pts + (xy 88.9 100.33) (xy 88.9 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a3bf5889-e68e-4673-ac77-9f82fb959370") + ) + (wire + (pts + (xy 138.43 132.08) (xy 128.27 132.08) + ) + (stroke + (width 0) + (type default) + ) + (uuid "a84ccbbd-0f52-4b51-ac77-632a50c919be") + ) + (wire + (pts + (xy 81.28 90.17) (xy 92.71 90.17) + ) + (stroke + (width 0) + (type default) + ) + (uuid "ada2bdf0-5579-4b7a-a3a3-e05fa6b02a8a") + ) + (wire + (pts + (xy 86.36 53.34) (xy 100.33 53.34) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b29ac79c-eb53-4250-a816-7dd1ba1031b2") + ) + (wire + (pts + (xy 138.43 87.63) (xy 100.33 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b4022011-602d-4e94-a734-65a92f43d546") + ) + (wire + (pts + (xy 88.9 87.63) (xy 81.28 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b40f499a-92c1-4bdd-bcce-109f780db419") + ) + (wire + (pts + (xy 130.81 129.54) (xy 130.81 95.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "b54b6e35-0123-474c-a3d8-c052fc021c13") + ) + (wire + (pts + (xy 128.27 132.08) (xy 128.27 92.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "c3b20870-fce8-41ee-b23c-56b7effc5c58") + ) + (wire + (pts + (xy 81.28 101.6) (xy 81.28 95.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "da7781cb-5435-4271-aeff-c98d779eb73a") + ) + (wire + (pts + (xy 130.81 95.25) (xy 138.43 95.25) + ) + (stroke + (width 0) + (type default) + ) + (uuid "dab8bce2-6753-43ec-bc7e-9fa0305a13e0") + ) + (wire + (pts + (xy 173.99 87.63) (xy 227.33 87.63) + ) + (stroke + (width 0) + (type default) + ) + (uuid "db47f8f0-4bc5-405e-960e-88258571ce80") + ) + (wire + (pts + (xy 96.52 87.63) (xy 96.52 92.71) + ) + (stroke + (width 0) + (type default) + ) + (uuid "f20702be-ed06-4b37-be3d-b34e9b54eb99") + ) + (label "I2S_BCLK" + (at 128.27 119.38 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "09452212-c79c-4bf5-9f29-c9a25df5cae9") + ) + (label "I2S_DIN" + (at 133.35 119.38 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "1f92fe3d-a4d9-4b80-9f67-9def316a4f1f") + ) + (label "I2S_LRC" + (at 130.81 119.38 90) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "3669a922-1b83-42ae-b2f9-f6d2e6f55b1e") + ) + (label "I2C_SDA" + (at 86.36 53.34 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "5441f028-b52c-4019-92c7-054e7c06b9f4") + ) + (label "USB_D+" + (at 196.85 85.09 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "6b2308f9-33fa-4a70-b08d-eb4283397724") + ) + (label "I2C_SCL" + (at 86.36 55.88 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "85f492c8-39dd-4674-a532-fbc41a0c013d") + ) + (label "USB_D-" + (at 196.85 87.63 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left bottom) + ) + (uuid "a76883ce-1b88-4131-8f57-88670c23096b") + ) + (symbol + (lib_id "power:+5V") + (at 152.4 125.73 0) + (unit 1) + (body_style 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (dnp no) + (fields_autoplaced yes) + (uuid "1e70915d-648a-4ba3-bfcb-6578a48359ac") + (property "Reference" "#PWR07" + (at 152.4 129.54 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "+5V" + (at 152.4 120.65 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 152.4 125.73 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 152.4 125.73 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+5V\"" + (at 152.4 125.73 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "aa547513-bbff-4823-9d56-7a056f6d8258") + ) + (instances + (project "main-control-board" + (path "/82a78d11-58ff-455c-a94e-f7463ce9fc2e" + (reference "#PWR07") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3.3V") + (at 81.28 101.6 180) + (unit 1) + (body_style 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (dnp no) + (fields_autoplaced yes) + (uuid "28a8df45-b413-46f6-8379-ede9277e82b2") + (property "Reference" "#PWR05" + (at 81.28 97.79 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "+3.3V" + (at 81.28 106.68 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 81.28 101.6 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 81.28 101.6 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+3.3V\"" + (at 81.28 101.6 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "24b86346-b2df-48fa-89dc-ae648dd7cef8") + ) + (instances + (project "main-control-board" + (path "/82a78d11-58ff-455c-a94e-f7463ce9fc2e" + (reference "#PWR05") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "TinyEngineerModules:MAX98357_Module") + (at 152.4 134.62 0) + (unit 1) + (body_style 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (dnp no) + (fields_autoplaced yes) + (uuid "36531e2b-a362-4cd5-9344-6709539e35aa") + (property "Reference" "MAX1" + (at 165.1 132.3311 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "MAX98357A" + (at 165.1 134.8711 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "TinyEngineerModules:MAX98357_Module" + (at 152.4 134.62 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 152.4 134.62 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "" + (at 152.4 134.62 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "7" + (uuid "adfd1584-26d6-433f-a957-9c345b0bde39") + ) + (pin "6" + (uuid "d67056a2-fc9f-48ac-84b6-0b51ae88a29c") + ) + (pin "5" + (uuid "1d4c947a-58cc-4eab-98a7-6c7f52abcc27") + ) + (pin "1" + (uuid "75a96ac8-308a-4834-ab61-f93956e214e5") + ) + (pin "4" + (uuid "6405be18-6cee-478f-8d1b-5514d92f7e80") + ) + (pin "2" + (uuid "8f302ff6-5da7-40b8-9122-3e83b3eec81b") + ) + (pin "3" + (uuid "cd17607c-22dc-4e91-9343-2cc38c6c95eb") + ) + (instances + (project "main-control-board" + (path "/82a78d11-58ff-455c-a94e-f7463ce9fc2e" + (reference "MAX1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 214.63 90.17 90) + (unit 1) + (body_style 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (dnp no) + (fields_autoplaced yes) + (uuid "444296ff-792b-4539-ae99-bd3ecf801b93") + (property "Reference" "#PWR011" + (at 218.44 90.17 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "+5V" + (at 210.82 90.1699 90) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 214.63 90.17 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 214.63 90.17 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+5V\"" + (at 214.63 90.17 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "46462983-cecd-4511-baa3-ae6bb39ba6bd") + ) + (instances + (project "main-control-board" + (path "/82a78d11-58ff-455c-a94e-f7463ce9fc2e" + (reference "#PWR011") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "TinyEngineerModules:Waveshare_OLED_09_Module") + (at 66.04 54.61 0) + (unit 1) + (body_style 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (dnp no) + (fields_autoplaced yes) + (uuid "4df93a1e-042d-4c49-a44e-af77e7aabde4") + (property "Reference" "OLED1" + (at 46.99 52.0671 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "Waveshare 0.91 OLED" + (at 46.99 54.6071 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical" + (at 66.04 54.61 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 66.04 54.61 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "" + (at 66.04 54.61 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "KiLib_Generator" "connector/pin_header_socket" + (at 66.04 54.61 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "6c34246e-0998-417b-9292-50ade7e35b3b") + ) + (pin "2" + (uuid "061713c8-6964-44c3-8590-5efebfbca31a") + ) + (pin "3" + (uuid "f52165cf-2e64-4e01-8dd4-950ad22c6bf3") + ) + (pin "4" + (uuid "f3173bdb-e536-4e7c-af99-e4a4f6685fbf") + ) + (instances + (project "main-control-board" + (path "/82a78d11-58ff-455c-a94e-f7463ce9fc2e" + (reference "OLED1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "TinyEngineerModules:Adafruit_PCA9685_Module") + (at 66.04 91.44 0) + (unit 1) + (body_style 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (dnp no) + (fields_autoplaced yes) + (uuid "6391d22f-15dc-41a6-9172-b77d075a6c9e") + (property "Reference" "PCA1" + (at 52.07 90.1699 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Value" "Adafruit PCA9685" + (at 52.07 92.7099 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + (justify right) + ) + ) + (property "Footprint" "TinyEngineerModules:Adafruit_PCA9685_Module" + (at 66.04 91.44 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 66.04 91.44 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "" + (at 66.04 91.44 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "2" + (uuid "7c74a8fa-ab21-4093-81cb-f4631d1cf85f") + ) + (pin "1" + (uuid "935d63e1-f1f3-487d-94af-1c5c103a4a62") + ) + (pin "4" + (uuid "71f04be1-a56d-4747-80a9-b898ec63c81a") + ) + (pin "3" + (uuid "8180417d-f95b-4253-9f87-6ebc00a83d83") + ) + (pin "5" + (uuid "cde79735-4137-41af-a4fa-909f4c19d194") + ) + (pin "6" + (uuid "d4ef052f-3247-46db-9679-0a7dd7fb0258") + ) + (instances + (project "main-control-board" + (path "/82a78d11-58ff-455c-a94e-f7463ce9fc2e" + (reference "PCA1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 223.52 92.71 0) + (unit 1) + (body_style 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (dnp no) + (fields_autoplaced yes) + (uuid "7a7a2d30-281d-4ea9-b605-7400cd5ce566") + (property "Reference" "#PWR012" + (at 223.52 99.06 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "GND" + (at 223.52 97.79 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 223.52 92.71 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 223.52 92.71 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "Power symbol creates a global label with name \"GND\" , ground" + (at 223.52 92.71 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "6c09f720-e9d9-4026-8d3e-ede9402f9792") + ) + (instances + (project "main-control-board" + (path "/82a78d11-58ff-455c-a94e-f7463ce9fc2e" + (reference "#PWR012") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "TinyEngineerModules:ESP32_C3_Zero_Dev_Board") + (at 156.21 90.17 0) + (unit 1) + (body_style 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (dnp no) + (fields_autoplaced yes) + (uuid "830dbdd4-4215-415a-a843-81c8ec435273") + (property "Reference" "ESP1" + (at 158.3533 73.66 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "ESP32-C3-ZERO" + (at 158.3533 76.2 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "TinyEngineerModules:ESP32_C3_Zero_Dev_Board" + (at 156.21 90.17 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "https://www.waveshare.com/wiki/ESP32-C3-Zero" + (at 156.21 90.17 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "Waveshare ESP32-C3-Zero module header, pads numbered anticlockwise from USB" + (at 156.21 90.17 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "4" + (uuid "fc2a9e0c-b317-4dc6-8124-603a6230cb75") + ) + (pin "5" + (uuid "d3a77671-4988-43c3-8b54-2504a732da19") + ) + (pin "1" + (uuid "29d84231-b1c5-46c2-88b9-1403ede41324") + ) + (pin "2" + (uuid "8e91d964-ed39-4b4b-8f75-f9b93ba6ef91") + ) + (pin "3" + (uuid "5f62bd83-491b-4cdf-9be3-44c9ccb7e1a9") + ) + (pin "12" + (uuid "607c1438-a129-4904-bf22-c28ec0854243") + ) + (pin "13" + (uuid "09a8931c-0799-4b8a-8d99-fb80957f9db7") + ) + (pin "6" + (uuid "2f678b9d-39d1-43c1-bbe8-dc08f4f5a920") + ) + (pin "7" + (uuid "39063a94-b645-4ded-9c80-99c8e247dd03") + ) + (pin "8" + (uuid "f22f5460-611a-4b76-ad4d-d0c5fa298c58") + ) + (pin "9" + (uuid "3b2b3aa7-bb47-453a-984a-85de84254089") + ) + (pin "10" + (uuid "930a9963-0d74-4a17-9cbc-67a4cd77465c") + ) + (pin "14" + (uuid "bd2eafed-45f3-4c52-8fd9-4986d83f9a5a") + ) + (pin "15" + (uuid "91fefff7-3319-4381-8757-64384f6425ee") + ) + (pin "16" + (uuid "3369ab32-c0b3-43c4-857f-d8b40b7a8f5a") + ) + (pin "17" + (uuid "d5c05741-4d42-457a-a4ee-a8be655daf31") + ) + (pin "18" + (uuid "fbdc5fe9-61fa-47de-b2fc-10c02a2b5bad") + ) + (pin "11" + (uuid "7e360e3b-04dc-4f3c-8bf1-5db5e7406e0c") + ) + (instances + (project "main-control-board" + (path "/82a78d11-58ff-455c-a94e-f7463ce9fc2e" + (reference "ESP1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "Connector:Conn_01x04_Socket") + (at 232.41 87.63 0) + (unit 1) + (body_style 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (dnp no) + (fields_autoplaced yes) + (uuid "892d2d19-23bd-4928-9797-558c2f8336b9") + (property "Reference" "USB1" + (at 233.68 87.6299 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Conn_01x04_Socket" + (at 233.68 90.1699 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "Connector_PinSocket_2.54mm:PinSocket_1x04_P2.54mm_Vertical" + (at 232.41 87.63 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 232.41 87.63 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "Generic connector, single row, 01x04, script generated" + (at 232.41 87.63 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "KiLib_Generator" "connector/pin_header_socket" + (at 232.41 87.63 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "b068347e-252a-40b0-b170-b4b59c0032bd") + ) + (pin "2" + (uuid "8b4e3e8a-74f1-497d-931b-3b79b7185a0a") + ) + (pin "3" + (uuid "22eb9229-e651-4a16-ad53-42c7d0b183ff") + ) + (pin "4" + (uuid "3583e291-274b-436c-a74f-784307b4caca") + ) + (instances + (project "main-control-board" + (path "/82a78d11-58ff-455c-a94e-f7463ce9fc2e" + (reference "USB1") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 156.21 76.2 0) + (unit 1) + (body_style 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (dnp no) + (fields_autoplaced yes) + (uuid "a07f9255-817b-4460-b680-8046a3632154") + (property "Reference" "#PWR09" + (at 156.21 80.01 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "+5V" + (at 156.21 71.12 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 156.21 76.2 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 156.21 76.2 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+5V\"" + (at 156.21 76.2 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "d2c163c6-b8ee-4af8-b18a-720034eb93aa") + ) + (instances + (project "main-control-board" + (path "/82a78d11-58ff-455c-a94e-f7463ce9fc2e" + (reference "#PWR09") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 156.21 104.14 0) + (unit 1) + (body_style 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (dnp no) + (fields_autoplaced yes) + (uuid "a3fb58c7-21c9-4e7d-9344-c5a6126637b7") + (property "Reference" "#PWR010" + (at 156.21 110.49 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "GND" + (at 156.21 109.22 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 156.21 104.14 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 156.21 104.14 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "Power symbol creates a global label with name \"GND\" , ground" + (at 156.21 104.14 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "ddd6d60b-5bf6-4ff2-a314-3312609e8a47") + ) + (instances + (project "main-control-board" + (path "/82a78d11-58ff-455c-a94e-f7463ce9fc2e" + (reference "#PWR010") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 66.04 101.6 0) + (unit 1) + (body_style 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (dnp no) + (fields_autoplaced yes) + (uuid "a695565c-c157-4a19-8115-24200542a25f") + (property "Reference" "#PWR04" + (at 66.04 107.95 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "GND" + (at 66.04 106.68 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 66.04 101.6 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 66.04 101.6 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "Power symbol creates a global label with name \"GND\" , ground" + (at 66.04 101.6 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "6b419dd3-d301-46c7-8c50-fc648bd2a5e7") + ) + (instances + (project "main-control-board" + (path "/82a78d11-58ff-455c-a94e-f7463ce9fc2e" + (reference "#PWR04") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 152.4 143.51 0) + (unit 1) + (body_style 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (dnp no) + (fields_autoplaced yes) + (uuid "b892aaa2-371f-4d1a-ba83-f308b6df54e7") + (property "Reference" "#PWR08" + (at 152.4 149.86 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "GND" + (at 152.4 148.59 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 152.4 143.51 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 152.4 143.51 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "Power symbol creates a global label with name \"GND\" , ground" + (at 152.4 143.51 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "f59f4f50-250b-43e9-8c59-ccdc0fbd5407") + ) + (instances + (project "main-control-board" + (path "/82a78d11-58ff-455c-a94e-f7463ce9fc2e" + (reference "#PWR08") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3.3V") + (at 138.43 80.01 90) + (unit 1) + (body_style 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (dnp no) + (fields_autoplaced yes) + (uuid "c33cf18b-f25e-4f3c-8211-186d18b308c2") + (property "Reference" "#PWR06" + (at 142.24 80.01 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "+3.3V" + (at 134.62 80.0099 90) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 138.43 80.01 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 138.43 80.01 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+3.3V\"" + (at 138.43 80.01 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "fb95eaf8-32e0-4338-b339-431c1805b0a7") + ) + (instances + (project "main-control-board" + (path "/82a78d11-58ff-455c-a94e-f7463ce9fc2e" + (reference "#PWR06") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+5V") + (at 66.04 81.28 0) + (unit 1) + (body_style 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (dnp no) + (fields_autoplaced yes) + (uuid "e78c725d-cb72-44f7-a714-f7dc8f172b82") + (property "Reference" "#PWR03" + (at 66.04 85.09 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "+5V" + (at 66.04 76.2 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 66.04 81.28 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 66.04 81.28 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+5V\"" + (at 66.04 81.28 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "5c766759-a293-43eb-b059-86d917363697") + ) + (instances + (project "main-control-board" + (path "/82a78d11-58ff-455c-a94e-f7463ce9fc2e" + (reference "#PWR03") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:GND") + (at 66.04 62.23 0) + (unit 1) + (body_style 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (dnp no) + (fields_autoplaced yes) + (uuid "ebdb650c-0dcd-40a8-87d6-18f8fd7362fd") + (property "Reference" "#PWR02" + (at 66.04 68.58 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "GND" + (at 66.04 67.31 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 66.04 62.23 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 66.04 62.23 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "Power symbol creates a global label with name \"GND\" , ground" + (at 66.04 62.23 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "4a013899-d2bd-4778-b888-40e78f383107") + ) + (instances + (project "main-control-board" + (path "/82a78d11-58ff-455c-a94e-f7463ce9fc2e" + (reference "#PWR02") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:+3.3V") + (at 66.04 46.99 0) + (unit 1) + (body_style 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (dnp no) + (fields_autoplaced yes) + (uuid "f80cd6fd-9b41-420e-a461-cc6729152f73") + (property "Reference" "#PWR01" + (at 66.04 50.8 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "+3.3V" + (at 66.04 41.91 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 66.04 46.99 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 66.04 46.99 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "Power symbol creates a global label with name \"+3.3V\"" + (at 66.04 46.99 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "b4ff7387-b5e7-44be-8245-7cce4899e4cf") + ) + (instances + (project "main-control-board" + (path "/82a78d11-58ff-455c-a94e-f7463ce9fc2e" + (reference "#PWR01") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:PWR_FLAG") + (at 217.17 99.06 180) + (unit 1) + (body_style 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (dnp no) + (fields_autoplaced yes) + (uuid "fa2b1a66-9db6-4dd6-a827-f3cb68f8dd64") + (property "Reference" "#FLG01" + (at 217.17 100.965 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "PWR_FLAG" + (at 217.17 104.14 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 217.17 99.06 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 217.17 99.06 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "Special symbol for telling ERC where power comes from" + (at 217.17 99.06 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "03554afc-456d-46d3-8e23-3a33296f46b5") + ) + (instances + (project "main-control-board" + (path "/82a78d11-58ff-455c-a94e-f7463ce9fc2e" + (reference "#FLG01") + (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "power:PWR_FLAG") + (at 227.33 99.06 180) + (unit 1) + (body_style 1) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (in_pos_files yes) + (dnp no) + (uuid "ffc6aa5c-99c8-43b1-ad59-4ef994381e01") + (property "Reference" "#FLG02" + (at 227.33 100.965 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "PWR_FLAG" + (at 227.33 104.14 0) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 227.33 99.06 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 227.33 99.06 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "Special symbol for telling ERC where power comes from" + (at 227.33 99.06 0) + (hide yes) + (show_name no) + (do_not_autoplace no) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (pin "1" + (uuid "8a86b872-0ed9-4b42-bed0-df5dd3c4f057") + ) + (instances + (project "main-control-board" + (path "/82a78d11-58ff-455c-a94e-f7463ce9fc2e" + (reference "#FLG02") + (unit 1) + ) + ) + ) + ) (sheet_instances (path "/" (page "1") diff --git a/include/pins.h b/include/pins.h index edc0df4..bf61ab3 100644 --- a/include/pins.h +++ b/include/pins.h @@ -18,8 +18,8 @@ constexpr int I2S_DIN = 4; // GP4 // Built-in WS2812 RGB constexpr int RGB_LED_PIN = 10; -// PCA9685 output enable (active LOW). Optional: wire OE → GP5. -constexpr bool PCA9685_OE_WIRED = false; +// PCA9685 output enable (active LOW). Wired GP5 → OE on main-control-board. +constexpr bool PCA9685_OE_WIRED = true; constexpr int PCA9685_OE_PIN = 5; // ===================================================== From 664f50397dc1e917fa89ea6f4d1b35f15c84becb Mon Sep 17 00:00:00 2001 From: Krzysztof Jamroz Date: Sun, 13 Sep 2026 21:43:47 +0200 Subject: [PATCH 07/12] fix(pcb): update PCA9685 OE wiring status and related documentation - Changed PCA9685 OE wiring status to pending in multiple documentation files, indicating that GP5 is not yet implemented for output enable. - Clarified that the firmware behavior regarding OE is conditional on the wiring status. - Updated references in the pinout, interfaces, and testing documentation to reflect the current state of the PCA9685 OE connection. --- docs/hardware/components.md | 2 +- docs/hardware/interfaces.md | 2 +- docs/hardware/pinout.md | 4 ++-- docs/hardware/servos.md | 6 +++--- docs/hardware/testing.md | 2 +- docs/hardware/wiring.md | 7 +++---- include/pins.h | 4 ++-- 7 files changed, 13 insertions(+), 14 deletions(-) diff --git a/docs/hardware/components.md b/docs/hardware/components.md index 774617b..b242f54 100644 --- a/docs/hardware/components.md +++ b/docs/hardware/components.md @@ -52,7 +52,7 @@ Constants cited below match [`include/pins.h`](../../include/pins.h). | Interface | I2C | | Address | `0x40` (`PCA9685_ADDRESS` in firmware). A0–A5 pads can change this | | PWM | 12-bit, firmware `setPWMFreq(50)` | -| Important pins | As drawn: **5V** (servo-rail in), **V+** (to servo 5V), **VCC** (3V3 logic), **GND**, **SDA**, **SCL**, **PWM**, **OE** (GP5) | +| Important pins | As drawn: **5V** (servo-rail in), **V+** (to servo 5V), **VCC** (3V3 logic), **GND**, **SDA**, **SCL**, **PWM**. **OE** (GP5) is pending, not implemented | | Channels used | 0–4 (five servos). 5–15 unused | | Limits | **V+** and **VCC** must stay separate. Do not jumper servo power onto logic VCC on this robot | | Firmware note | Detection at `0x40` is a **hard fail** in the bring-up test | diff --git a/docs/hardware/interfaces.md b/docs/hardware/interfaces.md index 77ca118..ef30784 100644 --- a/docs/hardware/interfaces.md +++ b/docs/hardware/interfaces.md @@ -63,7 +63,7 @@ ESP32 GPIO is not wired to servo SIG lines. | --- | --- | --- | | OE | GPIO5 / GP5 | **Active LOW** — outputs enabled. Firmware drives **HIGH** during PCA9685 init, then **LOW** after neutral PWM is written | -Wired on main-control-board (`PCA9685_OE_WIRED = true` in [`include/pins.h`](../../include/pins.h)). Blocks invalid PWM during boot and flash resets. +Not wired (`PCA9685_OE_WIRED = false` in [`include/pins.h`](../../include/pins.h)). Firmware keeps OE helpers behind that flag. Blocks invalid PWM during boot and flash resets when the net exists. ## USB diff --git a/docs/hardware/pinout.md b/docs/hardware/pinout.md index 27f197a..5e228e9 100644 --- a/docs/hardware/pinout.md +++ b/docs/hardware/pinout.md @@ -11,7 +11,7 @@ Source of truth: [`include/pins.h`](../../include/pins.h). This file must match | I2S BCLK | **GPIO2** (diagram **GP2**) | `I2S_BCLK` | MAX98357A BCLK | | I2S LRCLK / WS | **GPIO3** (diagram **GP3**) | `I2S_LRC` | MAX98357A **LRC** | | I2S DATA OUT | **GPIO4** (diagram **GP4**) | `I2S_DIN` | MAX98357A DIN | -| PCA9685 OE | **GPIO5** (diagram **GP5**) | `PCA9685_OE_PIN` | PCA9685 **OE** (`PCA9685_OE_WIRED`) | +| PCA9685 OE | **GPIO5** (diagram **GP5**) | `PCA9685_OE_PIN` | reserved for PCA9685 **OE**; net pending (`PCA9685_OE_WIRED`) | | Built-in WS2812 RGB | **GPIO10** | `RGB_LED_PIN` | onboard LED only | Logic level: **3.3 V**. @@ -59,7 +59,7 @@ Power pads (not GPIO): **5V**, **GND**, **3V3**. | `OLED_WIDTH` / `OLED_HEIGHT` | 128 / 32 | Display | | `SERVO_MIN_US` / `SERVO_MAX_US` | 800 / 2200 | Electrical PWM span | | `SERVO_BOOT_SPEED_DEG_S` | 35 | Boot centering / sleep-pose rate (deg/s) | -| `PCA9685_OE_WIRED` | `true` | GP5 → PCA9685 OE on main-control-board | +| `PCA9685_OE_WIRED` | `false` | pending GP5 → PCA9685 OE (not on schematic/PCB yet) | ## Pin allocation rules diff --git a/docs/hardware/servos.md b/docs/hardware/servos.md index abc985d..6db83d5 100644 --- a/docs/hardware/servos.md +++ b/docs/hardware/servos.md @@ -47,12 +47,12 @@ Verified in [`include/pins.h`](../../include/pins.h) and [`include/servos.h`](.. On every boot (and after each flash reset): -1. **OE** — `PCA9685_OE_WIRED` is true on main-control-board: GP5 disables PCA9685 outputs before I2C init. +1. **OE** — `PCA9685_OE_WIRED` is false until a tested GP5→OE board exists; firmware skips the OE pin. 2. **Early init** — PCA9685 is probed and configured immediately after `Wire.begin`, before OLED, settings, or Wi-Fi. -3. **Neutral park** — all channels receive mid-pulse PWM while OE is still disabled (if wired), then outputs enable. +3. **Neutral park** — all channels receive mid-pulse PWM (OE enable is skipped while unwired). 4. **Smooth boot moves** — `centerAllServos()` and sleep-inertia pose use `servoMoveAllSmoothTo()` at `SERVO_BOOT_SPEED_DEG_S` (35°/s), not instant snaps. -GP5 → PCA9685 **OE** is wired on main-control-board (`PCA9685_OE_WIRED = true` in [`include/pins.h`](../../include/pins.h)). OE is **active LOW** on the Adafruit breakout. +GP5 → PCA9685 **OE** is planned, not implemented (`PCA9685_OE_WIRED = false` in [`include/pins.h`](../../include/pins.h)). OE is **active LOW** on the Adafruit breakout when that net exists. ## Motion modes diff --git a/docs/hardware/testing.md b/docs/hardware/testing.md index 55d1290..f0c6711 100644 --- a/docs/hardware/testing.md +++ b/docs/hardware/testing.md @@ -19,7 +19,7 @@ Build/flash: project root README (`pio run`, `pio run -t upload`, serial 115200) | --- | --- | | Built-in WS2812 | Green ready (GPIO10) | | I2C init | `Wire.begin` on GPIO0/GPIO1 | -| PCA9685 | Probe `0x40` early; park neutral; OE on GP5 (`PCA9685_OE_WIRED`) | +| PCA9685 | Probe `0x40` early; park neutral; OE skipped (`PCA9685_OE_WIRED` is false until GP5→OE is implemented) | | OLED | Probe `0x3C`, init (optional) | | Wi-Fi | STA connect from saved NVS credentials, or setup AP `TinyEngineer-XXXX` when unset/failed; mDNS `{hostname}.local` after STA connect | | MAX98357A / I2S | `I2S.begin` 44.1 kHz 16-bit stereo | diff --git a/docs/hardware/wiring.md b/docs/hardware/wiring.md index bb65981..b80c1e0 100644 --- a/docs/hardware/wiring.md +++ b/docs/hardware/wiring.md @@ -49,7 +49,6 @@ On Adafruit PCA9685, header/terminal **V+** is normally the same servo rail as t | ESP32-C3-Zero | GP2 | MAX98357A | BCLK | I2S bit clock | | ESP32-C3-Zero | GP3 | MAX98357A | LRC | I2S word select | | ESP32-C3-Zero | GP4 | MAX98357A | DIN | I2S data | -| ESP32-C3-Zero | GP5 | PCA9685 | OE | Output enable (see [interfaces.md](interfaces.md)) | | PCA9685 | PWM | Servo | SIG | Servo PWM | | PCA9685 | V+ | Servo | 5V | Servo power | | PCA9685 | GND (servo side) | Servo | GND | Servo ground | @@ -125,11 +124,11 @@ Firmware drives **channels 0–4** (`SERVO_CHANNELS`). The drawing does not numb ESP32-C3-Zero, unused in the PNG: -**GP6, GP7, GP8, GP9, GP10, GP20, GP21** +**GP5, GP6, GP7, GP8, GP9, GP10, GP20, GP21** -GP5 = PCA9685 OE on main-control-board (`PCA9685_OE_WIRED`). GP9 = BOOT, GP10 = onboard WS2812. GP18/GP19 = native USB — wire from 5993 D−/D+ even if the base PNG omits them. See [pinout.md](pinout.md). +GP5 is reserved for PCA9685 OE (`PCA9685_OE_PIN`) but that net is **pending**: schematic and PCB do not implement or validate GP5→OE yet (`PCA9685_OE_WIRED = false`). GP9 = BOOT, GP10 = onboard WS2812. GP18/GP19 = native USB — wire from 5993 D−/D+ even if the base PNG omits them. See [pinout.md](pinout.md). -PCA9685 **OE** is GP5 on this board. MAX98357A **GAIN** / **SD** not wired (breakout defaults). **SPK+** / **SPK-** not drawn. +PCA9685 **OE** is not wired on this board. MAX98357A **GAIN** / **SD** not wired (breakout defaults). **SPK+** / **SPK-** not drawn. ## Not on the drawing diff --git a/include/pins.h b/include/pins.h index bf61ab3..47cdd72 100644 --- a/include/pins.h +++ b/include/pins.h @@ -18,8 +18,8 @@ constexpr int I2S_DIN = 4; // GP4 // Built-in WS2812 RGB constexpr int RGB_LED_PIN = 10; -// PCA9685 output enable (active LOW). Wired GP5 → OE on main-control-board. -constexpr bool PCA9685_OE_WIRED = true; +// PCA9685 output enable (active LOW). GP5 → OE pending; schematic/PCB do not implement that net. +constexpr bool PCA9685_OE_WIRED = false; constexpr int PCA9685_OE_PIN = 5; // ===================================================== From 7fec90bf2a0b2aebd6f8bb579e8da6c9a905b370 Mon Sep 17 00:00:00 2001 From: Krzysztof Jamroz Date: Sun, 13 Sep 2026 22:56:09 +0200 Subject: [PATCH 08/12] feat(pcb): add design rules and update PCB layout - Introduced design rules for track widths and via dimensions specific to Power5V and Power3V3 net classes in `main-control-board.kicad_dru`. - Updated the PCB layout in `main-control-board.kicad_pcb` to include detailed layer configurations and footprint placements for the Tiny Engineer modules. - Updated the schematic UUID in `main-control-board.kicad_sch` for consistency across project files. - Revised the README to reflect the current status and assumptions regarding the design and connections. --- hardware/boards/main-control-board/README.md | 10 +- .../ESP32_C3_Zero_Dev_Board.kicad_mod | 110 +- .../main-control-board.kicad_dru | 14 + .../main-control-board.kicad_pcb | 4666 ++++++++++++++++- .../main-control-board.kicad_pro | 122 +- .../main-control-board.kicad_sch | 2 +- 6 files changed, 4853 insertions(+), 71 deletions(-) create mode 100644 hardware/boards/main-control-board/main-control-board.kicad_dru diff --git a/hardware/boards/main-control-board/README.md b/hardware/boards/main-control-board/README.md index 97923c6..1f276f2 100644 --- a/hardware/boards/main-control-board/README.md +++ b/hardware/boards/main-control-board/README.md @@ -3,18 +3,20 @@ Carrier PCB that reduces jumper wiring: existing modules plug in on pin headers. - **Purpose:** interconnect / carrier with header sockets for the existing modules -- **Status:** draft +- **Status:** draft (schematic + routed layout, rev v1 / 2026-09-12) - **KiCad:** 10 - **Interfaces:** header sockets for the Waveshare ESP32-C3-Zero, Adafruit PCA9685, MAX98357A, SSD1306 OLED, and Adafruit 5993 USB-C breakout; shared I2C (ESP32 GP0/GP1 → PCA9685 and SSD1306 OLED); point-to-point I2S (ESP32 GP2/GP3/GP4 → MAX98357A BCLK/LRC/DIN); USB D+/D− (5993 → ESP32 GP19/GP18); PCA9685 OE ← GP5; +5V, 3V3, and GND. Servo 3-pin plugs and speaker terminals stay on the modules this revision. -- **Assumptions:** nets follow [`docs/hardware/`](../../../docs/hardware/README.md) (keep servo **+5V** off logic **3V3**; common GND). Custom module symbols live in [`libraries/symbols/tiny_engineer_modules.kicad_sym`](libraries/symbols/tiny_engineer_modules.kicad_sym). ESP32-C3-Zero symbol pin numbers are Waveshare **header pads** (pad 1 = 5V, numbered anticlockwise from USB), not the ESP32-C3 QFN package. -- **ERC / DRC:** schematic ERC after this pass; PCB is still an empty stub (DRC N/A until layout). +- **Assumptions:** nets follow `[docs/hardware/](../../../docs/hardware/README.md)` (keep servo **+5V** off logic **3V3**; common GND). Custom module symbols live in `[libraries/symbols/tiny_engineer_modules.kicad_sym](libraries/symbols/tiny_engineer_modules.kicad_sym)`; footprints in `[libraries/footprints/tiny_engineer_modules.pretty](libraries/footprints/tiny_engineer_modules.pretty)`. ESP32-C3-Zero symbol pin numbers are Waveshare **header pads** (pad 1 = 5V, numbered anticlockwise from USB), not the ESP32-C3 QFN package. Two-layer FR4 ~1.6 mm; ESP32-C3-Zero on the back, other modules on the front. OLED uses a 1×04 pin header; USB-C breakout uses a 1×04 pin socket. Netclasses: `GND`, `Power5V` (`+5V`, 1.5 mm), `Power3V3` (`+3.3V`, 0.4 mm), `USB` (`/USB_`*), `Default` (I2C/I2S and other signals). +- **ERC / DRC:** schematic ERC after the symbol pass. PCB is routed with custom power DRC in `[main-control-board.kicad_dru](main-control-board.kicad_dru)`; DRC not signed off for fab. - **Built:** not manufactured - **Tested:** not tested + + ## Direction First revision is sockets only. Design in KiCad 10, then fabricate, so the robot is wired on a board instead of Dupont harnesses. Later revisions may integrate some or all of those functions onto this PCB and drop the plug-in modules. -Contribution rules: [`docs/pcb.md`](../../../docs/pcb.md). +Contribution rules: `[docs/pcb.md](../../../docs/pcb.md)`. \ No newline at end of file diff --git a/hardware/boards/main-control-board/libraries/footprints/tiny_engineer_modules.pretty/ESP32_C3_Zero_Dev_Board.kicad_mod b/hardware/boards/main-control-board/libraries/footprints/tiny_engineer_modules.pretty/ESP32_C3_Zero_Dev_Board.kicad_mod index a0c9f4e..a4fa8ea 100644 --- a/hardware/boards/main-control-board/libraries/footprints/tiny_engineer_modules.pretty/ESP32_C3_Zero_Dev_Board.kicad_mod +++ b/hardware/boards/main-control-board/libraries/footprints/tiny_engineer_modules.pretty/ESP32_C3_Zero_Dev_Board.kicad_mod @@ -7,7 +7,7 @@ (at 0 13 0) (unlocked yes) (layer "F.SilkS") - (uuid "a95cfa09-ddb9-466c-b267-8c72eaf2dabe") + (uuid "67158926-b292-4f65-a109-848aae5bc929") (effects (font (size 1 1) @@ -19,7 +19,7 @@ (at -0.1 15.24 0) (unlocked yes) (layer "F.Fab") - (uuid "0f3b6c68-ceda-4f93-9dec-87ba1c36146b") + (uuid "e8ffb888-95ec-4a1e-a86b-ac20f9a6e75a") (effects (font (size 1 1) @@ -32,7 +32,7 @@ (unlocked yes) (layer "F.Fab") (hide yes) - (uuid "6957737b-2974-483e-85d5-147bbca40e79") + (uuid "236e36c4-46ba-414a-bcd1-37c543e02b91") (effects (font (size 1 1) @@ -45,7 +45,7 @@ (unlocked yes) (layer "F.Fab") (hide yes) - (uuid "abe504cb-9d73-40b2-b0db-b930bf56d13f") + (uuid "eb66ab46-0f2a-49fc-932e-26d732d45109") (effects (font (size 1 1) @@ -63,7 +63,7 @@ (type default) ) (layer "F.SilkS") - (uuid "84e6b9fc-a114-4f1e-a61d-839b923e533c") + (uuid "34e3000d-1e83-44f1-a4ab-4110ee711d2b") ) (fp_line (start -9.5 11.9) @@ -73,7 +73,7 @@ (type default) ) (layer "F.SilkS") - (uuid "1bd345a8-686d-422f-ac0a-3f5a6a77bad5") + (uuid "69445495-519d-4210-8a7f-8ca153b131cf") ) (fp_line (start -4.6 -13.4) @@ -83,7 +83,7 @@ (type dot) ) (layer "F.SilkS") - (uuid "d1cc8e22-abda-4da3-b578-aca76aea90a3") + (uuid "0d7a8112-068f-4923-90f0-804b54f44a32") ) (fp_line (start -4.6 -13.4) @@ -93,7 +93,7 @@ (type dot) ) (layer "F.SilkS") - (uuid "8116e6b2-6e96-4675-a2a2-1b96244020df") + (uuid "935fb6a1-35f4-45ff-a214-d837c81b406d") ) (fp_line (start 4.4 -13.4) @@ -103,7 +103,7 @@ (type dot) ) (layer "F.SilkS") - (uuid "d4a824f1-1236-4bdc-aca3-365b4731e405") + (uuid "a8a10797-554b-41a0-b8cc-943af2dfaa7c") ) (fp_line (start 9.3 -11.9) @@ -113,7 +113,7 @@ (type default) ) (layer "F.SilkS") - (uuid "60a447f4-40da-4141-b7ee-092e4e21acbb") + (uuid "43c44519-55e3-4dff-84e8-3dcd84b8f3c9") ) (fp_line (start 9.3 11.9) @@ -123,7 +123,7 @@ (type default) ) (layer "F.SilkS") - (uuid "951d0944-c9f9-4335-9d5d-e3b3007a0785") + (uuid "8573d8b3-8362-4362-8e39-1a7f6fc6fc7b") ) (fp_rect (start -6.6 6.5) @@ -134,7 +134,7 @@ ) (fill no) (layer "F.SilkS") - (uuid "3b59eb34-e2d8-4bd6-82e5-54751ac754ee") + (uuid "c1b73b2c-bb16-4b55-a767-c1b5659b1508") ) (fp_poly (pts @@ -146,13 +146,13 @@ ) (fill no) (layer "F.CrtYd") - (uuid "119b2070-6014-4041-9e0a-0554078a90d0") + (uuid "776f451f-172d-4858-b6fa-5ea06bbee9dd") ) (fp_text user "5V" (at -6.35 -10.16 0) (unlocked yes) (layer "F.SilkS") - (uuid "61489827-f509-4d13-990c-695810878311") + (uuid "4dedc7ad-45d4-4678-9095-9b2e78d493b8") (effects (font (size 0.8 0.8) @@ -165,7 +165,7 @@ (at -6.35 -7.62 0) (unlocked yes) (layer "F.SilkS") - (uuid "c081275b-49b5-42ed-b156-c8a1c883019a") + (uuid "2787ab48-337b-48a9-b174-eeda0e9656db") (effects (font (size 0.8 0.8) @@ -178,7 +178,7 @@ (at -6.35 -5.08 0) (unlocked yes) (layer "F.SilkS") - (uuid "fbd7f3cd-45a9-4dc5-9f72-95b505968f22") + (uuid "92887545-e8f2-4703-b5e5-a832f460ef59") (effects (font (size 0.8 0.8) @@ -191,7 +191,7 @@ (at -6.35 -2.54 0) (unlocked yes) (layer "F.SilkS") - (uuid "bce3a55f-7668-4ccf-8e75-c57e1e0f52ad") + (uuid "4c314571-97fd-47fa-9a3f-fbdfebbf3aed") (effects (font (size 0.8 0.8) @@ -204,7 +204,7 @@ (at -6.35 0 0) (unlocked yes) (layer "F.SilkS") - (uuid "eda1c0ab-cd9a-4474-893e-f9bf19ce7f9a") + (uuid "2b8a6e5e-b227-4a36-bfee-2249e44f7e46") (effects (font (size 0.8 0.8) @@ -217,7 +217,7 @@ (at -6.35 2.54 0) (unlocked yes) (layer "F.SilkS") - (uuid "7f11e3a6-bf22-4c6a-8f52-e37304c25690") + (uuid "7916cb9a-5f38-455f-8367-960b80e5642b") (effects (font (size 0.8 0.8) @@ -230,7 +230,7 @@ (at -6.35 5.08 0) (unlocked yes) (layer "F.SilkS") - (uuid "1d29365e-6b15-408c-a7fc-09bec74a0541") + (uuid "d32fa86f-d366-48b1-aaf7-42ef14070b11") (effects (font (size 0.8 0.8) @@ -243,7 +243,7 @@ (at -6.35 7.62 0) (unlocked yes) (layer "F.SilkS") - (uuid "f1df89b4-6e0b-4161-a173-e125c6b1f4fd") + (uuid "2fc31eee-e787-47ef-86c5-ba1df77626b5") (effects (font (size 0.8 0.8) @@ -256,7 +256,7 @@ (at -6.35 10.16 0) (unlocked yes) (layer "F.SilkS") - (uuid "870f9f0c-95c7-4fcb-bdf6-05443daab73c") + (uuid "3721c142-a315-4f15-ab98-842eb1982f53") (effects (font (size 0.8 0.8) @@ -269,7 +269,7 @@ (at -1.3 -12.2 0) (unlocked yes) (layer "F.SilkS") - (uuid "143c54ff-0885-453f-bbbb-cc4e490c8fe8") + (uuid "149524f8-b5f8-407e-a771-0ca41ea7e2f3") (effects (font (size 0.8 0.8) @@ -282,7 +282,7 @@ (at 0 9.1 0) (unlocked yes) (layer "F.SilkS") - (uuid "ab1ef04d-f505-4d28-b24a-bae6ad41c17c") + (uuid "25bbe8e7-ecd7-4d35-afa5-7825822e5153") (effects (font (size 0.8 0.8) @@ -294,7 +294,7 @@ (at 6.35 -10.16 0) (unlocked yes) (layer "F.SilkS") - (uuid "c9d0889f-891b-4d87-9e02-fc622e8072ae") + (uuid "04d53a20-2399-42a9-ac38-dde86f9103ad") (effects (font (size 0.8 0.8) @@ -307,7 +307,7 @@ (at 6.35 -7.62 0) (unlocked yes) (layer "F.SilkS") - (uuid "13f832c7-0875-45cd-854d-44035c81681c") + (uuid "ab72257f-c46d-490a-a17c-2569b87913ad") (effects (font (size 0.8 0.8) @@ -320,7 +320,7 @@ (at 6.35 -5.08 0) (unlocked yes) (layer "F.SilkS") - (uuid "d6c283f1-3429-43b6-9c51-b6bef48d94f2") + (uuid "dee8783b-5acf-4d6f-a957-ed17c1b181c1") (effects (font (size 0.8 0.8) @@ -333,7 +333,7 @@ (at 6.35 -2.54 0) (unlocked yes) (layer "F.SilkS") - (uuid "0813f3a5-a5cf-4d2e-a471-0251a44bd386") + (uuid "624d1427-3118-4b0f-9b89-932f22924a76") (effects (font (size 0.8 0.8) @@ -346,7 +346,7 @@ (at 6.35 0 0) (unlocked yes) (layer "F.SilkS") - (uuid "cc1a992c-87f1-47b3-b514-6dd34db8afad") + (uuid "2233f98f-cb54-40b5-80fc-7b97020d1cf1") (effects (font (size 0.8 0.8) @@ -359,7 +359,7 @@ (at 6.35 2.54 0) (unlocked yes) (layer "F.SilkS") - (uuid "8305b386-4289-4efb-9ec8-972772729b59") + (uuid "800a1516-f745-4688-abe1-981233b7a747") (effects (font (size 0.8 0.8) @@ -372,7 +372,7 @@ (at 6.35 5.08 0) (unlocked yes) (layer "F.SilkS") - (uuid "45c74698-ea31-4c8e-bb23-414d6a0f2760") + (uuid "dc54778f-788f-41e5-a782-c7743f461760") (effects (font (size 0.8 0.8) @@ -385,7 +385,7 @@ (at 6.35 7.62 0) (unlocked yes) (layer "F.SilkS") - (uuid "8ad47244-9deb-48f3-a1cf-7da3443b479b") + (uuid "1ede5b0a-b3da-4231-bf6c-eadc5b57a8e5") (effects (font (size 0.8 0.8) @@ -398,7 +398,7 @@ (at 6.35 10.16 0) (unlocked yes) (layer "F.SilkS") - (uuid "88207855-d7df-4dc3-afec-63635f60ec6e") + (uuid "d169d8e5-233a-4829-a98d-f3a415ff49eb") (effects (font (size 0.8 0.8) @@ -411,7 +411,7 @@ (at -0.1 17.78 0) (unlocked yes) (layer "F.Fab") - (uuid "37b52785-0181-4240-95fe-f9098cad7577") + (uuid "79c36b70-660b-43f0-b905-103773c51193") (effects (font (size 1 1) @@ -426,7 +426,7 @@ (layers "*.Cu" "*.Mask") (remove_unused_layers no) (roundrect_rratio 0.15) - (uuid "6f29c076-3c73-4adf-97d2-279f25b7f65f") + (uuid "d1bb63a2-29cd-4970-9056-d8fb47ccbff1") ) (pad "2" thru_hole circle (at -7.62 -7.62) @@ -434,7 +434,7 @@ (drill 1) (layers "*.Cu" "*.Mask") (remove_unused_layers no) - (uuid "a9310cf3-8605-4a2d-80ee-6d8937f20f43") + (uuid "b56c7c16-6fd5-4d88-b20b-25d30423c421") ) (pad "3" thru_hole circle (at -7.62 -5.08) @@ -442,7 +442,7 @@ (drill 1) (layers "*.Cu" "*.Mask") (remove_unused_layers no) - (uuid "752ec01f-6030-4206-9096-d681374b35a4") + (uuid "636e829c-46bc-4dca-b361-a1ee91c589fb") ) (pad "4" thru_hole circle (at -7.62 -2.54) @@ -450,7 +450,7 @@ (drill 1) (layers "*.Cu" "*.Mask") (remove_unused_layers no) - (uuid "a5906c90-4a6e-47f4-9711-3b5b90b6561f") + (uuid "26b8db50-5d0d-4027-9f92-22632c380724") ) (pad "5" thru_hole circle (at -7.62 0) @@ -458,7 +458,7 @@ (drill 1) (layers "*.Cu" "*.Mask") (remove_unused_layers no) - (uuid "3b346b86-1a5c-4c85-8dfd-c411e17683ca") + (uuid "882374e3-caff-4217-a4df-64d3ccf956c3") ) (pad "6" thru_hole circle (at -7.62 2.54) @@ -466,7 +466,7 @@ (drill 1) (layers "*.Cu" "*.Mask") (remove_unused_layers no) - (uuid "81efee36-9116-41f4-85e7-f544f285c22b") + (uuid "8a71f3b2-6957-4fbb-a00f-545025ab6e12") ) (pad "7" thru_hole circle (at -7.62 5.08) @@ -474,7 +474,7 @@ (drill 1) (layers "*.Cu" "*.Mask") (remove_unused_layers no) - (uuid "353ed785-cece-4f85-822a-f26fe068750a") + (uuid "ee51e7e7-4d37-466d-8d96-161b42df1896") ) (pad "8" thru_hole circle (at -7.62 7.62) @@ -482,7 +482,7 @@ (drill 1) (layers "*.Cu" "*.Mask") (remove_unused_layers no) - (uuid "e6f15655-8075-4df8-bc22-901ef1afcd05") + (uuid "d5831d60-80d8-4a8c-818a-827e37160a17") ) (pad "9" thru_hole circle (at -7.62 10.16) @@ -490,7 +490,7 @@ (drill 1) (layers "*.Cu" "*.Mask") (remove_unused_layers no) - (uuid "9fcaa4d3-595b-4656-90ab-bfb55a709d52") + (uuid "76cacfd2-77b3-469f-a48b-dd77ea38b55c") ) (pad "10" thru_hole circle (at 7.62 10.16) @@ -498,7 +498,7 @@ (drill 1) (layers "*.Cu" "*.Mask") (remove_unused_layers no) - (uuid "993209ad-644d-4a61-a039-7dd8de580dc9") + (uuid "35af9cda-97f6-4d81-b704-42712098b756") ) (pad "11" thru_hole circle (at 7.62 7.62) @@ -506,7 +506,7 @@ (drill 1) (layers "*.Cu" "*.Mask") (remove_unused_layers no) - (uuid "943c5432-45b0-4a15-94f6-8e49feb41fe8") + (uuid "e5d0acf7-5cc3-40cc-95ab-c18859836ab1") ) (pad "12" thru_hole circle (at 7.62 5.08) @@ -514,7 +514,7 @@ (drill 1) (layers "*.Cu" "*.Mask") (remove_unused_layers no) - (uuid "08c0b910-01a5-4201-ab9e-647a695bdef7") + (uuid "78aed1d1-b180-4d7e-8ea2-bfeab948cd70") ) (pad "13" thru_hole circle (at 7.62 2.54) @@ -522,7 +522,7 @@ (drill 1) (layers "*.Cu" "*.Mask") (remove_unused_layers no) - (uuid "97c34e51-01ac-4f08-bb62-3839c62ea2d0") + (uuid "37f89ad5-d51f-4ff1-8de5-e714c1608a67") ) (pad "14" thru_hole circle (at 7.62 0) @@ -530,7 +530,7 @@ (drill 1) (layers "*.Cu" "*.Mask") (remove_unused_layers no) - (uuid "6c424ae0-a3b2-4c5f-a607-6f8bc4aee769") + (uuid "bbe9133d-b11c-4951-b00e-3f298b38f4e0") ) (pad "15" thru_hole circle (at 7.62 -2.54) @@ -538,7 +538,7 @@ (drill 1) (layers "*.Cu" "*.Mask") (remove_unused_layers no) - (uuid "c522fbb7-cf60-4ddc-ba37-5fe2795cfa3c") + (uuid "5eed437a-ec57-4650-8aa9-ae59d3402b98") ) (pad "16" thru_hole circle (at 7.62 -5.08) @@ -546,7 +546,7 @@ (drill 1) (layers "*.Cu" "*.Mask") (remove_unused_layers no) - (uuid "1a3ce6af-c811-42aa-b27d-b7283b2e021d") + (uuid "48ee4904-1fee-4766-851b-4bd967e910df") ) (pad "17" thru_hole circle (at 7.62 -7.62) @@ -554,7 +554,7 @@ (drill 1) (layers "*.Cu" "*.Mask") (remove_unused_layers no) - (uuid "c81dd2b7-0498-49d6-8cc3-de248b51e0ad") + (uuid "dd16cc99-5358-40c5-bf07-dd968253b967") ) (pad "18" thru_hole circle (at 7.62 -10.16) @@ -562,11 +562,11 @@ (drill 1) (layers "*.Cu" "*.Mask") (remove_unused_layers no) - (uuid "d2089de2-ce0c-43f2-86f0-5bfa3d62d5f2") + (uuid "86152640-255f-47a3-928c-33fc8834df32") ) (zone (layers "F.Cu" "B.Cu") - (uuid "0c8d1ec9-a649-4a8b-9391-140bc1075aee") + (uuid "b7b5d213-60cd-486f-bfc9-24388b5e256c") (hatch edge 0.5) (connect_pads (clearance 0) @@ -595,8 +595,8 @@ ) ) (zone - (layer "F.Fab") - (uuid "61ab9364-dcd8-45f6-b9fc-bff55e725ba0") + (layer "F.CrtYd") + (uuid "e2eaa247-ccd4-4b12-87ce-c50b2db9ddc0") (hatch edge 0.5) (connect_pads (clearance 0) diff --git a/hardware/boards/main-control-board/main-control-board.kicad_dru b/hardware/boards/main-control-board/main-control-board.kicad_dru new file mode 100644 index 0000000..02bad03 --- /dev/null +++ b/hardware/boards/main-control-board/main-control-board.kicad_dru @@ -0,0 +1,14 @@ +(version 1) + +(rule "5V min width" + (constraint track_width (min 1.5mm)) + (condition "A.NetClass == 'Power5V'")) + +(rule "5V via min" + (constraint via_diameter (min 0.8mm)) + (constraint hole_size (min 0.4mm)) + (condition "A.NetClass == 'Power5V' && A.Type == 'Via'")) + +(rule "3V3 min width" + (constraint track_width (min 0.4mm)) + (condition "A.NetClass == 'Power3V3'")) \ No newline at end of file diff --git a/hardware/boards/main-control-board/main-control-board.kicad_pcb b/hardware/boards/main-control-board/main-control-board.kicad_pcb index ccd82d6..40bf7cb 100644 --- a/hardware/boards/main-control-board/main-control-board.kicad_pcb +++ b/hardware/boards/main-control-board/main-control-board.kicad_pcb @@ -1,2 +1,4664 @@ -(kicad_pcb (version 20260206) (generator "pcbnew") (generator_version "10.0") -) \ No newline at end of file +(kicad_pcb + (version 20260206) + (generator "pcbnew") + (generator_version "10.0") + (general + (thickness 1.6002) + (legacy_teardrops no) + ) + (paper "A4") + (layers + (0 "F.Cu" signal "Front") + (2 "B.Cu" signal "Back") + (13 "F.Paste" user) + (15 "B.Paste" user) + (5 "F.SilkS" user "F.Silkscreen") + (7 "B.SilkS" user "B.Silkscreen") + (1 "F.Mask" user) + (3 "B.Mask" user) + (25 "Edge.Cuts" user) + (27 "Margin" user) + (31 "F.CrtYd" user "F.Courtyard") + (29 "B.CrtYd" user "B.Courtyard") + (35 "F.Fab" user) + (33 "B.Fab" user) + ) + (setup + (stackup + (layer "F.SilkS" + (type "Top Silk Screen") + ) + (layer "F.Paste" + (type "Top Solder Paste") + ) + (layer "F.Mask" + (type "Top Solder Mask") + (thickness 0.01) + ) + (layer "F.Cu" + (type "copper") + (thickness 0.035) + ) + (layer "dielectric 1" + (type "core") + (thickness 1.5102) + (material "FR4") + (epsilon_r 4.5) + (loss_tangent 0.02) + ) + (layer "B.Cu" + (type "copper") + (thickness 0.035) + ) + (layer "B.Mask" + (type "Bottom Solder Mask") + (thickness 0.01) + ) + (layer "B.Paste" + (type "Bottom Solder Paste") + ) + (layer "B.SilkS" + (type "Bottom Silk Screen") + ) + (copper_finish "None") + (dielectric_constraints no) + ) + (pad_to_mask_clearance 0) + (solder_mask_min_width 0.1) + (allow_soldermask_bridges_in_footprints no) + (tenting + (front yes) + (back yes) + ) + (covering + (front no) + (back no) + ) + (plugging + (front no) + (back no) + ) + (capping no) + (filling no) + (zone_defaults) + (pcbplotparams + (layerselection 0x00000000_00000000_55555555_5755f5ff) + (plot_on_all_layers_selection 0x00000000_00000000_00000000_00000000) + (disableapertmacros no) + (usegerberextensions no) + (usegerberattributes yes) + (usegerberadvancedattributes yes) + (creategerberjobfile yes) + (dashed_line_dash_ratio 12) + (dashed_line_gap_ratio 3) + (svgprecision 4) + (plotframeref no) + (mode 1) + (useauxorigin no) + (pdf_front_fp_property_popups yes) + (pdf_back_fp_property_popups yes) + (pdf_metadata yes) + (pdf_single_document no) + (dxfpolygonmode yes) + (dxfimperialunits yes) + (dxfusepcbnewfont yes) + (psnegative no) + (psa4output no) + (plot_black_and_white yes) + (sketchpadsonfab no) + (plotpadnumbers no) + (hidednponfab no) + (sketchdnponfab yes) + (crossoutdnponfab yes) + (subtractmaskfromsilk no) + (outputformat 1) + (mirror no) + (drillshape 1) + (scaleselection 1) + (outputdirectory "") + ) + ) + (footprint "TinyEngineerModules:Adafruit_PCA9685_Module" + (layer "F.Cu") + (uuid "1cf25c3a-e938-4c8a-8003-b87c04f6c5f0") + (at 183.98 44.58) + (property "Reference" "PCA1" + (at 0 -0.5 0) + (unlocked yes) + (layer "F.SilkS") + (hide yes) + (uuid "3ca4b5c6-f6a6-4bea-9a5f-eb83217e4d6d") + (effects + (font + (size 1 1) + (thickness 0.12) + ) + ) + ) + (property "Value" "PCA9685" + (at 0 1 0) + (unlocked yes) + (layer "F.Fab") + (uuid "d06dfd76-4b19-4d51-a115-d256f5358948") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "ce092e3e-5e72-4d2f-8954-c4ae09d7718f") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "8e1feeed-52e2-42c8-99b1-c91be116080d") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (path "/6391d22f-15dc-41a6-9172-b77d075a6c9e") + (sheetname "/") + (sheetfile "main-control-board.kicad_sch") + (attr through_hole) + (duplicate_pad_numbers_are_jumpers no) + (fp_line + (start -31.85 -11.4) + (end 30.65 -11.4) + (stroke + (width 0.1) + (type default) + ) + (layer "F.SilkS") + (uuid "370a4ab7-a624-4f02-beb5-77d11692b852") + ) + (fp_line + (start -31.85 14) + (end -31.85 -11.4) + (stroke + (width 0.1) + (type default) + ) + (layer "F.SilkS") + (uuid "e225579f-ed5a-44e3-b57d-00c1e2d3c56a") + ) + (fp_line + (start 30.65 -11.4) + (end 30.65 14) + (stroke + (width 0.1) + (type default) + ) + (layer "F.SilkS") + (uuid "d346277c-9ba1-44e5-a1da-09add34397d2") + ) + (fp_line + (start 30.65 14) + (end -31.85 14) + (stroke + (width 0.1) + (type default) + ) + (layer "F.SilkS") + (uuid "f86f8eb1-2dd8-42f0-b54c-e54252897d25") + ) + (fp_poly + (pts + (xy 30.65 -11.4) (xy -31.85 -11.4) (xy -31.85 14) (xy 30.65 14) + ) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.CrtYd") + (uuid "ca36fb18-eb7e-4632-9663-901b41c8c079") + ) + (fp_text user "GND" + (at -29.21 -5.08 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "fd7f0ad6-5eea-473d-ad59-619a25ab474b") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "OE" + (at -29.21 -2.54 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "a30f90ad-7805-469b-afa7-da16c38ee14e") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "SCL" + (at -29.21 0 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "c876105f-f684-4329-92ab-d3d3943e1e6b") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "SDA" + (at -29.21 2.54 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "142d42e5-df6d-4fae-aa90-d1636c33cd74") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "VCC" + (at -29.21 5.08 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "a622a7ae-249f-4a7d-9a9f-9e3d84f50494") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "V+" + (at -29.21 7.62 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "3bbd39c0-119e-4bad-8937-eddeae81b014") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (fp_text user "GND" + (at 26.67 -5.08 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "bcc4971e-8258-451d-993b-9041b7627d19") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "OE" + (at 26.67 -2.54 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "44e7e3a7-d538-4a24-8b25-03755c73f697") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "SCL" + (at 26.67 0 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "257b5320-42ae-42dd-8484-5f1d5a51d62e") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "SDA" + (at 26.67 2.54 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "aa7762f7-d524-4e35-8922-5943ea06d71d") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "VCC" + (at 26.67 5.08 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "be7e31f1-3085-47a0-8d37-bac15dc3a164") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "V+" + (at 26.67 7.62 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "143932d4-e96a-420e-a9d6-a2556100dc24") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "${REFERENCE}" + (at 0 2.5 0) + (unlocked yes) + (layer "F.Fab") + (uuid "1e07c56d-5bb6-468b-87ce-2d2b1eaa2d7f") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "1" thru_hole roundrect + (at -30.48 -5.08) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (roundrect_rratio 0.1470588235) + (net "GND") + (pinfunction "GND_1") + (pintype "power_in") + (uuid "194a8b9a-e519-42ea-9ca9-b1b6b6dd1b49") + ) + (pad "1" thru_hole roundrect + (at 27.94 -5.08) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (roundrect_rratio 0.1470588235) + (net "GND") + (pinfunction "GND_1") + (pintype "power_in") + (uuid "66cc0945-ae65-40bc-9102-6f2cdffe2b72") + ) + (pad "2" thru_hole circle + (at -30.48 -2.54) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "Net-(ESP1-GP5)") + (pinfunction "OE_2") + (pintype "input") + (uuid "58fbb6d6-bf53-4164-aefd-cc9a4ea1b03b") + ) + (pad "2" thru_hole circle + (at 27.94 -2.54) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "Net-(ESP1-GP5)") + (pinfunction "OE_2") + (pintype "input") + (uuid "ea8df7ae-c2f6-4fbc-89e8-c6becb133f73") + ) + (pad "3" thru_hole circle + (at -30.48 0) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "/I2C_SCL") + (pinfunction "SCL_3") + (pintype "bidirectional") + (uuid "f013e112-91e4-41d6-a005-dc259e65c7d1") + ) + (pad "3" thru_hole circle + (at 27.94 0) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "/I2C_SCL") + (pinfunction "SCL_3") + (pintype "bidirectional") + (uuid "77ffa5dc-6840-49a0-9683-bce37c275924") + ) + (pad "4" thru_hole circle + (at -30.48 2.54) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "/I2C_SDA") + (pinfunction "SDA_4") + (pintype "bidirectional") + (uuid "d9357d41-f83c-4a58-a51b-deaecf13841f") + ) + (pad "4" thru_hole circle + (at 27.94 2.54) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "/I2C_SDA") + (pinfunction "SDA_4") + (pintype "bidirectional") + (uuid "113abf7c-f964-4083-9573-c07c5f5cf1e4") + ) + (pad "5" thru_hole circle + (at -30.48 5.08) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "+3.3V") + (pinfunction "VCC_5") + (pintype "power_in") + (uuid "9f70253a-6514-4415-bc89-4ea58d2b9c22") + ) + (pad "5" thru_hole circle + (at 27.94 5.08) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "+3.3V") + (pinfunction "VCC_5") + (pintype "power_in") + (uuid "1dab7595-3f44-473d-aa1d-e45a7a9c143b") + ) + (pad "6" thru_hole circle + (at -30.48 7.62) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "+5V") + (pinfunction "V+_6") + (pintype "power_in") + (uuid "8cde51f2-1104-44d4-88fa-79ff5f412232") + ) + (pad "6" thru_hole circle + (at 27.94 7.62) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "+5V") + (pinfunction "V+_6") + (pintype "power_in") + (uuid "25c61f07-51ab-49b1-a067-dc7dc5be28ae") + ) + (zone + (layer "F.Fab") + (uuid "3ca67a1d-5fa4-4f46-8fdd-de4ae5106067") + (hatch edge 0.5) + (connect_pads + (clearance 0) + ) + (min_thickness 0.25) + (keepout + (tracks allowed) + (vias allowed) + (pads not_allowed) + (copperpour allowed) + (footprints not_allowed) + ) + (placement + (enabled no) + (sheetname "") + ) + (fill + (thermal_gap 0.5) + (thermal_bridge_width 0.5) + (island_removal_mode 0) + ) + (polygon + (pts + (xy 152.13 33.18) (xy 214.63 33.18) (xy 214.63 58.58) (xy 152.13 58.58) + ) + ) + ) + (embedded_fonts no) + ) + (footprint "Connector_PinSocket_2.54mm:PinSocket_1x04_P2.54mm_Vertical" + (layer "F.Cu") + (uuid "35cd7b00-f4f4-4329-95b0-28af0837033c") + (at 235.88 57.5 90) + (descr "Through hole straight socket strip, 1x04, 2.54mm pitch, single row (from Kicad 4.0.7), script generated") + (tags "Through hole socket strip THT 1x04 2.54mm single row") + (property "Reference" "USB1" + (at 0 -2.77 90) + (layer "F.SilkS") + (hide yes) + (uuid "e18d6987-f9df-45bf-9b8a-6a4c30339e13") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "USB" + (at -3.15 -0.09 180) + (layer "F.Fab") + (uuid "47854d5d-c43e-420b-8638-8b1141b06711") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "d09227fb-ccf9-49e2-9bf8-640e1c7d919a") + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "3b1d56ef-2438-4d11-b9c9-0ae6e9c8b3b7") + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "KiLib_Generator" "connector/pin_header_socket" + (at 0 0 90) + (layer "F.SilkS") + (hide yes) + (uuid "6e2540e2-94bc-451e-aea8-1d8ea239cf60") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property ki_fp_filters "Connector*:*_1x??_*") + (path "/892d2d19-23bd-4928-9797-558c2f8336b9") + (sheetname "/") + (sheetfile "main-control-board.kicad_sch") + (units + (unit + (name "A") + (pins "1" "2" "3" "4") + ) + ) + (attr through_hole) + (duplicate_pad_numbers_are_jumpers no) + (fp_line + (start 1.33 -1.33) + (end 1.33 0) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "246b6301-cb04-42c6-9185-130a9bb1d3a3") + ) + (fp_line + (start 0 -1.33) + (end 1.33 -1.33) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "5500b17b-0b2a-4daa-99bd-b9ae481f9030") + ) + (fp_line + (start 1.33 1.27) + (end 1.33 8.95) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "d905690f-46ed-4ff5-88c2-c4cba2678e9a") + ) + (fp_line + (start -1.33 1.27) + (end 1.33 1.27) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "670c5834-9299-4500-9d72-21f815ccf7ab") + ) + (fp_line + (start -1.33 1.27) + (end -1.33 8.95) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "0f3626e6-0d7b-452f-9124-93a5f1a4797c") + ) + (fp_line + (start -1.33 8.95) + (end 1.33 8.95) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "d27b304a-fc91-4c44-ae83-cbd46c1eff47") + ) + (fp_line + (start 1.77 -1.77) + (end 1.77 9.39) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "f0025064-b615-4a2a-ba5c-2d8f0557883b") + ) + (fp_line + (start -1.77 -1.77) + (end 1.77 -1.77) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "6b46e851-b704-4379-88ce-8cead7ca0ae8") + ) + (fp_line + (start 1.77 9.39) + (end -1.77 9.39) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "17cc1e35-cc47-4490-b465-b2820ecb9785") + ) + (fp_line + (start -1.77 9.39) + (end -1.77 -1.77) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "deb6aef6-2de0-4b97-af37-217feec807be") + ) + (fp_line + (start 0.635 -1.27) + (end 1.27 -0.635) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "5c9d3fcd-edde-4f2f-8205-6399e3eb8a4d") + ) + (fp_line + (start -1.27 -1.27) + (end 0.635 -1.27) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "96aa6760-979f-4462-aceb-3299bf625c9c") + ) + (fp_line + (start 1.27 -0.635) + (end 1.27 8.89) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "4d0c7582-7e3f-4e03-b688-c2552d7dabc0") + ) + (fp_line + (start 1.27 8.89) + (end -1.27 8.89) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "f335540c-811c-4c87-8015-b27ff1eb891c") + ) + (fp_line + (start -1.27 8.89) + (end -1.27 -1.27) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "24ac51d2-4fdf-4c17-b519-11b411f9b2dc") + ) + (fp_text user "${REFERENCE}" + (at 0 3.81 180) + (layer "F.Fab") + (uuid "2fc5d409-8e3e-413b-bc2d-7e4d1e009075") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "1" thru_hole rect + (at 0 0 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "/USB_D+") + (pinfunction "Pin_1_1") + (pintype "passive") + (uuid "2c58756a-4ea8-4443-9d0b-39853d0cab56") + ) + (pad "2" thru_hole circle + (at 0 2.54 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "/USB_D-") + (pinfunction "Pin_2_2") + (pintype "passive") + (uuid "5cef7094-b417-4355-9c49-a224194ec056") + ) + (pad "3" thru_hole circle + (at 0 5.08 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "+5V") + (pinfunction "Pin_3_3") + (pintype "passive") + (uuid "2e450e1c-8984-4ed0-bac8-8dd295857b77") + ) + (pad "4" thru_hole circle + (at 0 7.62 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "GND") + (pinfunction "Pin_4_4") + (pintype "passive") + (uuid "f2b7169b-2584-447c-80a7-97d8bca9c7fe") + ) + (embedded_fonts no) + (model "${KICAD10_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x04_P2.54mm_Vertical.step" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "TinyEngineerModules:MAX98357_Module" + (layer "F.Cu") + (uuid "a365f461-1c77-44ad-b967-8291f3f14810") + (at 239.5 42 180) + (property "Reference" "MAX1" + (at 2.5 0 180) + (unlocked yes) + (layer "F.SilkS") + (hide yes) + (uuid "895041d2-7a94-41ce-a94f-28df26ea3fc6") + (effects + (font + (size 1 1) + (thickness 0.12) + ) + ) + ) + (property "Value" "MAX98357" + (at 0 10 180) + (unlocked yes) + (layer "F.Fab") + (uuid "6eb6a287-206e-4932-b015-aaea8f026895") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 180) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "698df864-dd15-4c15-9d4b-2111ff2c8156") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 180) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "3f1b229a-11c9-4aa1-808c-78d553e8cda9") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (path "/36531e2b-a362-4cd5-9344-6709539e35aa") + (sheetname "/") + (sheetfile "main-control-board.kicad_sch") + (attr through_hole) + (duplicate_pad_numbers_are_jumpers no) + (fp_line + (start 9.35 8.75) + (end -9.35 8.75) + (stroke + (width 0.1) + (type default) + ) + (layer "F.SilkS") + (uuid "8fae1b8b-8e3a-4e35-bec4-6c22532d9cf7") + ) + (fp_line + (start 9.35 -8.95) + (end 9.35 8.75) + (stroke + (width 0.1) + (type default) + ) + (layer "F.SilkS") + (uuid "85c50e62-0cab-41ba-b5cb-17dc0a59ed7a") + ) + (fp_line + (start -9.35 8.75) + (end -9.35 -8.95) + (stroke + (width 0.1) + (type default) + ) + (layer "F.SilkS") + (uuid "c65a6e0c-9a1d-4e7e-9e5b-c90f9f5ec56d") + ) + (fp_line + (start -9.35 -8.95) + (end 9.35 -8.95) + (stroke + (width 0.1) + (type default) + ) + (layer "F.SilkS") + (uuid "6d51b3d5-f47e-4855-8838-fe511fba674e") + ) + (fp_rect + (start -9.35 -8.95) + (end 9.35 8.75) + (stroke + (width 0.1) + (type default) + ) + (fill no) + (layer "F.SilkS") + (uuid "f2ad4059-e0cc-43ec-a0d0-8e88de911db9") + ) + (fp_line + (start 9.35 8.75) + (end -9.35 8.75) + (stroke + (width 0.1) + (type default) + ) + (layer "F.CrtYd") + (uuid "c4b93df9-81e3-4156-ba87-59467fd9e5d5") + ) + (fp_line + (start 9.35 -8.95) + (end 9.35 8.75) + (stroke + (width 0.1) + (type default) + ) + (layer "F.CrtYd") + (uuid "81ffaab9-82e9-463b-8f9b-350e7dad8a8e") + ) + (fp_line + (start -9.35 8.75) + (end -9.35 -8.95) + (stroke + (width 0.1) + (type default) + ) + (layer "F.CrtYd") + (uuid "baae025c-c47f-4e4e-979b-c3eeb54b72af") + ) + (fp_line + (start -9.35 -8.95) + (end 9.35 -8.95) + (stroke + (width 0.1) + (type default) + ) + (layer "F.CrtYd") + (uuid "70af2232-da69-4b7c-8450-02638b28e353") + ) + (fp_text user "Vin" + (at -6.35 7.5 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "74fdcb99-6e0c-42ec-b422-d90ac9743009") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "GND" + (at -6.35 5 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "30ef265c-f1ed-4f85-9fb2-6dc0d76fbecd") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "SD" + (at -6.35 2.5 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "8d0420dd-ca79-4c71-8a2b-adebcca24a28") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "GAIN" + (at -6.35 0 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "1ab7141d-d815-42c2-b6c1-e2d9dcd4606c") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "DIN" + (at -6.35 -2.5 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "eb6d8c64-bf0f-45b9-b55b-d6b0c52995fe") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "BCLK" + (at -6.35 -5 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "b1dcd3fc-efdc-45b7-ba13-01dd1918221a") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "LRC" + (at -6.35 -7.5 0) + (unlocked yes) + (layer "F.SilkS") + (uuid "03d5bd16-91e6-4f5c-b298-3cca1f872060") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right) + ) + ) + (fp_text user "${REFERENCE}" + (at 0 12.5 180) + (unlocked yes) + (layer "F.Fab") + (uuid "7c1d2696-2016-4b4c-abc4-97b9f58f4eaf") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "1" thru_hole roundrect + (at -7.5 -7.5 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (roundrect_rratio 0.1470588235) + (net "/I2S_LRC") + (pinfunction "LRC_1") + (pintype "bidirectional") + (uuid "bac83806-9801-452c-89c3-e9b10d0270ab") + ) + (pad "2" thru_hole circle + (at -7.5 -5 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "/I2S_BCLK") + (pinfunction "BCLK_2") + (pintype "bidirectional") + (uuid "35be6f7c-471d-4e9d-91c4-2d8d01e03899") + ) + (pad "3" thru_hole circle + (at -7.5 -2.5 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "/I2S_DIN") + (pinfunction "DIN_3") + (pintype "bidirectional") + (uuid "d2579328-5e00-47e9-b665-e53ce7372787") + ) + (pad "4" thru_hole circle + (at -7.5 0 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "unconnected-(MAX1-GAIN-Pad4)") + (pinfunction "GAIN_4") + (pintype "bidirectional+no_connect") + (uuid "28876361-9b99-427f-8540-0b63c65ad81f") + ) + (pad "5" thru_hole circle + (at -7.5 2.5 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "unconnected-(MAX1-SD-Pad5)") + (pinfunction "SD_5") + (pintype "bidirectional+no_connect") + (uuid "df7d059b-b445-44f6-862d-12cedfc3c96e") + ) + (pad "6" thru_hole circle + (at -7.5 5 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "GND") + (pinfunction "GND_6") + (pintype "power_in") + (uuid "1e3f4c46-abd9-4e91-837b-82d9989c5b3c") + ) + (pad "7" thru_hole circle + (at -7.5 7.5 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "+5V") + (pinfunction "Vin_7") + (pintype "power_in") + (uuid "03a32a78-a4a7-4e30-b0f7-c2721cf50605") + ) + (zone + (layer "F.Fab") + (uuid "9fee1b0c-3011-4fe2-b828-b29ecf94443a") + (hatch edge 0.5) + (connect_pads + (clearance 0) + ) + (min_thickness 0.25) + (keepout + (tracks allowed) + (vias allowed) + (pads not_allowed) + (copperpour allowed) + (footprints not_allowed) + ) + (placement + (enabled no) + (sheetname "") + ) + (fill + (thermal_gap 0.5) + (thermal_bridge_width 0.5) + (island_removal_mode 0) + ) + (polygon + (pts + (xy 248.85 50.95) (xy 230.15 50.95) (xy 230.15 33.25) (xy 248.85 33.25) + ) + ) + ) + (embedded_fonts no) + ) + (footprint "Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical" + (layer "F.Cu") + (uuid "a7b6f5ea-fd39-4a06-951c-e2fa493a7f6e") + (at 221.4 48.08 180) + (descr "Through hole straight pin header, 1x04, 2.54mm pitch, single row") + (tags "Through hole pin header THT 1x04 2.54mm single row") + (property "Reference" "OLED1" + (at 0 -2.38 0) + (layer "F.SilkS") + (hide yes) + (uuid "198ecb0f-8a10-49da-8626-bd1840207c07") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "OLED" + (at 2.65 7.46 90) + (layer "F.Fab") + (uuid "b2e280ed-ad2c-4ebf-837e-7bb0a4880ed8") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "afb98e53-6a8e-4bbc-ad63-185b8009f90e") + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "57ce26e0-76c4-442a-831d-e95f70897913") + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "KiLib_Generator" "connector/pin_header_socket" + (at 0 0 0) + (layer "F.SilkS") + (hide yes) + (uuid "7e4776da-7665-4c95-a8bb-31f76dc57a95") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (path "/4df93a1e-042d-4c49-a44e-af77e7aabde4") + (sheetname "/") + (sheetfile "main-control-board.kicad_sch") + (units + (unit + (name "A") + (pins "1" "2" "3" "4") + ) + ) + (attr through_hole) + (duplicate_pad_numbers_are_jumpers no) + (fp_line + (start 1.38 1.27) + (end 1.38 9) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "cea827aa-595c-44c7-8f83-282f526b954a") + ) + (fp_line + (start -1.38 9) + (end 1.38 9) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "ebeecd40-fe3a-4fc0-9548-74a22478a5ac") + ) + (fp_line + (start -1.38 1.27) + (end 1.38 1.27) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "b6ee2047-b33a-453b-aefd-2f7961974e2e") + ) + (fp_line + (start -1.38 1.27) + (end -1.38 9) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "084dae95-5ec1-4f19-980a-5719e53238c0") + ) + (fp_line + (start -1.38 0) + (end -1.38 -1.38) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "0512901a-7ccc-4017-8e42-3202329b3bb9") + ) + (fp_line + (start -1.38 -1.38) + (end 0 -1.38) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "4ef9d0b4-1093-490c-a21f-5c3e6f9cd4b9") + ) + (fp_rect + (start -1.77 -1.77) + (end 1.77 9.39) + (stroke + (width 0.05) + (type solid) + ) + (fill no) + (layer "F.CrtYd") + (uuid "1e31b69d-853d-4cba-a117-6dca6add557a") + ) + (fp_line + (start 1.27 8.89) + (end -1.27 8.89) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "3e070bc3-2015-4bbb-aad4-e21fe1552826") + ) + (fp_line + (start 1.27 -1.27) + (end 1.27 8.89) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "e050a31b-53ff-43b3-9cbf-7f0489bad166") + ) + (fp_line + (start -0.635 -1.27) + (end 1.27 -1.27) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "af9210c0-81b9-48d3-8251-1dd63c3e316f") + ) + (fp_line + (start -1.27 8.89) + (end -1.27 -0.635) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "1a671d4e-d0e0-4eee-a067-c8da70cb39e4") + ) + (fp_line + (start -1.27 -0.635) + (end -0.635 -1.27) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "6d7313f9-9247-4020-a475-9db537fe4571") + ) + (fp_text user "${REFERENCE}" + (at 0 3.81 90) + (layer "F.Fab") + (uuid "8c9edbd5-6937-4f74-95c9-ffff2c96b9c1") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "1" thru_hole rect + (at 0 0 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "+3.3V") + (pinfunction "VCC_1") + (pintype "power_in") + (uuid "09a85a4d-a3ef-4d62-8591-cea61af45d82") + ) + (pad "2" thru_hole circle + (at 0 2.54 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "GND") + (pinfunction "GND_2") + (pintype "power_in") + (uuid "6b9c7537-42ae-4207-b08c-21873553617b") + ) + (pad "3" thru_hole circle + (at 0 5.08 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "/I2C_SDA") + (pinfunction "SDA_3") + (pintype "bidirectional") + (uuid "8fee2071-ff59-4508-bc5e-1d1da720d2a9") + ) + (pad "4" thru_hole circle + (at 0 7.62 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "/I2C_SCL") + (pinfunction "SCL_4") + (pintype "bidirectional") + (uuid "0741a587-a504-4963-81ae-17c8e1fa43ae") + ) + (embedded_fonts no) + (model "${KICAD10_3DMODEL_DIR}/Connector_PinHeader_2.54mm.3dshapes/PinHeader_1x04_P2.54mm_Vertical.step" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "TinyEngineerModules:ESP32_C3_Zero_Dev_Board" + (layer "B.Cu") + (uuid "f36ce200-0897-4526-8479-7c85c92e6620") + (at 135.98 46.12 180) + (property "Reference" "ESP1" + (at 0 -13 0) + (unlocked yes) + (layer "B.SilkS") + (hide yes) + (uuid "df145312-111b-45a1-9f94-6c7d65f51f8e") + (effects + (font + (size 1 1) + (thickness 0.12) + ) + (justify mirror) + ) + ) + (property "Value" "ESP32-C3-ZERO" + (at -0.1 -15.24 0) + (unlocked yes) + (layer "B.Fab") + (uuid "c01bbf37-d065-4425-99f2-64628fd99f25") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + (justify mirror) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (unlocked yes) + (layer "B.Fab") + (hide yes) + (uuid "a95bd327-7588-4114-841f-0f4d086d1734") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + (justify mirror) + ) + ) + (property "Description" "" + (at 0 0 0) + (unlocked yes) + (layer "B.Fab") + (hide yes) + (uuid "4a36a5e4-1dd0-4592-8174-3908031b0b09") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + (justify mirror) + ) + ) + (path "/830dbdd4-4215-415a-a843-81c8ec435273") + (sheetname "/") + (sheetfile "main-control-board.kicad_sch") + (attr through_hole) + (duplicate_pad_numbers_are_jumpers no) + (fp_line + (start 9.3 11.9) + (end 9.3 -11.9) + (stroke + (width 0.1) + (type default) + ) + (layer "B.SilkS") + (uuid "328fc9e0-0e8f-41bc-91d9-bac146d7d967") + ) + (fp_line + (start 9.3 -11.9) + (end -9.5 -11.9) + (stroke + (width 0.1) + (type default) + ) + (layer "B.SilkS") + (uuid "291cbb94-7e70-40cf-b489-e732a350afd3") + ) + (fp_line + (start 4.4 13.4) + (end 4.4 11.9) + (stroke + (width 0.1) + (type dot) + ) + (layer "B.SilkS") + (uuid "5f96e149-b3bf-40d8-959b-508008f78270") + ) + (fp_line + (start -4.6 13.4) + (end 4.4 13.4) + (stroke + (width 0.1) + (type dot) + ) + (layer "B.SilkS") + (uuid "5582b0b6-8376-4943-95e9-c0c733dc8fc1") + ) + (fp_line + (start -4.6 13.4) + (end -4.6 11.9) + (stroke + (width 0.1) + (type dot) + ) + (layer "B.SilkS") + (uuid "78f5f3e8-a333-43a5-9e55-a6883bb831b9") + ) + (fp_line + (start -9.5 11.9) + (end 9.3 11.9) + (stroke + (width 0.1) + (type default) + ) + (layer "B.SilkS") + (uuid "0f1dab84-c45d-42ba-b747-64fcd5cd9030") + ) + (fp_line + (start -9.5 -11.9) + (end -9.5 11.9) + (stroke + (width 0.1) + (type default) + ) + (layer "B.SilkS") + (uuid "49e3ed13-6899-4544-90d8-9479be90419a") + ) + (fp_rect + (start -6.6 -6.5) + (end 6.6 -11.4) + (stroke + (width 0.1) + (type dot) + ) + (fill no) + (layer "B.SilkS") + (uuid "b8ccf47c-5c2a-4671-918b-8a6feab76e00") + ) + (fp_poly + (pts + (xy -9.5 11.9) (xy -9.5 -11.9) (xy 9.3 -11.9) (xy 9.3 11.9) + ) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "B.CrtYd") + (uuid "b8ba6241-540e-47d7-a775-75eb656a8e75") + ) + (fp_text user "TX" + (at 6.35 10.16 0) + (unlocked yes) + (layer "B.SilkS") + (uuid "94df90b8-7617-460b-930f-77d1fe559649") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right mirror) + ) + ) + (fp_text user "RX" + (at 6.35 7.62 0) + (unlocked yes) + (layer "B.SilkS") + (uuid "672c5690-1b29-41b9-a5bc-d95e17236b6f") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right mirror) + ) + ) + (fp_text user "USB DP" + (at 6.35 5.08 0) + (unlocked yes) + (layer "B.SilkS") + (uuid "9c7ad69f-12a6-4349-847d-e772b90e3325") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right mirror) + ) + ) + (fp_text user "USB DM" + (at 6.35 2.54 0) + (unlocked yes) + (layer "B.SilkS") + (uuid "5cd6f378-951c-4de0-92ba-5308f5243973") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right mirror) + ) + ) + (fp_text user "GP10" + (at 6.35 0 0) + (unlocked yes) + (layer "B.SilkS") + (uuid "1b0e6929-99b4-4328-b531-cedfd7ca607c") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right mirror) + ) + ) + (fp_text user "GP9" + (at 6.35 -2.54 0) + (unlocked yes) + (layer "B.SilkS") + (uuid "9981159a-2a5f-4e2c-b7c1-ad35f5c7db9c") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right mirror) + ) + ) + (fp_text user "GP8" + (at 6.35 -5.08 0) + (unlocked yes) + (layer "B.SilkS") + (uuid "2374589c-ad49-4b72-b9e5-cc7dd761155c") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right mirror) + ) + ) + (fp_text user "GP7" + (at 6.35 -7.62 0) + (unlocked yes) + (layer "B.SilkS") + (uuid "5d47f9e9-f61c-4cbc-a0d5-222b83fa37d4") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right mirror) + ) + ) + (fp_text user "GP6" + (at 6.35 -10.16 0) + (unlocked yes) + (layer "B.SilkS") + (uuid "91a08118-2f46-4cce-96fc-c09c35a1f359") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify right mirror) + ) + ) + (fp_text user "ANT" + (at 0 -9.1 0) + (unlocked yes) + (layer "B.SilkS") + (uuid "e2e6f67e-4492-4997-8f08-17c1765c4e97") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify mirror) + ) + ) + (fp_text user "USB" + (at -1.3 12.2 0) + (unlocked yes) + (layer "B.SilkS") + (uuid "3666efe1-5eec-4534-a209-fc71ef4ea196") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left bottom mirror) + ) + ) + (fp_text user "5V" + (at -6.35 10.16 0) + (unlocked yes) + (layer "B.SilkS") + (uuid "b48f3cd7-3d70-46e4-9bf8-54e829617829") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left mirror) + ) + ) + (fp_text user "GND" + (at -6.35 7.62 0) + (unlocked yes) + (layer "B.SilkS") + (uuid "6f273698-94bd-489b-a44e-36a6643b8a44") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left mirror) + ) + ) + (fp_text user "3V3" + (at -6.35 5.08 0) + (unlocked yes) + (layer "B.SilkS") + (uuid "62b1ec49-0579-4a38-b9a4-bd56a3abed6d") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left mirror) + ) + ) + (fp_text user "GP0" + (at -6.35 2.54 0) + (unlocked yes) + (layer "B.SilkS") + (uuid "0dbb2a23-9740-4dc5-b20a-ffbade2c8a3d") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left mirror) + ) + ) + (fp_text user "GP1" + (at -6.35 0 0) + (unlocked yes) + (layer "B.SilkS") + (uuid "a9dac915-a0fe-4226-9e5c-870303965ca1") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left mirror) + ) + ) + (fp_text user "GP2" + (at -6.35 -2.54 0) + (unlocked yes) + (layer "B.SilkS") + (uuid "e082c57b-2e8a-4249-b427-baf584f5c055") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left mirror) + ) + ) + (fp_text user "GP3" + (at -6.35 -5.08 0) + (unlocked yes) + (layer "B.SilkS") + (uuid "e19a65d3-46f0-4e45-b0d4-a7c4de36f45b") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left mirror) + ) + ) + (fp_text user "GP4" + (at -6.35 -7.62 0) + (unlocked yes) + (layer "B.SilkS") + (uuid "6ad14453-cfd7-4e4a-a592-47cf1f30df65") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left mirror) + ) + ) + (fp_text user "GP5" + (at -6.35 -10.16 0) + (unlocked yes) + (layer "B.SilkS") + (uuid "4ed83151-3518-4961-ad14-3c27e6d4b03a") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left mirror) + ) + ) + (fp_text user "${REFERENCE}" + (at -0.1 -17.78 0) + (unlocked yes) + (layer "B.Fab") + (uuid "64561b89-482f-409b-8b9a-ca8660826a5d") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + (justify mirror) + ) + ) + (pad "1" thru_hole roundrect + (at -7.62 10.16 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (roundrect_rratio 0.15) + (net "+5V") + (pinfunction "5V_1") + (pintype "power_in") + (uuid "a17ea410-0bd7-4dab-966b-fd174fbfd7ed") + ) + (pad "2" thru_hole circle + (at -7.62 7.62 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "GND") + (pinfunction "GND_2") + (pintype "power_in") + (uuid "92aad9c5-fa0d-4214-8ea6-b9b9e970a511") + ) + (pad "3" thru_hole circle + (at -7.62 5.08 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "+3.3V") + (pinfunction "3V3_3") + (pintype "power_out") + (uuid "141a71d0-cfb1-4d1a-b393-c1859ea37988") + ) + (pad "4" thru_hole circle + (at -7.62 2.54 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "/I2C_SDA") + (pinfunction "GP0_4") + (pintype "bidirectional") + (uuid "3f2b544d-afed-42c1-8c62-31402182adbf") + ) + (pad "5" thru_hole circle + (at -7.62 0 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "/I2C_SCL") + (pinfunction "GP1_5") + (pintype "bidirectional") + (uuid "5220d2f2-6503-4c7c-bd21-6d7246d28dbe") + ) + (pad "6" thru_hole circle + (at -7.62 -2.54 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "/I2S_BCLK") + (pinfunction "GP2_6") + (pintype "bidirectional") + (uuid "605e0f8e-d42a-4207-8ff0-555ab94a3297") + ) + (pad "7" thru_hole circle + (at -7.62 -5.08 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "/I2S_LRC") + (pinfunction "GP3_7") + (pintype "bidirectional") + (uuid "d894526c-92ff-4179-9bb5-84d6ed8ac186") + ) + (pad "8" thru_hole circle + (at -7.62 -7.62 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "/I2S_DIN") + (pinfunction "GP4_8") + (pintype "bidirectional") + (uuid "24efb83c-fa17-4e3d-8732-1b7b9be84945") + ) + (pad "9" thru_hole circle + (at -7.62 -10.16 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "Net-(ESP1-GP5)") + (pinfunction "GP5_9") + (pintype "bidirectional") + (uuid "07faf1c2-0cae-4587-8fd1-0dfdb9c7aa3c") + ) + (pad "10" thru_hole circle + (at 7.62 -10.16 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "unconnected-(ESP1-GP6-Pad10)") + (pinfunction "GP6_10") + (pintype "bidirectional+no_connect") + (uuid "724c2088-1c89-4e62-a0b4-c7d895fcb121") + ) + (pad "11" thru_hole circle + (at 7.62 -7.62 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "unconnected-(ESP1-GP7-Pad11)") + (pinfunction "GP7_11") + (pintype "bidirectional+no_connect") + (uuid "63cdc181-3e1d-4dbd-8635-7447c7fee78e") + ) + (pad "12" thru_hole circle + (at 7.62 -5.08 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "unconnected-(ESP1-GP8-Pad12)") + (pinfunction "GP8_12") + (pintype "bidirectional+no_connect") + (uuid "fecf710b-37d1-491e-8e46-5a8ea0221441") + ) + (pad "13" thru_hole circle + (at 7.62 -2.54 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "unconnected-(ESP1-GP9-Pad13)") + (pinfunction "GP9_13") + (pintype "bidirectional+no_connect") + (uuid "936c7b47-0e6f-4b6b-b73b-09e2e3e9e5c0") + ) + (pad "14" thru_hole circle + (at 7.62 0 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "unconnected-(ESP1-GP10-Pad14)") + (pinfunction "GP10_14") + (pintype "bidirectional+no_connect") + (uuid "40f8679f-d984-496d-b636-d3720ceea9c5") + ) + (pad "15" thru_hole circle + (at 7.62 2.54 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "/USB_D-") + (pinfunction "USB_DM_15") + (pintype "bidirectional") + (uuid "05855b5b-b590-413d-86ad-75a5e50814b5") + ) + (pad "16" thru_hole circle + (at 7.62 5.08 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "/USB_D+") + (pinfunction "USB_DP_16") + (pintype "bidirectional") + (uuid "061f5830-cc1b-4560-846f-2eb8955b9a69") + ) + (pad "17" thru_hole circle + (at 7.62 7.62 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "unconnected-(ESP1-RX-Pad17)") + (pinfunction "RX_17") + (pintype "bidirectional+no_connect") + (uuid "9cc82926-0959-4792-8194-9d2070dc683d") + ) + (pad "18" thru_hole circle + (at 7.62 10.16 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net "unconnected-(ESP1-TX-Pad18)") + (pinfunction "TX_18") + (pintype "bidirectional+no_connect") + (uuid "92f8f283-8d3f-4dc3-9af5-2a7f9b7cb757") + ) + (zone + (layers "F.Cu" "B.Cu") + (uuid "c7f9b3f6-2443-48a3-92cf-4aa43b757406") + (hatch edge 0.5) + (connect_pads + (clearance 0) + ) + (min_thickness 0.25) + (keepout + (tracks not_allowed) + (vias not_allowed) + (pads not_allowed) + (copperpour not_allowed) + (footprints allowed) + ) + (placement + (enabled no) + (sheetname "") + ) + (fill + (thermal_gap 0.5) + (thermal_bridge_width 0.5) + (island_removal_mode 0) + ) + (polygon + (pts + (xy 142.64 51.12) (xy 129.58 51.12) (xy 129.58 58.92) (xy 142.64 58.92) + ) + ) + ) + (zone + (layer "B.CrtYd") + (uuid "28c97b2f-e8d1-41d1-a71a-086cbc06a4c5") + (hatch edge 0.5) + (connect_pads + (clearance 0) + ) + (min_thickness 0.25) + (keepout + (tracks allowed) + (vias allowed) + (pads not_allowed) + (copperpour allowed) + (footprints not_allowed) + ) + (placement + (enabled no) + (sheetname "") + ) + (fill + (thermal_gap 0.5) + (thermal_bridge_width 0.5) + (island_removal_mode 0) + ) + (polygon + (pts + (xy 145.48 34.22) (xy 126.68 34.22) (xy 126.68 58.02) (xy 145.48 58.02) + ) + ) + ) + (embedded_fonts no) + ) + (gr_poly + (pts + (xy 179.607495 46.092044) (xy 179.702049 46.184993) (xy 179.743688 46.225412) (xy 179.782883 46.261379) + (xy 179.819246 46.29412) (xy 179.853598 46.323603) (xy 179.885935 46.35029) (xy 179.91746 46.374134) + (xy 179.947355 46.395556) (xy 179.977272 46.414939) (xy 180.00676 46.43233) (xy 180.036679 46.448484) + (xy 180.067393 46.463453) (xy 180.099303 46.477591) (xy 180.132448 46.490927) (xy 180.167601 46.504262) + (xy 180.275523 46.543451) (xy 181.364237 46.543052) (xy 182.287262 46.542645) (xy 182.386695 46.448078) + (xy 182.488135 46.351908) (xy 182.591585 46.254902) (xy 182.696654 46.156708) (xy 182.666741 45.993851) + (xy 182.637236 45.830992) (xy 181.074477 45.830992) (xy 179.346823 45.830992) + ) + (stroke + (width 0) + (type solid) + ) + (fill yes) + (layer "B.SilkS") + (uuid "a3e07924-64cf-4259-9231-0855b76b3901") + ) + (gr_poly + (pts + (xy 189.411253 45.837443) (xy 189.410452 45.839059) (xy 189.40924 45.841896) (xy 189.4064 45.852005) + (xy 189.402367 45.866956) (xy 189.397516 45.886342) (xy 189.392256 45.909798) (xy 189.386207 45.93606) + (xy 189.380133 45.964741) (xy 189.373667 45.995065) (xy 189.342952 46.1462) (xy 189.436719 46.233102) + (xy 189.537337 46.327256) (xy 189.647663 46.431521) (xy 189.765262 46.543451) (xy 190.636979 46.542243) + (xy 191.162751 46.540629) (xy 191.509897 46.536994) (xy 191.709943 46.530527) (xy 191.764903 46.52568) + (xy 191.795203 46.520011) (xy 191.832798 46.507492) (xy 191.86957 46.492941) (xy 191.906341 46.477191) + (xy 191.942711 46.459001) (xy 191.979075 46.439185) (xy 192.015878 46.41696) (xy 192.053052 46.392715) + (xy 192.090625 46.365644) (xy 192.129412 46.336131) (xy 192.169032 46.303415) (xy 192.210245 46.268251) + (xy 192.252676 46.229851) (xy 192.296734 46.187834) (xy 192.343209 46.142568) (xy 192.391303 46.094082) + (xy 192.442211 46.041532) (xy 192.634584 45.839461) (xy 190.915826 45.835429) (xy 189.810527 45.834214) + ) + (stroke + (width 0) + (type solid) + ) + (fill yes) + (layer "B.SilkS") + (uuid "31bb577f-334e-4c7f-afe7-8b637cde890d") + ) + (gr_poly + (pts + (xy 184.299432 44.262969) (xy 184.299432 44.417338) (xy 184.385106 44.457757) (xy 184.402896 44.466237) + (xy 184.42026 44.474725) (xy 184.436826 44.483623) (xy 184.452189 44.492508) (xy 184.46592 44.500588) + (xy 184.477645 44.507868) (xy 184.486541 44.514335) (xy 184.490166 44.517156) (xy 184.492994 44.519583) + (xy 184.494609 44.521602) (xy 184.495843 44.524834) (xy 184.497448 44.529293) (xy 184.498668 44.534531) + (xy 184.501486 44.549096) (xy 184.503915 44.569288) (xy 184.505924 44.595566) (xy 184.507558 44.628694) + (xy 184.50917 44.668708) (xy 184.510377 44.71679) (xy 184.512398 44.838451) (xy 184.514015 44.997659) + (xy 184.514416 45.199733) (xy 184.514825 45.448685) (xy 184.514825 46.355944) (xy 184.41136 46.396362) + (xy 184.307505 46.43717) (xy 184.303063 46.606103) (xy 184.29821 46.775444) (xy 184.846214 46.775444) + (xy 185.393804 46.775444) (xy 185.389362 46.607723) (xy 185.38451 46.440419) (xy 185.281063 46.397976) + (xy 185.177607 46.355541) (xy 185.177607 45.441404) (xy 185.177607 44.527266) (xy 185.284693 44.47918) + (xy 185.391778 44.43148) (xy 185.392187 44.269831) (xy 185.392593 44.108583) (xy 184.846214 44.108583) + (xy 184.299432 44.108583) + ) + (stroke + (width 0) + (type solid) + ) + (fill yes) + (layer "B.SilkS") + (uuid "39db4e56-5dfe-474a-bbaf-8206d75a5eac") + ) + (gr_poly + (pts + (xy 190.060287 43.847926) (xy 189.731741 43.854376) (xy 189.667467 43.85884) (xy 189.649682 43.864888) + (xy 189.650082 43.867312) (xy 189.651311 43.871365) (xy 189.652931 43.876607) (xy 189.65575 43.882281) + (xy 189.658982 43.889547) (xy 189.662624 43.897219) (xy 189.671912 43.915419) (xy 189.683223 43.936012) + (xy 189.696155 43.95864) (xy 189.710312 43.982489) (xy 189.725262 44.007558) (xy 189.801245 44.12919) + (xy 189.729701 44.205989) (xy 189.690912 44.246792) (xy 189.637963 44.302568) (xy 189.517538 44.427443) + (xy 189.3769 44.572132) (xy 191.522025 44.571303) (xy 193.364845 44.566057) (xy 193.762105 44.559184) + (xy 193.861535 44.554742) (xy 193.907181 44.549502) (xy 193.945988 44.537781) (xy 193.984379 44.524024) + (xy 194.022356 44.508674) (xy 194.060364 44.491296) (xy 194.098746 44.471493) (xy 194.137537 44.449272) + (xy 194.176741 44.424216) (xy 194.217152 44.396315) (xy 194.258372 44.366023) (xy 194.301219 44.332069) + (xy 194.345675 44.295298) (xy 194.391723 44.254478) (xy 194.440235 44.210423) (xy 194.490753 44.162739) + (xy 194.544095 44.110607) (xy 194.599872 44.054836) (xy 194.787784 43.864888) (xy 194.607135 43.853977) + (xy 194.342426 43.84994) (xy 193.754021 43.846311) (xy 191.955644 43.843469) + ) + (stroke + (width 0) + (type solid) + ) + (fill yes) + (layer "B.SilkS") + (uuid "996cc6c8-b7b2-4eee-8c7f-eef086a553bf") + ) + (gr_poly + (pts + (xy 178.007541 43.849133) (xy 177.212216 43.859242) (xy 177.213829 43.862064) (xy 177.217877 43.866907) + (xy 177.23202 43.883485) (xy 177.253844 43.907324) (xy 177.282127 43.937243) (xy 177.315678 43.972806) + (xy 177.354458 44.012806) (xy 177.396494 44.056046) (xy 177.441757 44.10171) (xy 177.522186 44.181741) + (xy 177.594514 44.250839) (xy 177.628053 44.281551) (xy 177.660396 44.309841) (xy 177.691115 44.336105) + (xy 177.721006 44.35995) (xy 177.749708 44.382172) (xy 177.777186 44.402388) (xy 177.804254 44.421377) + (xy 177.830938 44.438352) (xy 177.85721 44.453702) (xy 177.883471 44.468263) (xy 177.909347 44.481189) + (xy 177.935604 44.493322) (xy 177.967537 44.507868) (xy 177.982486 44.514335) (xy 177.997036 44.519985) + (xy 178.012401 44.525654) (xy 178.028553 44.530898) (xy 178.046335 44.53574) (xy 178.066137 44.539792) + (xy 178.088773 44.543827) (xy 178.11382 44.547462) (xy 178.142925 44.550708) (xy 178.176068 44.553926) + (xy 178.213645 44.55676) (xy 178.256494 44.559184) (xy 178.304984 44.561212) (xy 178.359541 44.563233) + (xy 178.420552 44.564848) (xy 178.488868 44.566057) (xy 178.649307 44.568479) (xy 178.844908 44.570099) + (xy 179.079291 44.570901) (xy 179.356523 44.571727) (xy 179.681446 44.571727) (xy 180.489293 44.572132) + (xy 182.634419 44.572132) (xy 182.419425 44.356312) (xy 182.204423 44.140111) (xy 182.27555 44.006345) + (xy 182.289688 43.979257) (xy 182.302614 43.953805) (xy 182.313526 43.929963) (xy 182.322825 43.908947) + (xy 182.330103 43.891173) (xy 182.334949 43.877013) (xy 182.336566 43.871365) (xy 182.336958 43.867312) + (xy 182.336958 43.864084) (xy 182.336958 43.862871) (xy 182.336566 43.862472) (xy 181.527097 43.851553) + (xy 179.765088 43.846713) + ) + (stroke + (width 0) + (type solid) + ) + (fill yes) + (layer "B.SilkS") + (uuid "374ccecc-dbf1-49fe-a999-6f9e8a768c4d") + ) + (gr_poly + (pts + (xy 185.885226 42.798405) (xy 185.710247 42.812146) (xy 185.536466 42.836384) (xy 185.364301 42.871544) + (xy 185.194567 42.91681) (xy 185.026859 42.972172) (xy 184.861965 43.038057) (xy 184.700716 43.114019) + (xy 184.543117 43.20011) (xy 184.389945 43.296284) (xy 184.242045 43.402161) (xy 184.144239 43.480571) + (xy 184.049669 43.565031) (xy 183.958743 43.655149) (xy 183.871447 43.750123) (xy 183.788198 43.849541) + (xy 183.708984 43.953398) (xy 183.634631 44.060899) (xy 183.564716 44.172027) (xy 183.499647 44.286398) + (xy 183.439842 44.402791) (xy 183.38568 44.522006) (xy 183.337191 44.642447) (xy 183.294347 44.764481) + (xy 183.257983 44.88775) (xy 183.227683 45.011413) (xy 183.204238 45.135469) (xy 183.198574 45.176292) + (xy 183.193332 45.221154) (xy 183.186452 45.32096) (xy 183.182421 45.430496) (xy 183.182015 45.543654) + (xy 183.185247 45.655579) (xy 183.191306 45.761081) (xy 183.200591 45.854426) (xy 183.206262 45.894834) + (xy 183.213114 45.93039) (xy 183.2305 46.008796) (xy 183.249096 46.085594) (xy 183.269295 46.159938) + (xy 183.290315 46.232279) (xy 183.312146 46.302198) (xy 183.335176 46.368871) (xy 183.359015 46.433135) + (xy 183.38367 46.493747) (xy 183.459652 46.657422) (xy 183.545318 46.814634) (xy 183.640685 46.96497) + (xy 183.744961 47.108425) (xy 183.857706 47.244226) (xy 183.97936 47.372729) (xy 184.108676 47.49317) + (xy 184.245678 47.60552) (xy 184.390346 47.70978) (xy 184.541509 47.804751) (xy 184.69951 47.891221) + (xy 184.86358 47.968014) (xy 185.03372 48.035506) (xy 185.209115 48.092895) (xy 185.389771 48.140577) + (xy 185.574852 48.177759) (xy 185.660539 48.189475) (xy 185.759542 48.198369) (xy 185.867034 48.204825) + (xy 185.978581 48.208477) (xy 186.089719 48.209281) (xy 186.195202 48.20686) (xy 186.29016 48.201194) + (xy 186.332198 48.197557) (xy 186.370179 48.192704) (xy 186.499088 48.171302) (xy 186.626802 48.145023) + (xy 186.75248 48.113917) (xy 186.87575 48.077929) (xy 186.995769 48.037524) (xy 187.111751 47.992667) + (xy 187.16833 47.968821) (xy 187.22371 47.943771) (xy 187.277859 47.917507) (xy 187.330794 47.890824) + (xy 187.476285 47.809592) (xy 187.615306 47.721905) (xy 187.747861 47.628553) (xy 187.873535 47.529137) + (xy 187.992361 47.424058) (xy 188.104697 47.313317) (xy 188.209381 47.197333) (xy 188.307175 47.07571) + (xy 188.397702 46.949619) (xy 188.48095 46.818259) (xy 188.556123 46.682069) (xy 188.624004 46.541436) + (xy 188.684234 46.396764) (xy 188.735945 46.247242) (xy 188.780004 46.094082) (xy 188.815975 45.936867) + (xy 188.823648 45.892411) (xy 188.830508 45.843922) (xy 188.836172 45.791775) (xy 188.84022 45.736414) + (xy 188.845884 45.619217) (xy 188.846685 45.535558) (xy 188.405385 45.535558) (xy 188.402534 45.641844) + (xy 188.399317 45.693178) (xy 188.395281 45.742474) (xy 188.389614 45.789352) (xy 188.383151 45.833002) + (xy 188.367383 45.916251) (xy 188.347997 46.001519) (xy 188.324557 46.087607) (xy 188.298276 46.173265) + (xy 188.269599 46.256948) (xy 188.238467 46.337365) (xy 188.205731 46.41293) (xy 188.18917 46.448078) + (xy 188.171789 46.482031) (xy 188.101064 46.617828) (xy 188.096221 46.53417) (xy 188.091362 46.450498) + (xy 187.988712 46.399592) (xy 187.885655 46.348273) (xy 187.791503 46.077499) (xy 187.582964 45.483042) + (xy 187.065686 45.483042) (xy 187.065686 45.484249) (xy 187.064881 45.485055) (xy 187.063259 45.485857) + (xy 187.06124 45.486662) (xy 187.055994 45.488682) (xy 187.048306 45.490301) (xy 187.039011 45.491511) + (xy 187.027297 45.493122) (xy 187.013564 45.494347) (xy 186.998204 45.495561) (xy 186.980417 45.496372) + (xy 186.961011 45.497177) (xy 186.91696 45.498788) (xy 186.865644 45.499591) (xy 186.80785 45.5) + (xy 186.728643 45.499591) (xy 186.667623 45.499194) (xy 186.622363 45.497581) (xy 186.605379 45.49677) + (xy 186.59124 45.495561) (xy 186.579925 45.493927) (xy 186.571449 45.491918) (xy 186.564973 45.489484) + (xy 186.560934 45.486662) (xy 186.558501 45.483439) (xy 186.557687 45.479785) (xy 186.557687 45.475752) + (xy 186.558903 45.470892) (xy 186.680955 45.075661) (xy 186.760174 44.829147) (xy 186.786431 44.754373) + (xy 186.805433 44.707903) (xy 186.812291 44.694567) (xy 186.817557 44.686896) (xy 186.821588 44.684865) + (xy 186.824015 44.688114) (xy 186.873323 44.841678) (xy 186.954963 45.108396) (xy 187.031737 45.363402) + (xy 187.065686 45.483042) (xy 187.582964 45.483042) (xy 187.47104 45.163361) (xy 187.313021 44.707497) + (xy 187.266144 44.56767) (xy 187.25401 44.529293) (xy 187.250774 44.515148) (xy 187.251593 44.514335) + (xy 187.253616 44.513111) (xy 187.259665 44.509473) (xy 187.268564 44.504635) (xy 187.280283 44.498566) + (xy 187.308963 44.483623) (xy 187.343316 44.466237) (xy 187.430213 44.422599) (xy 187.430213 44.265388) + (xy 187.430213 44.108583) (xy 186.784417 44.108583) (xy 186.13821 44.108583) (xy 186.13821 44.262157) + (xy 186.13821 44.416129) (xy 186.229142 44.460989) (xy 186.247725 44.470284) (xy 186.264704 44.479582) + (xy 186.280054 44.488865) (xy 186.293798 44.497758) (xy 186.299459 44.501796) (xy 186.304706 44.505847) + (xy 186.309569 44.509473) (xy 186.313191 44.512705) (xy 186.316425 44.515953) (xy 186.318457 44.518776) + (xy 186.320071 44.521199) (xy 186.320477 44.522006) (xy 186.320477 44.523219) (xy 186.31683 44.537373) + (xy 186.305931 44.571303) (xy 186.266322 44.689716) (xy 186.208128 44.860267) (xy 186.136598 45.065561) + (xy 186.013338 45.422804) (xy 185.886435 45.798654) (xy 185.779754 46.121956) (xy 185.716697 46.321988) + (xy 185.715893 46.32442) (xy 185.715079 46.326446) (xy 185.713876 46.328465) (xy 185.712664 46.330892) + (xy 185.711453 46.332909) (xy 185.70984 46.335329) (xy 185.708225 46.33776) (xy 185.706202 46.339783) + (xy 185.704176 46.342202) (xy 185.70215 46.344629) (xy 185.699733 46.346641) (xy 185.697311 46.349085) + (xy 185.691643 46.353925) (xy 185.685594 46.358362) (xy 185.679114 46.363228) (xy 185.671855 46.368062) + (xy 185.663767 46.372924) (xy 185.655276 46.377761) (xy 185.646379 46.382628) (xy 185.636693 46.38706) + (xy 185.626591 46.391903) (xy 185.616078 46.396764) (xy 185.52596 46.435967) (xy 185.525558 46.605696) + (xy 185.525155 46.775444) (xy 186.022222 46.775444) (xy 186.519303 46.775444) (xy 186.519303 46.611751) + (xy 186.519303 46.448484) (xy 186.415447 46.411312) (xy 186.394424 46.403624) (xy 186.374625 46.395962) + (xy 186.356035 46.38868) (xy 186.339461 46.381807) (xy 186.325326 46.37575) (xy 186.314001 46.370488) + (xy 186.305931 46.366447) (xy 186.303498 46.364835) (xy 186.301882 46.363624) (xy 186.301476 46.357553) + (xy 186.303893 46.343414) (xy 186.314813 46.295326) (xy 186.332198 46.228643) (xy 186.353621 46.153084) + (xy 186.375848 46.076694) (xy 186.396444 46.009606) (xy 186.413018 45.960709) (xy 186.419076 45.945757) + (xy 186.423127 45.938885) (xy 186.428775 45.937679) (xy 186.442915 45.93606) (xy 186.492639 45.933637) + (xy 186.653482 45.92918) (xy 186.849887 45.926763) (xy 186.944451 45.926763) (xy 187.027698 45.927573) + (xy 187.213194 45.93039) (xy 187.281083 46.14013) (xy 187.298876 46.195503) (xy 187.313021 46.241575) + (xy 187.323524 46.278765) (xy 187.330382 46.308252) (xy 187.332818 46.31998) (xy 187.334439 46.330483) + (xy 187.335255 46.33898) (xy 187.335255 46.346242) (xy 187.334439 46.352307) (xy 187.333226 46.356747) + (xy 187.331189 46.3604) (xy 187.328368 46.362822) (xy 187.325951 46.364028) (xy 187.322318 46.366052) + (xy 187.31221 46.370086) (xy 187.298876 46.374937) (xy 187.283109 46.380587) (xy 187.264933 46.386661) + (xy 187.245522 46.392715) (xy 187.224507 46.399189) (xy 187.203089 46.405665) (xy 187.09882 46.435556) + (xy 187.09882 46.605289) (xy 187.09882 46.775444) (xy 187.537705 46.775444) (xy 187.708253 46.776243) + (xy 187.848081 46.778667) (xy 187.942233 46.781892) (xy 187.967712 46.783911) (xy 187.974573 46.785121) + (xy 187.976991 46.786348) (xy 187.976586 46.789176) (xy 187.975377 46.792407) (xy 187.970538 46.801704) + (xy 187.963259 46.813824) (xy 187.953154 46.827973) (xy 187.940623 46.84454) (xy 187.926478 46.863127) + (xy 187.90992 46.883329) (xy 187.89213 46.904758) (xy 187.852129 46.95042) (xy 187.80808 46.998514) + (xy 187.785441 47.02276) (xy 187.7624 47.046602) (xy 187.739373 47.069638) (xy 187.716745 47.092266) + (xy 187.641967 47.161773) (xy 187.564391 47.228054) (xy 187.483973 47.290693) (xy 187.400705 47.350497) + (xy 187.315041 47.406677) (xy 187.227332 47.459215) (xy 187.13763 47.50852) (xy 187.045482 47.553775) + (xy 186.952137 47.595413) (xy 186.856747 47.633396) (xy 186.760174 47.667343) (xy 186.662363 47.697242) + (xy 186.563761 47.723116) (xy 186.463945 47.744945) (xy 186.363307 47.762317) (xy 186.262285 47.775242) + (xy 186.235199 47.77767) (xy 186.202075 47.7793) (xy 186.122456 47.780099) (xy 186.029504 47.778892) + (xy 185.929679 47.775242) (xy 185.828649 47.769599) (xy 185.733278 47.762714) (xy 185.649223 47.754224) + (xy 185.583345 47.744945) (xy 185.525558 47.733633) (xy 185.467358 47.720281) (xy 185.408364 47.70533) + (xy 185.348543 47.688363) (xy 185.288728 47.669765) (xy 185.228917 47.649158) (xy 185.169108 47.62733) + (xy 185.109305 47.603489) (xy 185.049897 47.578434) (xy 184.991296 47.552165) (xy 184.933113 47.524272) + (xy 184.876127 47.495185) (xy 184.819949 47.464873) (xy 184.764976 47.433764) (xy 184.711232 47.401026) + (xy 184.659506 47.367882) (xy 184.619895 47.340415) (xy 184.578279 47.308888) (xy 184.534628 47.274538) + (xy 184.489768 47.236953) (xy 184.444107 47.196535) (xy 184.398035 47.154493) (xy 184.351553 47.110865) + (xy 184.305888 47.065602) (xy 184.260627 47.019529) (xy 184.216577 46.973054) (xy 184.174146 46.926989) + (xy 184.133734 46.880917) (xy 184.09615 46.835648) (xy 184.060986 46.792004) (xy 184.029462 46.749963) + (xy 184.001183 46.709964) (xy 183.932886 46.60124) (xy 183.871043 46.490927) (xy 183.815686 46.378572) + (xy 183.767581 46.264605) (xy 183.725969 46.149436) (xy 183.691619 46.033039) (xy 183.663722 45.915447) + (xy 183.643124 45.797034) (xy 183.628966 45.678205) (xy 183.622107 45.558596) (xy 183.622107 45.438985) + (xy 183.629373 45.319346) (xy 183.643525 45.199733) (xy 183.66455 45.080121) (xy 183.692825 44.961291) + (xy 183.728395 44.842884) (xy 183.783358 44.693764) (xy 183.848406 44.549502) (xy 183.922779 44.410873) + (xy 184.006031 44.278315) (xy 184.097771 44.15182) (xy 184.197589 44.031799) (xy 184.305479 43.918249) + (xy 184.420659 43.812369) (xy 184.543117 43.713748) (xy 184.672027 43.623219) (xy 184.807422 43.540378) + (xy 184.948864 43.466024) (xy 185.095967 43.400952) (xy 185.247918 43.344375) (xy 185.404707 43.297502) + (xy 185.566363 43.260324) (xy 185.612839 43.251831) (xy 185.662967 43.244552) (xy 185.715489 43.238489) + (xy 185.77045 43.233223) (xy 185.885226 43.225969) (xy 186.004034 43.223145) (xy 186.122864 43.22436) + (xy 186.23844 43.230007) (xy 186.293798 43.234458) (xy 186.346746 43.239707) (xy 186.397247 43.246185) + (xy 186.444545 43.253844) (xy 186.540727 43.27325) (xy 186.635286 43.295885) (xy 186.728643 43.322549) + (xy 186.820383 43.352457) (xy 186.910903 43.385601) (xy 186.999412 43.422779) (xy 187.086698 43.463182) + (xy 187.171979 43.507229) (xy 187.25563 43.554518) (xy 187.337261 43.605045) (xy 187.417276 43.658785) + (xy 187.495285 43.716166) (xy 187.571253 43.776802) (xy 187.645217 43.840644) (xy 187.717148 43.907734) + (xy 187.786657 43.977645) (xy 187.838786 44.033823) (xy 187.888093 44.090805) (xy 187.935374 44.148996) + (xy 187.980641 44.208402) (xy 188.023464 44.269019) (xy 188.064291 44.331264) (xy 188.10268 44.394304) + (xy 188.139048 44.459371) (xy 188.1734 44.525654) (xy 188.205731 44.593131) (xy 188.236048 44.662635) + (xy 188.264326 44.733786) (xy 188.290612 44.806515) (xy 188.315265 44.881269) (xy 188.337896 44.957655) + (xy 188.358487 45.036055) (xy 188.367383 45.076465) (xy 188.375875 45.12012) (xy 188.383151 45.166589) + (xy 188.389211 45.215489) (xy 188.394466 45.266414) (xy 188.398911 45.318939) (xy 188.404158 45.426855) + (xy 188.405385 45.535558) (xy 188.846685 45.535558) (xy 188.847091 45.49677) (xy 188.843457 45.374313) + (xy 188.835779 45.256718) (xy 188.830508 45.201346) (xy 188.824054 45.148824) (xy 188.81637 45.099505) + (xy 188.80788 45.055049) (xy 188.775968 44.922099) (xy 188.73918 44.791977) (xy 188.697159 44.665078) + (xy 188.649879 44.541813) (xy 188.597737 44.421377) (xy 188.540348 44.304175) (xy 188.478124 44.191037) + (xy 188.41104 44.080701) (xy 188.339103 43.974412) (xy 188.262317 43.871762) (xy 188.180683 43.773148) + (xy 188.094608 43.677782) (xy 188.003669 43.586847) (xy 187.908293 43.49997) (xy 187.80808 43.416711) + (xy 187.703402 43.337917) (xy 187.669463 43.314477) (xy 187.629848 43.289001) (xy 187.538915 43.234059) + (xy 187.435457 43.176263) (xy 187.325951 43.118072) (xy 187.21481 43.063111) (xy 187.108526 43.013392) + (xy 187.011947 42.971769) (xy 186.969102 42.955192) (xy 186.930712 42.941455) (xy 186.758964 42.89014) + (xy 186.585988 42.850121) (xy 186.411403 42.821031) (xy 186.236003 42.802841) (xy 186.060619 42.795175) + ) + (stroke + (width 0) + (type solid) + ) + (fill yes) + (layer "B.SilkS") + (uuid "3dcbd66b-932b-4202-8100-17260a6280b0") + ) + (gr_poly + (pts + (xy 185.956753 41.875374) (xy 185.900981 41.876583) (xy 185.848046 41.877786) (xy 185.79996 41.880215) + (xy 185.58052 41.891934) (xy 185.500102 42.1429) (xy 185.457655 42.274244) (xy 185.425723 42.371643) + (xy 185.411993 42.40922) (xy 185.399469 42.44075) (xy 185.38775 42.466205) (xy 185.376434 42.486814) + (xy 185.365115 42.503384) (xy 185.352588 42.515907) (xy 185.339257 42.526012) (xy 185.324692 42.533701) + (xy 185.308135 42.540155) (xy 185.288728 42.545816) (xy 185.241851 42.557541) (xy 185.21478 42.56482) + (xy 185.18406 42.573299) (xy 185.116973 42.593103) (xy 185.049096 42.614518) (xy 185.017156 42.625031) + (xy 184.988455 42.634728) (xy 184.857533 42.680807) (xy 184.611017 42.474291) (xy 184.364888 42.267379) + (xy 184.220222 42.354253) (xy 184.141017 42.402342) (xy 184.058979 42.454492) (xy 183.977747 42.507029) + (xy 183.902161 42.557541) (xy 183.835887 42.602801) (xy 183.783358 42.640384) (xy 183.748602 42.667455) + (xy 183.739298 42.675946) (xy 183.736078 42.680807) (xy 183.738095 42.68888) (xy 183.742932 42.707469) + (xy 183.760725 42.770507) (xy 183.78699 42.861037) (xy 183.818924 42.968946) (xy 183.85125 43.076845) + (xy 183.877515 43.167774) (xy 183.895303 43.232018) (xy 183.900148 43.251018) (xy 183.901763 43.259511) + (xy 183.901763 43.260725) (xy 183.900952 43.262332) (xy 183.898528 43.265973) (xy 183.89448 43.271634) + (xy 183.889231 43.278501) (xy 183.882352 43.286579) (xy 183.874286 43.296284) (xy 183.854475 43.318106) + (xy 183.830634 43.343969) (xy 183.803167 43.37267) (xy 183.77325 43.403779) (xy 183.740511 43.436517) + (xy 183.579669 43.597771) (xy 183.281014 43.537148) (xy 183.062785 43.492289) (xy 182.956495 43.469261) + (xy 182.954894 43.468853) (xy 182.952869 43.468853) (xy 182.95086 43.468853) (xy 182.948819 43.469658) + (xy 182.946799 43.47046) (xy 182.944383 43.471677) (xy 182.941961 43.472884) (xy 182.939533 43.474503) + (xy 182.936697 43.476536) (xy 182.934274 43.478958) (xy 182.931043 43.48178) (xy 182.928221 43.484601) + (xy 182.924969 43.487855) (xy 182.921749 43.49148) (xy 182.918518 43.495519) (xy 182.914891 43.49997) + (xy 182.907612 43.509258) (xy 182.899515 43.520167) (xy 182.891024 43.532288) (xy 182.881746 43.546045) + (xy 182.872052 43.561394) (xy 182.861542 43.577954) (xy 182.850219 43.59574) (xy 182.838501 43.615547) + (xy 182.714432 43.824483) (xy 182.66634 43.907734) (xy 182.627555 43.976842) (xy 182.598046 44.032208) + (xy 182.577423 44.073825) (xy 182.566112 44.10212) (xy 182.56369 44.111017) (xy 182.563281 44.116671) + (xy 182.564095 44.118279) (xy 182.5649 44.120291) (xy 182.569348 44.125966) (xy 182.575414 44.134051) + (xy 182.583899 44.144143) (xy 182.606532 44.170017) (xy 182.636025 44.202756) (xy 182.671184 44.241141) + (xy 182.711602 44.283986) (xy 182.755659 44.330461) (xy 182.802942 44.378955) (xy 183.037329 44.619413) + (xy 182.987224 44.790343) (xy 182.931858 44.980697) (xy 182.931043 44.981901) (xy 182.929425 44.982718) + (xy 182.922962 44.984727) (xy 182.913659 44.98635) (xy 182.901539 44.98757) (xy 182.87083 44.990394) + (xy 182.835676 44.992012) (xy 182.799706 44.993218) (xy 182.767379 44.993621) (xy 182.741928 44.99282) + (xy 182.733427 44.992418) (xy 182.728169 44.991603) (xy 182.725745 44.990803) (xy 182.723331 44.990394) + (xy 182.721307 44.989592) (xy 182.719286 44.988386) (xy 182.717258 44.98757) (xy 182.715235 44.98635) + (xy 182.71362 44.985134) (xy 182.712003 44.983926) (xy 182.7104 44.982718) (xy 182.708782 44.981099) + (xy 182.707164 44.979885) (xy 182.70594 44.977868) (xy 182.704322 44.976251) (xy 182.703118 44.974212) + (xy 182.701895 44.97221) (xy 182.700687 44.970185) (xy 182.699882 44.967763) (xy 182.698676 44.965343) + (xy 182.69786 44.962903) (xy 182.696654 44.960084) (xy 182.695849 44.957251) (xy 182.695025 44.954032) + (xy 182.694619 44.950785) (xy 182.693815 44.947552) (xy 182.693011 44.943924) (xy 182.692606 44.940273) + (xy 182.691394 44.932207) (xy 182.690585 44.923712) (xy 182.689778 44.914012) (xy 182.684933 44.845703) + (xy 180.576592 44.841267) (xy 178.970991 44.84208) (xy 178.482385 44.845311) (xy 178.302974 44.850168) + (xy 178.303365 44.850975) (xy 178.304177 44.852588) (xy 178.308212 44.857838) (xy 178.314282 44.865115) + (xy 178.323155 44.874816) (xy 178.346611 44.899876) (xy 178.377715 44.932207) (xy 178.415303 44.970185) + (xy 178.458145 45.013835) (xy 178.505826 45.060715) (xy 178.557166 45.11082) (xy 178.648093 45.198923) + (xy 178.688905 45.236913) (xy 178.727304 45.271667) (xy 178.762868 45.302789) (xy 178.796815 45.331474) + (xy 178.829135 45.357352) (xy 178.860259 45.380783) (xy 178.890566 45.402204) (xy 178.920463 45.421597) + (xy 178.949975 45.439381) (xy 178.98027 45.455944) (xy 179.010993 45.471316) (xy 179.042527 45.486265) + (xy 179.075652 45.500409) (xy 179.110816 45.514548) (xy 179.222352 45.557792) (xy 181.070852 45.562231) + (xy 182.919725 45.566686) (xy 182.929425 45.705306) (xy 182.934682 45.765507) (xy 182.942366 45.823304) + (xy 182.952065 45.879482) (xy 182.957311 45.906552) (xy 182.96378 45.933637) (xy 182.970241 45.959906) + (xy 182.977521 45.985757) (xy 182.985204 46.011219) (xy 182.993675 46.036272) (xy 183.002567 46.060934) + (xy 183.011871 46.084778) (xy 183.021573 46.108629) (xy 183.032084 46.132064) (xy 183.040558 46.150231) + (xy 183.048243 46.168829) (xy 183.055118 46.186622) (xy 183.061165 46.203997) (xy 183.066438 46.219342) + (xy 183.070065 46.233102) (xy 183.071677 46.238751) (xy 183.07248 46.243998) (xy 183.073299 46.248858) + (xy 183.073701 46.25248) (xy 183.073299 46.254497) (xy 183.072083 46.257349) (xy 183.06845 46.264205) + (xy 183.062376 46.273499) (xy 183.054303 46.28522) (xy 183.0434 46.298554) (xy 183.030871 46.314325) + (xy 183.015907 46.331696) (xy 182.998941 46.350692) (xy 182.959729 46.393927) (xy 182.91326 46.443645) + (xy 182.859921 46.499011) (xy 182.800916 46.558824) (xy 182.528128 46.833226) (xy 182.640479 47.032052) + (xy 182.719286 47.169463) (xy 182.806176 47.317778) (xy 182.878904 47.440623) (xy 182.903575 47.480641) + (xy 182.916503 47.500441) (xy 182.918518 47.500441) (xy 182.923758 47.50003) (xy 182.943576 47.497208) + (xy 182.974291 47.492361) (xy 183.014702 47.485482) (xy 183.119369 47.467305) (xy 183.24626 47.443865) + (xy 183.57241 47.382427) (xy 183.737286 47.546499) (xy 183.77043 47.580051) (xy 183.801134 47.611571) + (xy 183.829027 47.641077) (xy 183.853671 47.667751) (xy 183.873877 47.690381) (xy 183.888834 47.708562) + (xy 183.89448 47.715836) (xy 183.898528 47.721499) (xy 183.900952 47.725936) (xy 183.901763 47.728366) + (xy 183.901353 47.732006) (xy 183.900148 47.738066) (xy 183.895303 47.758676) (xy 183.877113 47.827783) + (xy 183.850447 47.925576) (xy 183.817706 48.041968) (xy 183.801134 48.101388) (xy 183.786579 48.157543) + (xy 183.77325 48.208477) (xy 183.762744 48.253336) (xy 183.754651 48.290915) (xy 183.749001 48.320011) + (xy 183.746988 48.339409) (xy 183.746988 48.344678) (xy 183.747794 48.347091) (xy 183.836687 48.408919) + (xy 183.933285 48.473185) (xy 184.032288 48.537433) (xy 184.128081 48.597251) (xy 184.215356 48.650187) + (xy 184.288122 48.692223) (xy 184.340644 48.720098) (xy 184.357625 48.727376) (xy 184.367712 48.730203) + (xy 184.368941 48.729799) (xy 184.370556 48.728994) (xy 184.375799 48.725756) (xy 184.383485 48.720504) + (xy 184.393182 48.713644) (xy 184.418249 48.694236) (xy 184.450168 48.668782) (xy 184.487752 48.638055) + (xy 184.530197 48.602498) (xy 184.576256 48.563707) (xy 184.62475 48.522072) (xy 184.864401 48.313951) + (xy 184.975529 48.35072) (xy 185.000588 48.358815) (xy 185.029687 48.368102) (xy 185.095166 48.387488) + (xy 185.163869 48.406491) (xy 185.227305 48.423059) (xy 185.367936 48.458622) (xy 185.474212 48.782742) + (xy 185.580924 49.106455) (xy 185.714678 49.116961) (xy 185.782988 49.121002) (xy 185.866222 49.123417) + (xy 185.958368 49.124626) (xy 186.053752 49.124626) (xy 186.146703 49.123417) (xy 186.230761 49.121002) + (xy 186.301077 49.11736) (xy 186.351586 49.112512) (xy 186.423937 49.102803) (xy 186.527394 48.780312) + (xy 186.630855 48.457811) (xy 186.719743 48.4364) (xy 186.767844 48.423865) (xy 186.832502 48.405689) + (xy 186.905665 48.384677) (xy 186.978398 48.362443) (xy 187.148142 48.31072) (xy 187.276652 48.425085) + (xy 187.438697 48.568142) (xy 187.499727 48.620693) (xy 187.54902 48.662303) (xy 187.587422 48.693029) + (xy 187.615713 48.714043) (xy 187.634704 48.726168) (xy 187.64116 48.728994) (xy 187.646023 48.730203) + (xy 187.648447 48.729799) (xy 187.652074 48.728994) (xy 187.660562 48.726168) (xy 187.671881 48.721301) + (xy 187.68602 48.714854) (xy 187.7026 48.705957) (xy 187.721985 48.695448) (xy 187.744226 48.682515) + (xy 187.769272 48.667977) (xy 187.827464 48.632411) (xy 187.897385 48.589172) (xy 187.979031 48.537027) + (xy 188.072777 48.476816) (xy 188.123694 48.443275) (xy 188.166545 48.414179) (xy 188.200894 48.389512) + (xy 188.227963 48.368513) (xy 188.238871 48.359616) (xy 188.247774 48.351534) (xy 188.255039 48.343861) + (xy 188.260702 48.337387) (xy 188.265144 48.331721) (xy 188.267574 48.326478) (xy 188.268785 48.322039) + (xy 188.268376 48.317985) (xy 188.193611 48.048441) (xy 188.166136 47.951037) (xy 188.141483 47.864967) + (xy 188.122085 47.79989) (xy 188.110769 47.764729) (xy 188.109551 47.761098) (xy 188.108348 47.757473) + (xy 188.107539 47.754224) (xy 188.106728 47.750999) (xy 188.106328 47.747774) (xy 188.106328 47.74414) + (xy 188.106328 47.740889) (xy 188.106728 47.737256) (xy 188.107539 47.734027) (xy 188.108751 47.729974) + (xy 188.110363 47.72635) (xy 188.11198 47.721905) (xy 188.114399 47.717858) (xy 188.116832 47.71301) + (xy 188.12006 47.70815) (xy 188.123694 47.702907) (xy 188.12813 47.697666) (xy 188.132588 47.691589) + (xy 188.137847 47.685114) (xy 188.143504 47.678657) (xy 188.14996 47.671381) (xy 188.156837 47.663717) + (xy 188.172594 47.646329) (xy 188.19079 47.62733) (xy 188.211802 47.60552) (xy 188.236048 47.580845) + (xy 188.263523 47.552979) (xy 188.431646 47.382831) (xy 188.758584 47.446697) (xy 188.886282 47.471341) + (xy 188.99176 47.489937) (xy 189.064106 47.50124) (xy 189.084708 47.503669) (xy 189.090374 47.503669) + (xy 189.092796 47.503271) (xy 189.115023 47.468513) (xy 189.160693 47.390918) (xy 189.287997 47.16581) + (xy 189.410452 46.943546) (xy 189.449648 46.869194) (xy 189.460562 46.847772) (xy 189.463788 46.838879) + (xy 189.437117 46.808963) (xy 189.370839 46.739456) (xy 189.171197 46.535784) (xy 188.97237 46.336552) + (xy 188.906095 46.272288) (xy 188.887092 46.254497) (xy 188.880236 46.249255) (xy 188.878616 46.25289) + (xy 188.875374 46.261379) (xy 188.864059 46.291292) (xy 188.848705 46.334119) (xy 188.83011 46.386265) + (xy 188.776772 46.525275) (xy 188.717374 46.660664) (xy 188.651493 46.792004) (xy 188.579159 46.918901) + (xy 188.500756 47.041755) (xy 188.416281 47.16017) (xy 188.325766 47.274132) (xy 188.22957 47.383634) + (xy 188.12733 47.488308) (xy 188.019429 47.58854) (xy 187.906268 47.683901) (xy 187.787062 47.774031) + (xy 187.662589 47.859715) (xy 187.532464 47.940137) (xy 187.397072 48.015301) (xy 187.256841 48.085213) + (xy 187.142067 48.135316) (xy 187.024471 48.180582) (xy 186.904033 48.220592) (xy 186.780786 48.25535) + (xy 186.655501 48.284843) (xy 186.528606 48.308694) (xy 186.40009 48.327289) (xy 186.270355 48.340617) + (xy 186.139825 48.348308) (xy 186.008898 48.35072) (xy 185.877544 48.347499) (xy 185.746613 48.339006) + (xy 185.616078 48.324865) (xy 185.48635 48.305055) (xy 185.357838 48.280004) (xy 185.23053 48.248881) + (xy 185.022409 48.185444) (xy 184.821565 48.108252) (xy 184.628386 48.017722) (xy 184.443291 47.914259) + (xy 184.267099 47.799084) (xy 184.100181 47.67219) (xy 183.942982 47.534784) (xy 183.796284 47.386887) + (xy 183.660489 47.229675) (xy 183.536423 47.063174) (xy 183.424086 46.88818) (xy 183.324666 46.705523) + (xy 183.238588 46.51517) (xy 183.165835 46.318771) (xy 183.107645 46.115884) (xy 183.084211 46.01243) + (xy 183.064409 45.907761) (xy 183.057541 45.862498) (xy 183.052272 45.812391) (xy 183.044611 45.699631) + (xy 183.041785 45.575578) (xy 183.042585 45.446248) (xy 183.047841 45.31773) (xy 183.057139 45.195694) + (xy 183.07047 45.085765) (xy 183.078155 45.037677) (xy 183.08703 44.994428) (xy 183.114518 44.884923) + (xy 183.145639 44.776609) (xy 183.180395 44.67032) (xy 183.21879 44.566057) (xy 183.260397 44.463407) + (xy 183.306067 44.362775) (xy 183.354576 44.264177) (xy 183.407105 44.167998) (xy 183.462476 44.073825) + (xy 183.521477 43.982084) (xy 183.583719 43.892382) (xy 183.649176 43.805086) (xy 183.717881 43.720624) + (xy 183.789812 43.638589) (xy 183.864584 43.558979) (xy 183.942584 43.482188) (xy 184.057767 43.379532) + (xy 184.178585 43.28255) (xy 184.305086 43.192019) (xy 184.436417 43.107966) (xy 184.571798 43.030366) + (xy 184.711633 42.959652) (xy 184.854303 42.895786) (xy 185.000183 42.839217) (xy 185.148092 42.789906) + (xy 185.297628 42.748275) (xy 185.448765 42.714341) (xy 185.600305 42.688066) (xy 185.752275 42.67029) + (xy 185.903823 42.660591) (xy 186.054562 42.65978) (xy 186.204087 42.667043) (xy 186.345931 42.680807) + (xy 186.478898 42.698179) (xy 186.54315 42.708678) (xy 186.606196 42.719996) (xy 186.667623 42.732926) + (xy 186.728643 42.746664) (xy 186.78885 42.762033) (xy 186.848683 42.778593) (xy 186.908483 42.79679) + (xy 186.968293 42.81658) (xy 187.089522 42.860225) (xy 187.214407 42.911159) (xy 187.334439 42.9653) + (xy 187.451631 43.024704) (xy 187.5652 43.089373) (xy 187.675915 43.158481) (xy 187.783026 43.232426) + (xy 187.88648 43.31083) (xy 187.985891 43.393672) (xy 188.081661 43.480571) (xy 188.1734 43.571902) + (xy 188.261098 43.667275) (xy 188.344344 43.766295) (xy 188.423155 43.869346) (xy 188.497525 43.975633) + (xy 188.567042 44.085546) (xy 188.631689 44.199101) (xy 188.691092 44.315496) (xy 188.721407 44.379753) + (xy 188.750098 44.443198) (xy 188.776375 44.505439) (xy 188.801026 44.56767) (xy 188.824054 44.6291) + (xy 188.845068 44.69094) (xy 188.86486 44.752363) (xy 188.882655 44.813796) (xy 188.898824 44.876026) + (xy 188.913771 44.938656) (xy 188.927109 45.002116) (xy 188.938835 45.066766) (xy 188.949333 45.132645) + (xy 188.958622 45.199327) (xy 188.966707 45.268024) (xy 188.973582 45.338345) (xy 188.993395 45.566286) + (xy 190.838228 45.566286) (xy 192.01464 45.56507) (xy 192.373532 45.561424) (xy 192.617619 45.553752) + (xy 192.77562 45.540824) (xy 192.87585 45.520619) (xy 192.946975 45.492315) (xy 193.01769 45.453928) + (xy 193.042354 45.439783) (xy 193.066603 45.425241) (xy 193.091252 45.409468) (xy 193.116306 45.392505) + (xy 193.14136 45.373909) (xy 193.16763 45.353697) (xy 193.194714 45.331868) (xy 193.223002 45.308033) + (xy 193.252501 45.282172) (xy 193.283608 45.253884) (xy 193.316753 45.222771) (xy 193.351907 45.189219) + (xy 193.429093 45.112839) (xy 193.517205 45.023537) (xy 193.698643 44.837226) (xy 191.42179 44.841267) + (xy 189.475504 44.845703) (xy 189.480768 44.924117) (xy 189.480768 44.930992) (xy 189.479957 44.937445) + (xy 189.477944 44.943113) (xy 189.475098 44.948765) (xy 189.471872 44.954032) (xy 189.467431 44.958869) + (xy 189.462577 44.963314) (xy 189.45693 44.967763) (xy 189.450856 44.971797) (xy 189.444396 44.975447) + (xy 189.437117 44.978673) (xy 189.429831 44.981501) (xy 189.413683 44.986762) (xy 189.3967 44.991204) + (xy 189.379329 44.994838) (xy 189.361944 44.997659) (xy 189.344976 44.999696) (xy 189.328405 45.000912) + (xy 189.300118 45.002519) (xy 189.280312 45.002921) (xy 189.277485 45.002921) (xy 189.274255 45.002921) + (xy 189.271426 45.002519) (xy 189.268589 45.002116) (xy 189.265763 45.00171) (xy 189.263338 45.000912) + (xy 189.260925 45.000102) (xy 189.258485 44.999284) (xy 189.256065 44.998068) (xy 189.253641 44.996859) + (xy 189.251625 44.995644) (xy 189.249202 44.994029) (xy 189.247181 44.992012) (xy 189.245143 44.989996) + (xy 189.242728 44.98757) (xy 189.240716 44.985134) (xy 189.238698 44.982305) (xy 189.236677 44.979483) + (xy 189.234645 44.976251) (xy 189.232621 44.972606) (xy 189.230613 44.968975) (xy 189.228585 44.964936) + (xy 189.226568 44.960486) (xy 189.224143 44.955646) (xy 189.21969 44.945133) (xy 189.214854 44.933408) + (xy 189.209995 44.920476) (xy 189.204341 44.905513) (xy 189.196659 44.884923) (xy 189.187362 44.863094) + (xy 189.177657 44.840871) (xy 189.167164 44.819045) (xy 189.156652 44.798023) (xy 189.146551 44.779024) + (xy 189.136851 44.761659) (xy 189.127553 44.74752) (xy 189.119459 44.734989) (xy 189.111798 44.722867) + (xy 189.104515 44.711549) (xy 189.098461 44.701046) (xy 189.093605 44.691748) (xy 189.089567 44.68406) + (xy 189.088361 44.681229) (xy 189.087144 44.678412) (xy 189.08674 44.676397) (xy 189.086341 44.674761) + (xy 189.086341 44.673952) (xy 189.08552 44.672744) (xy 189.083097 44.668708) (xy 189.075031 44.655779) + (xy 189.070173 44.646877) (xy 189.067746 44.64204) (xy 189.065726 44.636772) (xy 189.063303 44.631129) + (xy 189.061274 44.625461) (xy 189.05925 44.619413) (xy 189.057634 44.61294) (xy 189.056424 44.606073) + (xy 189.055213 44.599205) (xy 189.054817 44.591915) (xy 189.054413 44.584253) (xy 189.054817 44.57657) + (xy 189.055617 44.568887) (xy 189.057237 44.560815) (xy 189.05925 44.552315) (xy 189.061677 44.543827) + (xy 189.065318 44.53533) (xy 189.069758 44.52646) (xy 189.074618 44.517565) (xy 189.080674 44.508674) + (xy 189.087554 44.499365) (xy 189.095619 44.490077) (xy 189.104515 44.480795) (xy 189.182117 44.402791) + (xy 189.258485 44.324391) (xy 189.324364 44.255281) (xy 189.350628 44.226593) (xy 189.370839 44.203964) + (xy 189.454085 44.10898) (xy 189.286776 43.822871) (xy 189.21969 43.708904) (xy 189.160291 43.610695) + (xy 189.115023 43.537964) (xy 189.100081 43.514922) (xy 189.09078 43.501994) (xy 189.062073 43.467236) + (xy 188.742427 43.529065) (xy 188.422751 43.591306) (xy 188.265941 43.431675) (xy 188.205731 43.371447) + (xy 188.181894 43.346795) (xy 188.171789 43.335887) (xy 188.162483 43.324973) (xy 188.154008 43.314886) + (xy 188.146723 43.305173) (xy 188.140686 43.295478) (xy 188.135018 43.285778) (xy 188.13058 43.276081) + (xy 188.126922 43.265973) (xy 188.124097 43.25586) (xy 188.122485 43.244961) (xy 188.121678 43.234059) + (xy 188.121275 43.221934) (xy 188.122085 43.209388) (xy 188.123694 43.195657) (xy 188.126123 43.181106) + (xy 188.129367 43.165757) (xy 188.133396 43.148782) (xy 188.138241 43.130198) (xy 188.149553 43.08896) + (xy 188.164113 43.040876) (xy 188.201699 42.919632) (xy 188.253421 42.747874) (xy 188.269193 42.694137) + (xy 188.275242 42.673121) (xy 188.271605 42.669492) (xy 188.262317 42.661799) (xy 188.227558 42.636754) + (xy 188.175027 42.600781) (xy 188.109551 42.557541) (xy 188.036415 42.509847) (xy 187.959622 42.460953) + (xy 187.884046 42.41326) (xy 187.814131 42.37083) (xy 187.643584 42.267778) (xy 187.524367 42.363951) + (xy 187.400705 42.464186) (xy 187.270178 42.571275) (xy 187.135189 42.682819) (xy 187.037808 42.643206) + (xy 187.014775 42.634328) (xy 186.987295 42.624626) (xy 186.955767 42.614518) (xy 186.921817 42.604013) + (xy 186.885855 42.593509) (xy 186.849483 42.583399) (xy 186.813515 42.573701) (xy 186.779164 42.565227) + (xy 186.735519 42.554303) (xy 186.699556 42.545012) (xy 186.684184 42.540558) (xy 186.670853 42.536119) + (xy 186.659129 42.532084) (xy 186.64863 42.528031) (xy 186.639733 42.523993) (xy 186.632064 42.519952) + (xy 186.625592 42.515907) (xy 186.620334 42.511871) (xy 186.616289 42.507437) (xy 186.613061 42.502974) + (xy 186.610638 42.498535) (xy 186.608629 42.493675) (xy 186.575484 42.38659) (xy 186.509606 42.176438) + (xy 186.419879 41.892336) (xy 186.219441 41.880215) (xy 186.174989 41.878199) (xy 186.124475 41.876583) + (xy 186.070321 41.875773) (xy 186.013735 41.875374) + ) + (stroke + (width 0) + (type solid) + ) + (fill yes) + (layer "B.SilkS") + (uuid "3aa4ed9e-99e1-4a87-a167-935c4a0834dd") + ) + (gr_rect + (start 123.5 30) + (end 252.5 63) + (radius 2) + (stroke + (width 0.05) + (type solid) + ) + (fill no) + (layer "Edge.Cuts") + (uuid "4402ae3a-9c5f-43b4-95b9-b05c659ac475") + ) + (gr_text "1. HEAD | 2. NECK | 3. LEFT HAND | 4. RIGHT HAND | 5. BODY" + (at 164 59.5 0) + (layer "F.SilkS") + (uuid "cfa00be6-5a27-423f-8485-2f14bec28c10") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (gr_text "SERVO ORDER:" + (at 179.9 57.5 0) + (layer "F.SilkS") + (uuid "d8256c46-d249-41ca-8ff8-91dd6410bbbb") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (gr_text "SCL" + (at 223.5 40.46 0) + (layer "F.SilkS") + (uuid "2684a999-3a9a-430b-9dbc-bc66824272a2") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (gr_text "SDA" + (at 223.5 43 0) + (layer "F.SilkS") + (uuid "0ca6bed9-dd1f-4e16-bf1a-4dbfd671d550") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (gr_text "GND" + (at 223.5 45.54 0) + (layer "F.SilkS") + (uuid "47442e9f-2d93-489b-be21-a2cf0223aaa6") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (gr_text "VCC\n" + (at 223.5 48.08 0) + (layer "F.SilkS") + (uuid "8fed1ddb-1051-4b00-bc58-460b28600c9a") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (gr_text "EYES\n(OLED)" + (at 221.4 37.06 0) + (layer "F.SilkS") + (uuid "b9c7937c-7135-4a97-a837-a3dcbb912356") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + ) + ) + (gr_text "D+" + (at 235.85 55.4 90) + (layer "F.SilkS") + (uuid "e777576d-29d6-430d-868f-30ba10368c13") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (gr_text "D-" + (at 238.39 55.4 90) + (layer "F.SilkS") + (uuid "7a8a1a09-7615-4527-a6c7-419b223be739") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (gr_text "5V" + (at 240.93 55.4 90) + (layer "F.SilkS") + (uuid "00f5a805-37f8-44d2-ab07-6c881cdb704a") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (gr_text "GND\n" + (at 243.47 55.4 90) + (layer "F.SilkS") + (uuid "7b5a9312-5f7a-46d5-9bd1-dbd153a22379") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + (justify left) + ) + ) + (gr_text "POWER\n(USB)" + (at 232.2 57.3 90) + (layer "F.SilkS") + (uuid "12f6f387-5e46-4451-9e88-c54cd2cfc75c") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + ) + ) + (gr_text "MOTION\n(PCA9685)" + (at 184.3 36 0) + (layer "F.SilkS") + (uuid "4f5289e3-3541-44dc-9f4d-d474f4eeec59") + (effects + (font + (size 1 1) + (thickness 0.12) + ) + ) + ) + (gr_text "VOICE\n(MAX98357)" + (at 233.6 41.94 90) + (layer "F.SilkS") + (uuid "6a1a3afb-3a1d-4d6f-92c0-94bed3ff3a54") + (effects + (font + (size 1 1) + (thickness 0.12) + ) + ) + ) + (gr_text "Main Control Board\nREV #1 | 2026-09-12\ngithub.com/jamro/tiny-engineer" + (at 185.5 50.5 0) + (layer "B.SilkS") + (uuid "366bc4bb-d37f-4099-af31-758c225e0b34") + (effects + (font + (size 1 1) + (thickness 0.12) + ) + (justify top mirror) + ) + ) + (gr_text "BRAIN (ESP32)" + (at 135.89 59.5 0) + (layer "B.SilkS") + (uuid "cae9c790-ef36-4d7c-9702-5b7bb861f9d1") + (effects + (font + (size 1 1) + (thickness 0.12) + ) + (justify mirror) + ) + ) + (gr_text "TINY SOFTWARE ENGINEER" + (at 200 40 0) + (layer "B.SilkS") + (uuid "57a87b69-54f0-46a0-a040-3a89f0e6d960") + (effects + (font + (size 1.5 1.5) + (thickness 0.3) + (bold yes) + ) + (justify left bottom mirror) + ) + ) + (segment + (start 144.107412 47.345) + (end 143.092588 47.345) + (width 0.25) + (layer "F.Cu") + (net "Net-(ESP1-GP5)") + (uuid "18a1ed9c-a24f-4e17-a4e8-ff83d880562f") + ) + (segment + (start 141.875 46.127412) + (end 141.875 41.032588) + (width 0.25) + (layer "F.Cu") + (net "Net-(ESP1-GP5)") + (uuid "2cf1de88-7bc0-4571-87d8-703e7f79e633") + ) + (segment + (start 143.6 56.28) + (end 144.825 55.055) + (width 0.25) + (layer "F.Cu") + (net "Net-(ESP1-GP5)") + (uuid "34768fbc-9f7f-45ae-9395-5ea28b4f313b") + ) + (segment + (start 141.875 41.032588) + (end 143.092588 39.815) + (width 0.25) + (layer "F.Cu") + (net "Net-(ESP1-GP5)") + (uuid "433fdd04-a63e-46a6-bc78-27191182bbfa") + ) + (segment + (start 144.825 48.062588) + (end 144.107412 47.345) + (width 0.25) + (layer "F.Cu") + (net "Net-(ESP1-GP5)") + (uuid "6371a2f3-3066-4631-ad79-79db11322ae9") + ) + (segment + (start 143.092588 39.815) + (end 151.275 39.815) + (width 0.25) + (layer "F.Cu") + (net "Net-(ESP1-GP5)") + (uuid "9998c307-8621-4626-8c0c-a294fe765dc5") + ) + (segment + (start 153.5 42.04) + (end 211.92 42.04) + (width 0.25) + (layer "F.Cu") + (net "Net-(ESP1-GP5)") + (uuid "9af35acf-49d2-47f1-8e88-89703c6d2a55") + ) + (segment + (start 144.825 55.055) + (end 144.825 48.062588) + (width 0.25) + (layer "F.Cu") + (net "Net-(ESP1-GP5)") + (uuid "bce92f55-ae92-4373-98b3-acacad495040") + ) + (segment + (start 143.092588 47.345) + (end 141.875 46.127412) + (width 0.25) + (layer "F.Cu") + (net "Net-(ESP1-GP5)") + (uuid "e5e45424-6a13-4518-85f7-f943d2dd008c") + ) + (segment + (start 151.275 39.815) + (end 153.5 42.04) + (width 0.25) + (layer "F.Cu") + (net "Net-(ESP1-GP5)") + (uuid "e8c6c30a-f49b-4065-9748-45430e103885") + ) + (segment + (start 142.375 44.895) + (end 143.6 46.12) + (width 0.25) + (layer "F.Cu") + (net "/I2C_SCL") + (uuid "0143ed92-d60f-4b68-a1ad-a987fbec8e2a") + ) + (segment + (start 142.375 43.072588) + (end 142.375 44.895) + (width 0.25) + (layer "F.Cu") + (net "/I2C_SCL") + (uuid "1c29d066-ab45-41f0-9119-678c56843ed6") + ) + (segment + (start 151.375 42.355) + (end 143.092588 42.355) + (width 0.25) + (layer "F.Cu") + (net "/I2C_SCL") + (uuid "2639d09c-fcdc-48e3-a0e8-6ceaa9487fec") + ) + (segment + (start 143.092588 42.355) + (end 142.375 43.072588) + (width 0.25) + (layer "F.Cu") + (net "/I2C_SCL") + (uuid "2b3c3a00-7bc6-4de3-be72-8ff74601a423") + ) + (segment + (start 221.4 40.46) + (end 217.28 44.58) + (width 0.25) + (layer "F.Cu") + (net "/I2C_SCL") + (uuid "3902899f-cbf9-4d5a-8fd1-ef08350169dd") + ) + (segment + (start 211.92 44.58) + (end 153.6 44.58) + (width 0.25) + (layer "F.Cu") + (net "/I2C_SCL") + (uuid "6190e703-d101-480e-a982-3f1aa8ae86f2") + ) + (segment + (start 153.5 44.48) + (end 151.375 42.355) + (width 0.25) + (layer "F.Cu") + (net "/I2C_SCL") + (uuid "76003773-2cee-456b-942d-096a5d5197c1") + ) + (segment + (start 153.6 44.58) + (end 153.5 44.48) + (width 0.25) + (layer "F.Cu") + (net "/I2C_SCL") + (uuid "76c31f12-f833-4f2c-a3c0-29ae9304d8a7") + ) + (segment + (start 217.28 44.58) + (end 211.92 44.58) + (width 0.25) + (layer "F.Cu") + (net "/I2C_SCL") + (uuid "bfa30a57-b873-4c93-86f7-aa400c117443") + ) + (segment + (start 153.5 47.12) + (end 149.96 43.58) + (width 0.25) + (layer "F.Cu") + (net "/I2C_SDA") + (uuid "2e72d2df-5888-413e-9c1f-e4d641066051") + ) + (segment + (start 221.4 43) + (end 217.28 47.12) + (width 0.25) + (layer "F.Cu") + (net "/I2C_SDA") + (uuid "34e729c1-4839-4682-8a20-788b1e3af17b") + ) + (segment + (start 217.28 47.12) + (end 211.92 47.12) + (width 0.25) + (layer "F.Cu") + (net "/I2C_SDA") + (uuid "8a474d08-be8f-4940-b423-eb7d47ace8e2") + ) + (segment + (start 211.92 47.12) + (end 153.5 47.12) + (width 0.25) + (layer "F.Cu") + (net "/I2C_SDA") + (uuid "b75d9b5d-d0fb-4b24-9740-2e16f2ec1b29") + ) + (segment + (start 149.96 43.58) + (end 143.6 43.58) + (width 0.25) + (layer "F.Cu") + (net "/I2C_SDA") + (uuid "c4152c52-cfc8-4bac-8b36-b968598d85da") + ) + (segment + (start 153.5 49.66) + (end 211.92 49.66) + (width 0.4) + (layer "F.Cu") + (net "+3.3V") + (uuid "11271f16-7177-4c5f-9173-21db88e864a7") + ) + (segment + (start 211.92 49.66) + (end 213.5 48.08) + (width 0.4) + (layer "F.Cu") + (net "+3.3V") + (uuid "80f23f2a-c8b6-4a12-ab1a-8a06adc07705") + ) + (segment + (start 213.5 48.08) + (end 221.4 48.08) + (width 0.4) + (layer "F.Cu") + (net "+3.3V") + (uuid "f56f3b72-05c8-4127-9696-c40821409940") + ) + (segment + (start 139.5 36.94) + (end 143.6 41.04) + (width 0.4) + (layer "B.Cu") + (net "+3.3V") + (uuid "2c53dd11-fa2b-4895-ba0b-01e9d03d04a7") + ) + (segment + (start 153.5 49.66) + (end 157.5 45.66) + (width 0.4) + (layer "B.Cu") + (net "+3.3V") + (uuid "3e8f2f28-9ffd-4b63-b93d-3065b2122526") + ) + (segment + (start 157.5 33.5) + (end 140.5 33.5) + (width 0.4) + (layer "B.Cu") + (net "+3.3V") + (uuid "8a1e1977-9771-4cd9-9b58-b327aba79799") + ) + (segment + (start 139.5 34.5) + (end 139.5 36.94) + (width 0.4) + (layer "B.Cu") + (net "+3.3V") + (uuid "c988d1cf-ab3a-4e4c-b0c2-97294a671c84") + ) + (segment + (start 157.5 45.66) + (end 157.5 33.5) + (width 0.4) + (layer "B.Cu") + (net "+3.3V") + (uuid "d2ef2383-c513-411f-8e0d-4e13b306c6f6") + ) + (segment + (start 140.5 33.5) + (end 139.5 34.5) + (width 0.4) + (layer "B.Cu") + (net "+3.3V") + (uuid "f3259612-855c-4738-a50b-20c472ad7d00") + ) + (segment + (start 236.8 52.2) + (end 211.92 52.2) + (width 1.5) + (layer "F.Cu") + (net "+5V") + (uuid "0224f180-5cdc-4d2d-9f15-acc99d100e90") + ) + (segment + (start 240.96 57.5) + (end 240.96 56.297919) + (width 1.5) + (layer "F.Cu") + (net "+5V") + (uuid "8806655e-27b2-4b4c-85e0-cc05b92e80a0") + ) + (segment + (start 211.92 52.2) + (end 153.5 52.2) + (width 1.5) + (layer "F.Cu") + (net "+5V") + (uuid "a8d98996-3466-4765-8853-d4503f06e387") + ) + (segment + (start 240.96 56.297919) + (end 236.862081 52.2) + (width 1.5) + (layer "F.Cu") + (net "+5V") + (uuid "da17adb4-ca21-49ed-913e-64071f057757") + ) + (via + (at 236.862081 52.2) + (size 0.8) + (drill 0.4) + (layers "F.Cu" "B.Cu") + (net "+5V") + (uuid "12605bae-8f39-4c3a-b537-d8866fafd2f1") + ) + (segment + (start 150.5 40.5) + (end 145.96 35.96) + (width 1.5) + (layer "B.Cu") + (net "+5V") + (uuid "0564dada-3468-4df9-8f1f-0223443a8148") + ) + (segment + (start 150.5 49.276296) + (end 150.5 40.5) + (width 1.5) + (layer "B.Cu") + (net "+5V") + (uuid "2c7b436b-15ce-40c6-9280-cc0392d1e559") + ) + (segment + (start 153.423704 52.2) + (end 150.5 49.276296) + (width 1.5) + (layer "B.Cu") + (net "+5V") + (uuid "34e0f49a-c152-4939-940b-f348c6e218f7") + ) + (segment + (start 145.96 35.96) + (end 143.6 35.96) + (width 1.5) + (layer "B.Cu") + (net "+5V") + (uuid "48ffa7ec-fcad-4106-8abf-0fa19b4cee6f") + ) + (segment + (start 240.5 40.883704) + (end 246.883704 34.5) + (width 1.5) + (layer "B.Cu") + (net "+5V") + (uuid "5fa47e1e-24c2-472e-872c-a23ead17257f") + ) + (segment + (start 246.883704 34.5) + (end 247 34.5) + (width 1.5) + (layer "B.Cu") + (net "+5V") + (uuid "62abe9f5-623a-460c-a47d-31f20e498a83") + ) + (segment + (start 240.5 47.5) + (end 240.5 40.883704) + (width 1.5) + (layer "B.Cu") + (net "+5V") + (uuid "9598513b-5068-49ca-994a-cd3d591acc88") + ) + (segment + (start 153.5 52.2) + (end 153.423704 52.2) + (width 1.5) + (layer "B.Cu") + (net "+5V") + (uuid "b62ce53e-2016-4208-b0d4-cffbae612b50") + ) + (segment + (start 236.862081 51.137919) + (end 240.5 47.5) + (width 1.5) + (layer "B.Cu") + (net "+5V") + (uuid "d52b395b-a680-4a7e-aa79-d511ea185433") + ) + (segment + (start 236.862081 52.2) + (end 236.862081 51.137919) + (width 1.5) + (layer "B.Cu") + (net "+5V") + (uuid "e7ad4bbf-720d-42bf-af92-88c69681419e") + ) + (segment + (start 234.282844 57.5) + (end 235.88 57.5) + (width 0.2) + (layer "F.Cu") + (net "/USB_D+") + (uuid "0e6ed789-ce91-46b1-9a03-f0bfee60428a") + ) + (segment + (start 125 60.782841) + (end 125.617159 61.4) + (width 0.2) + (layer "F.Cu") + (net "/USB_D+") + (uuid "1bd30e72-f42f-4127-9733-ffb9be643fdd") + ) + (segment + (start 230.382842 61.4) + (end 234.282844 57.5) + (width 0.2) + (layer "F.Cu") + (net "/USB_D+") + (uuid "207f3fe2-2b84-448d-8587-f165d46f4045") + ) + (segment + (start 125 44.4) + (end 125 60.782841) + (width 0.2) + (layer "F.Cu") + (net "/USB_D+") + (uuid "4ca4f05a-9a7b-494a-969f-4fce31a09712") + ) + (segment + (start 125.617159 61.4) + (end 230.382842 61.4) + (width 0.2) + (layer "F.Cu") + (net "/USB_D+") + (uuid "8193a873-3303-4879-93b6-f6f647fcb185") + ) + (segment + (start 128.36 41.04) + (end 125 44.4) + (width 0.2) + (layer "F.Cu") + (net "/USB_D+") + (uuid "bea52e67-2468-44d7-9a65-e913f44f78ec") + ) + (segment + (start 230.217156 61) + (end 234.117156 57.1) + (width 0.2) + (layer "F.Cu") + (net "/USB_D-") + (uuid "394c2cc6-f9e9-4dd8-a700-321ae1172c61") + ) + (segment + (start 125.5 44.465686) + (end 125.5 60.717156) + (width 0.2) + (layer "F.Cu") + (net "/USB_D-") + (uuid "49be936a-e1cf-40a0-879a-010858d4616c") + ) + (segment + (start 234.73 57.1) + (end 234.73 56.35) + (width 0.2) + (layer "F.Cu") + (net "/USB_D-") + (uuid "6355839c-c9ba-4934-b7a0-9eb4e04220b7") + ) + (segment + (start 237.03 56.35) + (end 237.03 57.1) + (width 0.2) + (layer "F.Cu") + (net "/USB_D-") + (uuid "69409db0-1660-43df-b08b-960ec41c7a1d") + ) + (segment + (start 234.117156 57.1) + (end 234.73 57.1) + (width 0.2) + (layer "F.Cu") + (net "/USB_D-") + (uuid "93886e58-3107-4e09-ad86-b406db25f37c") + ) + (segment + (start 126.385686 43.58) + (end 125.5 44.465686) + (width 0.2) + (layer "F.Cu") + (net "/USB_D-") + (uuid "a29b6e4f-df49-475c-a065-b3875abec358") + ) + (segment + (start 234.73 56.35) + (end 237.03 56.35) + (width 0.2) + (layer "F.Cu") + (net "/USB_D-") + (uuid "c6e17136-eb51-4c5b-ac00-92c5ebb7c8d9") + ) + (segment + (start 125.5 60.717156) + (end 125.782844 61) + (width 0.2) + (layer "F.Cu") + (net "/USB_D-") + (uuid "ce830e04-83a2-4e99-9f50-faf2db5182b5") + ) + (segment + (start 125.782844 61) + (end 230.217156 61) + (width 0.2) + (layer "F.Cu") + (net "/USB_D-") + (uuid "d270677f-8d46-488a-93f1-4d2b6b4da274") + ) + (segment + (start 238.02 57.1) + (end 238.42 57.5) + (width 0.2) + (layer "F.Cu") + (net "/USB_D-") + (uuid "dec4e84b-a928-4b1a-9c58-d768ecf1d9ab") + ) + (segment + (start 237.03 57.1) + (end 238.02 57.1) + (width 0.2) + (layer "F.Cu") + (net "/USB_D-") + (uuid "e2a630c8-80df-4028-ae02-571d1b5307dc") + ) + (segment + (start 128.36 43.58) + (end 126.385686 43.58) + (width 0.2) + (layer "F.Cu") + (net "/USB_D-") + (uuid "f72b0dd6-4154-447e-b720-4bbf4bea8047") + ) + (segment + (start 134 41.600001) + (end 143.6 51.2) + (width 0.25) + (layer "F.Cu") + (net "/I2S_LRC") + (uuid "005129cc-5a8b-4578-bcee-04b1ac7ff41e") + ) + (segment + (start 251 46.5) + (end 251 32.792893) + (width 0.25) + (layer "F.Cu") + (net "/I2S_LRC") + (uuid "0a729beb-2038-408d-8cd4-27cded7b9fc5") + ) + (segment + (start 247 49.5) + (end 248 49.5) + (width 0.25) + (layer "F.Cu") + (net "/I2S_LRC") + (uuid "0faef83e-3b5b-4298-8f25-621a83e35efe") + ) + (segment + (start 249.932106 31.725) + (end 134.275 31.725) + (width 0.25) + (layer "F.Cu") + (net "/I2S_LRC") + (uuid "78df1889-2bc9-41f8-8ae4-fb6915f4093f") + ) + (segment + (start 251 32.792893) + (end 249.932106 31.725) + (width 0.25) + (layer "F.Cu") + (net "/I2S_LRC") + (uuid "960dce0d-5eaf-44dd-aab0-522505cb5b43") + ) + (segment + (start 248 49.5) + (end 251 46.5) + (width 0.25) + (layer "F.Cu") + (net "/I2S_LRC") + (uuid "d6ebbcd2-265a-4143-a0fc-9b3ac9c3f500") + ) + (segment + (start 134 32) + (end 134 41.600001) + (width 0.25) + (layer "F.Cu") + (net "/I2S_LRC") + (uuid "f67139fc-59a1-4906-a962-15e537659f80") + ) + (segment + (start 134.275 31.725) + (end 134 32) + (width 0.25) + (layer "F.Cu") + (net "/I2S_LRC") + (uuid "fdabe193-b546-4daf-8375-1307abf151c4") + ) + (segment + (start 141.767106 48.66) + (end 134.5 41.392894) + (width 0.25) + (layer "F.Cu") + (net "/I2S_BCLK") + (uuid "0dedafc2-4e10-4b4b-80a8-854a0018d852") + ) + (segment + (start 250.5 44.5) + (end 248 47) + (width 0.25) + (layer "F.Cu") + (net "/I2S_BCLK") + (uuid "22606639-b55d-4564-95a9-904a4ea7bc2e") + ) + (segment + (start 134.5 41.392894) + (end 134.5 32.225) + (width 0.25) + (layer "F.Cu") + (net "/I2S_BCLK") + (uuid "afccd9f6-51b7-4673-b38e-fa5440cb65eb") + ) + (segment + (start 249.725 32.225) + (end 250.5 33) + (width 0.25) + (layer "F.Cu") + (net "/I2S_BCLK") + (uuid "b5efb90a-8206-4f82-bc2e-6aff8331f4f5") + ) + (segment + (start 250.5 33) + (end 250.5 44.5) + (width 0.25) + (layer "F.Cu") + (net "/I2S_BCLK") + (uuid "b8835e6a-4316-4c72-be6e-8ee27a8b5d8f") + ) + (segment + (start 143.6 48.66) + (end 141.767106 48.66) + (width 0.25) + (layer "F.Cu") + (net "/I2S_BCLK") + (uuid "c1c8a768-687e-45e6-9b2b-66911aabc47e") + ) + (segment + (start 248 47) + (end 247 47) + (width 0.25) + (layer "F.Cu") + (net "/I2S_BCLK") + (uuid "cfc0559d-a539-4ddb-9c63-adf7d225655d") + ) + (segment + (start 134.5 32.225) + (end 249.725 32.225) + (width 0.25) + (layer "F.Cu") + (net "/I2S_BCLK") + (uuid "e0d242f3-7b06-43ae-82b4-c809206fc7f8") + ) + (segment + (start 250 41.5) + (end 247 44.5) + (width 0.25) + (layer "F.Cu") + (net "/I2S_DIN") + (uuid "424eb6bf-9802-4387-9985-5d281c38f2b3") + ) + (segment + (start 138 33) + (end 249.5 33) + (width 0.25) + (layer "F.Cu") + (net "/I2S_DIN") + (uuid "42c062e8-f00e-463a-b55b-29fe7e79bac6") + ) + (segment + (start 250 33.5) + (end 250 41.5) + (width 0.25) + (layer "F.Cu") + (net "/I2S_DIN") + (uuid "73975ca3-aa76-46e1-806e-3029c6a31755") + ) + (segment + (start 249.5 33) + (end 250 33.5) + (width 0.25) + (layer "F.Cu") + (net "/I2S_DIN") + (uuid "945e8750-64f4-4804-8711-3e8de03fe2f9") + ) + (via + (at 138 33) + (size 0.8) + (drill 0.4) + (layers "F.Cu" "B.Cu") + (net "/I2S_DIN") + (uuid "609b6b0b-11de-4c47-a4ad-81b28f705084") + ) + (segment + (start 144.107412 47.435) + (end 144.825 48.152588) + (width 0.25) + (layer "B.Cu") + (net "/I2S_DIN") + (uuid "114beba8-19f7-443c-b23a-5fa1a1a5d8cc") + ) + (segment + (start 136.5 34.5) + (end 136.5 40.842412) + (width 0.25) + (layer "B.Cu") + (net "/I2S_DIN") + (uuid "24ab9c33-1c58-4188-bc05-54f02bef4937") + ) + (segment + (start 136.5 40.842412) + (end 143.092588 47.435) + (width 0.25) + (layer "B.Cu") + (net "/I2S_DIN") + (uuid "31f4d0dd-c8d7-4c74-809e-a64a34a5fced") + ) + (segment + (start 138 33) + (end 136.5 34.5) + (width 0.25) + (layer "B.Cu") + (net "/I2S_DIN") + (uuid "62918640-61a9-483d-ae7b-5cd6883d4cd7") + ) + (segment + (start 143.092588 47.435) + (end 144.107412 47.435) + (width 0.25) + (layer "B.Cu") + (net "/I2S_DIN") + (uuid "69cec695-35f6-4b4a-aec6-00cb3f9c902a") + ) + (segment + (start 144.825 52.515) + (end 143.6 53.74) + (width 0.25) + (layer "B.Cu") + (net "/I2S_DIN") + (uuid "b92b0b0e-8a4f-49d1-9fe1-97ab3350da54") + ) + (segment + (start 144.825 48.152588) + (end 144.825 52.515) + (width 0.25) + (layer "B.Cu") + (net "/I2S_DIN") + (uuid "d393ab17-274e-473d-af5e-35e460d52431") + ) + (zone + (net "GND") + (layers "F.Cu" "B.Cu") + (uuid "f7622463-09bb-4525-9d01-b451e268aeb1") + (hatch edge 0.5) + (connect_pads + (clearance 0.5) + ) + (min_thickness 0.25) + (fill yes + (thermal_gap 0.5) + (thermal_bridge_width 0.5) + (island_removal_mode 0) + ) + (polygon + (pts + (xy 120.5 29) (xy 120.5 68) (xy 257.5 68) (xy 257 27) (xy 120.5 28.5) + ) + ) + (filled_polygon + (layer "F.Cu") + (pts + (xy 219.969334 45.417769) (xy 220.025267 45.459641) (xy 220.049684 45.525105) (xy 220.05 45.533951) + (xy 220.05 45.646246) (xy 220.083242 45.856127) (xy 220.083242 45.85613) (xy 220.148904 46.058217) + (xy 220.245375 46.24755) (xy 220.284728 46.301716) (xy 220.917037 45.669408) (xy 220.934075 45.732993) + (xy 220.999901 45.847007) (xy 221.092993 45.940099) (xy 221.207007 46.005925) (xy 221.27059 46.022962) + (xy 220.60037 46.693181) (xy 220.539047 46.726666) (xy 220.512698 46.7295) (xy 220.502134 46.7295) + (xy 220.502123 46.729501) (xy 220.442516 46.735908) (xy 220.307671 46.786202) (xy 220.307664 46.786206) + (xy 220.192455 46.872452) (xy 220.192452 46.872455) (xy 220.106206 46.987664) (xy 220.106202 46.987671) + (xy 220.055908 47.122517) (xy 220.052942 47.150109) (xy 220.049501 47.182123) (xy 220.0495 47.182135) + (xy 220.0495 47.2555) (xy 220.029815 47.322539) (xy 219.977011 47.368294) (xy 219.9255 47.3795) + (xy 218.204452 47.3795) (xy 218.137413 47.359815) (xy 218.091658 47.307011) (xy 218.081714 47.237853) + (xy 218.110739 47.174297) (xy 218.116771 47.167819) (xy 218.974734 46.309856) (xy 219.838319 45.446269) + (xy 219.899642 45.412785) + ) + ) + (filled_polygon + (layer "F.Cu") + (pts + (xy 249.256587 33.645185) (xy 249.277229 33.661819) (xy 249.338181 33.722771) (xy 249.371666 33.784094) + (xy 249.3745 33.810452) (xy 249.3745 41.189546) (xy 249.354815 41.256585) (xy 249.338181 41.277227) + (xy 248.562181 42.053227) (xy 248.500858 42.086712) (xy 248.431166 42.081728) (xy 248.375233 42.039856) + (xy 248.350816 41.974392) (xy 248.3505 41.965546) (xy 248.3505 41.893713) (xy 248.342776 41.844949) + (xy 248.317246 41.683757) (xy 248.251557 41.481588) (xy 248.155051 41.292184) (xy 248.155049 41.292181) + (xy 248.155048 41.292179) (xy 248.030109 41.120213) (xy 247.879792 40.969896) (xy 247.86757 40.961016) + (xy 247.715204 40.850316) (xy 247.67254 40.794989) (xy 247.666561 40.725376) (xy 247.699166 40.66358) + (xy 247.715199 40.649686) (xy 247.879792 40.530104) (xy 248.030104 40.379792) (xy 248.030106 40.379788) + (xy 248.030109 40.379786) (xy 248.155048 40.20782) (xy 248.155047 40.20782) (xy 248.155051 40.207816) + (xy 248.251557 40.018412) (xy 248.317246 39.816243) (xy 248.3505 39.606287) (xy 248.3505 39.393713) + (xy 248.317246 39.183757) (xy 248.251557 38.981588) (xy 248.155051 38.792184) (xy 248.155049 38.792181) + (xy 248.155048 38.792179) (xy 248.030109 38.620213) (xy 247.87979 38.469894) (xy 247.879785 38.46989) + (xy 247.714781 38.350008) (xy 247.672115 38.294678) (xy 247.666136 38.225065) (xy 247.698741 38.16327) + (xy 247.714781 38.149372) (xy 247.761716 38.115271) (xy 247.761717 38.11527) (xy 247.129408 37.482962) + (xy 247.192993 37.465925) (xy 247.307007 37.400099) (xy 247.400099 37.307007) (xy 247.465925 37.192993) + (xy 247.482962 37.129408) (xy 248.11527 37.761717) (xy 248.11527 37.761716) (xy 248.154622 37.707554) + (xy 248.251095 37.518217) (xy 248.316757 37.31613) (xy 248.316757 37.316127) (xy 248.35 37.106246) + (xy 248.35 36.893753) (xy 248.316757 36.683872) (xy 248.316757 36.683869) (xy 248.251095 36.481782) + (xy 248.154624 36.292449) (xy 248.11527 36.238282) (xy 248.115269 36.238282) (xy 247.482962 36.87059) + (xy 247.465925 36.807007) (xy 247.400099 36.692993) (xy 247.307007 36.599901) (xy 247.192993 36.534075) + (xy 247.129409 36.517037) (xy 247.761716 35.884728) (xy 247.71478 35.850628) (xy 247.672114 35.795298) + (xy 247.666135 35.725685) (xy 247.69874 35.663889) (xy 247.714776 35.649994) (xy 247.879792 35.530104) + (xy 248.030104 35.379792) (xy 248.030106 35.379788) (xy 248.030109 35.379786) (xy 248.155048 35.20782) + (xy 248.155047 35.20782) (xy 248.155051 35.207816) (xy 248.251557 35.018412) (xy 248.317246 34.816243) + (xy 248.3505 34.606287) (xy 248.3505 34.393713) (xy 248.317246 34.183757) (xy 248.251557 33.981588) + (xy 248.161985 33.805794) (xy 248.14909 33.737126) (xy 248.175366 33.672385) (xy 248.232473 33.632128) + (xy 248.272471 33.6255) (xy 249.189548 33.6255) + ) + ) + (filled_polygon + (layer "F.Cu") + (pts + (xy 250.504418 30.500816) (xy 250.704561 30.51513) (xy 250.722063 30.517647) (xy 250.913795 30.559355) + (xy 250.93076 30.564336) (xy 251.114611 30.632909) (xy 251.130694 30.640253) (xy 251.247495 30.704032) + (xy 251.302908 30.73429) (xy 251.317791 30.743855) (xy 251.474864 30.861438) (xy 251.488235 30.873024) + (xy 251.626975 31.011764) (xy 251.638561 31.025135) (xy 251.756144 31.182208) (xy 251.765709 31.197091) + (xy 251.859743 31.3693) (xy 251.867093 31.385394) (xy 251.935661 31.569234) (xy 251.940645 31.586209) + (xy 251.982351 31.777931) (xy 251.984869 31.795442) (xy 251.999184 31.99558) (xy 251.9995 32.004427) + (xy 251.9995 60.995572) (xy 251.999184 61.004419) (xy 251.984869 61.204557) (xy 251.982351 61.222068) + (xy 251.940645 61.41379) (xy 251.935661 61.430765) (xy 251.867093 61.614605) (xy 251.859743 61.630699) + (xy 251.765709 61.802908) (xy 251.756144 61.817791) (xy 251.638561 61.974864) (xy 251.626975 61.988235) + (xy 251.488235 62.126975) (xy 251.474864 62.138561) (xy 251.317791 62.256144) (xy 251.302908 62.265709) + (xy 251.130699 62.359743) (xy 251.114605 62.367093) (xy 250.930765 62.435661) (xy 250.91379 62.440645) + (xy 250.722068 62.482351) (xy 250.704557 62.484869) (xy 250.523779 62.497799) (xy 250.504417 62.499184) + (xy 250.495572 62.4995) (xy 125.504428 62.4995) (xy 125.495582 62.499184) (xy 125.473622 62.497613) + (xy 125.295442 62.484869) (xy 125.277931 62.482351) (xy 125.086209 62.440645) (xy 125.069234 62.435661) + (xy 124.885394 62.367093) (xy 124.8693 62.359743) (xy 124.697091 62.265709) (xy 124.682208 62.256144) + (xy 124.525135 62.138561) (xy 124.511764 62.126975) (xy 124.373024 61.988235) (xy 124.361438 61.974864) + (xy 124.243855 61.817791) (xy 124.23429 61.802908) (xy 124.140256 61.630699) (xy 124.132909 61.614611) + (xy 124.064336 61.43076) (xy 124.059354 61.41379) (xy 124.028167 61.270426) (xy 124.017648 61.222066) + (xy 124.017906 61.218458) (xy 124.01513 61.204556) (xy 124.011339 61.151557) (xy 124.000816 61.004418) + (xy 124.0005 60.995572) (xy 124.0005 60.861895) (xy 124.399498 60.861895) (xy 124.440423 61.014626) + (xy 124.450041 61.031284) (xy 124.450042 61.031287) (xy 124.519475 61.15155) (xy 124.519481 61.151558) + (xy 124.638349 61.270426) (xy 124.638354 61.27043) (xy 125.248443 61.88052) (xy 125.248445 61.880521) + (xy 125.248449 61.880524) (xy 125.385368 61.959573) (xy 125.385375 61.959577) (xy 125.538102 62.000501) + (xy 125.538104 62.000501) (xy 125.703813 62.000501) (xy 125.703829 62.0005) (xy 230.296172 62.0005) + (xy 230.296188 62.000501) (xy 230.303784 62.000501) (xy 230.461896 62.000501) (xy 230.461899 62.000501) + (xy 230.614627 61.959577) (xy 230.664746 61.930639) (xy 230.751558 61.88052) (xy 230.863362 61.768716) + (xy 230.863362 61.768714) (xy 230.87357 61.758507) (xy 230.873571 61.758504) (xy 234.317861 58.314216) + (xy 234.37918 58.280734) (xy 234.448872 58.285718) (xy 234.504805 58.32759) (xy 234.529222 58.393054) + (xy 234.52936 58.395253) (xy 234.5295 58.397867) (xy 234.535908 58.457483) (xy 234.586202 58.592328) + (xy 234.586206 58.592335) (xy 234.672452 58.707544) (xy 234.672455 58.707547) (xy 234.787664 58.793793) + (xy 234.787671 58.793797) (xy 234.922517 58.844091) (xy 234.922516 58.844091) (xy 234.929444 58.844835) + (xy 234.982127 58.8505) (xy 236.777872 58.850499) (xy 236.837483 58.844091) (xy 236.972331 58.793796) + (xy 237.087546 58.707546) (xy 237.173796 58.592331) (xy 237.22281 58.460916) (xy 237.264681 58.404984) + (xy 237.330145 58.380566) (xy 237.398418 58.395417) (xy 237.426673 58.416569) (xy 237.540213 58.530109) + (xy 237.712179 58.655048) (xy 237.712181 58.655049) (xy 237.712184 58.655051) (xy 237.901588 58.751557) + (xy 238.103757 58.817246) (xy 238.313713 58.8505) (xy 238.313714 58.8505) (xy 238.526286 58.8505) + (xy 238.526287 58.8505) (xy 238.736243 58.817246) (xy 238.938412 58.751557) (xy 239.127816 58.655051) + (xy 239.214138 58.592335) (xy 239.299786 58.530109) (xy 239.299788 58.530106) (xy 239.299792 58.530104) + (xy 239.450104 58.379792) (xy 239.450106 58.379788) (xy 239.450109 58.379786) (xy 239.575048 58.20782) + (xy 239.575047 58.20782) (xy 239.575051 58.207816) (xy 239.579514 58.199054) (xy 239.627488 58.148259) + (xy 239.695308 58.131463) (xy 239.761444 58.153999) (xy 239.800486 58.199056) (xy 239.804951 58.20782) + (xy 239.92989 58.379786) (xy 240.080213 58.530109) (xy 240.252179 58.655048) (xy 240.252181 58.655049) + (xy 240.252184 58.655051) (xy 240.441588 58.751557) (xy 240.643757 58.817246) (xy 240.853713 58.8505) + (xy 240.853714 58.8505) (xy 241.066286 58.8505) (xy 241.066287 58.8505) (xy 241.276243 58.817246) + (xy 241.478412 58.751557) (xy 241.667816 58.655051) (xy 241.754138 58.592335) (xy 241.839786 58.530109) + (xy 241.839788 58.530106) (xy 241.839792 58.530104) (xy 241.990104 58.379792) (xy 241.990106 58.379788) + (xy 241.990109 58.379786) (xy 242.07589 58.261717) (xy 242.115051 58.207816) (xy 242.119793 58.198508) + (xy 242.167763 58.147711) (xy 242.235583 58.130911) (xy 242.301719 58.153445) (xy 242.340763 58.1985) + (xy 242.345373 58.207547) (xy 242.384728 58.261716) (xy 243.017037 57.629408) (xy 243.034075 57.692993) + (xy 243.099901 57.807007) (xy 243.192993 57.900099) (xy 243.307007 57.965925) (xy 243.37059 57.982962) + (xy 242.738282 58.615269) (xy 242.738282 58.61527) (xy 242.792449 58.654624) (xy 242.981782 58.751095) + (xy 243.18387 58.816757) (xy 243.393754 58.85) (xy 243.606246 58.85) (xy 243.816127 58.816757) (xy 243.81613 58.816757) + (xy 244.018217 58.751095) (xy 244.207554 58.654622) (xy 244.261716 58.61527) (xy 244.261717 58.61527) + (xy 243.629408 57.982962) (xy 243.692993 57.965925) (xy 243.807007 57.900099) (xy 243.900099 57.807007) + (xy 243.965925 57.692993) (xy 243.982962 57.629409) (xy 244.61527 58.261717) (xy 244.61527 58.261716) + (xy 244.654622 58.207554) (xy 244.751095 58.018217) (xy 244.816757 57.81613) (xy 244.816757 57.816127) + (xy 244.85 57.606246) (xy 244.85 57.393753) (xy 244.816757 57.183872) (xy 244.816757 57.183869) + (xy 244.751095 56.981782) (xy 244.654624 56.792449) (xy 244.61527 56.738282) (xy 244.615269 56.738282) + (xy 243.982962 57.37059) (xy 243.965925 57.307007) (xy 243.900099 57.192993) (xy 243.807007 57.099901) + (xy 243.692993 57.034075) (xy 243.629409 57.017037) (xy 244.261716 56.384728) (xy 244.20755 56.345375) + (xy 244.018217 56.248904) (xy 243.816129 56.183242) (xy 243.606246 56.15) (xy 243.393754 56.15) + (xy 243.183872 56.183242) (xy 243.183869 56.183242) (xy 242.981782 56.248904) (xy 242.792439 56.34538) + (xy 242.738282 56.384727) (xy 242.738282 56.384728) (xy 243.370591 57.017037) (xy 243.307007 57.034075) + (xy 243.192993 57.099901) (xy 243.099901 57.192993) (xy 243.034075 57.307007) (xy 243.017037 57.370591) + (xy 242.384728 56.738282) (xy 242.34423 56.74147) (xy 242.330618 56.73861) (xy 242.316853 56.74059) + (xy 242.297101 56.731569) (xy 242.275852 56.727106) (xy 242.265947 56.717342) (xy 242.253297 56.711565) + (xy 242.241557 56.693298) (xy 242.226095 56.678055) (xy 242.222268 56.663283) (xy 242.215523 56.652787) + (xy 242.2105 56.617852) (xy 242.2105 56.199496) (xy 242.179709 56.005096) (xy 242.179709 56.005095) + (xy 242.179709 56.005093) (xy 242.139475 55.881267) (xy 242.118884 55.817893) (xy 242.029524 55.642514) + (xy 241.913829 55.483274) (xy 237.676727 51.246172) (xy 237.517486 51.130476) (xy 237.496926 51.12) + (xy 237.342111 51.041117) (xy 237.154907 50.98029) (xy 236.960503 50.9495) (xy 236.960498 50.9495) + (xy 236.898417 50.9495) (xy 212.824397 50.9495) (xy 212.757358 50.929815) (xy 212.711603 50.877011) + (xy 212.701659 50.807853) (xy 212.730684 50.744297) (xy 212.751512 50.725181) (xy 212.799792 50.690104) + (xy 212.950104 50.539792) (xy 212.950106 50.539788) (xy 212.950109 50.539786) (xy 213.075048 50.36782) + (xy 213.075047 50.36782) (xy 213.075051 50.367816) (xy 213.171557 50.178412) (xy 213.237246 49.976243) + (xy 213.2705 49.766287) (xy 213.2705 49.553713) (xy 213.245715 49.397227) (xy 213.25467 49.327933) + (xy 213.280507 49.290148) (xy 213.753837 48.816819) (xy 213.81516 48.783334) (xy 213.841518 48.7805) + (xy 219.925501 48.7805) (xy 219.99254 48.800185) (xy 220.038295 48.852989) (xy 220.049501 48.9045) + (xy 220.049501 48.977876) (xy 220.055908 49.037483) (xy 220.106202 49.172328) (xy 220.106206 49.172335) + (xy 220.192452 49.287544) (xy 220.192455 49.287547) (xy 220.307664 49.373793) (xy 220.307671 49.373797) + (xy 220.442517 49.424091) (xy 220.442516 49.424091) (xy 220.449444 49.424835) (xy 220.502127 49.4305) + (xy 222.297872 49.430499) (xy 222.357483 49.424091) (xy 222.492331 49.373796) (xy 222.607546 49.287546) + (xy 222.693796 49.172331) (xy 222.744091 49.037483) (xy 222.7505 48.977873) (xy 222.750499 47.182128) + (xy 222.744091 47.122517) (xy 222.738037 47.106286) (xy 222.693797 46.987671) (xy 222.693793 46.987664) + (xy 222.607547 46.872455) (xy 222.607544 46.872452) (xy 222.492335 46.786206) (xy 222.492328 46.786202) + (xy 222.357482 46.735908) (xy 222.357483 46.735908) (xy 222.297883 46.729501) (xy 222.297881 46.7295) + (xy 222.297873 46.7295) (xy 222.297865 46.7295) (xy 222.287309 46.7295) (xy 222.22027 46.709815) + (xy 222.199628 46.693181) (xy 221.529408 46.022962) (xy 221.592993 46.005925) (xy 221.707007 45.940099) + (xy 221.800099 45.847007) (xy 221.865925 45.732993) (xy 221.882962 45.669408) (xy 222.51527 46.301717) + (xy 222.51527 46.301716) (xy 222.554622 46.247554) (xy 222.651095 46.058217) (xy 222.716757 45.85613) + (xy 222.716757 45.856127) (xy 222.75 45.646246) (xy 222.75 45.433753) (xy 222.716757 45.223872) + (xy 222.716757 45.223869) (xy 222.651095 45.021782) (xy 222.554624 44.832449) (xy 222.51527 44.778282) + (xy 222.515269 44.778282) (xy 221.882962 45.41059) (xy 221.865925 45.347007) (xy 221.800099 45.232993) + (xy 221.707007 45.139901) (xy 221.592993 45.074075) (xy 221.529408 45.057037) (xy 222.161716 44.424728) + (xy 222.107547 44.385373) (xy 222.107547 44.385372) (xy 222.0985 44.380763) (xy 222.047706 44.332788) + (xy 222.030912 44.264966) (xy 222.053451 44.198832) (xy 222.098508 44.159793) (xy 222.107816 44.155051) + (xy 222.189241 44.095893) (xy 222.279786 44.030109) (xy 222.279788 44.030106) (xy 222.279792 44.030104) + (xy 222.430104 43.879792) (xy 222.430106 43.879788) (xy 222.430109 43.879786) (xy 222.555048 43.70782) + (xy 222.555047 43.70782) (xy 222.555051 43.707816) (xy 222.651557 43.518412) (xy 222.717246 43.316243) + (xy 222.7505 43.106287) (xy 222.7505 42.893713) (xy 222.717246 42.683757) (xy 222.651557 42.481588) + (xy 222.555051 42.292184) (xy 222.555049 42.292181) (xy 222.555048 42.292179) (xy 222.430109 42.120213) + (xy 222.279786 41.96989) (xy 222.10782 41.844951) (xy 222.107115 41.844591) (xy 222.099054 41.840485) + (xy 222.048259 41.792512) (xy 222.031463 41.724692) (xy 222.053999 41.658556) (xy 222.099054 41.619515) + (xy 222.107816 41.615051) (xy 222.153086 41.582161) (xy 222.279786 41.490109) (xy 222.279788 41.490106) + (xy 222.279792 41.490104) (xy 222.430104 41.339792) (xy 222.430106 41.339788) (xy 222.430109 41.339786) + (xy 222.555048 41.16782) (xy 222.555047 41.16782) (xy 222.555051 41.167816) (xy 222.651557 40.978412) + (xy 222.717246 40.776243) (xy 222.7505 40.566287) (xy 222.7505 40.353713) (xy 222.717246 40.143757) + (xy 222.651557 39.941588) (xy 222.555051 39.752184) (xy 222.555049 39.752181) (xy 222.555048 39.752179) + (xy 222.430109 39.580213) (xy 222.279786 39.42989) (xy 222.10782 39.304951) (xy 221.918414 39.208444) + (xy 221.918413 39.208443) (xy 221.918412 39.208443) (xy 221.716243 39.142754) (xy 221.716241 39.142753) + (xy 221.71624 39.142753) (xy 221.553709 39.117011) (xy 221.506287 39.1095) (xy 221.293713 39.1095) + (xy 221.246291 39.117011) (xy 221.08376 39.142753) (xy 220.881585 39.208444) (xy 220.692179 39.304951) + (xy 220.520213 39.42989) (xy 220.36989 39.580213) (xy 220.244951 39.752179) (xy 220.148444 39.941585) + (xy 220.082753 40.14376) (xy 220.0495 40.353713) (xy 220.0495 40.566286) (xy 220.082753 40.776241) + (xy 220.087821 40.791837) (xy 220.089816 40.861678) (xy 220.057571 40.917837) (xy 217.057229 43.918181) + (xy 216.995906 43.951666) (xy 216.969548 43.9545) (xy 213.192981 43.9545) (xy 213.125942 43.934815) + (xy 213.082497 43.886797) (xy 213.075049 43.87218) (xy 212.950109 43.700213) (xy 212.799786 43.54989) + (xy 212.62782 43.424951) (xy 212.627115 43.424591) (xy 212.619054 43.420485) (xy 212.568259 43.372512) + (xy 212.551463 43.304692) (xy 212.573999 43.238556) (xy 212.619054 43.199515) (xy 212.627816 43.195051) + (xy 212.716171 43.130858) (xy 212.799786 43.070109) (xy 212.799788 43.070106) (xy 212.799792 43.070104) + (xy 212.950104 42.919792) (xy 212.950106 42.919788) (xy 212.950109 42.919786) (xy 213.075048 42.74782) + (xy 213.075049 42.747819) (xy 213.075051 42.747816) (xy 213.171557 42.558412) (xy 213.237246 42.356243) + (xy 213.2705 42.146287) (xy 213.2705 41.933713) (xy 213.237246 41.723757) (xy 213.171557 41.521588) + (xy 213.075051 41.332184) (xy 213.075049 41.332181) (xy 213.075048 41.332179) (xy 212.950109 41.160213) + (xy 212.79979 41.009894) (xy 212.799785 41.00989) (xy 212.794399 41.005977) (xy 212.751731 40.950649) + (xy 212.74575 40.881036) (xy 212.778354 40.81924) (xy 212.828278 40.787951) (xy 212.839117 40.784359) + (xy 212.839124 40.784356) (xy 212.988345 40.692315) (xy 213.112315 40.568345) (xy 213.204356 40.419124) + (xy 213.204358 40.419119) (xy 213.259505 40.252697) (xy 213.259506 40.25269) (xy 213.269999 40.149986) + (xy 213.27 40.149973) (xy 213.27 39.75) (xy 212.353012 39.75) (xy 212.385925 39.692993) (xy 212.42 39.565826) + (xy 212.42 39.434174) (xy 212.385925 39.307007) (xy 212.353012 39.25) (xy 213.269999 39.25) (xy 213.269999 38.850028) + (xy 213.269998 38.850013) (xy 213.259505 38.747302) (xy 213.204358 38.58088) (xy 213.204356 38.580875) + (xy 213.112315 38.431654) (xy 212.988345 38.307684) (xy 212.839124 38.215643) (xy 212.839119 38.215641) + (xy 212.672697 38.160494) (xy 212.67269 38.160493) (xy 212.569986 38.15) (xy 212.17 38.15) (xy 212.17 39.066988) + (xy 212.112993 39.034075) (xy 211.985826 39) (xy 211.854174 39) (xy 211.727007 39.034075) (xy 211.67 39.066988) + (xy 211.67 38.15) (xy 211.270028 38.15) (xy 211.270012 38.150001) (xy 211.167302 38.160494) (xy 211.00088 38.215641) + (xy 211.000875 38.215643) (xy 210.851654 38.307684) (xy 210.727684 38.431654) (xy 210.635643 38.580875) + (xy 210.635641 38.58088) (xy 210.580494 38.747302) (xy 210.580493 38.747309) (xy 210.57 38.850013) + (xy 210.57 39.25) (xy 211.486988 39.25) (xy 211.454075 39.307007) (xy 211.42 39.434174) (xy 211.42 39.565826) + (xy 211.454075 39.692993) (xy 211.486988 39.75) (xy 210.570001 39.75) (xy 210.570001 40.149986) + (xy 210.580494 40.252697) (xy 210.635641 40.419119) (xy 210.635643 40.419124) (xy 210.727684 40.568345) + (xy 210.851654 40.692315) (xy 211.000875 40.784356) (xy 211.000878 40.784357) (xy 211.011723 40.787951) + (xy 211.069167 40.827724) (xy 211.09599 40.89224) (xy 211.083675 40.961016) (xy 211.045605 41.005974) + (xy 211.040211 41.009892) (xy 210.88989 41.160213) (xy 210.76495 41.33218) (xy 210.757503 41.346797) + (xy 210.709527 41.397592) (xy 210.647019 41.4145) (xy 154.772981 41.4145) (xy 154.705942 41.394815) + (xy 154.662497 41.346797) (xy 154.655049 41.33218) (xy 154.530109 41.160213) (xy 154.37979 41.009894) + (xy 154.379785 41.00989) (xy 154.374399 41.005977) (xy 154.331731 40.950649) (xy 154.32575 40.881036) + (xy 154.358354 40.81924) (xy 154.408278 40.787951) (xy 154.419117 40.784359) (xy 154.419124 40.784356) + (xy 154.568345 40.692315) (xy 154.692315 40.568345) (xy 154.784356 40.419124) (xy 154.784358 40.419119) + (xy 154.839505 40.252697) (xy 154.839506 40.25269) (xy 154.849999 40.149986) (xy 154.85 40.149973) + (xy 154.85 39.75) (xy 153.933012 39.75) (xy 153.965925 39.692993) (xy 154 39.565826) (xy 154 39.434174) + (xy 153.965925 39.307007) (xy 153.933012 39.25) (xy 154.849999 39.25) (xy 154.849999 38.850029) + (xy 154.849998 38.850012) (xy 154.839505 38.747302) (xy 154.784358 38.58088) (xy 154.784356 38.580875) + (xy 154.692315 38.431654) (xy 154.568345 38.307684) (xy 154.419124 38.215643) (xy 154.419119 38.215641) + (xy 154.252697 38.160494) (xy 154.25269 38.160493) (xy 154.149986 38.15) (xy 153.75 38.15) (xy 153.75 39.066988) + (xy 153.692993 39.034075) (xy 153.565826 39) (xy 153.434174 39) (xy 153.307007 39.034075) (xy 153.25 39.066988) + (xy 153.25 38.15) (xy 152.850028 38.15) (xy 152.850012 38.150001) (xy 152.747302 38.160494) (xy 152.58088 38.215641) + (xy 152.580875 38.215643) (xy 152.431654 38.307684) (xy 152.307684 38.431654) (xy 152.215643 38.580875) + (xy 152.215641 38.58088) (xy 152.160494 38.747302) (xy 152.160493 38.747309) (xy 152.15 38.850013) + (xy 152.15 39.25) (xy 153.066988 39.25) (xy 153.034075 39.307007) (xy 153 39.434174) (xy 153 39.565826) + (xy 153.034075 39.692993) (xy 153.066988 39.75) (xy 152.145952 39.75) (xy 152.078913 39.730315) + (xy 152.058271 39.713681) (xy 151.765198 39.420608) (xy 151.765178 39.420586) (xy 151.673733 39.329141) + (xy 151.622509 39.294915) (xy 151.571287 39.260689) (xy 151.571286 39.260688) (xy 151.571283 39.260686) + (xy 151.57128 39.260685) (xy 151.490792 39.227347) (xy 151.457453 39.213537) (xy 151.447427 39.211543) + (xy 151.397029 39.201518) (xy 151.33661 39.1895) (xy 151.336607 39.1895) (xy 151.336606 39.1895) + (xy 144.965727 39.1895) (xy 144.938707 39.181566) (xy 144.910953 39.176747) (xy 144.905625 39.171852) + (xy 144.898688 39.169815) (xy 144.880248 39.148534) (xy 144.859504 39.129474) (xy 144.857668 39.122476) + (xy 144.852933 39.117011) (xy 144.848924 39.089131) (xy 144.84178 39.061889) (xy 144.84371 39.052872) + (xy 144.842989 39.047853) (xy 144.847818 39.027116) (xy 144.916999 38.814605) (xy 144.95 38.606246) + (xy 144.95 38.393753) (xy 144.916757 38.183872) (xy 144.916757 38.183869) (xy 144.851095 37.981782) + (xy 144.754624 37.792449) (xy 144.71527 37.738282) (xy 144.715269 37.738282) (xy 144.082962 38.370589) + (xy 144.065925 38.307007) (xy 144.000099 38.192993) (xy 143.907007 38.099901) (xy 143.792993 38.034075) + (xy 143.729409 38.017037) (xy 144.365393 37.381051) (xy 144.376871 37.326412) (xy 144.425922 37.276655) + (xy 144.447119 37.267354) (xy 144.516462 37.244377) (xy 144.666778 37.15166) (xy 144.79166 37.026778) + (xy 144.884377 36.876462) (xy 144.939929 36.708815) (xy 144.9505 36.605342) (xy 144.9505 35.314658) + (xy 144.939929 35.211185) (xy 144.884377 35.043538) (xy 144.884373 35.043532) (xy 144.884372 35.043529) + (xy 144.791662 34.893225) (xy 144.791659 34.893221) (xy 144.666778 34.76834) (xy 144.666774 34.768337) + (xy 144.51647 34.675627) (xy 144.516464 34.675624) (xy 144.516462 34.675623) (xy 144.417266 34.642753) + (xy 144.348816 34.620071) (xy 144.245349 34.6095) (xy 144.245342 34.6095) (xy 142.954658 34.6095) + (xy 142.95465 34.6095) (xy 142.851183 34.620071) (xy 142.68354 34.675622) (xy 142.683529 34.675627) + (xy 142.533225 34.768337) (xy 142.533221 34.76834) (xy 142.40834 34.893221) (xy 142.408337 34.893225) + (xy 142.315627 35.043529) (xy 142.315622 35.04354) (xy 142.260071 35.211183) (xy 142.2495 35.31465) + (xy 142.2495 36.605349) (xy 142.260071 36.708816) (xy 142.315622 36.876459) (xy 142.315627 36.87647) + (xy 142.408337 37.026774) (xy 142.40834 37.026778) (xy 142.533221 37.151659) (xy 142.533225 37.151662) + (xy 142.683529 37.244372) (xy 142.683532 37.244373) (xy 142.683538 37.244377) (xy 142.752876 37.267353) + (xy 142.810321 37.307126) (xy 142.837144 37.371642) (xy 142.837325 37.383771) (xy 143.470591 38.017037) + (xy 143.407007 38.034075) (xy 143.292993 38.099901) (xy 143.199901 38.192993) (xy 143.134075 38.307007) + (xy 143.117037 38.370591) (xy 142.484728 37.738282) (xy 142.484727 37.738282) (xy 142.44538 37.792439) + (xy 142.348904 37.981782) (xy 142.283242 38.183869) (xy 142.283242 38.183872) (xy 142.25 38.393753) + (xy 142.25 38.606246) (xy 142.283242 38.816127) (xy 142.283242 38.81613) (xy 142.348904 39.018217) + (xy 142.445376 39.207553) (xy 142.538853 39.336214) (xy 142.562332 39.402021) (xy 142.546506 39.470075) + (xy 142.526215 39.49678) (xy 141.690818 40.332179) (xy 141.476269 40.546728) (xy 141.476267 40.54673) + (xy 141.432704 40.590292) (xy 141.389142 40.633854) (xy 141.364132 40.671285) (xy 141.364131 40.671286) + (xy 141.32069 40.736297) (xy 141.32069 40.736298) (xy 141.320688 40.7363) (xy 141.320688 40.736302) + (xy 141.290901 40.808215) (xy 141.273538 40.850132) (xy 141.273535 40.850144) (xy 141.2495 40.970977) + (xy 141.2495 46.189017) (xy 141.256913 46.226287) (xy 141.256913 46.226296) (xy 141.273535 46.309856) + (xy 141.273537 46.309864) (xy 141.287205 46.342861) (xy 141.287205 46.342862) (xy 141.320685 46.423692) + (xy 141.320687 46.423695) (xy 141.320688 46.423698) (xy 141.354844 46.474815) (xy 141.354914 46.474919) + (xy 141.354915 46.474921) (xy 141.38914 46.526143) (xy 141.389141 46.526144) (xy 141.389142 46.526145) + (xy 141.476267 46.61327) (xy 141.476268 46.61327) (xy 141.483335 46.620337) (xy 141.483334 46.620337) + (xy 141.483338 46.62034) (xy 142.525858 47.662861) (xy 142.559343 47.724184) (xy 142.554359 47.793876) + (xy 142.538495 47.823427) (xy 142.44495 47.95218) (xy 142.437503 47.966797) (xy 142.389527 48.017592) + (xy 142.327019 48.0345) (xy 142.077558 48.0345) (xy 142.010519 48.014815) (xy 141.989877 47.998181) + (xy 135.161819 41.170123) (xy 135.128334 41.1088) (xy 135.1255 41.082442) (xy 135.1255 32.9745) + (xy 135.145185 32.907461) (xy 135.197989 32.861706) (xy 135.2495 32.8505) (xy 136.9755 32.8505) + (xy 137.042539 32.870185) (xy 137.088294 32.922989) (xy 137.0995 32.9745) (xy 137.0995 33.088695) + (xy 137.134103 33.262658) (xy 137.134106 33.262667) (xy 137.201983 33.42654) (xy 137.20199 33.426553) + (xy 137.300535 33.574034) (xy 137.300538 33.574038) (xy 137.425961 33.699461) (xy 137.425965 33.699464) + (xy 137.573446 33.798009) (xy 137.573459 33.798016) (xy 137.696363 33.848923) (xy 137.737334 33.865894) + (xy 137.737336 33.865894) (xy 137.737341 33.865896) (xy 137.911304 33.900499) (xy 137.911307 33.9005) + (xy 137.911309 33.9005) (xy 138.088693 33.9005) (xy 138.088694 33.900499) (xy 138.146682 33.888964) + (xy 138.262658 33.865896) (xy 138.262661 33.865894) (xy 138.262666 33.865894) (xy 138.426547 33.798013) + (xy 138.574035 33.699464) (xy 138.611679 33.66182) (xy 138.673001 33.628334) (xy 138.699361 33.6255) + (xy 245.727529 33.6255) (xy 245.794568 33.645185) (xy 245.840323 33.697989) (xy 245.850267 33.767147) + (xy 245.838014 33.805795) (xy 245.748444 33.981585) (xy 245.682753 34.18376) (xy 245.6495 34.393713) + (xy 245.6495 34.606286) (xy 245.680965 34.804951) (xy 245.682754 34.816243) (xy 245.719682 34.929896) + (xy 245.748444 35.018414) (xy 245.844951 35.20782) (xy 245.96989 35.379786) (xy 245.969896 35.379792) + (xy 246.120208 35.530104) (xy 246.285219 35.649991) (xy 246.327884 35.705319) (xy 246.333863 35.774932) + (xy 246.301258 35.836728) (xy 246.285218 35.850626) (xy 246.238282 35.884726) (xy 246.238282 35.884728) + (xy 246.870591 36.517037) (xy 246.807007 36.534075) (xy 246.692993 36.599901) (xy 246.599901 36.692993) + (xy 246.534075 36.807007) (xy 246.517037 36.87059) (xy 245.884728 36.238282) (xy 245.884727 36.238282) + (xy 245.84538 36.292439) (xy 245.748904 36.481782) (xy 245.683242 36.683869) (xy 245.683242 36.683872) + (xy 245.65 36.893753) (xy 245.65 37.106246) (xy 245.683242 37.316127) (xy 245.683242 37.31613) (xy 245.748904 37.518217) + (xy 245.845375 37.70755) (xy 245.884728 37.761716) (xy 246.517037 37.129408) (xy 246.534075 37.192993) + (xy 246.599901 37.307007) (xy 246.692993 37.400099) (xy 246.807007 37.465925) (xy 246.87059 37.482962) + (xy 246.238282 38.115269) (xy 246.238282 38.11527) (xy 246.285219 38.149371) (xy 246.327885 38.204701) + (xy 246.333864 38.274314) (xy 246.301259 38.33611) (xy 246.285219 38.350008) (xy 246.120214 38.46989) + (xy 246.120209 38.469894) (xy 245.96989 38.620213) (xy 245.844951 38.792179) (xy 245.748444 38.981585) + (xy 245.682753 39.18376) (xy 245.6495 39.393713) (xy 245.6495 39.606286) (xy 245.672508 39.751557) + (xy 245.682754 39.816243) (xy 245.723481 39.941588) (xy 245.748444 40.018414) (xy 245.844951 40.20782) + (xy 245.96989 40.379786) (xy 246.120209 40.530105) (xy 246.120214 40.530109) (xy 246.284793 40.649682) + (xy 246.327459 40.705011) (xy 246.333438 40.774625) (xy 246.300833 40.83642) (xy 246.284793 40.850318) + (xy 246.120214 40.96989) (xy 246.120209 40.969894) (xy 245.96989 41.120213) (xy 245.844951 41.292179) + (xy 245.748444 41.481585) (xy 245.682753 41.68376) (xy 245.6495 41.893713) (xy 245.6495 42.106286) + (xy 245.682753 42.316239) (xy 245.748444 42.518414) (xy 245.844951 42.70782) (xy 245.96989 42.879786) + (xy 246.120209 43.030105) (xy 246.120214 43.030109) (xy 246.284793 43.149682) (xy 246.327459 43.205011) + (xy 246.333438 43.274625) (xy 246.300833 43.33642) (xy 246.284793 43.350318) (xy 246.120214 43.46989) + (xy 246.120209 43.469894) (xy 245.96989 43.620213) (xy 245.844951 43.792179) (xy 245.748444 43.981585) + (xy 245.748443 43.981587) (xy 245.748443 43.981588) (xy 245.732296 44.031282) (xy 245.682753 44.18376) + (xy 245.6495 44.393713) (xy 245.6495 44.606286) (xy 245.676741 44.778282) (xy 245.682754 44.816243) + (xy 245.73555 44.978733) (xy 245.748444 45.018414) (xy 245.844951 45.20782) (xy 245.96989 45.379786) + (xy 246.120209 45.530105) (xy 246.120214 45.530109) (xy 246.284793 45.649682) (xy 246.327459 45.705011) + (xy 246.333438 45.774625) (xy 246.300833 45.83642) (xy 246.284793 45.850318) (xy 246.120214 45.96989) + (xy 246.120209 45.969894) (xy 245.96989 46.120213) (xy 245.844951 46.292179) (xy 245.748444 46.481585) + (xy 245.682753 46.68376) (xy 245.652867 46.872452) (xy 245.6495 46.893713) (xy 245.6495 47.106287) + (xy 245.652071 47.122517) (xy 245.681291 47.307011) (xy 245.682754 47.316243) (xy 245.744069 47.504951) + (xy 245.748444 47.518414) (xy 245.844951 47.70782) (xy 245.96989 47.879786) (xy 246.108705 48.018601) + (xy 246.14219 48.079924) (xy 246.137206 48.149616) (xy 246.095334 48.205549) (xy 246.086121 48.211821) + (xy 245.931342 48.307289) (xy 245.807289 48.431342) (xy 245.715187 48.580663) (xy 245.715186 48.580666) + (xy 245.660001 48.747203) (xy 245.660001 48.747204) (xy 245.66 48.747204) (xy 245.6495 48.849983) + (xy 245.6495 50.150001) (xy 245.649501 50.150018) (xy 245.66 50.252796) (xy 245.660001 50.252799) + (xy 245.715185 50.419331) (xy 245.715186 50.419334) (xy 245.807288 50.568656) (xy 245.931344 50.692712) + (xy 246.080666 50.784814) (xy 246.247203 50.839999) (xy 246.349991 50.8505) (xy 247.650008 50.850499) + (xy 247.752797 50.839999) (xy 247.919334 50.784814) (xy 248.068656 50.692712) (xy 248.192712 50.568656) + (xy 248.284814 50.419334) (xy 248.339999 50.252797) (xy 248.3505 50.150009) (xy 248.350499 50.08409) + (xy 248.370183 50.017052) (xy 248.395834 49.988237) (xy 248.398725 49.985863) (xy 248.398733 49.985858) + (xy 248.485858 49.898733) (xy 248.485858 49.898731) (xy 248.496062 49.888528) (xy 248.496065 49.888523) + (xy 251.485858 46.898733) (xy 251.554312 46.796285) (xy 251.601463 46.682451) (xy 251.625501 46.561606) + (xy 251.625501 46.438393) (xy 251.625501 46.433283) (xy 251.6255 46.433257) (xy 251.6255 32.731286) + (xy 251.625499 32.731282) (xy 251.601464 32.610448) (xy 251.601463 32.610441) (xy 251.554311 32.496607) + (xy 251.55431 32.496606) (xy 251.554307 32.4966) (xy 251.485859 32.394161) (xy 251.485858 32.39416) + (xy 251.398733 32.307035) (xy 251.398732 32.307034) (xy 250.425033 31.333337) (xy 250.425031 31.333334) + (xy 250.425031 31.333335) (xy 250.417964 31.326268) (xy 250.417964 31.326267) (xy 250.330839 31.239142) + (xy 250.330838 31.239141) (xy 250.330837 31.23914) (xy 250.29996 31.218509) (xy 250.28268 31.197833) + (xy 250.228394 31.170689) (xy 250.203759 31.160485) (xy 250.161709 31.143067) (xy 250.139996 31.134073) + (xy 250.114564 31.123539) (xy 250.114552 31.123535) (xy 249.993716 31.0995) (xy 249.993712 31.0995) + (xy 134.213394 31.0995) (xy 134.213389 31.0995) (xy 134.092553 31.123535) (xy 134.092541 31.123539) + (xy 134.060262 31.136909) (xy 134.045397 31.143067) (xy 133.978719 31.170685) (xy 133.978717 31.170686) + (xy 133.876266 31.239141) (xy 133.876263 31.239144) (xy 133.601269 31.51414) (xy 133.601267 31.514142) + (xy 133.56696 31.548449) (xy 133.514144 31.601264) (xy 133.514142 31.601267) (xy 133.499262 31.623537) + (xy 133.499261 31.623539) (xy 133.49926 31.623538) (xy 133.445689 31.703712) (xy 133.445685 31.703719) + (xy 133.39854 31.817538) (xy 133.398537 31.817547) (xy 133.375356 31.934094) (xy 133.375352 31.934111) + (xy 133.3745 31.938388) (xy 133.3745 31.938394) (xy 133.3745 41.661607) (xy 133.398537 41.782453) + (xy 133.398538 41.782456) (xy 133.404267 41.796287) (xy 133.445686 41.896285) (xy 133.445691 41.896293) + (xy 133.465961 41.926626) (xy 133.465963 41.926633) (xy 133.465965 41.926633) (xy 133.514138 41.998729) + (xy 133.514144 41.998737) (xy 133.605586 42.090179) (xy 133.605608 42.090199) (xy 142.257571 50.742162) + (xy 142.291056 50.803485) (xy 142.287821 50.86816) (xy 142.282754 50.883753) (xy 142.261904 51.015398) + (xy 142.231975 51.078533) (xy 142.172663 51.115464) (xy 142.139431 51.12) (xy 129.820569 51.12) + (xy 129.75353 51.100315) (xy 129.707775 51.047511) (xy 129.698096 51.015398) (xy 129.695886 51.001447) + (xy 129.677246 50.883757) (xy 129.611557 50.681588) (xy 129.515051 50.492184) (xy 129.515049 50.492181) + (xy 129.515048 50.492179) (xy 129.390109 50.320213) (xy 129.239786 50.16989) (xy 129.06782 50.044951) + (xy 129.067115 50.044591) (xy 129.059054 50.040485) (xy 129.008259 49.992512) (xy 128.991463 49.924692) + (xy 129.013999 49.858556) (xy 129.059054 49.819515) (xy 129.067816 49.815051) (xy 129.089789 49.799086) + (xy 129.239786 49.690109) (xy 129.239788 49.690106) (xy 129.239792 49.690104) (xy 129.390104 49.539792) + (xy 129.390106 49.539788) (xy 129.390109 49.539786) (xy 129.515048 49.36782) (xy 129.515047 49.36782) + (xy 129.515051 49.367816) (xy 129.611557 49.178412) (xy 129.677246 48.976243) (xy 129.7105 48.766287) + (xy 129.7105 48.553713) (xy 129.677246 48.343757) (xy 129.611557 48.141588) (xy 129.515051 47.952184) + (xy 129.515049 47.952181) (xy 129.515048 47.952179) (xy 129.390109 47.780213) (xy 129.239786 47.62989) + (xy 129.06782 47.504951) (xy 129.067115 47.504591) (xy 129.059054 47.500485) (xy 129.008259 47.452512) + (xy 128.991463 47.384692) (xy 129.013999 47.318556) (xy 129.059054 47.279515) (xy 129.067816 47.275051) + (xy 129.119015 47.237853) (xy 129.239786 47.150109) (xy 129.239788 47.150106) (xy 129.239792 47.150104) + (xy 129.390104 46.999792) (xy 129.390106 46.999788) (xy 129.390109 46.999786) (xy 129.515048 46.82782) + (xy 129.51505 46.827817) (xy 129.515051 46.827816) (xy 129.611557 46.638412) (xy 129.677246 46.436243) + (xy 129.7105 46.226287) (xy 129.7105 46.013713) (xy 129.677246 45.803757) (xy 129.611557 45.601588) + (xy 129.515051 45.412184) (xy 129.515049 45.412181) (xy 129.515048 45.412179) (xy 129.390109 45.240213) + (xy 129.239786 45.08989) (xy 129.06782 44.964951) (xy 129.067115 44.964591) (xy 129.059054 44.960485) + (xy 129.008259 44.912512) (xy 128.991463 44.844692) (xy 129.013999 44.778556) (xy 129.059054 44.739515) + (xy 129.067816 44.735051) (xy 129.118342 44.698342) (xy 129.239786 44.610109) (xy 129.239788 44.610106) + (xy 129.239792 44.610104) (xy 129.390104 44.459792) (xy 129.390106 44.459788) (xy 129.390109 44.459786) + (xy 129.515048 44.28782) (xy 129.515049 44.287819) (xy 129.515051 44.287816) (xy 129.611557 44.098412) + (xy 129.677246 43.896243) (xy 129.7105 43.686287) (xy 129.7105 43.473713) (xy 129.677246 43.263757) + (xy 129.611557 43.061588) (xy 129.515051 42.872184) (xy 129.515049 42.872181) (xy 129.515048 42.872179) + (xy 129.390109 42.700213) (xy 129.239786 42.54989) (xy 129.06782 42.424951) (xy 129.067115 42.424591) + (xy 129.059054 42.420485) (xy 129.008259 42.372512) (xy 128.991463 42.304692) (xy 129.013999 42.238556) + (xy 129.059054 42.199515) (xy 129.067816 42.195051) (xy 129.089789 42.179086) (xy 129.239786 42.070109) + (xy 129.239788 42.070106) (xy 129.239792 42.070104) (xy 129.390104 41.919792) (xy 129.390106 41.919788) + (xy 129.390109 41.919786) (xy 129.515048 41.74782) (xy 129.515047 41.74782) (xy 129.515051 41.747816) + (xy 129.611557 41.558412) (xy 129.677246 41.356243) (xy 129.7105 41.146287) (xy 129.7105 40.933713) + (xy 129.677246 40.723757) (xy 129.611557 40.521588) (xy 129.515051 40.332184) (xy 129.515049 40.332181) + (xy 129.515048 40.332179) (xy 129.390109 40.160213) (xy 129.239786 40.00989) (xy 129.06782 39.884951) + (xy 129.067115 39.884591) (xy 129.059054 39.880485) (xy 129.008259 39.832512) (xy 128.991463 39.764692) + (xy 129.013999 39.698556) (xy 129.059054 39.659515) (xy 129.067816 39.655051) (xy 129.089789 39.639086) + (xy 129.239786 39.530109) (xy 129.239788 39.530106) (xy 129.239792 39.530104) (xy 129.390104 39.379792) + (xy 129.390106 39.379788) (xy 129.390109 39.379786) (xy 129.515048 39.20782) (xy 129.515047 39.20782) + (xy 129.515051 39.207816) (xy 129.611557 39.018412) (xy 129.677246 38.816243) (xy 129.7105 38.606287) + (xy 129.7105 38.393713) (xy 129.677246 38.183757) (xy 129.611557 37.981588) (xy 129.515051 37.792184) + (xy 129.515049 37.792181) (xy 129.515048 37.792179) (xy 129.390109 37.620213) (xy 129.239786 37.46989) + (xy 129.06782 37.344951) (xy 129.067115 37.344591) (xy 129.059054 37.340485) (xy 129.008259 37.292512) + (xy 128.991463 37.224692) (xy 129.013999 37.158556) (xy 129.059054 37.119515) (xy 129.067816 37.115051) + (xy 129.135569 37.065826) (xy 129.239786 36.990109) (xy 129.239788 36.990106) (xy 129.239792 36.990104) + (xy 129.390104 36.839792) (xy 129.390106 36.839788) (xy 129.390109 36.839786) (xy 129.515048 36.66782) + (xy 129.515047 36.66782) (xy 129.515051 36.667816) (xy 129.611557 36.478412) (xy 129.677246 36.276243) + (xy 129.7105 36.066287) (xy 129.7105 35.853713) (xy 129.677246 35.643757) (xy 129.611557 35.441588) + (xy 129.515051 35.252184) (xy 129.515049 35.252181) (xy 129.515048 35.252179) (xy 129.390109 35.080213) + (xy 129.239786 34.92989) (xy 129.06782 34.804951) (xy 128.878414 34.708444) (xy 128.878413 34.708443) + (xy 128.878412 34.708443) (xy 128.676243 34.642754) (xy 128.676241 34.642753) (xy 128.67624 34.642753) + (xy 128.514957 34.617208) (xy 128.466287 34.6095) (xy 128.253713 34.6095) (xy 128.205042 34.617208) + (xy 128.04376 34.642753) (xy 127.841585 34.708444) (xy 127.652179 34.804951) (xy 127.480213 34.92989) + (xy 127.32989 35.080213) (xy 127.204951 35.252179) (xy 127.108444 35.441585) (xy 127.042753 35.64376) + (xy 127.0095 35.853713) (xy 127.0095 36.066286) (xy 127.036741 36.238282) (xy 127.042754 36.276243) + (xy 127.048016 36.292439) (xy 127.108444 36.478414) (xy 127.204951 36.66782) (xy 127.32989 36.839786) + (xy 127.480213 36.990109) (xy 127.652182 37.11505) (xy 127.660946 37.119516) (xy 127.711742 37.167491) + (xy 127.728536 37.235312) (xy 127.705998 37.301447) (xy 127.660946 37.340484) (xy 127.652182 37.344949) + (xy 127.480213 37.46989) (xy 127.32989 37.620213) (xy 127.204951 37.792179) (xy 127.108444 37.981585) + (xy 127.042753 38.18376) (xy 127.0095 38.393713) (xy 127.0095 38.606286) (xy 127.042735 38.816127) + (xy 127.042754 38.816243) (xy 127.053731 38.850028) (xy 127.108444 39.018414) (xy 127.204951 39.20782) + (xy 127.32989 39.379786) (xy 127.480213 39.530109) (xy 127.652182 39.65505) (xy 127.660946 39.659516) + (xy 127.711742 39.707491) (xy 127.728536 39.775312) (xy 127.705998 39.841447) (xy 127.660946 39.880484) + (xy 127.652182 39.884949) (xy 127.480213 40.00989) (xy 127.32989 40.160213) (xy 127.204951 40.332179) + (xy 127.108444 40.521585) (xy 127.042753 40.72376) (xy 127.0095 40.933713) (xy 127.0095 41.146286) + (xy 127.042754 41.356244) (xy 127.042754 41.356247) (xy 127.056491 41.398523) (xy 127.058486 41.468364) + (xy 127.026241 41.524522) (xy 124.631286 43.919478) (xy 124.519481 44.031282) (xy 124.51948 44.031284) + (xy 124.475185 44.108007) (xy 124.469361 44.118094) (xy 124.469359 44.118096) (xy 124.440425 44.168209) + (xy 124.440424 44.16821) (xy 124.430432 44.2055) (xy 124.399499 44.320943) (xy 124.399499 44.320945) + (xy 124.399499 44.489046) (xy 124.3995 44.489059) (xy 124.3995 60.696171) (xy 124.399499 60.696189) + (xy 124.399499 60.861895) (xy 124.399498 60.861895) (xy 124.0005 60.861895) (xy 124.0005 32.004427) + (xy 124.000816 31.995581) (xy 124.004906 31.938394) (xy 124.01513 31.795436) (xy 124.017646 31.777938) + (xy 124.059356 31.5862) (xy 124.064335 31.569242) (xy 124.132911 31.385382) (xy 124.140251 31.36931) + (xy 124.234294 31.197083) (xy 124.24385 31.182214) (xy 124.361443 31.025128) (xy 124.373017 31.011771) + (xy 124.511771 30.873017) (xy 124.525128 30.861443) (xy 124.682214 30.74385) (xy 124.697083 30.734294) + (xy 124.86931 30.640251) (xy 124.885382 30.632911) (xy 125.069242 30.564335) (xy 125.0862 30.559356) + (xy 125.277938 30.517646) (xy 125.295436 30.51513) (xy 125.495582 30.500816) (xy 125.504428 30.5005) + (xy 125.565892 30.5005) (xy 250.434108 30.5005) (xy 250.495572 30.5005) + ) + ) + (filled_polygon + (layer "B.Cu") + (pts + (xy 156.742539 34.220185) (xy 156.788294 34.272989) (xy 156.7995 34.3245) (xy 156.7995 45.31848) + (xy 156.779815 45.385519) (xy 156.763181 45.406161) (xy 155.062181 47.107161) (xy 155.000858 47.140646) + (xy 154.931166 47.135662) (xy 154.875233 47.09379) (xy 154.850816 47.028326) (xy 154.8505 47.01948) + (xy 154.8505 47.013713) (xy 154.845481 46.982026) (xy 154.817246 46.803757) (xy 154.751557 46.601588) + (xy 154.655051 46.412184) (xy 154.655049 46.412181) (xy 154.655048 46.412179) (xy 154.530109 46.240213) + (xy 154.379786 46.08989) (xy 154.20782 45.964951) (xy 154.207115 45.964591) (xy 154.199054 45.960485) + (xy 154.148259 45.912512) (xy 154.131463 45.844692) (xy 154.153999 45.778556) (xy 154.199054 45.739515) + (xy 154.207816 45.735051) (xy 154.249163 45.705011) (xy 154.379786 45.610109) (xy 154.379788 45.610106) + (xy 154.379792 45.610104) (xy 154.530104 45.459792) (xy 154.530106 45.459788) (xy 154.530109 45.459786) + (xy 154.655048 45.28782) (xy 154.655047 45.28782) (xy 154.655051 45.287816) (xy 154.751557 45.098412) + (xy 154.817246 44.896243) (xy 154.8505 44.686287) (xy 154.8505 44.473713) (xy 154.817246 44.263757) + (xy 154.751557 44.061588) (xy 154.655051 43.872184) (xy 154.655049 43.872181) (xy 154.655048 43.872179) + (xy 154.530109 43.700213) (xy 154.379786 43.54989) (xy 154.20782 43.424951) (xy 154.207115 43.424591) + (xy 154.199054 43.420485) (xy 154.148259 43.372512) (xy 154.131463 43.304692) (xy 154.153999 43.238556) + (xy 154.199054 43.199515) (xy 154.207816 43.195051) (xy 154.229789 43.179086) (xy 154.379786 43.070109) + (xy 154.379788 43.070106) (xy 154.379792 43.070104) (xy 154.530104 42.919792) (xy 154.530106 42.919788) + (xy 154.530109 42.919786) (xy 154.655048 42.74782) (xy 154.655047 42.74782) (xy 154.655051 42.747816) + (xy 154.751557 42.558412) (xy 154.817246 42.356243) (xy 154.8505 42.146287) (xy 154.8505 41.933713) + (xy 154.817246 41.723757) (xy 154.751557 41.521588) (xy 154.655051 41.332184) (xy 154.655049 41.332181) + (xy 154.655048 41.332179) (xy 154.530109 41.160213) (xy 154.37979 41.009894) (xy 154.379785 41.00989) + (xy 154.374399 41.005977) (xy 154.331731 40.950649) (xy 154.32575 40.881036) (xy 154.358354 40.81924) + (xy 154.408278 40.787951) (xy 154.419117 40.784359) (xy 154.419124 40.784356) (xy 154.568345 40.692315) + (xy 154.692315 40.568345) (xy 154.784356 40.419124) (xy 154.784358 40.419119) (xy 154.839505 40.252697) + (xy 154.839506 40.25269) (xy 154.849999 40.149986) (xy 154.85 40.149973) (xy 154.85 39.75) (xy 153.933012 39.75) + (xy 153.965925 39.692993) (xy 154 39.565826) (xy 154 39.434174) (xy 153.965925 39.307007) (xy 153.933012 39.25) + (xy 154.849999 39.25) (xy 154.849999 38.850028) (xy 154.849998 38.850013) (xy 154.839505 38.747302) + (xy 154.784358 38.58088) (xy 154.784356 38.580875) (xy 154.692315 38.431654) (xy 154.568345 38.307684) + (xy 154.419124 38.215643) (xy 154.419119 38.215641) (xy 154.252697 38.160494) (xy 154.25269 38.160493) + (xy 154.149986 38.15) (xy 153.75 38.15) (xy 153.75 39.066988) (xy 153.692993 39.034075) (xy 153.565826 39) + (xy 153.434174 39) (xy 153.307007 39.034075) (xy 153.25 39.066988) (xy 153.25 38.15) (xy 152.850028 38.15) + (xy 152.850012 38.150001) (xy 152.747302 38.160494) (xy 152.58088 38.215641) (xy 152.580875 38.215643) + (xy 152.431654 38.307684) (xy 152.307684 38.431654) (xy 152.215643 38.580875) (xy 152.215641 38.58088) + (xy 152.160494 38.747302) (xy 152.160493 38.747309) (xy 152.15 38.850013) (xy 152.15 39.25) (xy 153.066988 39.25) + (xy 153.034075 39.307007) (xy 153 39.434174) (xy 153 39.565826) (xy 153.034075 39.692993) (xy 153.066988 39.75) + (xy 152.150001 39.75) (xy 152.150001 40.149986) (xy 152.160494 40.252697) (xy 152.215641 40.419119) + (xy 152.215643 40.419124) (xy 152.307684 40.568345) (xy 152.431654 40.692315) (xy 152.580875 40.784356) + (xy 152.580878 40.784357) (xy 152.591723 40.787951) (xy 152.649167 40.827724) (xy 152.67599 40.89224) + (xy 152.663675 40.961016) (xy 152.625605 41.005974) (xy 152.620211 41.009892) (xy 152.46989 41.160213) + (xy 152.344951 41.332179) (xy 152.248444 41.521585) (xy 152.182753 41.72376) (xy 152.1495 41.933713) + (xy 152.1495 42.146286) (xy 152.176418 42.316243) (xy 152.182754 42.356243) (xy 152.223481 42.481588) + (xy 152.248444 42.558414) (xy 152.344951 42.74782) (xy 152.46989 42.919786) (xy 152.620213 43.070109) + (xy 152.792182 43.19505) (xy 152.800946 43.199516) (xy 152.851742 43.247491) (xy 152.868536 43.315312) + (xy 152.845998 43.381447) (xy 152.800946 43.420484) (xy 152.792182 43.424949) (xy 152.620213 43.54989) + (xy 152.46989 43.700213) (xy 152.344951 43.872179) (xy 152.248444 44.061585) (xy 152.182753 44.26376) + (xy 152.1495 44.473713) (xy 152.1495 44.686286) (xy 152.172508 44.831557) (xy 152.182754 44.896243) + (xy 152.240535 45.074075) (xy 152.248444 45.098414) (xy 152.344951 45.28782) (xy 152.46989 45.459786) + (xy 152.620213 45.610109) (xy 152.792182 45.73505) (xy 152.800946 45.739516) (xy 152.851742 45.787491) + (xy 152.868536 45.855312) (xy 152.845998 45.921447) (xy 152.800946 45.960484) (xy 152.792182 45.964949) + (xy 152.620213 46.08989) (xy 152.46989 46.240213) (xy 152.344951 46.412179) (xy 152.248444 46.601585) + (xy 152.182753 46.80376) (xy 152.1495 47.013713) (xy 152.1495 47.226286) (xy 152.177264 47.401584) + (xy 152.182754 47.436243) (xy 152.235449 47.598422) (xy 152.248444 47.638414) (xy 152.344951 47.82782) + (xy 152.46989 47.999786) (xy 152.620213 48.150109) (xy 152.792182 48.27505) (xy 152.800946 48.279516) + (xy 152.851742 48.327491) (xy 152.868536 48.395312) (xy 152.845998 48.461447) (xy 152.800946 48.500484) + (xy 152.792182 48.504949) (xy 152.620213 48.62989) (xy 152.46989 48.780213) (xy 152.344951 48.952179) + (xy 152.287218 49.065488) (xy 152.239244 49.116284) (xy 152.171423 49.133079) (xy 152.105288 49.110542) + (xy 152.089052 49.096874) (xy 151.786819 48.794641) (xy 151.753334 48.733318) (xy 151.7505 48.70696) + (xy 151.7505 40.401577) (xy 151.723055 40.228299) (xy 151.719709 40.207174) (xy 151.70445 40.160213) + (xy 151.702226 40.153367) (xy 151.658885 40.019976) (xy 151.658884 40.019973) (xy 151.58781 39.880484) + (xy 151.569524 39.844595) (xy 151.453829 39.685355) (xy 146.774646 35.006172) (xy 146.615405 34.890476) + (xy 146.44003 34.801117) (xy 146.252826 34.74029) (xy 146.058422 34.7095) (xy 146.058417 34.7095) + (xy 144.606551 34.7095) (xy 144.541453 34.691038) (xy 144.531172 34.684696) (xy 144.516466 34.675625) + (xy 144.516463 34.675623) (xy 144.516462 34.675623) (xy 144.417266 34.642753) (xy 144.348816 34.620071) + (xy 144.245349 34.6095) (xy 144.245342 34.6095) (xy 142.954658 34.6095) (xy 142.95465 34.6095) (xy 142.851183 34.620071) + (xy 142.68354 34.675622) (xy 142.683529 34.675627) (xy 142.533225 34.768337) (xy 142.533221 34.76834) + (xy 142.40834 34.893221) (xy 142.408337 34.893225) (xy 142.315627 35.043529) (xy 142.315622 35.04354) + (xy 142.260071 35.211183) (xy 142.2495 35.31465) (xy 142.2495 36.605349) (xy 142.260071 36.708816) + (xy 142.315622 36.876459) (xy 142.315627 36.87647) (xy 142.408337 37.026774) (xy 142.40834 37.026778) + (xy 142.533221 37.151659) (xy 142.533225 37.151662) (xy 142.683529 37.244372) (xy 142.683532 37.244373) + (xy 142.683538 37.244377) (xy 142.752876 37.267353) (xy 142.810321 37.307126) (xy 142.837144 37.371642) + (xy 142.837325 37.383771) (xy 143.470591 38.017037) (xy 143.407007 38.034075) (xy 143.292993 38.099901) + (xy 143.199901 38.192993) (xy 143.134075 38.307007) (xy 143.117037 38.370591) (xy 142.484728 37.738282) + (xy 142.484727 37.738282) (xy 142.44538 37.792439) (xy 142.348904 37.981782) (xy 142.283242 38.183869) + (xy 142.283242 38.183872) (xy 142.25 38.393753) (xy 142.25 38.399981) (xy 142.230315 38.46702) (xy 142.177511 38.512775) + (xy 142.108353 38.522719) (xy 142.044797 38.493694) (xy 142.038319 38.487662) (xy 140.236819 36.686162) + (xy 140.203334 36.624839) (xy 140.2005 36.598481) (xy 140.2005 34.841519) (xy 140.220185 34.77448) + (xy 140.236819 34.753838) (xy 140.753838 34.236819) (xy 140.815161 34.203334) (xy 140.841519 34.2005) + (xy 156.6755 34.2005) + ) + ) + (filled_polygon + (layer "B.Cu") + (pts + (xy 250.504418 30.500816) (xy 250.704561 30.51513) (xy 250.722063 30.517647) (xy 250.913795 30.559355) + (xy 250.93076 30.564336) (xy 251.114611 30.632909) (xy 251.130694 30.640253) (xy 251.247495 30.704032) + (xy 251.302908 30.73429) (xy 251.317791 30.743855) (xy 251.474864 30.861438) (xy 251.488235 30.873024) + (xy 251.626975 31.011764) (xy 251.638561 31.025135) (xy 251.756144 31.182208) (xy 251.765709 31.197091) + (xy 251.859743 31.3693) (xy 251.867093 31.385394) (xy 251.935661 31.569234) (xy 251.940645 31.586209) + (xy 251.982351 31.777931) (xy 251.984869 31.795442) (xy 251.999184 31.99558) (xy 251.9995 32.004427) + (xy 251.9995 60.995572) (xy 251.999184 61.004419) (xy 251.984869 61.204557) (xy 251.982351 61.222068) + (xy 251.940645 61.41379) (xy 251.935661 61.430765) (xy 251.867093 61.614605) (xy 251.859743 61.630699) + (xy 251.765709 61.802908) (xy 251.756144 61.817791) (xy 251.638561 61.974864) (xy 251.626975 61.988235) + (xy 251.488235 62.126975) (xy 251.474864 62.138561) (xy 251.317791 62.256144) (xy 251.302908 62.265709) + (xy 251.130699 62.359743) (xy 251.114605 62.367093) (xy 250.930765 62.435661) (xy 250.91379 62.440645) + (xy 250.722068 62.482351) (xy 250.704557 62.484869) (xy 250.523779 62.497799) (xy 250.504417 62.499184) + (xy 250.495572 62.4995) (xy 125.504428 62.4995) (xy 125.495582 62.499184) (xy 125.473622 62.497613) + (xy 125.295442 62.484869) (xy 125.277931 62.482351) (xy 125.086209 62.440645) (xy 125.069234 62.435661) + (xy 124.885394 62.367093) (xy 124.8693 62.359743) (xy 124.697091 62.265709) (xy 124.682208 62.256144) + (xy 124.525135 62.138561) (xy 124.511764 62.126975) (xy 124.373024 61.988235) (xy 124.361438 61.974864) + (xy 124.243855 61.817791) (xy 124.23429 61.802908) (xy 124.140256 61.630699) (xy 124.132909 61.614611) + (xy 124.064336 61.43076) (xy 124.059354 61.41379) (xy 124.017648 61.222068) (xy 124.01513 61.204556) + (xy 124.000816 61.004418) (xy 124.0005 60.995572) (xy 124.0005 35.853713) (xy 127.0095 35.853713) + (xy 127.0095 36.066286) (xy 127.042753 36.276239) (xy 127.108444 36.478414) (xy 127.204951 36.66782) + (xy 127.32989 36.839786) (xy 127.480213 36.990109) (xy 127.652182 37.11505) (xy 127.660946 37.119516) + (xy 127.711742 37.167491) (xy 127.728536 37.235312) (xy 127.705998 37.301447) (xy 127.660946 37.340484) + (xy 127.652182 37.344949) (xy 127.480213 37.46989) (xy 127.32989 37.620213) (xy 127.204951 37.792179) + (xy 127.108444 37.981585) (xy 127.042753 38.18376) (xy 127.0095 38.393713) (xy 127.0095 38.606286) + (xy 127.042735 38.816127) (xy 127.042754 38.816243) (xy 127.053731 38.850028) (xy 127.108444 39.018414) + (xy 127.204951 39.20782) (xy 127.32989 39.379786) (xy 127.480213 39.530109) (xy 127.652182 39.65505) + (xy 127.660946 39.659516) (xy 127.711742 39.707491) (xy 127.728536 39.775312) (xy 127.705998 39.841447) + (xy 127.660946 39.880484) (xy 127.652182 39.884949) (xy 127.480213 40.00989) (xy 127.32989 40.160213) + (xy 127.204951 40.332179) (xy 127.108444 40.521585) (xy 127.042753 40.72376) (xy 127.0095 40.933713) + (xy 127.0095 41.146286) (xy 127.039442 41.335337) (xy 127.042754 41.356243) (xy 127.086248 41.490104) + (xy 127.108444 41.558414) (xy 127.204951 41.74782) (xy 127.32989 41.919786) (xy 127.480213 42.070109) + (xy 127.652182 42.19505) (xy 127.660946 42.199516) (xy 127.711742 42.247491) (xy 127.728536 42.315312) + (xy 127.705998 42.381447) (xy 127.660946 42.420484) (xy 127.652182 42.424949) (xy 127.480213 42.54989) + (xy 127.32989 42.700213) (xy 127.204951 42.872179) (xy 127.108444 43.061585) (xy 127.042753 43.26376) + (xy 127.0095 43.473713) (xy 127.0095 43.686286) (xy 127.038942 43.872179) (xy 127.042754 43.896243) + (xy 127.086248 44.030104) (xy 127.108444 44.098414) (xy 127.204951 44.28782) (xy 127.32989 44.459786) + (xy 127.480213 44.610109) (xy 127.652182 44.73505) (xy 127.660946 44.739516) (xy 127.711742 44.787491) + (xy 127.728536 44.855312) (xy 127.705998 44.921447) (xy 127.660946 44.960484) (xy 127.652182 44.964949) + (xy 127.480213 45.08989) (xy 127.32989 45.240213) (xy 127.204951 45.412179) (xy 127.108444 45.601585) + (xy 127.042753 45.80376) (xy 127.0095 46.013713) (xy 127.0095 46.226286) (xy 127.042753 46.436239) + (xy 127.108444 46.638414) (xy 127.204951 46.82782) (xy 127.32989 46.999786) (xy 127.480213 47.150109) + (xy 127.652182 47.27505) (xy 127.660946 47.279516) (xy 127.711742 47.327491) (xy 127.728536 47.395312) + (xy 127.705998 47.461447) (xy 127.660946 47.500484) (xy 127.652182 47.504949) (xy 127.480213 47.62989) + (xy 127.32989 47.780213) (xy 127.204951 47.952179) (xy 127.108444 48.141585) (xy 127.042753 48.34376) + (xy 127.0095 48.553713) (xy 127.0095 48.766286) (xy 127.038942 48.952179) (xy 127.042754 48.976243) + (xy 127.106468 49.172335) (xy 127.108444 49.178414) (xy 127.204951 49.36782) (xy 127.32989 49.539786) + (xy 127.480213 49.690109) (xy 127.652182 49.81505) (xy 127.660946 49.819516) (xy 127.711742 49.867491) + (xy 127.728536 49.935312) (xy 127.705998 50.001447) (xy 127.660946 50.040484) (xy 127.652182 50.044949) + (xy 127.480213 50.16989) (xy 127.32989 50.320213) (xy 127.204951 50.492179) (xy 127.108444 50.681585) + (xy 127.042753 50.88376) (xy 127.0095 51.093713) (xy 127.0095 51.306286) (xy 127.038942 51.492179) + (xy 127.042754 51.516243) (xy 127.088129 51.655893) (xy 127.108444 51.718414) (xy 127.204951 51.90782) + (xy 127.32989 52.079786) (xy 127.480213 52.230109) (xy 127.652182 52.35505) (xy 127.660946 52.359516) + (xy 127.711742 52.407491) (xy 127.728536 52.475312) (xy 127.705998 52.541447) (xy 127.660946 52.580484) + (xy 127.652182 52.584949) (xy 127.480213 52.70989) (xy 127.32989 52.860213) (xy 127.204951 53.032179) + (xy 127.108444 53.221585) (xy 127.042753 53.42376) (xy 127.0095 53.633713) (xy 127.0095 53.846286) + (xy 127.042753 54.056239) (xy 127.108444 54.258414) (xy 127.204951 54.44782) (xy 127.32989 54.619786) + (xy 127.480213 54.770109) (xy 127.652182 54.89505) (xy 127.660946 54.899516) (xy 127.711742 54.947491) + (xy 127.728536 55.015312) (xy 127.705998 55.081447) (xy 127.660946 55.120484) (xy 127.652182 55.124949) + (xy 127.480213 55.24989) (xy 127.32989 55.400213) (xy 127.204951 55.572179) (xy 127.108444 55.761585) + (xy 127.042753 55.96376) (xy 127.0095 56.173713) (xy 127.0095 56.386286) (xy 127.040724 56.583431) + (xy 127.042754 56.596243) (xy 127.106505 56.792449) (xy 127.108444 56.798414) (xy 127.204951 56.98782) + (xy 127.32989 57.159786) (xy 127.480213 57.310109) (xy 127.652179 57.435048) (xy 127.652181 57.435049) + (xy 127.652184 57.435051) (xy 127.841588 57.531557) (xy 128.043757 57.597246) (xy 128.253713 57.6305) + (xy 128.253714 57.6305) (xy 128.466286 57.6305) (xy 128.466287 57.6305) (xy 128.676243 57.597246) + (xy 128.878412 57.531557) (xy 129.067816 57.435051) (xy 129.153973 57.372455) (xy 129.239786 57.310109) + (xy 129.239788 57.310106) (xy 129.239792 57.310104) (xy 129.368319 57.181577) (xy 129.429642 57.148092) + (xy 129.499334 57.153076) (xy 129.555267 57.194948) (xy 129.579684 57.260412) (xy 129.58 57.269258) + (xy 129.58 58.92) (xy 142.64 58.92) (xy 142.64 57.495193) (xy 142.659685 57.428154) (xy 142.712489 57.382399) + (xy 142.781647 57.372455) (xy 142.836885 57.394875) (xy 142.892179 57.435048) (xy 142.892181 57.435049) + (xy 142.892184 57.435051) (xy 143.081588 57.531557) (xy 143.283757 57.597246) (xy 143.493713 57.6305) + (xy 143.493714 57.6305) (xy 143.706286 57.6305) (xy 143.706287 57.6305) (xy 143.916243 57.597246) + (xy 144.118412 57.531557) (xy 144.307816 57.435051) (xy 144.393973 57.372455) (xy 144.479786 57.310109) + (xy 144.479788 57.310106) (xy 144.479792 57.310104) (xy 144.630104 57.159792) (xy 144.630106 57.159788) + (xy 144.630109 57.159786) (xy 144.755048 56.98782) (xy 144.755047 56.98782) (xy 144.755051 56.987816) + (xy 144.851557 56.798412) (xy 144.915332 56.602135) (xy 234.5295 56.602135) (xy 234.5295 58.39787) + (xy 234.529501 58.397876) (xy 234.535908 58.457483) (xy 234.586202 58.592328) (xy 234.586206 58.592335) + (xy 234.672452 58.707544) (xy 234.672455 58.707547) (xy 234.787664 58.793793) (xy 234.787671 58.793797) + (xy 234.922517 58.844091) (xy 234.922516 58.844091) (xy 234.929444 58.844835) (xy 234.982127 58.8505) + (xy 236.777872 58.850499) (xy 236.837483 58.844091) (xy 236.972331 58.793796) (xy 237.087546 58.707546) + (xy 237.173796 58.592331) (xy 237.22281 58.460916) (xy 237.264681 58.404984) (xy 237.330145 58.380566) + (xy 237.398418 58.395417) (xy 237.426673 58.416569) (xy 237.540213 58.530109) (xy 237.712179 58.655048) + (xy 237.712181 58.655049) (xy 237.712184 58.655051) (xy 237.901588 58.751557) (xy 238.103757 58.817246) + (xy 238.313713 58.8505) (xy 238.313714 58.8505) (xy 238.526286 58.8505) (xy 238.526287 58.8505) + (xy 238.736243 58.817246) (xy 238.938412 58.751557) (xy 239.127816 58.655051) (xy 239.214138 58.592335) + (xy 239.299786 58.530109) (xy 239.299788 58.530106) (xy 239.299792 58.530104) (xy 239.450104 58.379792) + (xy 239.450106 58.379788) (xy 239.450109 58.379786) (xy 239.575048 58.20782) (xy 239.575047 58.20782) + (xy 239.575051 58.207816) (xy 239.579514 58.199054) (xy 239.627488 58.148259) (xy 239.695308 58.131463) + (xy 239.761444 58.153999) (xy 239.800486 58.199056) (xy 239.804951 58.20782) (xy 239.92989 58.379786) + (xy 240.080213 58.530109) (xy 240.252179 58.655048) (xy 240.252181 58.655049) (xy 240.252184 58.655051) + (xy 240.441588 58.751557) (xy 240.643757 58.817246) (xy 240.853713 58.8505) (xy 240.853714 58.8505) + (xy 241.066286 58.8505) (xy 241.066287 58.8505) (xy 241.276243 58.817246) (xy 241.478412 58.751557) + (xy 241.667816 58.655051) (xy 241.754138 58.592335) (xy 241.839786 58.530109) (xy 241.839788 58.530106) + (xy 241.839792 58.530104) (xy 241.990104 58.379792) (xy 241.990106 58.379788) (xy 241.990109 58.379786) + (xy 242.07589 58.261717) (xy 242.115051 58.207816) (xy 242.119793 58.198508) (xy 242.167763 58.147711) + (xy 242.235583 58.130911) (xy 242.301719 58.153445) (xy 242.340763 58.1985) (xy 242.345373 58.207547) + (xy 242.384728 58.261716) (xy 243.017037 57.629408) (xy 243.034075 57.692993) (xy 243.099901 57.807007) + (xy 243.192993 57.900099) (xy 243.307007 57.965925) (xy 243.37059 57.982962) (xy 242.738282 58.615269) + (xy 242.738282 58.61527) (xy 242.792449 58.654624) (xy 242.981782 58.751095) (xy 243.18387 58.816757) + (xy 243.393754 58.85) (xy 243.606246 58.85) (xy 243.816127 58.816757) (xy 243.81613 58.816757) (xy 244.018217 58.751095) + (xy 244.207554 58.654622) (xy 244.261716 58.61527) (xy 244.261717 58.61527) (xy 243.629408 57.982962) + (xy 243.692993 57.965925) (xy 243.807007 57.900099) (xy 243.900099 57.807007) (xy 243.965925 57.692993) + (xy 243.982962 57.629409) (xy 244.61527 58.261717) (xy 244.61527 58.261716) (xy 244.654622 58.207554) + (xy 244.751095 58.018217) (xy 244.816757 57.81613) (xy 244.816757 57.816127) (xy 244.85 57.606246) + (xy 244.85 57.393753) (xy 244.816757 57.183872) (xy 244.816757 57.183869) (xy 244.751095 56.981782) + (xy 244.654624 56.792449) (xy 244.61527 56.738282) (xy 244.615269 56.738282) (xy 243.982962 57.37059) + (xy 243.965925 57.307007) (xy 243.900099 57.192993) (xy 243.807007 57.099901) (xy 243.692993 57.034075) + (xy 243.629409 57.017037) (xy 244.261716 56.384728) (xy 244.20755 56.345375) (xy 244.018217 56.248904) + (xy 243.816129 56.183242) (xy 243.606246 56.15) (xy 243.393754 56.15) (xy 243.183872 56.183242) + (xy 243.183869 56.183242) (xy 242.981782 56.248904) (xy 242.792439 56.34538) (xy 242.738282 56.384727) + (xy 242.738282 56.384728) (xy 243.370591 57.017037) (xy 243.307007 57.034075) (xy 243.192993 57.099901) + (xy 243.099901 57.192993) (xy 243.034075 57.307007) (xy 243.017037 57.370591) (xy 242.384728 56.738282) + (xy 242.384727 56.738282) (xy 242.34538 56.79244) (xy 242.345376 56.792446) (xy 242.34076 56.801505) + (xy 242.292781 56.852297) (xy 242.224959 56.869087) (xy 242.158826 56.846543) (xy 242.119794 56.801493) + (xy 242.115051 56.792184) (xy 242.115049 56.792181) (xy 242.115048 56.792179) (xy 241.990109 56.620213) + (xy 241.839786 56.46989) (xy 241.66782 56.344951) (xy 241.478414 56.248444) (xy 241.478413 56.248443) + (xy 241.478412 56.248443) (xy 241.276243 56.182754) (xy 241.276241 56.182753) (xy 241.27624 56.182753) + (xy 241.114957 56.157208) (xy 241.066287 56.1495) (xy 240.853713 56.1495) (xy 240.805042 56.157208) + (xy 240.64376 56.182753) (xy 240.441585 56.248444) (xy 240.252179 56.344951) (xy 240.080213 56.46989) + (xy 239.92989 56.620213) (xy 239.804949 56.792182) (xy 239.800484 56.800946) (xy 239.752509 56.851742) + (xy 239.684688 56.868536) (xy 239.618553 56.845998) (xy 239.579516 56.800946) (xy 239.57505 56.792182) + (xy 239.450109 56.620213) (xy 239.299786 56.46989) (xy 239.12782 56.344951) (xy 238.938414 56.248444) + (xy 238.938413 56.248443) (xy 238.938412 56.248443) (xy 238.736243 56.182754) (xy 238.736241 56.182753) + (xy 238.73624 56.182753) (xy 238.574957 56.157208) (xy 238.526287 56.1495) (xy 238.313713 56.1495) + (xy 238.265042 56.157208) (xy 238.10376 56.182753) (xy 237.901585 56.248444) (xy 237.712179 56.344951) + (xy 237.540215 56.469889) (xy 237.426673 56.583431) (xy 237.36535 56.616915) (xy 237.295658 56.611931) + (xy 237.239725 56.570059) (xy 237.22281 56.539082) (xy 237.173797 56.407671) (xy 237.173793 56.407664) + (xy 237.087547 56.292455) (xy 237.087544 56.292452) (xy 236.972335 56.206206) (xy 236.972328 56.206202) + (xy 236.837482 56.155908) (xy 236.837483 56.155908) (xy 236.777883 56.149501) (xy 236.777881 56.1495) + (xy 236.777873 56.1495) (xy 236.777864 56.1495) (xy 234.982129 56.1495) (xy 234.982123 56.149501) + (xy 234.922516 56.155908) (xy 234.787671 56.206202) (xy 234.787664 56.206206) (xy 234.672455 56.292452) + (xy 234.672452 56.292455) (xy 234.586206 56.407664) (xy 234.586202 56.407671) (xy 234.535908 56.542517) + (xy 234.529501 56.602116) (xy 234.5295 56.602135) (xy 144.915332 56.602135) (xy 144.917246 56.596243) + (xy 144.9505 56.386287) (xy 144.9505 56.173713) (xy 144.917246 55.963757) (xy 144.851557 55.761588) + (xy 144.755051 55.572184) (xy 144.755049 55.572181) (xy 144.755048 55.572179) (xy 144.630109 55.400213) + (xy 144.479786 55.24989) (xy 144.30782 55.124951) (xy 144.307115 55.124591) (xy 144.299054 55.120485) + (xy 144.248259 55.072512) (xy 144.231463 55.004692) (xy 144.253999 54.938556) (xy 144.299054 54.899515) + (xy 144.307816 54.895051) (xy 144.329789 54.879086) (xy 144.479786 54.770109) (xy 144.479788 54.770106) + (xy 144.479792 54.770104) (xy 144.630104 54.619792) (xy 144.630106 54.619788) (xy 144.630109 54.619786) + (xy 144.755048 54.44782) (xy 144.755047 54.44782) (xy 144.755051 54.447816) (xy 144.851557 54.258412) + (xy 144.917246 54.056243) (xy 144.9505 53.846287) (xy 144.9505 53.633713) (xy 144.917246 53.423757) + (xy 144.912177 53.408159) (xy 144.910183 53.338321) (xy 144.942428 53.282162) (xy 145.310855 52.913736) + (xy 145.310855 52.913735) (xy 145.310858 52.913733) (xy 145.379312 52.811285) (xy 145.426463 52.697451) + (xy 145.448841 52.584951) (xy 145.450501 52.576608) (xy 145.450501 52.448283) (xy 145.4505 52.448257) + (xy 145.4505 48.220329) (xy 145.450501 48.220308) (xy 145.450501 48.090979) (xy 145.426464 47.970143) + (xy 145.426463 47.970137) (xy 145.379312 47.856303) (xy 145.310858 47.753855) (xy 145.310855 47.753851) + (xy 144.674141 47.117138) (xy 144.640656 47.055815) (xy 144.64564 46.986124) (xy 144.661499 46.956579) + (xy 144.755051 46.827816) (xy 144.851557 46.638412) (xy 144.917246 46.436243) (xy 144.9505 46.226287) + (xy 144.9505 46.013713) (xy 144.917246 45.803757) (xy 144.851557 45.601588) (xy 144.755051 45.412184) + (xy 144.755049 45.412181) (xy 144.755048 45.412179) (xy 144.630109 45.240213) (xy 144.479786 45.08989) + (xy 144.30782 44.964951) (xy 144.307115 44.964591) (xy 144.299054 44.960485) (xy 144.248259 44.912512) + (xy 144.231463 44.844692) (xy 144.253999 44.778556) (xy 144.299054 44.739515) (xy 144.307816 44.735051) + (xy 144.329789 44.719086) (xy 144.479786 44.610109) (xy 144.479788 44.610106) (xy 144.479792 44.610104) + (xy 144.630104 44.459792) (xy 144.630106 44.459788) (xy 144.630109 44.459786) (xy 144.755048 44.28782) + (xy 144.755047 44.28782) (xy 144.755051 44.287816) (xy 144.851557 44.098412) (xy 144.917246 43.896243) + (xy 144.9505 43.686287) (xy 144.9505 43.473713) (xy 144.917246 43.263757) (xy 144.851557 43.061588) + (xy 144.755051 42.872184) (xy 144.755049 42.872181) (xy 144.755048 42.872179) (xy 144.630109 42.700213) + (xy 144.479786 42.54989) (xy 144.30782 42.424951) (xy 144.307115 42.424591) (xy 144.299054 42.420485) + (xy 144.248259 42.372512) (xy 144.231463 42.304692) (xy 144.253999 42.238556) (xy 144.299054 42.199515) + (xy 144.307816 42.195051) (xy 144.329789 42.179086) (xy 144.479786 42.070109) (xy 144.479788 42.070106) + (xy 144.479792 42.070104) (xy 144.630104 41.919792) (xy 144.630106 41.919788) (xy 144.630109 41.919786) + (xy 144.755048 41.74782) (xy 144.755047 41.74782) (xy 144.755051 41.747816) (xy 144.851557 41.558412) + (xy 144.917246 41.356243) (xy 144.9505 41.146287) (xy 144.9505 40.933713) (xy 144.917246 40.723757) + (xy 144.851557 40.521588) (xy 144.755051 40.332184) (xy 144.755049 40.332181) (xy 144.755048 40.332179) + (xy 144.630109 40.160213) (xy 144.479786 40.00989) (xy 144.307817 39.884949) (xy 144.298504 39.880204) + (xy 144.247707 39.83223) (xy 144.230912 39.764409) (xy 144.253449 39.698274) (xy 144.298507 39.659232) + (xy 144.307555 39.654622) (xy 144.361716 39.61527) (xy 144.361717 39.61527) (xy 143.729408 38.982962) + (xy 143.792993 38.965925) (xy 143.907007 38.900099) (xy 144.000099 38.807007) (xy 144.065925 38.692993) + (xy 144.082962 38.629408) (xy 144.71527 39.261717) (xy 144.71527 39.261716) (xy 144.754622 39.207554) + (xy 144.851095 39.018217) (xy 144.916757 38.81613) (xy 144.916757 38.816127) (xy 144.95 38.606246) + (xy 144.95 38.393753) (xy 144.916757 38.183872) (xy 144.916757 38.183869) (xy 144.851095 37.981782) + (xy 144.754624 37.792449) (xy 144.71527 37.738282) (xy 144.715269 37.738282) (xy 144.082962 38.37059) + (xy 144.065925 38.307007) (xy 144.000099 38.192993) (xy 143.907007 38.099901) (xy 143.792993 38.034075) + (xy 143.729409 38.017037) (xy 144.365393 37.381051) (xy 144.376871 37.326412) (xy 144.425922 37.276655) + (xy 144.447119 37.267354) (xy 144.516462 37.244377) (xy 144.541453 37.228961) (xy 144.606551 37.2105) + (xy 145.390664 37.2105) (xy 145.457703 37.230185) (xy 145.478345 37.246819) (xy 149.213181 40.981655) + (xy 149.246666 41.042978) (xy 149.2495 41.069336) (xy 149.2495 49.374718) (xy 149.28029 49.569122) + (xy 149.341117 49.756326) (xy 149.397759 49.867491) (xy 149.430476 49.931701) (xy 149.546172 50.090942) + (xy 149.546174 50.090944) (xy 152.31226 52.85703) (xy 152.335063 52.888415) (xy 152.344949 52.907817) + (xy 152.46989 53.079786) (xy 152.620213 53.230109) (xy 152.792179 53.355048) (xy 152.792181 53.355049) + (xy 152.792184 53.355051) (xy 152.981588 53.451557) (xy 153.183757 53.517246) (xy 153.393713 53.5505) + (xy 153.393714 53.5505) (xy 153.606286 53.5505) (xy 153.606287 53.5505) (xy 153.816243 53.517246) + (xy 154.018412 53.451557) (xy 154.207816 53.355051) (xy 154.325535 53.269524) (xy 154.379786 53.230109) + (xy 154.379788 53.230106) (xy 154.379792 53.230104) (xy 154.530104 53.079792) (xy 154.530106 53.079788) + (xy 154.530109 53.079786) (xy 154.655048 52.90782) (xy 154.65505 52.907817) (xy 154.655051 52.907816) + (xy 154.751557 52.718412) (xy 154.817246 52.516243) (xy 154.8505 52.306287) (xy 154.8505 52.093713) + (xy 154.817246 51.883757) (xy 154.751557 51.681588) (xy 154.655051 51.492184) (xy 154.655049 51.492181) + (xy 154.655048 51.492179) (xy 154.530109 51.320213) (xy 154.379786 51.16989) (xy 154.20782 51.044951) + (xy 154.207115 51.044591) (xy 154.199054 51.040485) (xy 154.148259 50.992512) (xy 154.131463 50.924692) + (xy 154.153999 50.858556) (xy 154.199054 50.819515) (xy 154.207816 50.815051) (xy 154.249437 50.784812) + (xy 154.379786 50.690109) (xy 154.379788 50.690106) (xy 154.379792 50.690104) (xy 154.530104 50.539792) + (xy 154.530106 50.539788) (xy 154.530109 50.539786) (xy 154.655048 50.36782) (xy 154.655047 50.36782) + (xy 154.655051 50.367816) (xy 154.751557 50.178412) (xy 154.817246 49.976243) (xy 154.8505 49.766287) + (xy 154.8505 49.553713) (xy 154.825715 49.397227) (xy 154.83467 49.327933) (xy 154.860504 49.290151) + (xy 158.044114 46.106543) (xy 158.120775 45.991811) (xy 158.17358 45.864329) (xy 158.185828 45.802754) + (xy 158.195114 45.756069) (xy 158.2005 45.728995) (xy 158.2005 41.933713) (xy 210.5695 41.933713) + (xy 210.5695 42.146286) (xy 210.596418 42.316243) (xy 210.602754 42.356243) (xy 210.643481 42.481588) + (xy 210.668444 42.558414) (xy 210.764951 42.74782) (xy 210.88989 42.919786) (xy 211.040213 43.070109) + (xy 211.212182 43.19505) (xy 211.220946 43.199516) (xy 211.271742 43.247491) (xy 211.288536 43.315312) + (xy 211.265998 43.381447) (xy 211.220946 43.420484) (xy 211.212182 43.424949) (xy 211.040213 43.54989) + (xy 210.88989 43.700213) (xy 210.764951 43.872179) (xy 210.668444 44.061585) (xy 210.602753 44.26376) + (xy 210.5695 44.473713) (xy 210.5695 44.686286) (xy 210.592508 44.831557) (xy 210.602754 44.896243) + (xy 210.660535 45.074075) (xy 210.668444 45.098414) (xy 210.764951 45.28782) (xy 210.88989 45.459786) + (xy 211.040213 45.610109) (xy 211.212182 45.73505) (xy 211.220946 45.739516) (xy 211.271742 45.787491) + (xy 211.288536 45.855312) (xy 211.265998 45.921447) (xy 211.220946 45.960484) (xy 211.212182 45.964949) + (xy 211.040213 46.08989) (xy 210.88989 46.240213) (xy 210.764951 46.412179) (xy 210.668444 46.601585) + (xy 210.602753 46.80376) (xy 210.5695 47.013713) (xy 210.5695 47.226286) (xy 210.597264 47.401584) + (xy 210.602754 47.436243) (xy 210.655449 47.598422) (xy 210.668444 47.638414) (xy 210.764951 47.82782) + (xy 210.88989 47.999786) (xy 211.040213 48.150109) (xy 211.212182 48.27505) (xy 211.220946 48.279516) + (xy 211.271742 48.327491) (xy 211.288536 48.395312) (xy 211.265998 48.461447) (xy 211.220946 48.500484) + (xy 211.212182 48.504949) (xy 211.040213 48.62989) (xy 210.88989 48.780213) (xy 210.764951 48.952179) + (xy 210.668444 49.141585) (xy 210.602753 49.34376) (xy 210.5695 49.553713) (xy 210.5695 49.766286) + (xy 210.592508 49.911557) (xy 210.602754 49.976243) (xy 210.659217 50.150018) (xy 210.668444 50.178414) + (xy 210.764951 50.36782) (xy 210.88989 50.539786) (xy 211.040213 50.690109) (xy 211.212182 50.81505) + (xy 211.220946 50.819516) (xy 211.271742 50.867491) (xy 211.288536 50.935312) (xy 211.265998 51.001447) + (xy 211.220946 51.040484) (xy 211.212182 51.044949) (xy 211.040213 51.16989) (xy 210.88989 51.320213) + (xy 210.764951 51.492179) (xy 210.668444 51.681585) (xy 210.602753 51.88376) (xy 210.5695 52.093713) + (xy 210.5695 52.306286) (xy 210.592798 52.453387) (xy 210.602754 52.516243) (xy 210.661632 52.697451) + (xy 210.668444 52.718414) (xy 210.764951 52.90782) (xy 210.88989 53.079786) (xy 211.040213 53.230109) + (xy 211.212179 53.355048) (xy 211.212181 53.355049) (xy 211.212184 53.355051) (xy 211.401588 53.451557) + (xy 211.603757 53.517246) (xy 211.813713 53.5505) (xy 211.813714 53.5505) (xy 212.026286 53.5505) + (xy 212.026287 53.5505) (xy 212.236243 53.517246) (xy 212.438412 53.451557) (xy 212.627816 53.355051) + (xy 212.745535 53.269524) (xy 212.799786 53.230109) (xy 212.799788 53.230106) (xy 212.799792 53.230104) + (xy 212.950104 53.079792) (xy 212.950106 53.079788) (xy 212.950109 53.079786) (xy 213.075048 52.90782) + (xy 213.07505 52.907817) (xy 213.075051 52.907816) (xy 213.171557 52.718412) (xy 213.237246 52.516243) + (xy 213.2705 52.306287) (xy 213.2705 52.093713) (xy 213.237246 51.883757) (xy 213.171557 51.681588) + (xy 213.075051 51.492184) (xy 213.075049 51.492181) (xy 213.075048 51.492179) (xy 212.950109 51.320213) + (xy 212.799792 51.169896) (xy 212.752496 51.135534) (xy 212.627816 51.044949) (xy 212.617115 51.039496) + (xy 235.611581 51.039496) (xy 235.611581 52.298422) (xy 235.642371 52.492826) (xy 235.703198 52.680029) + (xy 235.770077 52.811285) (xy 235.792557 52.855405) (xy 235.908253 53.014646) (xy 236.047435 53.153828) + (xy 236.206676 53.269524) (xy 236.23148 53.282162) (xy 236.382051 53.358882) (xy 236.382053 53.358882) + (xy 236.382056 53.358884) (xy 236.482398 53.391487) (xy 236.569254 53.419709) (xy 236.763659 53.4505) + (xy 236.763664 53.4505) (xy 236.960503 53.4505) (xy 237.154907 53.419709) (xy 237.342106 53.358884) + (xy 237.517486 53.269524) (xy 237.676727 53.153828) (xy 237.815909 53.014646) (xy 237.931605 52.855405) + (xy 238.020965 52.680025) (xy 238.08179 52.492826) (xy 238.088036 52.453393) (xy 238.112581 52.298422) + (xy 238.112581 51.707255) (xy 238.132266 51.640216) (xy 238.1489 51.619574) (xy 239.792235 49.976239) + (xy 241.453828 48.314646) (xy 241.547233 48.186086) (xy 241.569524 48.155405) (xy 241.658884 47.980025) + (xy 241.699945 47.853652) (xy 241.719709 47.792827) (xy 241.736504 47.686785) (xy 241.7505 47.598422) + (xy 241.7505 41.453039) (xy 241.770185 41.386) (xy 241.786814 41.365363) (xy 245.589427 37.56275) + (xy 245.650746 37.529268) (xy 245.720438 37.534252) (xy 245.776371 37.576124) (xy 245.787589 37.594139) + (xy 245.845375 37.70755) (xy 245.884728 37.761716) (xy 246.517037 37.129408) (xy 246.534075 37.192993) + (xy 246.599901 37.307007) (xy 246.692993 37.400099) (xy 246.807007 37.465925) (xy 246.87059 37.482962) + (xy 246.238282 38.115269) (xy 246.238282 38.11527) (xy 246.285219 38.149371) (xy 246.327885 38.204701) + (xy 246.333864 38.274314) (xy 246.301259 38.33611) (xy 246.285219 38.350008) (xy 246.120214 38.46989) + (xy 246.120209 38.469894) (xy 245.96989 38.620213) (xy 245.844951 38.792179) (xy 245.748444 38.981585) + (xy 245.682753 39.18376) (xy 245.6495 39.393713) (xy 245.6495 39.606286) (xy 245.672508 39.751557) + (xy 245.682754 39.816243) (xy 245.723481 39.941588) (xy 245.748444 40.018414) (xy 245.844951 40.20782) + (xy 245.96989 40.379786) (xy 246.120209 40.530105) (xy 246.120214 40.530109) (xy 246.284793 40.649682) + (xy 246.327459 40.705011) (xy 246.333438 40.774625) (xy 246.300833 40.83642) (xy 246.284793 40.850318) + (xy 246.120214 40.96989) (xy 246.120209 40.969894) (xy 245.96989 41.120213) (xy 245.844951 41.292179) + (xy 245.748444 41.481585) (xy 245.682753 41.68376) (xy 245.6495 41.893713) (xy 245.6495 42.106286) + (xy 245.682753 42.316239) (xy 245.748444 42.518414) (xy 245.844951 42.70782) (xy 245.96989 42.879786) + (xy 246.120209 43.030105) (xy 246.120214 43.030109) (xy 246.284793 43.149682) (xy 246.327459 43.205011) + (xy 246.333438 43.274625) (xy 246.300833 43.33642) (xy 246.284793 43.350318) (xy 246.120214 43.46989) + (xy 246.120209 43.469894) (xy 245.96989 43.620213) (xy 245.844951 43.792179) (xy 245.748444 43.981585) + (xy 245.748443 43.981587) (xy 245.748443 43.981588) (xy 245.72245 44.061585) (xy 245.682753 44.18376) + (xy 245.6495 44.393713) (xy 245.6495 44.606286) (xy 245.676741 44.778282) (xy 245.682754 44.816243) + (xy 245.731072 44.964951) (xy 245.748444 45.018414) (xy 245.844951 45.20782) (xy 245.96989 45.379786) + (xy 246.120209 45.530105) (xy 246.120214 45.530109) (xy 246.284793 45.649682) (xy 246.327459 45.705011) + (xy 246.333438 45.774625) (xy 246.300833 45.83642) (xy 246.284793 45.850318) (xy 246.120214 45.96989) + (xy 246.120209 45.969894) (xy 245.96989 46.120213) (xy 245.844951 46.292179) (xy 245.748444 46.481585) + (xy 245.682753 46.68376) (xy 245.652867 46.872452) (xy 245.6495 46.893713) (xy 245.6495 47.106287) + (xy 245.652071 47.122517) (xy 245.676936 47.279514) (xy 245.682754 47.316243) (xy 245.744069 47.504951) + (xy 245.748444 47.518414) (xy 245.844951 47.70782) (xy 245.96989 47.879786) (xy 246.108705 48.018601) + (xy 246.14219 48.079924) (xy 246.137206 48.149616) (xy 246.095334 48.205549) (xy 246.086121 48.211821) + (xy 245.931342 48.307289) (xy 245.807289 48.431342) (xy 245.715187 48.580663) (xy 245.715186 48.580666) + (xy 245.660001 48.747203) (xy 245.660001 48.747204) (xy 245.66 48.747204) (xy 245.6495 48.849983) + (xy 245.6495 50.150001) (xy 245.649501 50.150018) (xy 245.66 50.252796) (xy 245.660001 50.252799) + (xy 245.698116 50.36782) (xy 245.715186 50.419334) (xy 245.807288 50.568656) (xy 245.931344 50.692712) + (xy 246.080666 50.784814) (xy 246.247203 50.839999) (xy 246.349991 50.8505) (xy 247.650008 50.850499) + (xy 247.752797 50.839999) (xy 247.919334 50.784814) (xy 248.068656 50.692712) (xy 248.192712 50.568656) + (xy 248.284814 50.419334) (xy 248.339999 50.252797) (xy 248.3505 50.150009) (xy 248.350499 48.849992) + (xy 248.34337 48.780208) (xy 248.339999 48.747203) (xy 248.339998 48.7472) (xy 248.301125 48.62989) + (xy 248.284814 48.580666) (xy 248.192712 48.431344) (xy 248.068656 48.307288) (xy 247.919334 48.215186) + (xy 247.919333 48.215185) (xy 247.913878 48.211821) (xy 247.867154 48.159873) (xy 247.855931 48.09091) + (xy 247.883775 48.026828) (xy 247.891272 48.018623) (xy 248.030104 47.879792) (xy 248.047171 47.856302) + (xy 248.155048 47.70782) (xy 248.155047 47.70782) (xy 248.155051 47.707816) (xy 248.251557 47.518412) + (xy 248.317246 47.316243) (xy 248.3505 47.106287) (xy 248.3505 46.893713) (xy 248.317246 46.683757) + (xy 248.251557 46.481588) (xy 248.155051 46.292184) (xy 248.155049 46.292181) (xy 248.155048 46.292179) + (xy 248.030109 46.120213) (xy 247.879792 45.969896) (xy 247.866837 45.960484) (xy 247.715204 45.850316) + (xy 247.67254 45.794989) (xy 247.666561 45.725376) (xy 247.699166 45.66358) (xy 247.715199 45.649686) + (xy 247.879792 45.530104) (xy 248.030104 45.379792) (xy 248.030106 45.379788) (xy 248.030109 45.379786) + (xy 248.155048 45.20782) (xy 248.155047 45.20782) (xy 248.155051 45.207816) (xy 248.251557 45.018412) + (xy 248.317246 44.816243) (xy 248.3505 44.606287) (xy 248.3505 44.393713) (xy 248.317246 44.183757) + (xy 248.251557 43.981588) (xy 248.155051 43.792184) (xy 248.155049 43.792181) (xy 248.155048 43.792179) + (xy 248.030109 43.620213) (xy 247.879792 43.469896) (xy 247.811784 43.420486) (xy 247.715204 43.350316) + (xy 247.67254 43.294989) (xy 247.666561 43.225376) (xy 247.699166 43.16358) (xy 247.715199 43.149686) + (xy 247.879792 43.030104) (xy 248.030104 42.879792) (xy 248.030106 42.879788) (xy 248.030109 42.879786) + (xy 248.155048 42.70782) (xy 248.155047 42.70782) (xy 248.155051 42.707816) (xy 248.251557 42.518412) + (xy 248.317246 42.316243) (xy 248.3505 42.106287) (xy 248.3505 41.893713) (xy 248.317246 41.683757) + (xy 248.251557 41.481588) (xy 248.155051 41.292184) (xy 248.155049 41.292181) (xy 248.155048 41.292179) + (xy 248.030109 41.120213) (xy 247.879792 40.969896) (xy 247.86757 40.961016) (xy 247.715204 40.850316) + (xy 247.67254 40.794989) (xy 247.666561 40.725376) (xy 247.699166 40.66358) (xy 247.715199 40.649686) + (xy 247.879792 40.530104) (xy 248.030104 40.379792) (xy 248.030106 40.379788) (xy 248.030109 40.379786) + (xy 248.155048 40.20782) (xy 248.155047 40.20782) (xy 248.155051 40.207816) (xy 248.251557 40.018412) + (xy 248.317246 39.816243) (xy 248.3505 39.606287) (xy 248.3505 39.393713) (xy 248.317246 39.183757) + (xy 248.251557 38.981588) (xy 248.155051 38.792184) (xy 248.155049 38.792181) (xy 248.155048 38.792179) + (xy 248.030109 38.620213) (xy 247.87979 38.469894) (xy 247.879785 38.46989) (xy 247.714781 38.350008) + (xy 247.672115 38.294678) (xy 247.666136 38.225065) (xy 247.698741 38.16327) (xy 247.714781 38.149372) + (xy 247.761716 38.115271) (xy 247.761717 38.11527) (xy 247.129408 37.482962) (xy 247.192993 37.465925) + (xy 247.307007 37.400099) (xy 247.400099 37.307007) (xy 247.465925 37.192993) (xy 247.482962 37.129408) + (xy 248.11527 37.761717) (xy 248.11527 37.761716) (xy 248.154622 37.707554) (xy 248.251095 37.518217) + (xy 248.316757 37.31613) (xy 248.316757 37.316127) (xy 248.35 37.106246) (xy 248.35 36.893753) (xy 248.316757 36.683872) + (xy 248.316757 36.683869) (xy 248.251095 36.481782) (xy 248.154624 36.292449) (xy 248.11527 36.238282) + (xy 248.115269 36.238282) (xy 247.482962 36.87059) (xy 247.465925 36.807007) (xy 247.400099 36.692993) + (xy 247.307007 36.599901) (xy 247.192993 36.534075) (xy 247.129408 36.517037) (xy 247.761716 35.884728) + (xy 247.71478 35.850628) (xy 247.672114 35.795298) (xy 247.666135 35.725685) (xy 247.69874 35.663889) + (xy 247.714776 35.649994) (xy 247.879792 35.530104) (xy 248.030104 35.379792) (xy 248.030106 35.379788) + (xy 248.030109 35.379786) (xy 248.155048 35.20782) (xy 248.155047 35.20782) (xy 248.155051 35.207816) + (xy 248.251557 35.018412) (xy 248.317246 34.816243) (xy 248.3505 34.606287) (xy 248.3505 34.393713) + (xy 248.317246 34.183757) (xy 248.251557 33.981588) (xy 248.155051 33.792184) (xy 248.155049 33.792181) + (xy 248.155048 33.792179) (xy 248.030109 33.620213) (xy 247.879786 33.46989) (xy 247.70782 33.344951) + (xy 247.518414 33.248444) (xy 247.518413 33.248443) (xy 247.518412 33.248443) (xy 247.316243 33.182754) + (xy 247.316241 33.182753) (xy 247.31624 33.182753) (xy 247.154957 33.157208) (xy 247.106287 33.1495) + (xy 246.893713 33.1495) (xy 246.845042 33.157208) (xy 246.68376 33.182753) (xy 246.481585 33.248444) + (xy 246.292179 33.344951) (xy 246.120213 33.46989) (xy 245.969895 33.620208) (xy 245.908875 33.704194) + (xy 245.896239 33.718988) (xy 239.546174 40.069055) (xy 239.546172 40.069058) (xy 239.496485 40.137445) + (xy 239.430476 40.228298) (xy 239.341115 40.403677) (xy 239.341114 40.40368) (xy 239.309657 40.500499) + (xy 239.28029 40.59088) (xy 239.28029 40.590881) (xy 239.2495 40.785281) (xy 239.2495 46.930664) + (xy 239.229815 46.997703) (xy 239.213181 47.018345) (xy 235.908255 50.32327) (xy 235.908255 50.323271) + (xy 235.908253 50.323273) (xy 235.875888 50.36782) (xy 235.792557 50.482513) (xy 235.70275 50.65877) + (xy 235.701689 50.662531) (xy 235.642373 50.845088) (xy 235.611581 51.039496) (xy 212.617115 51.039496) + (xy 212.611294 51.03653) (xy 212.604162 51.03153) (xy 212.587581 51.010761) (xy 212.568259 50.992512) + (xy 212.56612 50.983877) (xy 212.560571 50.976926) (xy 212.557851 50.950488) (xy 212.551463 50.924692) + (xy 212.554332 50.916271) (xy 212.553422 50.907423) (xy 212.565426 50.883712) (xy 212.573999 50.858556) + (xy 212.581419 50.852126) (xy 212.584983 50.845088) (xy 212.599122 50.836786) (xy 212.619054 50.819515) + (xy 212.627816 50.815051) (xy 212.669437 50.784812) (xy 212.799786 50.690109) (xy 212.799788 50.690106) + (xy 212.799792 50.690104) (xy 212.950104 50.539792) (xy 212.950106 50.539788) (xy 212.950109 50.539786) + (xy 213.075048 50.36782) (xy 213.075047 50.36782) (xy 213.075051 50.367816) (xy 213.171557 50.178412) + (xy 213.237246 49.976243) (xy 213.2705 49.766287) (xy 213.2705 49.553713) (xy 213.237246 49.343757) + (xy 213.171557 49.141588) (xy 213.075051 48.952184) (xy 213.075049 48.952181) (xy 213.075048 48.952179) + (xy 212.950109 48.780213) (xy 212.799786 48.62989) (xy 212.62782 48.504951) (xy 212.627115 48.504591) + (xy 212.619054 48.500485) (xy 212.568259 48.452512) (xy 212.551463 48.384692) (xy 212.573999 48.318556) + (xy 212.619054 48.279515) (xy 212.627816 48.275051) (xy 212.711578 48.214195) (xy 212.799786 48.150109) + (xy 212.799788 48.150106) (xy 212.799792 48.150104) (xy 212.950104 47.999792) (xy 212.950106 47.999788) + (xy 212.950109 47.999786) (xy 213.075048 47.82782) (xy 213.075047 47.82782) (xy 213.075051 47.827816) + (xy 213.171557 47.638412) (xy 213.237246 47.436243) (xy 213.2705 47.226287) (xy 213.2705 47.013713) + (xy 213.237246 46.803757) (xy 213.171557 46.601588) (xy 213.075051 46.412184) (xy 213.075049 46.412181) + (xy 213.075048 46.412179) (xy 212.950109 46.240213) (xy 212.799786 46.08989) (xy 212.62782 45.964951) + (xy 212.627115 45.964591) (xy 212.619054 45.960485) (xy 212.568259 45.912512) (xy 212.551463 45.844692) + (xy 212.573999 45.778556) (xy 212.619054 45.739515) (xy 212.627816 45.735051) (xy 212.669163 45.705011) + (xy 212.799786 45.610109) (xy 212.799788 45.610106) (xy 212.799792 45.610104) (xy 212.950104 45.459792) + (xy 212.954704 45.45346) (xy 213.025517 45.355996) (xy 213.075048 45.28782) (xy 213.075051 45.287816) + (xy 213.171557 45.098412) (xy 213.237246 44.896243) (xy 213.2705 44.686287) (xy 213.2705 44.473713) + (xy 213.237246 44.263757) (xy 213.171557 44.061588) (xy 213.075051 43.872184) (xy 213.075049 43.872181) + (xy 213.075048 43.872179) (xy 212.950109 43.700213) (xy 212.799786 43.54989) (xy 212.62782 43.424951) + (xy 212.627115 43.424591) (xy 212.619054 43.420485) (xy 212.568259 43.372512) (xy 212.551463 43.304692) + (xy 212.573999 43.238556) (xy 212.619054 43.199515) (xy 212.627816 43.195051) (xy 212.649789 43.179086) + (xy 212.799786 43.070109) (xy 212.799788 43.070106) (xy 212.799792 43.070104) (xy 212.950104 42.919792) + (xy 212.950106 42.919788) (xy 212.950109 42.919786) (xy 213.075048 42.74782) (xy 213.075047 42.74782) + (xy 213.075051 42.747816) (xy 213.171557 42.558412) (xy 213.237246 42.356243) (xy 213.2705 42.146287) + (xy 213.2705 41.933713) (xy 213.237246 41.723757) (xy 213.171557 41.521588) (xy 213.075051 41.332184) + (xy 213.075049 41.332181) (xy 213.075048 41.332179) (xy 212.950109 41.160213) (xy 212.79979 41.009894) + (xy 212.799785 41.00989) (xy 212.794399 41.005977) (xy 212.751731 40.950649) (xy 212.74575 40.881036) + (xy 212.778354 40.81924) (xy 212.828278 40.787951) (xy 212.839117 40.784359) (xy 212.839124 40.784356) + (xy 212.988345 40.692315) (xy 213.112315 40.568345) (xy 213.204356 40.419124) (xy 213.204358 40.419119) + (xy 213.226032 40.353713) (xy 220.0495 40.353713) (xy 220.0495 40.566286) (xy 220.082497 40.774625) + (xy 220.082754 40.776243) (xy 220.145675 40.969894) (xy 220.148444 40.978414) (xy 220.244951 41.16782) + (xy 220.36989 41.339786) (xy 220.520213 41.490109) (xy 220.692182 41.61505) (xy 220.700946 41.619516) + (xy 220.751742 41.667491) (xy 220.768536 41.735312) (xy 220.745998 41.801447) (xy 220.700946 41.840484) + (xy 220.692182 41.844949) (xy 220.520213 41.96989) (xy 220.36989 42.120213) (xy 220.244951 42.292179) + (xy 220.148444 42.481585) (xy 220.082753 42.68376) (xy 220.0495 42.893713) (xy 220.0495 43.106286) + (xy 220.082606 43.315312) (xy 220.082754 43.316243) (xy 220.133919 43.473713) (xy 220.148444 43.518414) + (xy 220.244951 43.70782) (xy 220.36989 43.879786) (xy 220.520213 44.030109) (xy 220.692179 44.155048) + (xy 220.692181 44.155049) (xy 220.692184 44.155051) (xy 220.701493 44.159794) (xy 220.75229 44.207766) + (xy 220.769087 44.275587) (xy 220.746552 44.341722) (xy 220.701505 44.38076) (xy 220.692446 44.385376) + (xy 220.69244 44.38538) (xy 220.638282 44.424727) (xy 220.638282 44.424728) (xy 221.270591 45.057037) + (xy 221.207007 45.074075) (xy 221.092993 45.139901) (xy 220.999901 45.232993) (xy 220.934075 45.347007) + (xy 220.917037 45.410591) (xy 220.284728 44.778282) (xy 220.284727 44.778282) (xy 220.24538 44.832439) + (xy 220.148904 45.021782) (xy 220.083242 45.223869) (xy 220.083242 45.223872) (xy 220.05 45.433753) + (xy 220.05 45.646246) (xy 220.083242 45.856127) (xy 220.083242 45.85613) (xy 220.148904 46.058217) + (xy 220.245375 46.24755) (xy 220.284728 46.301716) (xy 220.917036 45.669407) (xy 220.934075 45.732993) + (xy 220.999901 45.847007) (xy 221.092993 45.940099) (xy 221.207007 46.005925) (xy 221.27059 46.022962) + (xy 220.60037 46.693181) (xy 220.539047 46.726666) (xy 220.512698 46.7295) (xy 220.502134 46.7295) + (xy 220.502123 46.729501) (xy 220.442516 46.735908) (xy 220.307671 46.786202) (xy 220.307664 46.786206) + (xy 220.192455 46.872452) (xy 220.192452 46.872455) (xy 220.106206 46.987664) (xy 220.106202 46.987671) + (xy 220.055908 47.122517) (xy 220.052942 47.150109) (xy 220.049501 47.182123) (xy 220.0495 47.182135) + (xy 220.0495 48.97787) (xy 220.049501 48.977876) (xy 220.055908 49.037483) (xy 220.106202 49.172328) + (xy 220.106206 49.172335) (xy 220.192452 49.287544) (xy 220.192455 49.287547) (xy 220.307664 49.373793) + (xy 220.307671 49.373797) (xy 220.442517 49.424091) (xy 220.442516 49.424091) (xy 220.449444 49.424835) + (xy 220.502127 49.4305) (xy 222.297872 49.430499) (xy 222.357483 49.424091) (xy 222.492331 49.373796) + (xy 222.607546 49.287546) (xy 222.693796 49.172331) (xy 222.744091 49.037483) (xy 222.7505 48.977873) + (xy 222.750499 47.182128) (xy 222.744091 47.122517) (xy 222.738037 47.106286) (xy 222.693797 46.987671) + (xy 222.693793 46.987664) (xy 222.607547 46.872455) (xy 222.607544 46.872452) (xy 222.492335 46.786206) + (xy 222.492328 46.786202) (xy 222.357482 46.735908) (xy 222.357483 46.735908) (xy 222.297883 46.729501) + (xy 222.297881 46.7295) (xy 222.297873 46.7295) (xy 222.297865 46.7295) (xy 222.287309 46.7295) + (xy 222.22027 46.709815) (xy 222.199628 46.693181) (xy 221.529408 46.022962) (xy 221.592993 46.005925) + (xy 221.707007 45.940099) (xy 221.800099 45.847007) (xy 221.865925 45.732993) (xy 221.882962 45.669408) + (xy 222.51527 46.301717) (xy 222.51527 46.301716) (xy 222.554622 46.247554) (xy 222.651095 46.058217) + (xy 222.716757 45.85613) (xy 222.716757 45.856127) (xy 222.75 45.646246) (xy 222.75 45.433753) (xy 222.716757 45.223872) + (xy 222.716757 45.223869) (xy 222.651095 45.021782) (xy 222.554624 44.832449) (xy 222.51527 44.778282) + (xy 222.515269 44.778282) (xy 221.882962 45.41059) (xy 221.865925 45.347007) (xy 221.800099 45.232993) + (xy 221.707007 45.139901) (xy 221.592993 45.074075) (xy 221.529409 45.057037) (xy 222.161716 44.424728) + (xy 222.107547 44.385373) (xy 222.107547 44.385372) (xy 222.0985 44.380763) (xy 222.047706 44.332788) + (xy 222.030912 44.264966) (xy 222.053451 44.198832) (xy 222.098508 44.159793) (xy 222.107816 44.155051) + (xy 222.236462 44.061585) (xy 222.279786 44.030109) (xy 222.279788 44.030106) (xy 222.279792 44.030104) + (xy 222.430104 43.879792) (xy 222.430106 43.879788) (xy 222.430109 43.879786) (xy 222.555048 43.70782) + (xy 222.555047 43.70782) (xy 222.555051 43.707816) (xy 222.651557 43.518412) (xy 222.717246 43.316243) + (xy 222.7505 43.106287) (xy 222.7505 42.893713) (xy 222.717246 42.683757) (xy 222.651557 42.481588) + (xy 222.555051 42.292184) (xy 222.555049 42.292181) (xy 222.555048 42.292179) (xy 222.430109 42.120213) + (xy 222.279786 41.96989) (xy 222.10782 41.844951) (xy 222.107115 41.844591) (xy 222.099054 41.840485) + (xy 222.048259 41.792512) (xy 222.031463 41.724692) (xy 222.053999 41.658556) (xy 222.099054 41.619515) + (xy 222.107816 41.615051) (xy 222.185771 41.558414) (xy 222.279786 41.490109) (xy 222.279788 41.490106) + (xy 222.279792 41.490104) (xy 222.430104 41.339792) (xy 222.430106 41.339788) (xy 222.430109 41.339786) + (xy 222.555048 41.16782) (xy 222.555047 41.16782) (xy 222.555051 41.167816) (xy 222.651557 40.978412) + (xy 222.717246 40.776243) (xy 222.7505 40.566287) (xy 222.7505 40.353713) (xy 222.717246 40.143757) + (xy 222.651557 39.941588) (xy 222.555051 39.752184) (xy 222.555049 39.752181) (xy 222.555048 39.752179) + (xy 222.430109 39.580213) (xy 222.279786 39.42989) (xy 222.10782 39.304951) (xy 221.918414 39.208444) + (xy 221.918413 39.208443) (xy 221.918412 39.208443) (xy 221.716243 39.142754) (xy 221.716241 39.142753) + (xy 221.71624 39.142753) (xy 221.554957 39.117208) (xy 221.506287 39.1095) (xy 221.293713 39.1095) + (xy 221.245042 39.117208) (xy 221.08376 39.142753) (xy 220.881585 39.208444) (xy 220.692179 39.304951) + (xy 220.520213 39.42989) (xy 220.36989 39.580213) (xy 220.244951 39.752179) (xy 220.148444 39.941585) + (xy 220.082753 40.14376) (xy 220.0495 40.353713) (xy 213.226032 40.353713) (xy 213.240571 40.309837) + (xy 213.259505 40.252697) (xy 213.259506 40.25269) (xy 213.269999 40.149986) (xy 213.27 40.149973) + (xy 213.27 39.75) (xy 212.353012 39.75) (xy 212.385925 39.692993) (xy 212.42 39.565826) (xy 212.42 39.434174) + (xy 212.385925 39.307007) (xy 212.353012 39.25) (xy 213.269999 39.25) (xy 213.269999 38.850028) + (xy 213.269998 38.850013) (xy 213.259505 38.747302) (xy 213.204358 38.58088) (xy 213.204356 38.580875) + (xy 213.112315 38.431654) (xy 212.988345 38.307684) (xy 212.839124 38.215643) (xy 212.839119 38.215641) + (xy 212.672697 38.160494) (xy 212.67269 38.160493) (xy 212.569986 38.15) (xy 212.17 38.15) (xy 212.17 39.066988) + (xy 212.112993 39.034075) (xy 211.985826 39) (xy 211.854174 39) (xy 211.727007 39.034075) (xy 211.67 39.066988) + (xy 211.67 38.15) (xy 211.270028 38.15) (xy 211.270012 38.150001) (xy 211.167302 38.160494) (xy 211.00088 38.215641) + (xy 211.000875 38.215643) (xy 210.851654 38.307684) (xy 210.727684 38.431654) (xy 210.635643 38.580875) + (xy 210.635641 38.58088) (xy 210.580494 38.747302) (xy 210.580493 38.747309) (xy 210.57 38.850013) + (xy 210.57 39.25) (xy 211.486988 39.25) (xy 211.454075 39.307007) (xy 211.42 39.434174) (xy 211.42 39.565826) + (xy 211.454075 39.692993) (xy 211.486988 39.75) (xy 210.570001 39.75) (xy 210.570001 40.149986) + (xy 210.580494 40.252697) (xy 210.635641 40.419119) (xy 210.635643 40.419124) (xy 210.727684 40.568345) + (xy 210.851654 40.692315) (xy 211.000875 40.784356) (xy 211.000878 40.784357) (xy 211.011723 40.787951) + (xy 211.069167 40.827724) (xy 211.09599 40.89224) (xy 211.083675 40.961016) (xy 211.045605 41.005974) + (xy 211.040211 41.009892) (xy 210.88989 41.160213) (xy 210.764951 41.332179) (xy 210.668444 41.521585) + (xy 210.602753 41.72376) (xy 210.5695 41.933713) (xy 158.2005 41.933713) (xy 158.2005 33.431004) + (xy 158.173581 33.295677) (xy 158.17358 33.295676) (xy 158.17358 33.295672) (xy 158.126808 33.182753) + (xy 158.120778 33.168195) (xy 158.120771 33.168182) (xy 158.044114 33.053458) (xy 158.044111 33.053454) + (xy 157.946545 32.955888) (xy 157.946541 32.955885) (xy 157.831817 32.879228) (xy 157.831804 32.879221) + (xy 157.704332 32.826421) (xy 157.704322 32.826418) (xy 157.568995 32.7995) (xy 157.568993 32.7995) + (xy 140.568994 32.7995) (xy 140.431006 32.7995) (xy 140.431004 32.7995) (xy 140.295677 32.826418) + (xy 140.295667 32.826421) (xy 140.168192 32.879222) (xy 140.053454 32.955887) (xy 138.955887 34.053454) + (xy 138.879222 34.168192) (xy 138.826421 34.295667) (xy 138.826418 34.295679) (xy 138.805378 34.401457) + (xy 138.805378 34.401459) (xy 138.7995 34.431007) (xy 138.7995 36.871006) (xy 138.7995 37.008994) + (xy 138.7995 37.008996) (xy 138.799499 37.008996) (xy 138.826418 37.144322) (xy 138.826421 37.144332) + (xy 138.879222 37.271807) (xy 138.955887 37.386545) (xy 138.955888 37.386546) (xy 142.239492 40.670149) + (xy 142.272977 40.731472) (xy 142.274284 40.777227) (xy 142.2495 40.933712) (xy 142.2495 41.146286) + (xy 142.279442 41.335337) (xy 142.282754 41.356243) (xy 142.326248 41.490104) (xy 142.348444 41.558414) + (xy 142.444951 41.74782) (xy 142.56989 41.919786) (xy 142.720213 42.070109) (xy 142.892182 42.19505) + (xy 142.900946 42.199516) (xy 142.951742 42.247491) (xy 142.968536 42.315312) (xy 142.945998 42.381447) + (xy 142.900946 42.420484) (xy 142.892182 42.424949) (xy 142.720213 42.54989) (xy 142.56989 42.700213) + (xy 142.444951 42.872179) (xy 142.348444 43.061585) (xy 142.282753 43.26376) (xy 142.2495 43.473713) + (xy 142.2495 43.686286) (xy 142.278942 43.872179) (xy 142.282754 43.896243) (xy 142.326248 44.030104) + (xy 142.348444 44.098414) (xy 142.444951 44.28782) (xy 142.56989 44.459786) (xy 142.720213 44.610109) + (xy 142.892182 44.73505) (xy 142.900946 44.739516) (xy 142.951742 44.787491) (xy 142.968536 44.855312) + (xy 142.945998 44.921447) (xy 142.900946 44.960484) (xy 142.892182 44.964949) (xy 142.720213 45.08989) + (xy 142.56989 45.240213) (xy 142.444951 45.41218) (xy 142.356839 45.585108) (xy 142.308864 45.635904) + (xy 142.241043 45.652699) (xy 142.174908 45.630161) (xy 142.158673 45.616494) (xy 137.161819 40.61964) + (xy 137.128334 40.558317) (xy 137.1255 40.531959) (xy 137.1255 34.810452) (xy 137.145185 34.743413) + (xy 137.161819 34.722771) (xy 137.947772 33.936819) (xy 138.009095 33.903334) (xy 138.035453 33.9005) + (xy 138.088693 33.9005) (xy 138.088694 33.900499) (xy 138.146682 33.888964) (xy 138.262658 33.865896) + (xy 138.262661 33.865894) (xy 138.262666 33.865894) (xy 138.426547 33.798013) (xy 138.574035 33.699464) + (xy 138.699464 33.574035) (xy 138.798013 33.426547) (xy 138.865894 33.262666) (xy 138.868724 33.248443) + (xy 138.900499 33.088695) (xy 138.9005 33.088693) (xy 138.9005 32.911306) (xy 138.900499 32.911304) + (xy 138.865896 32.737341) (xy 138.865893 32.737332) (xy 138.798016 32.573459) (xy 138.798009 32.573446) + (xy 138.699464 32.425965) (xy 138.699461 32.425961) (xy 138.574038 32.300538) (xy 138.574034 32.300535) + (xy 138.426553 32.20199) (xy 138.42654 32.201983) (xy 138.262667 32.134106) (xy 138.262658 32.134103) + (xy 138.088694 32.0995) (xy 138.088691 32.0995) (xy 137.911309 32.0995) (xy 137.911306 32.0995) + (xy 137.737341 32.134103) (xy 137.737332 32.134106) (xy 137.573459 32.201983) (xy 137.573446 32.20199) + (xy 137.425965 32.300535) (xy 137.425961 32.300538) (xy 137.300538 32.425961) (xy 137.300535 32.425965) + (xy 137.20199 32.573446) (xy 137.201983 32.573459) (xy 137.134106 32.737332) (xy 137.134103 32.737341) + (xy 137.0995 32.911304) (xy 137.0995 32.964547) (xy 137.079815 33.031586) (xy 137.063181 33.052228) + (xy 136.014144 34.101264) (xy 136.014138 34.101272) (xy 135.945692 34.203705) (xy 135.945684 34.20372) + (xy 135.912346 34.284207) (xy 135.907599 34.295672) (xy 135.898537 34.317549) (xy 135.881848 34.401457) + (xy 135.875972 34.430998) (xy 135.87597 34.431006) (xy 135.874501 34.438388) (xy 135.8745 34.438399) + (xy 135.8745 40.904019) (xy 135.880445 40.933913) (xy 135.898535 41.024856) (xy 135.898537 41.024864) + (xy 135.912347 41.058204) (xy 135.912347 41.058205) (xy 135.945685 41.138692) (xy 135.94569 41.138701) + (xy 135.979914 41.189919) (xy 135.979915 41.189921) (xy 136.01414 41.241143) (xy 136.014141 41.241144) + (xy 136.014142 41.241145) (xy 136.101267 41.32827) (xy 136.101268 41.32827) (xy 136.108335 41.335337) + (xy 136.108334 41.335337) (xy 136.108338 41.33534) (xy 142.487985 47.714988) (xy 142.52147 47.776311) + (xy 142.516486 47.846003) (xy 142.500623 47.875553) (xy 142.444949 47.952183) (xy 142.444948 47.952185) + (xy 142.348444 48.141585) (xy 142.282753 48.34376) (xy 142.2495 48.553713) (xy 142.2495 48.766286) + (xy 142.278942 48.952179) (xy 142.282754 48.976243) (xy 142.346468 49.172335) (xy 142.348444 49.178414) + (xy 142.444951 49.36782) (xy 142.56989 49.539786) (xy 142.720213 49.690109) (xy 142.892182 49.81505) + (xy 142.900946 49.819516) (xy 142.951742 49.867491) (xy 142.968536 49.935312) (xy 142.945998 50.001447) + (xy 142.900946 50.040484) (xy 142.892182 50.044949) (xy 142.720213 50.16989) (xy 142.56989 50.320213) + (xy 142.444951 50.492179) (xy 142.348444 50.681585) (xy 142.282753 50.88376) (xy 142.261904 51.015398) + (xy 142.231975 51.078533) (xy 142.172663 51.115464) (xy 142.139431 51.12) (xy 129.820569 51.12) + (xy 129.75353 51.100315) (xy 129.707775 51.047511) (xy 129.698096 51.015398) (xy 129.694471 50.992512) + (xy 129.677246 50.883757) (xy 129.611557 50.681588) (xy 129.515051 50.492184) (xy 129.515049 50.492181) + (xy 129.515048 50.492179) (xy 129.390109 50.320213) (xy 129.239786 50.16989) (xy 129.06782 50.044951) + (xy 129.067115 50.044591) (xy 129.059054 50.040485) (xy 129.008259 49.992512) (xy 128.991463 49.924692) + (xy 129.013999 49.858556) (xy 129.059054 49.819515) (xy 129.067816 49.815051) (xy 129.089789 49.799086) + (xy 129.239786 49.690109) (xy 129.239788 49.690106) (xy 129.239792 49.690104) (xy 129.390104 49.539792) + (xy 129.390106 49.539788) (xy 129.390109 49.539786) (xy 129.515048 49.36782) (xy 129.515047 49.36782) + (xy 129.515051 49.367816) (xy 129.611557 49.178412) (xy 129.677246 48.976243) (xy 129.7105 48.766287) + (xy 129.7105 48.553713) (xy 129.677246 48.343757) (xy 129.611557 48.141588) (xy 129.515051 47.952184) + (xy 129.515049 47.952181) (xy 129.515048 47.952179) (xy 129.390109 47.780213) (xy 129.239786 47.62989) + (xy 129.06782 47.504951) (xy 129.067115 47.504591) (xy 129.059054 47.500485) (xy 129.008259 47.452512) + (xy 128.991463 47.384692) (xy 129.013999 47.318556) (xy 129.059054 47.279515) (xy 129.067816 47.275051) + (xy 129.089789 47.259086) (xy 129.239786 47.150109) (xy 129.239788 47.150106) (xy 129.239792 47.150104) + (xy 129.390104 46.999792) (xy 129.390106 46.999788) (xy 129.390109 46.999786) (xy 129.515048 46.82782) + (xy 129.515047 46.82782) (xy 129.515051 46.827816) (xy 129.611557 46.638412) (xy 129.677246 46.436243) + (xy 129.7105 46.226287) (xy 129.7105 46.013713) (xy 129.677246 45.803757) (xy 129.611557 45.601588) + (xy 129.515051 45.412184) (xy 129.515049 45.412181) (xy 129.515048 45.412179) (xy 129.390109 45.240213) + (xy 129.239786 45.08989) (xy 129.06782 44.964951) (xy 129.067115 44.964591) (xy 129.059054 44.960485) + (xy 129.008259 44.912512) (xy 128.991463 44.844692) (xy 129.013999 44.778556) (xy 129.059054 44.739515) + (xy 129.067816 44.735051) (xy 129.089789 44.719086) (xy 129.239786 44.610109) (xy 129.239788 44.610106) + (xy 129.239792 44.610104) (xy 129.390104 44.459792) (xy 129.390106 44.459788) (xy 129.390109 44.459786) + (xy 129.515048 44.28782) (xy 129.515047 44.28782) (xy 129.515051 44.287816) (xy 129.611557 44.098412) + (xy 129.677246 43.896243) (xy 129.7105 43.686287) (xy 129.7105 43.473713) (xy 129.677246 43.263757) + (xy 129.611557 43.061588) (xy 129.515051 42.872184) (xy 129.515049 42.872181) (xy 129.515048 42.872179) + (xy 129.390109 42.700213) (xy 129.239786 42.54989) (xy 129.06782 42.424951) (xy 129.067115 42.424591) + (xy 129.059054 42.420485) (xy 129.008259 42.372512) (xy 128.991463 42.304692) (xy 129.013999 42.238556) + (xy 129.059054 42.199515) (xy 129.067816 42.195051) (xy 129.089789 42.179086) (xy 129.239786 42.070109) + (xy 129.239788 42.070106) (xy 129.239792 42.070104) (xy 129.390104 41.919792) (xy 129.390106 41.919788) + (xy 129.390109 41.919786) (xy 129.515048 41.74782) (xy 129.515047 41.74782) (xy 129.515051 41.747816) + (xy 129.611557 41.558412) (xy 129.677246 41.356243) (xy 129.7105 41.146287) (xy 129.7105 40.933713) + (xy 129.677246 40.723757) (xy 129.611557 40.521588) (xy 129.515051 40.332184) (xy 129.515049 40.332181) + (xy 129.515048 40.332179) (xy 129.390109 40.160213) (xy 129.239786 40.00989) (xy 129.06782 39.884951) + (xy 129.067115 39.884591) (xy 129.059054 39.880485) (xy 129.008259 39.832512) (xy 128.991463 39.764692) + (xy 129.013999 39.698556) (xy 129.059054 39.659515) (xy 129.067816 39.655051) (xy 129.12257 39.61527) + (xy 129.239786 39.530109) (xy 129.239788 39.530106) (xy 129.239792 39.530104) (xy 129.390104 39.379792) + (xy 129.390106 39.379788) (xy 129.390109 39.379786) (xy 129.515048 39.20782) (xy 129.515047 39.20782) + (xy 129.515051 39.207816) (xy 129.611557 39.018412) (xy 129.677246 38.816243) (xy 129.7105 38.606287) + (xy 129.7105 38.393713) (xy 129.677246 38.183757) (xy 129.611557 37.981588) (xy 129.515051 37.792184) + (xy 129.515049 37.792181) (xy 129.515048 37.792179) (xy 129.390109 37.620213) (xy 129.239786 37.46989) + (xy 129.06782 37.344951) (xy 129.067115 37.344591) (xy 129.059054 37.340485) (xy 129.008259 37.292512) + (xy 128.991463 37.224692) (xy 129.013999 37.158556) (xy 129.059054 37.119515) (xy 129.067816 37.115051) + (xy 129.135569 37.065826) (xy 129.239786 36.990109) (xy 129.239788 36.990106) (xy 129.239792 36.990104) + (xy 129.390104 36.839792) (xy 129.390106 36.839788) (xy 129.390109 36.839786) (xy 129.515048 36.66782) + (xy 129.515047 36.66782) (xy 129.515051 36.667816) (xy 129.611557 36.478412) (xy 129.677246 36.276243) + (xy 129.7105 36.066287) (xy 129.7105 35.853713) (xy 129.677246 35.643757) (xy 129.611557 35.441588) + (xy 129.515051 35.252184) (xy 129.515049 35.252181) (xy 129.515048 35.252179) (xy 129.390109 35.080213) + (xy 129.239786 34.92989) (xy 129.06782 34.804951) (xy 128.878414 34.708444) (xy 128.878413 34.708443) + (xy 128.878412 34.708443) (xy 128.676243 34.642754) (xy 128.676241 34.642753) (xy 128.67624 34.642753) + (xy 128.514957 34.617208) (xy 128.466287 34.6095) (xy 128.253713 34.6095) (xy 128.205042 34.617208) + (xy 128.04376 34.642753) (xy 127.841585 34.708444) (xy 127.652179 34.804951) (xy 127.480213 34.92989) + (xy 127.32989 35.080213) (xy 127.204951 35.252179) (xy 127.108444 35.441585) (xy 127.042753 35.64376) + (xy 127.0095 35.853713) (xy 124.0005 35.853713) (xy 124.0005 32.004427) (xy 124.000816 31.995581) + (xy 124.01513 31.795443) (xy 124.015131 31.795442) (xy 124.01513 31.795436) (xy 124.017646 31.777938) + (xy 124.059356 31.5862) (xy 124.064335 31.569242) (xy 124.132911 31.385382) (xy 124.140251 31.36931) + (xy 124.234294 31.197083) (xy 124.24385 31.182214) (xy 124.361443 31.025128) (xy 124.373017 31.011771) + (xy 124.511771 30.873017) (xy 124.525128 30.861443) (xy 124.682214 30.74385) (xy 124.697083 30.734294) + (xy 124.86931 30.640251) (xy 124.885382 30.632911) (xy 125.069242 30.564335) (xy 125.0862 30.559356) + (xy 125.277938 30.517646) (xy 125.295436 30.51513) (xy 125.495582 30.500816) (xy 125.504428 30.5005) + (xy 125.565892 30.5005) (xy 250.434108 30.5005) (xy 250.495572 30.5005) + ) + ) + ) + (group "" + (uuid "8f628516-e8da-4639-ad8c-5e4d2b395262") + (members "0ca6bed9-dd1f-4e16-bf1a-4dbfd671d550" "2684a999-3a9a-430b-9dbc-bc66824272a2" + "47442e9f-2d93-489b-be21-a2cf0223aaa6" "8fed1ddb-1051-4b00-bc58-460b28600c9a" + "a7b6f5ea-fd39-4a06-951c-e2fa493a7f6e" "b9c7937c-7135-4a97-a837-a3dcbb912356" + ) + ) + (group "" + (uuid "a86301f5-1576-4536-bc8a-6d22b8ba8e21") + (members "00f5a805-37f8-44d2-ab07-6c881cdb704a" "12f6f387-5e46-4451-9e88-c54cd2cfc75c" + "35cd7b00-f4f4-4329-95b0-28af0837033c" "7a8a1a09-7615-4527-a6c7-419b223be739" + "7b5a9312-5f7a-46d5-9bd1-dbd153a22379" "e777576d-29d6-430d-868f-30ba10368c13" + ) + ) + (group "" + (uuid "96aeba32-e3b3-46a1-b34a-3c1318c359ff") + (members "31bb577f-334e-4c7f-afe7-8b637cde890d" "374ccecc-dbf1-49fe-a999-6f9e8a768c4d" + "39db4e56-5dfe-474a-bbaf-8206d75a5eac" "3aa4ed9e-99e1-4a87-a167-935c4a0834dd" + "3dcbd66b-932b-4202-8100-17260a6280b0" "996cc6c8-b7b2-4eee-8c7f-eef086a553bf" + "a3e07924-64cf-4259-9231-0855b76b3901" + ) + ) + (embedded_fonts no) +) diff --git a/hardware/boards/main-control-board/main-control-board.kicad_pro b/hardware/boards/main-control-board/main-control-board.kicad_pro index 829d605..e14c929 100644 --- a/hardware/boards/main-control-board/main-control-board.kicad_pro +++ b/hardware/boards/main-control-board/main-control-board.kicad_pro @@ -203,7 +203,13 @@ "td_width_to_size_filter_ratio": 0.9 } ], - "track_widths": [], + "track_widths": [ + 0.0, + 0.2, + 0.4, + 1.5, + 2.0 + ], "tuning_pattern_settings": { "diff_pair_defaults": { "corner_radius_percentage": 80, @@ -230,7 +236,20 @@ "spacing": 0.6 } }, - "via_dimensions": [], + "via_dimensions": [ + { + "diameter": 0.0, + "drill": 0.0 + }, + { + "diameter": 0.6, + "drill": 0.3 + }, + { + "diameter": 0.8, + "drill": 0.4 + } + ], "zones_allow_external_fillets": false }, "ipc2581": { @@ -495,22 +514,82 @@ "classes": [ { "bus_width": 12, - "clearance": 0.2, + "clearance": 0.25, "diff_pair_gap": 0.25, "diff_pair_via_gap": 0.25, - "diff_pair_width": 0.2, + "diff_pair_width": 0.25, "line_style": 0, - "microvia_diameter": 0.3, - "microvia_drill": 0.1, + "microvia_diameter": 0.8, + "microvia_drill": 0.4, "name": "Default", "pcb_color": "rgba(0, 0, 0, 0.000)", "priority": 2147483647, "schematic_color": "rgba(0, 0, 0, 0.000)", + "track_width": 0.25, + "tuning_profile": "", + "via_diameter": 0.8, + "via_drill": 0.4, + "wire_width": 6 + }, + { + "clearance": 0.25, + "diff_pair_gap": 0.25, + "diff_pair_width": 0.25, + "microvia_diameter": 0.8, + "microvia_drill": 0.4, + "name": "GND", + "pcb_color": "rgb(132, 132, 132)", + "priority": 0, + "schematic_color": "rgba(0, 0, 0, 0.000)", + "track_width": 0.4, + "tuning_profile": "", + "via_diameter": 0.8, + "via_drill": 0.4 + }, + { + "clearance": 0.2, + "diff_pair_gap": 0.25, + "diff_pair_width": 0.25, + "microvia_diameter": 0.6, + "microvia_drill": 0.3, + "name": "Power3V3", + "pcb_color": "rgb(221, 133, 0)", + "priority": 2, + "schematic_color": "rgba(0, 0, 0, 0.000)", + "track_width": 0.4, + "tuning_profile": "", + "via_diameter": 0.6, + "via_drill": 0.3 + }, + { + "clearance": 0.25, + "diff_pair_gap": 0.25, + "diff_pair_width": 0.25, + "microvia_diameter": 0.8, + "microvia_drill": 0.4, + "name": "Power5V", + "pcb_color": "rgb(194, 0, 0)", + "priority": 3, + "schematic_color": "rgba(0, 0, 0, 0.000)", + "track_width": 1.5, + "tuning_profile": "", + "via_diameter": 0.8, + "via_drill": 0.4 + }, + { + "clearance": 0.2, + "diff_pair_gap": 0.2, + "diff_pair_width": 0.2, + "microvia_diameter": 0.6, + "microvia_drill": 0.3, + "name": "USB", + "pcb_color": "rgb(0, 0, 255)", + "priority": 1, + "schematic_color": "rgba(0, 0, 0, 0.000)", "track_width": 0.2, "tuning_profile": "", "via_diameter": 0.6, - "via_drill": 0.3, - "wire_width": 6 + "via_drill": 0.3 } ], "meta": { @@ -518,7 +597,32 @@ }, "net_colors": null, "netclass_assignments": null, - "netclass_patterns": [] + "netclass_patterns": [ + { + "netclass": "GND", + "pattern": "GND" + }, + { + "netclass": "Power5V", + "pattern": "+5V" + }, + { + "netclass": "Power3V3", + "pattern": "+3.3V" + }, + { + "netclass": "USB", + "pattern": "/USB_*" + }, + { + "netclass": "Default", + "pattern": "/I2S_*" + }, + { + "netclass": "Default", + "pattern": "/I2C_*" + } + ] }, "pcbnew": { "last_paths": { diff --git a/hardware/boards/main-control-board/main-control-board.kicad_sch b/hardware/boards/main-control-board/main-control-board.kicad_sch index e2fc443..06f657a 100644 --- a/hardware/boards/main-control-board/main-control-board.kicad_sch +++ b/hardware/boards/main-control-board/main-control-board.kicad_sch @@ -2,7 +2,7 @@ (version 20260306) (generator "eeschema") (generator_version "10.0") - (uuid "ede99216-bb86-4aec-876e-63688c114483") + (uuid "82a78d11-58ff-455c-a94e-f7463ce9fc2e") (paper "A4") (title_block (title "TinyEngineer PCB") From af52445d693e7a213d8452ba1ee522d93431844d Mon Sep 17 00:00:00 2001 From: Krzysztof Jamroz Date: Mon, 14 Sep 2026 07:08:25 +0200 Subject: [PATCH 09/12] docs(pcb): update README with ERC and DRC status --- hardware/boards/main-control-board/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hardware/boards/main-control-board/README.md b/hardware/boards/main-control-board/README.md index 1f276f2..6b1fb9f 100644 --- a/hardware/boards/main-control-board/README.md +++ b/hardware/boards/main-control-board/README.md @@ -7,7 +7,7 @@ Carrier PCB that reduces jumper wiring: existing modules plug in on pin headers. - **KiCad:** 10 - **Interfaces:** header sockets for the Waveshare ESP32-C3-Zero, Adafruit PCA9685, MAX98357A, SSD1306 OLED, and Adafruit 5993 USB-C breakout; shared I2C (ESP32 GP0/GP1 → PCA9685 and SSD1306 OLED); point-to-point I2S (ESP32 GP2/GP3/GP4 → MAX98357A BCLK/LRC/DIN); USB D+/D− (5993 → ESP32 GP19/GP18); PCA9685 OE ← GP5; +5V, 3V3, and GND. Servo 3-pin plugs and speaker terminals stay on the modules this revision. - **Assumptions:** nets follow `[docs/hardware/](../../../docs/hardware/README.md)` (keep servo **+5V** off logic **3V3**; common GND). Custom module symbols live in `[libraries/symbols/tiny_engineer_modules.kicad_sym](libraries/symbols/tiny_engineer_modules.kicad_sym)`; footprints in `[libraries/footprints/tiny_engineer_modules.pretty](libraries/footprints/tiny_engineer_modules.pretty)`. ESP32-C3-Zero symbol pin numbers are Waveshare **header pads** (pad 1 = 5V, numbered anticlockwise from USB), not the ESP32-C3 QFN package. Two-layer FR4 ~1.6 mm; ESP32-C3-Zero on the back, other modules on the front. OLED uses a 1×04 pin header; USB-C breakout uses a 1×04 pin socket. Netclasses: `GND`, `Power5V` (`+5V`, 1.5 mm), `Power3V3` (`+3.3V`, 0.4 mm), `USB` (`/USB_`*), `Default` (I2C/I2S and other signals). -- **ERC / DRC:** schematic ERC after the symbol pass. PCB is routed with custom power DRC in `[main-control-board.kicad_dru](main-control-board.kicad_dru)`; DRC not signed off for fab. +- **ERC / DRC:** ERC passed; DRC passed (custom rules in `main-control-board.kicad_dru`) - **Built:** not manufactured - **Tested:** not tested From 28b46719c09ad4431fe55c9c28f556acf2c3ff53 Mon Sep 17 00:00:00 2001 From: Krzysztof Jamroz Date: Mon, 14 Sep 2026 07:41:05 +0200 Subject: [PATCH 10/12] feat(pcb): add via stitching for GND --- .../main-control-board.kicad_pcb | 91 ++++++++++++++++++- 1 file changed, 90 insertions(+), 1 deletion(-) diff --git a/hardware/boards/main-control-board/main-control-board.kicad_pcb b/hardware/boards/main-control-board/main-control-board.kicad_pcb index 40bf7cb..724d88a 100644 --- a/hardware/boards/main-control-board/main-control-board.kicad_pcb +++ b/hardware/boards/main-control-board/main-control-board.kicad_pcb @@ -80,7 +80,6 @@ ) (capping no) (filling no) - (zone_defaults) (pcbplotparams (layerselection 0x00000000_00000000_55555555_5755f5ff) (plot_on_all_layers_selection 0x00000000_00000000_00000000_00000000) @@ -2833,6 +2832,96 @@ (justify left bottom mirror) ) ) + (via + (at 231 50) + (size 0.8) + (drill 0.4) + (layers "F.Cu" "B.Cu") + (free yes) + (net "GND") + (uuid "1ce8905f-e1e0-4a1e-ba0e-7d3cc7f05ac3") + ) + (via + (at 232.5 48.5) + (size 0.8) + (drill 0.4) + (layers "F.Cu" "B.Cu") + (free yes) + (net "GND") + (uuid "2aef5c2c-e4ea-4162-89e9-7d552e5e134a") + ) + (via + (at 232.5 50) + (size 0.8) + (drill 0.4) + (layers "F.Cu" "B.Cu") + (free yes) + (net "GND") + (uuid "583b41fc-44ef-4539-b9a4-04762b3eddee") + ) + (via + (at 153 35) + (size 0.8) + (drill 0.4) + (layers "F.Cu" "B.Cu") + (free yes) + (net "GND") + (uuid "632a5247-16f3-4332-a73d-0e1cffcdc621") + ) + (via + (at 164.5 39) + (size 0.8) + (drill 0.4) + (layers "F.Cu" "B.Cu") + (free yes) + (net "GND") + (uuid "955eadf8-5911-47e8-a218-359494c3c7f1") + ) + (via + (at 153 37) + (size 0.8) + (drill 0.4) + (layers "F.Cu" "B.Cu") + (free yes) + (net "GND") + (uuid "d145d3f1-9596-4f0e-81b8-03587681f881") + ) + (via + (at 204.5 39) + (size 0.8) + (drill 0.4) + (layers "F.Cu" "B.Cu") + (free yes) + (net "GND") + (uuid "d4a4b437-c08b-4803-bd3d-52a40e9e5fc3") + ) + (via + (at 155 35) + (size 0.8) + (drill 0.4) + (layers "F.Cu" "B.Cu") + (free yes) + (net "GND") + (uuid "ef4a35cd-fa26-481a-a19f-af58eb779c8e") + ) + (via + (at 155 37) + (size 0.8) + (drill 0.4) + (layers "F.Cu" "B.Cu") + (free yes) + (net "GND") + (uuid "f8f1f0ce-5c56-4205-a40d-49cf50986de6") + ) + (via + (at 231 48.5) + (size 0.8) + (drill 0.4) + (layers "F.Cu" "B.Cu") + (free yes) + (net "GND") + (uuid "fb708cdf-bbb3-414d-a3b4-67a29ffd0a25") + ) (segment (start 144.107412 47.345) (end 143.092588 47.345) From d1ef6f170cc59e818cd271294e5eb94a326826a6 Mon Sep 17 00:00:00 2001 From: Krzysztof Jamroz Date: Mon, 14 Sep 2026 09:37:45 +0200 Subject: [PATCH 11/12] feat(pcb): add expected net memberships for main control board --- .../main-control-board/expected-nets.yml | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 hardware/boards/main-control-board/expected-nets.yml diff --git a/hardware/boards/main-control-board/expected-nets.yml b/hardware/boards/main-control-board/expected-nets.yml new file mode 100644 index 0000000..90b1515 --- /dev/null +++ b/hardware/boards/main-control-board/expected-nets.yml @@ -0,0 +1,47 @@ +# Critical net → pin memberships for review. +# Tokens = KiCad netlist RefDes.PinName (symbol pin name). +# Compare with: kicad-cli sch export netlist +# See docs/pcb.md#expected-netsyml + +nets: + "+5V": + - ESP1.5V + - MAX1.Vin + - PCA1.V+ + - USB1.Pin_3 + "+3.3V": + - ESP1.3V3 + - OLED1.VCC + - PCA1.VCC + GND: + - ESP1.GND + - MAX1.GND + - OLED1.GND + - PCA1.GND + - USB1.Pin_4 + "/I2C_SDA": + - ESP1.GP0 + - OLED1.SDA + - PCA1.SDA + "/I2C_SCL": + - ESP1.GP1 + - OLED1.SCL + - PCA1.SCL + "/I2S_BCLK": + - ESP1.GP2 + - MAX1.BCLK + "/I2S_LRC": + - ESP1.GP3 + - MAX1.LRC + "/I2S_DIN": + - ESP1.GP4 + - MAX1.DIN + "Net-(ESP1-GP5)": + - ESP1.GP5 + - PCA1.OE + "/USB_D+": + - ESP1.USB_DP + - USB1.Pin_1 + "/USB_D-": + - ESP1.USB_DM + - USB1.Pin_2 From 9a798487f65a3959f787946bb51b4e0db3ba7264 Mon Sep 17 00:00:00 2001 From: Krzysztof Jamroz Date: Mon, 14 Sep 2026 10:52:30 +0200 Subject: [PATCH 12/12] ci(pcb): enhance PCB validation process with automated checks - Added a new script `check_pcb.py` to run KiCad ERC, DRC, and expected-nets checks for all boards. - Updated documentation to reflect the requirement of running `python3 scripts/check_pcb.py` for PCB validation. - Modified CI workflow to include PCB checks, ensuring automated validation on every push/PR. --- .github/workflows/ci.yml | 18 + .gitignore | 1 + AGENTS.md | 5 +- CONTRIBUTING.md | 5 +- docs/pcb.md | 31 +- docs/testing.md | 12 +- hardware/README.md | 2 +- .../main-control-board/expected-nets.yml | 62 +-- scripts/check_pcb.py | 501 ++++++++++++++++++ 9 files changed, 586 insertions(+), 51 deletions(-) create mode 100755 scripts/check_pcb.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7a4870c..0e9d361 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,3 +47,21 @@ jobs: run: npm test --prefix packages/tiny-engineer-cursor - name: Antigravity package tests run: npm test --prefix packages/tiny-engineer-antigravity + + pcb: + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v4 + - name: Install KiCad 10 + run: | + sudo add-apt-repository -y ppa:kicad/kicad-10.0-releases + sudo apt-get update + sudo DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends kicad + kicad-cli version + - name: ERC / DRC / expected-nets + run: python3 scripts/check_pcb.py --report-dir artifacts/pcb + - uses: actions/upload-artifact@v4 + if: failure() + with: + name: pcb-reports + path: artifacts/pcb/ diff --git a/.gitignore b/.gitignore index e739110..41ee376 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .DS_Store +__pycache__/ # Cursor hook event log cursor_events.log diff --git a/AGENTS.md b/AGENTS.md index 29e8177..ac1aa74 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -27,9 +27,10 @@ pio run pio test -e native npm test --prefix packages/tiny-engineer-cursor npm test --prefix packages/tiny-engineer-antigravity +python3 scripts/check_pcb.py ``` -`pio test -e native` is not `pio run -e native`. Details: [docs/testing.md](docs/testing.md). +`pio test -e native` is not `pio run -e native`. PCB checks need KiCad 10 (`python3 scripts/check_pcb.py`). Details: [docs/testing.md](docs/testing.md). Do **not** flash (`pio run -t upload`) unless the user asks. @@ -66,7 +67,7 @@ Breaking rules, SemVer mapping, and examples: [CONTRIBUTING.md](CONTRIBUTING.md) - **Settings** — layer checklist in [docs/settings.md](docs/settings.md). Never log raw `access_token`. - **Integrations** — add/extend package tests; prefer short timeouts and ignore network errors so a missing robot does not stall the agent. - **CAD** — edit `.f3d` **and** export affected `3mf`. CERN-OHL-S. Do not swap `AiEmblem.3mf` as branding. -- **PCB** — [docs/pcb.md](docs/pcb.md) checklist + KiCad review rules below. New board paths need `REUSE.toml`. CERN-OHL-S. +- **PCB** — [docs/pcb.md](docs/pcb.md) checklist + KiCad review rules below. Run `python3 scripts/check_pcb.py` (KiCad 10). New board paths need `REUSE.toml`. CERN-OHL-S. - **Motion** — poses −1..1 mapped to saved min/max; see [docs/robot-movement.md](docs/robot-movement.md). Do not widen NVS servo clamps without testing on a real robot. - **Secrets** — no `.env`, tokens, or Wi-Fi passwords in logs or screenshots. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e3fd2e9..7bb380f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -40,9 +40,10 @@ pio run pio test -e native npm test --prefix packages/tiny-engineer-cursor npm test --prefix packages/tiny-engineer-antigravity +python3 scripts/check_pcb.py ``` -`pio test -e native` is not `pio run -e native`. Details: [docs/testing.md](docs/testing.md). Flash locally with `pio run -t upload` when you have a board. Physical module is a **Waveshare ESP32-C3-Zero**; PlatformIO `board = esp32-c3-devkitm-1` is the build target name. +`pio test -e native` is not `pio run -e native`. PCB checks need KiCad 10 (`python3 scripts/check_pcb.py`). Details: [docs/testing.md](docs/testing.md). Flash locally with `pio run -t upload` when you have a board. Physical module is a **Waveshare ESP32-C3-Zero**; PlatformIO `board = esp32-c3-devkitm-1` is the build target name. ## By change type @@ -56,7 +57,7 @@ npm test --prefix packages/tiny-engineer-antigravity **CAD.** Edit [`3d_models/cad/TinyEngineer.f3d`](3d_models/cad/TinyEngineer.f3d) **and** export the affected [`3d_models/parts/{servo_id}/3mf/*.3mf`](3d_models/parts/). Keep CERN-OHL-S. Do not swap `AiEmblem.3mf` as a branding change. -**PCB.** Follow the [PCB checklist](docs/pcb.md#checklist). Keep [`expected-nets.yml`](docs/pcb.md#expected-netsyml) in sync. One board per `hardware/boards//`, KiCad 10, ERC and DRC reviewed, no generated Gerbers or other fab outputs. Keep CERN-OHL-S. New board paths need a matching `[[annotations]]` block in [REUSE.toml](REUSE.toml). +**PCB.** Follow the [PCB checklist](docs/pcb.md#checklist). Run `python3 scripts/check_pcb.py` before opening a PCB PR. Keep [`expected-nets.yml`](docs/pcb.md#expected-netsyml) in sync. One board per `hardware/boards//`, KiCad 10, ERC and DRC reviewed, no generated Gerbers or other fab outputs. Keep CERN-OHL-S. New board paths need a matching `[[annotations]]` block in [REUSE.toml](REUSE.toml). **Motion.** Animations use −1..1 poses mapped to the saved min/max in [docs/robot-movement.md](docs/robot-movement.md). Stock defaults live in [`include/servos.h`](include/servos.h). Do not widen NVS servo clamps without testing on a real robot. Setup AP `POST /setup/servo` can use 0–180° to find limits; assembled motion must not. diff --git a/docs/pcb.md b/docs/pcb.md index e5fda91..f6bc25e 100644 --- a/docs/pcb.md +++ b/docs/pcb.md @@ -4,7 +4,7 @@ Baseline for contributing KiCad PCB designs. Goal: boards that are easy to under Before opening a PR, run the [checklist](#checklist). -Workflow and automated validation are still evolving. A reference board and CI pipeline are in progress and will be used to validate these rules. +Workflow and automated validation: CI runs ERC, DRC, and `expected-nets.yml` via `python3 scripts/check_pcb.py` (see [testing.md](testing.md)). KiCad sources live in [`hardware/boards/`](../hardware/README.md). Robot electrical reference (pinout, wiring, BOM) stays in [`docs/hardware/`](hardware/README.md). Firmware drivers stay in `src/hardware/`. @@ -108,27 +108,33 @@ Before submitting or updating a hardware pull request: The project should not introduce unexplained ERC or DRC errors. -Automated ERC and DRC via GitHub Actions is planned and is being tested on a reference board. It is not required yet. +Run the same checks CI uses (KiCad 10, stdlib Python — no pip packages): + +```bash +python3 scripts/check_pcb.py +``` + +Errors fail; warnings do not. Reports go to a temp dir, or pass `--report-dir artifacts/pcb`. CI runs this on every push/PR ([`.github/workflows/ci.yml`](../.github/workflows/ci.yml)). ## expected-nets.yml Committed checklist of **critical** net → pin memberships for human/AI review. Not a full netlist dump. - **Path:** `hardware/boards//expected-nets.yml` -- **Check:** `kicad-cli sch export netlist`, then compare to this file. No `kicad-cli` → say so and skip connectivity claims ([AGENTS.md](../AGENTS.md)). +- **Check:** `python3 scripts/check_pcb.py` (exports netlist via `kicad-cli` and compares). Manual: `kicad-cli sch export netlist`, then compare to this file. No `kicad-cli` → say so and skip connectivity claims ([AGENTS.md](../AGENTS.md)). - **Do not** infer nets from `.kicad_sch` / `.kicad_pcb` coordinates or geometry. - **Update** when you intentionally change listed nets or pins. Keep the list to power and important buses (I2C, I2S, USB, …), not every net. -Minimal shape (pin tokens = KiCad netlist `RefDes.PinName`): +Minimal shape (pin tokens = KiCad netlist `RefDes.PinNum:PinName` — pin number plus symbol pin name, so duplicate names like multiple `GND` pins stay distinct): ```yaml nets: "+5V": - - ESP1.5V - - PCA1.V+ + - ESP1.1:5V + - PCA1.6:V+ GND: - - ESP1.GND - - PCA1.GND + - ESP1.2:GND + - PCA1.1:GND ``` Required for new or updated boards when claiming connectivity in a PR. @@ -211,8 +217,7 @@ Use this before opening or updating a PCB pull request. Details are in the secti **Quality and docs** -- [ ] ERC run; violations reviewed -- [ ] DRC run; violations reviewed +- [ ] ERC / DRC / expected-nets: `python3 scripts/check_pcb.py` passes (or GUI ERC+DRC reviewed and nets checked if no `kicad-cli`) - [ ] No suppressions used only to make checks pass; any intentional exception has a reason - [ ] `expected-nets.yml` present and matches current netlist for listed nets - [ ] Board `README.md` covers purpose, status, interfaces, assumptions, and whether this revision was manufactured and tested @@ -233,10 +238,8 @@ Existing in-progress PRs: align where reasonably possible. Do not redesign solel The requirements above are the current contribution baseline. -Not standardized yet (to be evaluated on the reference board): +Not standardized yet: -- automated KiCad ERC and DRC in GitHub Actions -- exact multi-board CI structure - manufacturing jobsets - automated manufacturing artifacts - release and prerelease manufacturing packages @@ -244,6 +247,6 @@ Not standardized yet (to be evaluated on the reference board): - automated PCB renders or visual diffs - manufacturer-specific output configurations -Once the reference implementation is validated, this page will be updated. Stable parts of the workflow may become required for new hardware contributions. +ERC, DRC, and `expected-nets.yml` checks run in CI via `python3 scripts/check_pcb.py`. Keep the workflow reproducible and safe. Avoid complexity until it solves a real problem. diff --git a/docs/testing.md b/docs/testing.md index ca5a958..d005cbc 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -1,6 +1,6 @@ # Tests -Host checks. Neither flashes the board. GitHub Actions on `main` and PRs runs these same commands. On-device hardware: [hardware/testing.md](hardware/testing.md). +Host checks. Neither flashes the board. GitHub Actions on `main` and PRs runs these same commands (firmware, packages, and PCB). On-device hardware: [hardware/testing.md](hardware/testing.md). ## Firmware @@ -20,3 +20,13 @@ Node 18+. No robot. npm test --prefix packages/tiny-engineer-cursor npm test --prefix packages/tiny-engineer-antigravity ``` + +## PCB + +KiCad 10 (`kicad-cli`). Stdlib Python only — no pip packages. ERC (errors), DRC (errors + schematic parity), and `expected-nets.yml` for every board under `hardware/boards/`. + +```bash +python3 scripts/check_pcb.py +``` + +Optional: `python3 scripts/check_pcb.py main-control-board --report-dir artifacts/pcb`. Details: [pcb.md](pcb.md). On-device hardware: [hardware/testing.md](hardware/testing.md). \ No newline at end of file diff --git a/hardware/README.md b/hardware/README.md index 3020220..b260461 100644 --- a/hardware/README.md +++ b/hardware/README.md @@ -8,7 +8,7 @@ Boards live under `boards//`. Prefer the same name for the directory | --- | --- | | [`main-control-board`](boards/main-control-board/) | Draft interconnect / carrier (header sockets for existing modules) | -Contribution rules, KiCad version, what to commit, ERC/DRC, and PR expectations: [docs/pcb.md](../docs/pcb.md). Pre-PR checklist: [docs/pcb.md#checklist](../docs/pcb.md#checklist). Critical net checklist: [docs/pcb.md#expected-netsyml](../docs/pcb.md#expected-netsyml). +Contribution rules, KiCad version, what to commit, ERC/DRC, and PR expectations: [docs/pcb.md](../docs/pcb.md). Pre-PR checklist: [docs/pcb.md#checklist](../docs/pcb.md#checklist). Critical net checklist: [docs/pcb.md#expected-netsyml](../docs/pcb.md#expected-netsyml). Local/CI checks: `python3 scripts/check_pcb.py` (KiCad 10) — [docs/testing.md](../docs/testing.md). This tree is KiCad source only. Robot electrical reference (pinout, wiring, BOM) is [`docs/hardware/`](../docs/hardware/README.md). Firmware drivers are `src/hardware/`. diff --git a/hardware/boards/main-control-board/expected-nets.yml b/hardware/boards/main-control-board/expected-nets.yml index 90b1515..af9f757 100644 --- a/hardware/boards/main-control-board/expected-nets.yml +++ b/hardware/boards/main-control-board/expected-nets.yml @@ -1,47 +1,47 @@ # Critical net → pin memberships for review. -# Tokens = KiCad netlist RefDes.PinName (symbol pin name). +# Tokens = KiCad netlist RefDes.PinNum:PinName (pin number + symbol pin name). # Compare with: kicad-cli sch export netlist # See docs/pcb.md#expected-netsyml nets: "+5V": - - ESP1.5V - - MAX1.Vin - - PCA1.V+ - - USB1.Pin_3 + - ESP1.1:5V + - MAX1.7:Vin + - PCA1.6:V+ + - USB1.3:Pin_3 "+3.3V": - - ESP1.3V3 - - OLED1.VCC - - PCA1.VCC + - ESP1.3:3V3 + - OLED1.1:VCC + - PCA1.5:VCC GND: - - ESP1.GND - - MAX1.GND - - OLED1.GND - - PCA1.GND - - USB1.Pin_4 + - ESP1.2:GND + - MAX1.6:GND + - OLED1.2:GND + - PCA1.1:GND + - USB1.4:Pin_4 "/I2C_SDA": - - ESP1.GP0 - - OLED1.SDA - - PCA1.SDA + - ESP1.4:GP0 + - OLED1.3:SDA + - PCA1.4:SDA "/I2C_SCL": - - ESP1.GP1 - - OLED1.SCL - - PCA1.SCL + - ESP1.5:GP1 + - OLED1.4:SCL + - PCA1.3:SCL "/I2S_BCLK": - - ESP1.GP2 - - MAX1.BCLK + - ESP1.6:GP2 + - MAX1.2:BCLK "/I2S_LRC": - - ESP1.GP3 - - MAX1.LRC + - ESP1.7:GP3 + - MAX1.1:LRC "/I2S_DIN": - - ESP1.GP4 - - MAX1.DIN + - ESP1.8:GP4 + - MAX1.3:DIN "Net-(ESP1-GP5)": - - ESP1.GP5 - - PCA1.OE + - ESP1.9:GP5 + - PCA1.2:OE "/USB_D+": - - ESP1.USB_DP - - USB1.Pin_1 + - ESP1.16:USB_DP + - USB1.1:Pin_1 "/USB_D-": - - ESP1.USB_DM - - USB1.Pin_2 + - ESP1.15:USB_DM + - USB1.2:Pin_2 diff --git a/scripts/check_pcb.py b/scripts/check_pcb.py new file mode 100755 index 0000000..2263068 --- /dev/null +++ b/scripts/check_pcb.py @@ -0,0 +1,501 @@ +#!/usr/bin/env python3 +"""Run KiCad ERC, DRC, and expected-nets checks for hardware/boards/*. + +Requires KiCad 10 (kicad-cli). Stdlib only — no pip packages. Same entrypoint +locally and in CI: + + python3 scripts/check_pcb.py + python3 scripts/check_pcb.py main-control-board + python3 scripts/check_pcb.py --report-dir artifacts/pcb +""" + +from __future__ import annotations + +import argparse +import os +import re +import shutil +import subprocess +import sys +import tempfile +from pathlib import Path +from typing import Any + +KICAD_CLI_HINT = ( + "Install KiCad 10 and ensure kicad-cli is on PATH, " + "or set KICAD_CLI to the binary. " + "macOS: /Applications/KiCad/KiCad.app/Contents/MacOS/kicad-cli" +) + + +def find_repo_root(explicit: Path | None) -> Path: + if explicit is not None: + return explicit.resolve() + return Path(__file__).resolve().parent.parent + + +def find_kicad_cli() -> Path: + env = os.environ.get("KICAD_CLI") + if env: + path = Path(env) + if path.is_file(): + return path + raise SystemExit(f"error: KICAD_CLI is set but not a file: {env}") + + which = shutil.which("kicad-cli") or shutil.which("kicad-cli.exe") + if which: + return Path(which) + + mac = Path("/Applications/KiCad/KiCad.app/Contents/MacOS/kicad-cli") + if mac.is_file(): + return mac + + for base in ( + Path(os.environ.get("ProgramFiles", r"C:\Program Files")) / "KiCad", + Path(os.environ.get("ProgramFiles(x86)", r"C:\Program Files (x86)")) / "KiCad", + ): + if not base.is_dir(): + continue + matches = sorted(base.glob("*/bin/kicad-cli.exe"), reverse=True) + if matches: + return matches[0] + + raise SystemExit(f"error: kicad-cli not found. {KICAD_CLI_HINT}") + + +def discover_boards(repo_root: Path, names: list[str] | None) -> list[Path]: + boards_root = repo_root / "hardware" / "boards" + if not boards_root.is_dir(): + raise SystemExit(f"error: missing boards directory: {boards_root}") + + if names: + dirs = [boards_root / name for name in names] + else: + dirs = sorted(p for p in boards_root.iterdir() if p.is_dir()) + + boards: list[Path] = [] + for board_dir in dirs: + name = board_dir.name + sch = board_dir / f"{name}.kicad_sch" + pcb = board_dir / f"{name}.kicad_pcb" + if not board_dir.is_dir(): + raise SystemExit(f"error: board directory not found: {board_dir}") + if not sch.is_file() or not pcb.is_file(): + if names: + raise SystemExit( + f"error: {name} missing {sch.name} and/or {pcb.name}" + ) + continue + boards.append(board_dir) + + if not boards: + raise SystemExit("error: no KiCad boards found under hardware/boards/") + return boards + + +# --- minimal s-expression parser for KiCad netlists --- + + +def _tokenize(text: str) -> list[str]: + tokens: list[str] = [] + i = 0 + n = len(text) + while i < n: + c = text[i] + if c.isspace(): + i += 1 + continue + if c in "()": + tokens.append(c) + i += 1 + continue + if c == '"': + i += 1 + buf: list[str] = [] + while i < n: + if text[i] == "\\" and i + 1 < n: + buf.append(text[i + 1]) + i += 2 + continue + if text[i] == '"': + i += 1 + break + buf.append(text[i]) + i += 1 + tokens.append("".join(buf)) + continue + j = i + while j < n and not text[j].isspace() and text[j] not in "()": + j += 1 + tokens.append(text[i:j]) + i = j + return tokens + + +def _parse_tokens(tokens: list[str]) -> Any: + if not tokens: + raise ValueError("empty sexpr") + tok = tokens.pop(0) + if tok == "(": + out: list[Any] = [] + while tokens and tokens[0] != ")": + out.append(_parse_tokens(tokens)) + if not tokens: + raise ValueError("unclosed sexpr") + tokens.pop(0) + return out + if tok == ")": + raise ValueError("unexpected )") + return tok + + +def parse_sexpr(text: str) -> Any: + tokens = _tokenize(text) + tree = _parse_tokens(tokens) + if tokens: + raise ValueError("trailing tokens in sexpr") + return tree + + +def _children(node: list[Any], tag: str) -> list[list[Any]]: + return [c for c in node[1:] if isinstance(c, list) and c and c[0] == tag] + + +def _child(node: list[Any], tag: str) -> list[Any] | None: + found = _children(node, tag) + return found[0] if found else None + + +def _atom(node: list[Any], tag: str) -> str | None: + c = _child(node, tag) + if c is None or len(c) < 2: + return None + return str(c[1]) + + +def parse_netlist_pins(netlist_text: str) -> dict[str, set[str]]: + """Return net name -> set of RefDes.PinNum:PinName tokens.""" + root = parse_sexpr(netlist_text) + if not isinstance(root, list) or root[0] != "export": + raise ValueError("netlist root is not (export ...)") + + pin_names: dict[tuple[str, str, str], str] = {} + libparts = _child(root, "libparts") + if libparts: + for libpart in _children(libparts, "libpart"): + pins = _child(libpart, "pins") + if not pins: + continue + lib = _atom(libpart, "lib") or "" + part = _atom(libpart, "part") or "" + for pin in _children(pins, "pin"): + num = _atom(pin, "num") + name = _atom(pin, "name") + if num and name: + pin_names[(lib, part, num)] = name + + ref_libpart: dict[str, tuple[str, str]] = {} + components = _child(root, "components") + if components: + for comp in _children(components, "comp"): + ref = _atom(comp, "ref") + if not ref: + continue + libsource = _child(comp, "libsource") + if libsource: + lib = _atom(libsource, "lib") or "" + part = _atom(libsource, "part") or "" + ref_libpart[ref] = (lib, part) + + nets_out: dict[str, set[str]] = {} + nets = _child(root, "nets") + if not nets: + return nets_out + + for net in _children(nets, "net"): + name = _atom(net, "name") + if not name: + continue + pins: set[str] = set() + for node in _children(net, "node"): + ref = _atom(node, "ref") + pin_num = _atom(node, "pin") + if not ref or not pin_num: + continue + lib_part = ref_libpart.get(ref) + pin_name = None + if lib_part: + pin_name = pin_names.get((lib_part[0], lib_part[1], pin_num)) + if not pin_name: + pf = _atom(node, "pinfunction") + if pf and "_" in pf: + left, right = pf.rsplit("_", 1) + if right == pin_num: + pin_name = left + if not pin_name: + pin_name = pin_num + pins.add(f"{ref}.{pin_num}:{pin_name}") + nets_out[name] = pins + return nets_out + + +def load_expected_nets(path: Path) -> dict[str, list[str]]: + """Parse constrained expected-nets.yml (stdlib only). + + Accepts: # comments, blank lines, top-level `nets:`, bare or double-quoted + net keys, and `- Token` list items. Rejects anything else. + Pin tokens: RefDes.PinNum:PinName (e.g. ESP1.1:5V). + """ + text = path.read_text(encoding="utf-8") + nets: dict[str, list[str]] = {} + current: str | None = None + seen_nets = False + key_re = re.compile(r'^("(?:\\.|[^"\\])*"|[A-Za-z0-9_./+-]+)\s*:\s*$') + item_re = re.compile(r"^-\s+(\S+)\s*$") + + for lineno, raw in enumerate(text.splitlines(), start=1): + line = raw.split("#", 1)[0].rstrip() + if not line.strip(): + continue + stripped = line.strip() + indent = len(line) - len(line.lstrip(" ")) + + if indent == 0 and stripped == "nets:": + if seen_nets: + raise ValueError(f"{path}:{lineno}: duplicate 'nets:'") + seen_nets = True + current = None + continue + + if not seen_nets: + raise ValueError( + f"{path}:{lineno}: expected top-level 'nets:' before other content" + ) + + if indent == 2: + m = key_re.match(stripped) + if not m: + raise ValueError( + f"{path}:{lineno}: expected net key like GND: or \"+5V\":" + ) + key = m.group(1) + if key.startswith('"') and key.endswith('"'): + key = key[1:-1].replace(r"\"", '"').replace(r"\\", "\\") + if key in nets: + raise ValueError(f"{path}:{lineno}: duplicate net {key!r}") + nets[key] = [] + current = key + continue + + if indent == 4 and current is not None: + m = item_re.match(stripped) + if not m: + raise ValueError( + f"{path}:{lineno}: expected list item " + f"'- RefDes.PinNum:PinName'" + ) + nets[current].append(m.group(1)) + continue + + raise ValueError(f"{path}:{lineno}: unsupported line: {raw!r}") + + if not seen_nets: + raise ValueError(f"{path}: missing top-level 'nets:'") + if not nets: + raise ValueError(f"{path}: 'nets:' has no entries") + return nets + + +def check_expected_nets(expected_path: Path, netlist_path: Path) -> list[str]: + errors: list[str] = [] + try: + expected_nets = load_expected_nets(expected_path) + except ValueError as exc: + return [str(exc)] + + netlist_text = netlist_path.read_text(encoding="utf-8") + actual = parse_netlist_pins(netlist_text) + + for net_name, pins in expected_nets.items(): + want = set(pins) + got = actual.get(net_name) + if got is None: + errors.append(f"net {net_name!r}: missing from netlist") + continue + missing = sorted(want - got) + extra = sorted(got - want) + if missing: + errors.append( + f"net {net_name!r}: missing pins: {', '.join(missing)}" + ) + if extra: + errors.append( + f"net {net_name!r}: unexpected pins: {', '.join(extra)}" + ) + return errors + + +def run_kicad(kicad_cli: Path, args: list[str], *, label: str) -> int: + cmd = [str(kicad_cli), *args] + print(f" $ {' '.join(cmd)}") + proc = subprocess.run(cmd, check=False) + if proc.returncode not in (0, 5): + print( + f"error: {label} failed with unexpected exit {proc.returncode}", + file=sys.stderr, + ) + return proc.returncode + + +def check_board(kicad_cli: Path, board_dir: Path, report_dir: Path) -> bool: + name = board_dir.name + sch = board_dir / f"{name}.kicad_sch" + pcb = board_dir / f"{name}.kicad_pcb" + expected = board_dir / "expected-nets.yml" + report_dir.mkdir(parents=True, exist_ok=True) + + erc_json = report_dir / "erc.json" + drc_json = report_dir / "drc.json" + netlist = report_dir / "netlist.net" + + print(f"==> {name}") + + if not expected.is_file(): + print(f"error: missing {expected}", file=sys.stderr) + return False + + erc_rc = run_kicad( + kicad_cli, + [ + "sch", + "erc", + "--format", + "json", + "--severity-error", + "--exit-code-violations", + "-o", + str(erc_json), + str(sch), + ], + label="ERC", + ) + if erc_rc == 5: + print(f"error: ERC errors — see {erc_json}", file=sys.stderr) + return False + if erc_rc != 0: + return False + print(f" ERC OK ({erc_json})") + + drc_rc = run_kicad( + kicad_cli, + [ + "pcb", + "drc", + "--format", + "json", + "--severity-error", + "--schematic-parity", + "--refill-zones", + "--exit-code-violations", + "-o", + str(drc_json), + str(pcb), + ], + label="DRC", + ) + if drc_rc == 5: + print(f"error: DRC errors — see {drc_json}", file=sys.stderr) + return False + if drc_rc != 0: + return False + print(f" DRC OK ({drc_json})") + + net_rc = run_kicad( + kicad_cli, + ["sch", "export", "netlist", "-o", str(netlist), str(sch)], + label="netlist export", + ) + if net_rc != 0: + return False + + net_errors = check_expected_nets(expected, netlist) + if net_errors: + print(f"error: expected-nets mismatch for {name}:", file=sys.stderr) + for err in net_errors: + print(f" - {err}", file=sys.stderr) + return False + print(f" expected-nets OK ({expected.name})") + return True + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser( + description="KiCad ERC, DRC, and expected-nets for hardware/boards/" + ) + parser.add_argument( + "boards", + nargs="*", + help="Board directory names under hardware/boards/ (default: all)", + ) + parser.add_argument( + "--repo-root", + type=Path, + default=None, + help="Repository root (default: parent of scripts/)", + ) + parser.add_argument( + "--report-dir", + type=Path, + default=None, + help="Write per-board reports here (default: temp dir, or PCB_REPORT_DIR)", + ) + args = parser.parse_args(argv) + + repo_root = find_repo_root(args.repo_root) + report_root = args.report_dir + if report_root is None: + env_dir = os.environ.get("PCB_REPORT_DIR") + report_root = Path(env_dir) if env_dir else None + + kicad_cli = find_kicad_cli() + print(f"kicad-cli: {kicad_cli}") + ver = subprocess.run( + [str(kicad_cli), "version"], + check=False, + capture_output=True, + text=True, + ) + if ver.stdout.strip(): + print(f"version: {ver.stdout.strip()}") + + boards = discover_boards(repo_root, args.boards or None) + + owned_temp: Path | None = None + if report_root is None: + owned_temp = Path(tempfile.mkdtemp(prefix="tiny-engineer-pcb-")) + report_root = owned_temp + else: + report_root = report_root.resolve() + report_root.mkdir(parents=True, exist_ok=True) + + print(f"reports: {report_root}") + + ok = True + for board_dir in boards: + if not check_board(kicad_cli, board_dir, report_root / board_dir.name): + ok = False + break + + if ok: + print("All PCB checks passed.") + if owned_temp is not None: + shutil.rmtree(owned_temp, ignore_errors=True) + return 0 + + print("PCB checks failed.", file=sys.stderr) + print(f"reports kept at: {report_root}", file=sys.stderr) + return 1 + + +if __name__ == "__main__": + sys.exit(main())