From e3e7db7fb4e2c79a7ec45051bb247c3411446637 Mon Sep 17 00:00:00 2001 From: abdalrouf-AAA <236259618+technologyet31-create@users.noreply.github.com> Date: Tue, 14 Jul 2026 01:40:26 +0200 Subject: [PATCH] Add ESP32-C3 SuperMini common board Adds the ESP32-C3 SuperMini (18 x 22.5mm) as a reusable board: two rows of eight 2.54mm-pitch header pins carrying 5V/GND/3V3 and GPIO0-GPIO10, GPIO20 and GPIO21, with PCB, schematic and 3d snapshots. The pinout and the board's mechanical constants live in pinout.ts, so the footprint's pin positions and the chip's pinLabels/schPinArrangement are all derived from one list instead of repeating it. The outline is quantized to 1e-6mm before it is handed to the board: the corner arcs go through Math.cos/sin, which are not required to be correctly rounded and differ by ~1 ULP between libm implementations, which would otherwise make the PCB snapshot render differently per platform. Co-authored-by: abdalrouf-AAA <236259618+technologyet31-create@users.noreply.github.com> --- index.tsx | 1 + .../Esp32C3SuperMini.circuit.tsx | 84 ++++++++++++++++++ .../Esp32C3SuperMiniFootprint.tsx | 40 +++++++++ .../Esp32C3SuperMini.circuit-3d.snap.png | Bin 0 -> 17419 bytes .../Esp32C3SuperMini.circuit-pcb.snap.svg | 1 + ...sp32C3SuperMini.circuit-schematic.snap.svg | 25 ++++++ lib/Esp32C3SuperMini/pinout.ts | 36 ++++++++ 7 files changed, 187 insertions(+) create mode 100644 lib/Esp32C3SuperMini/Esp32C3SuperMini.circuit.tsx create mode 100644 lib/Esp32C3SuperMini/Esp32C3SuperMiniFootprint.tsx create mode 100644 lib/Esp32C3SuperMini/__snapshots__/Esp32C3SuperMini.circuit-3d.snap.png create mode 100644 lib/Esp32C3SuperMini/__snapshots__/Esp32C3SuperMini.circuit-pcb.snap.svg create mode 100644 lib/Esp32C3SuperMini/__snapshots__/Esp32C3SuperMini.circuit-schematic.snap.svg create mode 100644 lib/Esp32C3SuperMini/pinout.ts diff --git a/index.tsx b/index.tsx index a34bf53..a6e23ad 100644 --- a/index.tsx +++ b/index.tsx @@ -6,3 +6,4 @@ export * from "./lib/XiaoBoard/XiaoReceiver.circuit" export * from "./lib/ProMicroBoard/ProMicroBoard.circuit" // export * from "./Common Boards/RaspberryPiHatBoard/RaspberryPiHatBoard.circuit" export * from "./lib/ViaGridBoard/ViaGridBoard.circuit" +export * from "./lib/Esp32C3SuperMini/Esp32C3SuperMini.circuit" diff --git a/lib/Esp32C3SuperMini/Esp32C3SuperMini.circuit.tsx b/lib/Esp32C3SuperMini/Esp32C3SuperMini.circuit.tsx new file mode 100644 index 0000000..8058072 --- /dev/null +++ b/lib/Esp32C3SuperMini/Esp32C3SuperMini.circuit.tsx @@ -0,0 +1,84 @@ +import type { BoardProps, ChipProps } from "@tscircuit/props" +import { outlineBuilder } from "../../util/outlineBuilder" +import { Esp32C3SuperMiniFootprint } from "./Esp32C3SuperMiniFootprint" +import { + BOARD_LENGTH_MM, + BOARD_WIDTH_MM, + LEFT_PINS, + PINS_IN_FOOTPRINT_ORDER, + RIGHT_PINS, +} from "./pinout" + +export type Esp32C3SuperMiniProps = { + boardProps?: BoardProps + chipProps?: Partial + children?: any +} + +const CORNER_RADIUS_MM = 1.5 +const halfWidth = BOARD_WIDTH_MM / 2 +const halfLength = BOARD_LENGTH_MM / 2 + +const pinLabels = Object.fromEntries( + PINS_IN_FOOTPRINT_ORDER.map((label, index) => [`pin${index + 1}`, label]), +) + +const schPinArrangement = { + leftSide: { direction: "top-to-bottom" as const, pins: [...LEFT_PINS] }, + rightSide: { direction: "top-to-bottom" as const, pins: [...RIGHT_PINS] }, +} + +/** + * The corner arcs go through Math.cos/sin, which are not required to be + * correctly rounded and differ by ~1 ULP between libm implementations. Snapping + * to a 1nm grid keeps the outline, and therefore the rendered snapshot, + * identical on every platform. + */ +const snapToNanometerGrid = ({ x, y }: { x: number; y: number }) => ({ + x: Math.round(x * 1e6) / 1e6, + y: Math.round(y * 1e6) / 1e6, +}) + +/** 18 x 22.5mm outline with rounded corners; USB-C sits on the bottom edge. */ +const outline = outlineBuilder(0, halfLength) + .lineTo(halfWidth, halfLength) + .corner({ radius: CORNER_RADIUS_MM, turn: "ccw" }) + .lineTo(halfWidth, -halfLength) + .corner({ radius: CORNER_RADIUS_MM, turn: "ccw" }) + .lineTo(-halfWidth, -halfLength) + .corner({ radius: CORNER_RADIUS_MM, turn: "ccw" }) + .lineTo(-halfWidth, halfLength) + .corner({ radius: CORNER_RADIUS_MM, turn: "ccw" }) + .lineTo(0, halfLength) + .toArray() + .map(snapToNanometerGrid) + +/** + * ESP32-C3 SuperMini development board (18 x 22.5mm) as a reusable common board. + * Two rows of eight 2.54mm-pitch header pins carrying 5V/GND/3V3 and + * GPIO0-GPIO10, GPIO20 and GPIO21. + */ +export const Esp32C3SuperMini = ({ + boardProps = {}, + chipProps = {}, + children, +}: Esp32C3SuperMiniProps) => { + const { name: resolvedName = "Esp32C3SuperMini", ...chipRest } = chipProps + + return ( + + } + doNotPlace + pcbX={0} + pcbY={0} + pinLabels={pinLabels} + schWidth={1.4} + schPinArrangement={schPinArrangement} + /> + {children} + + ) +} diff --git a/lib/Esp32C3SuperMini/Esp32C3SuperMiniFootprint.tsx b/lib/Esp32C3SuperMini/Esp32C3SuperMiniFootprint.tsx new file mode 100644 index 0000000..d88bc88 --- /dev/null +++ b/lib/Esp32C3SuperMini/Esp32C3SuperMiniFootprint.tsx @@ -0,0 +1,40 @@ +import React from "react" +import type { PlatedHoleProps } from "@tscircuit/props" +import { PINS_PER_SIDE, PIN_PITCH_MM, ROW_SPACING_MM } from "./pinout" + +export interface Esp32C3SuperMiniFootprintProps { + holeDiameter?: number + outerDiameter?: number +} + +/** + * Through-hole footprint for the ESP32-C3 SuperMini: two columns of eight + * 2.54mm-pitch pins, 15.24mm apart, matching the module's header rows. + * pin1-pin8 are the left column (top to bottom) and pin9-pin16 the right. + */ +export const Esp32C3SuperMiniFootprint = ({ + holeDiameter = 1, + outerDiameter = 1.8, +}: Esp32C3SuperMiniFootprintProps = {}) => { + const topPinY = ((PINS_PER_SIDE - 1) / 2) * PIN_PITCH_MM + const columnXs = [-ROW_SPACING_MM / 2, ROW_SPACING_MM / 2] + + const holes = columnXs.flatMap((columnX, column) => + Array.from({ length: PINS_PER_SIDE }, (_, row) => { + const pin = `pin${column * PINS_PER_SIDE + row + 1}` + const holeProps: PlatedHoleProps = { + portHints: [pin], + shape: "circle", + holeDiameter, + outerDiameter, + pcbX: columnX, + pcbY: topPinY - row * PIN_PITCH_MM, + } + // tscircuit's JSX types don't accept React's `key`, so build the element + // directly rather than widening the props to `any`. + return React.createElement("platedhole", { key: pin, ...holeProps }) + }), + ) + + return {holes} +} diff --git a/lib/Esp32C3SuperMini/__snapshots__/Esp32C3SuperMini.circuit-3d.snap.png b/lib/Esp32C3SuperMini/__snapshots__/Esp32C3SuperMini.circuit-3d.snap.png new file mode 100644 index 0000000000000000000000000000000000000000..92abea6c12b2c4dec0182284159dd61c809b3d08 GIT binary patch literal 17419 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 \ No newline at end of file diff --git a/lib/Esp32C3SuperMini/__snapshots__/Esp32C3SuperMini.circuit-schematic.snap.svg b/lib/Esp32C3SuperMini/__snapshots__/Esp32C3SuperMini.circuit-schematic.snap.svg new file mode 100644 index 0000000..edb96a6 --- /dev/null +++ b/lib/Esp32C3SuperMini/__snapshots__/Esp32C3SuperMini.circuit-schematic.snap.svg @@ -0,0 +1,25 @@ +Esp32C3SuperMini1V52GND3V3_34IO45IO36IO27IO18IO09IO510IO611IO712IO813IO914IO1015IO2016IO21 \ No newline at end of file diff --git a/lib/Esp32C3SuperMini/pinout.ts b/lib/Esp32C3SuperMini/pinout.ts new file mode 100644 index 0000000..b44bc29 --- /dev/null +++ b/lib/Esp32C3SuperMini/pinout.ts @@ -0,0 +1,36 @@ +/** + * ESP32-C3 SuperMini header pinout and mechanical constants. + * + * Pins are listed top to bottom exactly as they sit on the board, with the PCB + * antenna at the top and USB-C at the bottom. + */ +export const LEFT_PINS = [ + "V5", + "GND", + "V3_3", + "IO4", + "IO3", + "IO2", + "IO1", + "IO0", +] as const + +export const RIGHT_PINS = [ + "IO5", + "IO6", + "IO7", + "IO8", + "IO9", + "IO10", + "IO20", + "IO21", +] as const + +/** Footprint pin order: pin1-pin8 are the left column, pin9-pin16 the right. */ +export const PINS_IN_FOOTPRINT_ORDER = [...LEFT_PINS, ...RIGHT_PINS] + +export const PINS_PER_SIDE = LEFT_PINS.length +export const PIN_PITCH_MM = 2.54 +export const ROW_SPACING_MM = 15.24 +export const BOARD_WIDTH_MM = 18 +export const BOARD_LENGTH_MM = 22.5