krishnax12/usb-c-control-dial

USB-C control dial PCB with an EC11 push encoder and a 16-LED ring for volume and brightness controls. Work in progress; firmware not included and not fabrication-ready.

Version
0.0.3
License
unset
Stars
1

index.circuit.tsx

PCBPCB preview for index.circuit.tsx
SchematicSchematic preview for index.circuit.tsx
import { Fragment } from "react"
import { boardOutline } from "./components/board-outline"
import { Controller } from "./components/controller"
import { LedRing, ledCount } from "./components/led-ring"
import { UsbInterface } from "./components/usb-interface"

export default function UsbControlDial({
  ledCutoutShape = "polygon",
}: {
  ledCutoutShape?: "polygon" | "rect"
} = {}) {
  return (
    <board
      width={80}
      height={80}
      outline={boardOutline}
      thickness={1.6}
      layers={4}
      solderMaskColor="green"
      title="USB-C control dial"
      schLayout={{ layoutMode: "match-adapt" }}
      autorouter={{ preset: "auto_local", traceClearance: 0.25 }}
      autorouterVersion="beta_pipeline9"
      minTraceWidth={0.15}
      minTraceToPadEdgeClearance={0.15}
      minTraceToHoleEdgeClearance={0.3}
      minViaEdgeToPadEdgeClearance={0.1}
      minViaHoleDiameter={0.3}
      minViaPadDiameter={0.6}
      minViaHoleEdgeToViaHoleEdgeClearance={0.25}
      nominalTraceWidth={0.2}
    >
      <autoroutingphase
        phaseIndex={0}
        minTraceToPadEdgeClearance={0.2}
        minTraceToHoleEdgeClearance={0.35}
        minViaEdgeToPadEdgeClearance={0.2}
      />
      <net
        name="GND"
        isGroundNet
        nominalTraceWidth={0.4}
        routingPhaseIndex={0}
      />
      <net
        name="VBUS"
        isPowerNet
        nominalTraceWidth={0.5}
        routingPhaseIndex={0}
      />
      <net name="V5" isPowerNet nominalTraceWidth={0.5} routingPhaseIndex={0} />
      <net name="V33" isPowerNet routingPhaseIndex={0} />
      {[
        "USB_DP",
        "USB_DM",
        "CC1",
        "CC2",
        "ENC_A",
        "ENC_B",
        "ENC_SW",
        "LED_RAW",
        "LED_DATA",
        "RESET",
        "BOOT",
      ].map((name) => (
        <Fragment key={name}>
          <net name={name} routingPhaseIndex={0} />
        </Fragment>
      ))}
      {Array.from({ length: ledCount - 1 }, (_, index) => (
        <Fragment key={index}>
          <net name={`PIXEL_${index + 1}`} routingPhaseIndex={0} />
        </Fragment>
      ))}
      <UsbInterface />
      <Controller />
      <LedRing openingShape={ledCutoutShape} />
      {[-1, 1].flatMap((x) =>
        [-1, 1].map((y) => (
          <Fragment key={`${x}:${y}`}>
            <hole
              name={`MOUNT_${x}_${y}`}
              pcbX={x * 26}
              pcbY={y * 26}
              diameter={3.2}
            />
          </Fragment>
        )),
      )}
      <copperpour
        layer="inner1"
        connectsTo="net.GND"
        clearance={0.3}
        boardEdgeMargin={0.5}
      />
      <copperpour
        layer="bottom"
        connectsTo="net.GND"
        clearance={0.3}
        boardEdgeMargin={0.5}
      />
      <silkscreentext text="USB-C CONTROL DIAL" pcbY={13} fontSize={1} />
      <silkscreentext text="VOLUME / BRIGHTNESS" pcbY={-13} fontSize={0.8} />
      <silkscreentext text="KrishnaX12" pcbY={-16} fontSize={0.8} />
      <silkscreentext text="BOOT" pcbX={12} pcbY={-15} fontSize={0.7} />
    </board>
  )
}