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
PCB
Schematic
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>
)
}