AnasSarkiz/rp2040-usb-c-single-axis-dm542t-motion-controller--01a0e89c
A USB‑C RP2040 controller board with external QSPI flash, crystal clock, regulated 3.3/1.1/5 V power, boost-converted motor-driver supply, protected USB and limit inputs, status LEDs, reset/boot switches, and AO3400A MOSFET outputs for stepper-control signals.
- Version
- 0.1.0-prototype.19
- License
- unset
- Stars
- 0
lib/circuit.tsx
import { FunctionalLabels, probeLabels } from "./silkscreen"
import { DriverPower } from "./driver-power"
import { TerminalFootprint } from "./terminal-footprint"
import {
passiveSchematicPosition,
schematicPosition,
mcuPinStyle,
} from "./schematic-layout"
import { passiveComponents } from "./passive-components"
import {
RP2040Attributes,
TYPE_C_31_M_12Attributes,
AO3400AAttributes,
} from "./pin-attributes"
import { RP2040 } from "../imports/RP2040"
import { W25Q16JVSSIQ } from "../imports/W25Q16JVSSIQ"
import { AP2112K_3_3TRG1 } from "../imports/AP2112K_3_3TRG1"
import { UsbProtection } from "./symbol-usbprotection"
import { TYPE_C_31_M_12 } from "../imports/TYPE_C_31_M_12"
import { OutputMosfet } from "./output-mosfet"
import { ClockCrystal } from "./symbol-clockcrystal"
import { TS_1187A_B_A_B } from "../imports/TS_1187A_B_A_B"
import { KF350_3_5_2P } from "../imports/KF350_3_5_2P"
import { LM66100DCKR } from "../imports/LM66100DCKR"
import { InputFuse } from "./symbol-inputfuse"
import { KT_0805G } from "../imports/KT_0805G"
import { passives } from "./passives"
import catalog from "./catalog.json"
export function CircuitParts() {
return (
<>
<DriverPower />
<FunctionalLabels />
<net name="GND" isGroundNet />
<net name="VBUS" isPowerNet nominalTraceWidth="0.5mm" />
<net name="V5" isPowerNet nominalTraceWidth="0.5mm" />
<net name="V3V3" isPowerNet nominalTraceWidth="0.4mm" />
<net name="V1V1" isPowerNet nominalTraceWidth="0.3mm" />
<net name="FUSED_VBUS" isPowerNet nominalTraceWidth="0.5mm" />
<RP2040
name="U1"
{...schematicPosition("U1")}
pcbStyle={{ silkscreenTextVisibility: "hidden" }}
schHeight={8.7}
schPinStyle={mcuPinStyle}
schWidth={2.8}
pinAttributes={RP2040Attributes}
pcbX={-10}
pcbY={0}
pcbRotation={90}
connections={{
pin1: "net.V3V3",
pin10: "net.V3V3",
pin22: "net.V3V3",
pin33: "net.V3V3",
pin42: "net.V3V3",
pin43: "net.V3V3",
pin44: "net.V3V3",
pin48: "net.V3V3",
pin49: "net.V3V3",
pin23: "net.V1V1",
pin50: "net.V1V1",
pin45: "net.V1V1",
pin19: "net.GND",
pin57: "net.GND",
pin20: "net.XIN",
pin21: "net.XOUT",
pin24: "net.SWCLK",
pin25: "net.SWDIO",
pin26: "net.RUN",
pin46: "net.MCU_DM",
pin47: "net.MCU_DP",
pin51: "net.QSPI_D3",
pin52: "net.QSPI_CLK",
pin53: "net.QSPI_D0",
pin54: "net.QSPI_D2",
pin55: "net.QSPI_D1",
pin56: "net.QSPI_CS",
GPIO0: "net.STEP",
GPIO1: "net.DIR",
GPIO2: "net.ENABLE",
GPIO3: "net.ARM",
GPIO4: "net.LIMIT_MIN",
GPIO5: "net.LIMIT_MAX",
GPIO6: "net.DRIVER_POWER",
GPIO7: "net.DRIVER_REG_ENABLE",
GPIO8: "net.DRIVER_FAULT",
GPIO25: "net.STATUS",
GPIO26_ADC0: "net.VBUS_SENSE",
}}
/>
<W25Q16JVSSIQ
name="U2"
{...schematicPosition("U2")}
pcbX={-22}
pcbY={-4.5}
pcbRotation={90}
connections={{
pin1: "net.QSPI_CS",
pin2: "net.QSPI_D1",
pin3: "net.QSPI_D2",
pin4: "net.GND",
pin5: "net.QSPI_D0",
pin6: "net.QSPI_CLK",
pin7: "net.QSPI_D3",
pin8: "net.V3V3",
}}
/>
<AP2112K_3_3TRG1
name="U3"
{...schematicPosition("U3")}
pcbStyle={{ silkscreenTextVisibility: "hidden" }}
schHeight={0.6}
pcbX={-27}
pcbY={-10}
connections={{
VIN: "net.V5",
GND: "net.GND",
EN: "net.V5",
VOUT: "net.V3V3",
}}
/>
<UsbProtection
name="U4"
{...schematicPosition("U4")}
pinAttributes={{
pin2: { requiresGround: true },
pin5: { requiresPower: true },
pin1: { isPassive: true },
pin3: { isPassive: true },
pin4: { isPassive: true },
pin6: { isPassive: true },
}}
pcbX={-31}
pcbY={0}
connections={{
pin1: "net.USB_DP",
pin6: "net.USB_DP",
pin3: "net.USB_DM",
pin4: "net.USB_DM",
pin2: "net.GND",
pin5: "net.VBUS",
}}
/>
<LM66100DCKR
name="U5"
{...schematicPosition("U5")}
pcbX={-34}
pcbY={-4}
pcbRotation={90}
connections={{
VIN: "net.FUSED_VBUS",
GND: "net.GND",
N_CE: "net.V5",
VOUT: "net.V5",
ST: "net.GND",
}}
/>
<UsbProtection
name="U6"
{...schematicPosition("U6")}
pinAttributes={{
pin2: { requiresGround: true },
pin5: { requiresPower: true },
pin1: { isPassive: true },
pin3: { isPassive: true },
pin4: { isPassive: true },
pin6: { isPassive: true },
}}
pcbX={17}
pcbY={-15}
connections={{
pin1: "net.LIMIT_MIN_WIRE",
pin6: "net.LIMIT_MIN_WIRE",
pin3: "net.LIMIT_MAX_WIRE",
pin4: "net.LIMIT_MAX_WIRE",
pin2: "net.GND",
pin5: "net.V3V3",
}}
/>
<TYPE_C_31_M_12
name="J1"
{...schematicPosition("J1")}
pinAttributes={TYPE_C_31_M_12Attributes}
pcbX={-40.5}
pcbY={0}
pcbRotation={270}
connections={{
EH1: "net.GND",
EH2: "net.GND",
EH3: "net.GND",
EH4: "net.GND",
GND1: "net.GND",
GND2: "net.GND",
VBUS1: "net.VBUS",
VBUS2: "net.VBUS",
DP1: "net.USB_DP",
DP2: "net.USB_DP",
DN1: "net.USB_DM",
DN2: "net.USB_DM",
CC1: "net.CC1",
CC2: "net.CC2",
}}
/>
<InputFuse
name="F1"
{...schematicPosition("F1")}
pinAttributes={{ pin1: { isPassive: true }, pin2: { isPassive: true } }}
pcbX={-35}
pcbY={-11}
connections={{ pin1: "net.VBUS", pin2: "net.FUSED_VBUS" }}
/>
<ClockCrystal
name="Y1"
{...schematicPosition("Y1")}
pcbX={-2.9}
pcbY={-3}
pcbRotation={90}
connections={{
pin1: "net.XIN",
pin3: "net.XTAL_OUT",
GND1: "net.GND",
GND2: "net.GND",
}}
/>
<TS_1187A_B_A_B
name="SW1"
{...schematicPosition("SW1")}
pcbX={-29}
pcbY={14}
internallyConnectedPins={[
["pin1", "pin2"],
["pin3", "pin4"],
]}
connections={{
pin1: "net.BOOT_SW",
pin2: "net.BOOT_SW",
pin3: "net.GND",
pin4: "net.GND",
}}
/>
<TS_1187A_B_A_B
name="SW2"
{...schematicPosition("SW2")}
pcbX={-29}
pcbY={-19}
internallyConnectedPins={[
["pin1", "pin2"],
["pin3", "pin4"],
]}
connections={{
pin1: "net.RUN",
pin2: "net.RUN",
pin3: "net.GND",
pin4: "net.GND",
}}
/>
<KT_0805G
name="LED1"
{...schematicPosition("LED1")}
schRotation={-90}
pcbX={-29}
pcbY={19}
connections={{ anode: "net.LED_PWR", cathode: "net.GND" }}
/>
<KT_0805G
name="LED2"
{...schematicPosition("LED2")}
schRotation={-90}
pcbX={-21}
pcbY={19}
connections={{ anode: "net.LED_STATUS", cathode: "net.GND" }}
/>
<OutputMosfet
name="Q1"
{...schematicPosition("Q1")}
pinAttributes={AO3400AAttributes}
pcbX={15}
pcbY={8}
connections={{
G: "net.STEP_GATE",
D: "net.PUL_MINUS",
S: "net.STEP_RETURN",
}}
/>
<OutputMosfet
name="Q2"
{...schematicPosition("Q2")}
pinAttributes={AO3400AAttributes}
pcbX={15}
pcbY={1}
connections={{ G: "net.ARM_GATE", D: "net.STEP_RETURN", S: "net.GND" }}
/>
<OutputMosfet
name="Q3"
{...schematicPosition("Q3")}
pinAttributes={AO3400AAttributes}
pcbX={3}
pcbY={8}
connections={{ G: "net.DIR_GATE", D: "net.DIR_MINUS", S: "net.GND" }}
/>
<OutputMosfet
name="Q4"
{...schematicPosition("Q4")}
pinAttributes={AO3400AAttributes}
pcbX={15}
pcbY={-6}
connections={{
G: "net.DISABLE_GATE",
D: "net.ENA_MINUS",
S: "net.GND",
}}
/>
<OutputMosfet
name="Q5"
{...schematicPosition("Q5")}
pinAttributes={AO3400AAttributes}
pcbX={21}
pcbY={-6}
connections={{
G: "net.ENABLE_GATE",
D: "net.DISABLE_GATE",
S: "net.GND",
}}
/>
{[
{
name: "J2",
x: 6,
y: 17,
a: "VDRV",
b: "PUL_MINUS",
label: "PUL- PUL+",
},
{
name: "J3",
x: 18,
y: 17,
a: "VDRV",
b: "DIR_MINUS",
label: "DIR- DIR+",
},
{
name: "J4",
x: 30,
y: 20,
a: "VDRV",
b: "ENA_MINUS",
label: "ENA- ENA+",
},
{
name: "J5",
x: 11,
y: -25,
a: "LIMIT_MIN_WIRE",
b: "GND",
label: "MIN GND",
},
{
name: "J6",
x: 23,
y: -25,
a: "LIMIT_MAX_WIRE",
b: "GND",
label: "MAX GND",
},
].map((connector, index) => (
<group key={connector.name} pcbX={0} pcbY={0}>
<KF350_3_5_2P
name={connector.name}
footprint={<TerminalFootprint name={connector.name} />}
schPinArrangement={{ topSide: ["pin1"], bottomSide: ["pin2"] }}
pinAttributes={{
pin1: { isPassive: true },
pin2: { isPassive: true },
}}
pcbX={connector.x}
pcbY={connector.y}
pcbRotation={index < 3 ? 180 : 0}
{...schematicPosition(connector.name)}
connections={{
pin1: `net.${connector.a}`,
pin2: `net.${connector.b}`,
}}
/>
<silkscreentext
text={connector.label}
fontSize="1.8mm"
pcbX={connector.x}
pcbY={connector.y + (index < 3 ? 5.5 : 6)}
/>
</group>
))}
{passives.map((part) => {
const purchased = catalog.find(
(entry) => entry.componentCode === part.code,
)
if (!purchased)
throw new Error(`Missing catalog evidence for ${part.name}`)
const layout = {
name: part.name,
pcbX: part.pcbX,
pcbY: part.pcbY,
pcbRotation: part.pcbRotation,
schRotation: part.nets.some((net) =>
[
"GND",
"VBUS",
"V5",
"V3V3",
"V1V1",
"VDRV",
"DRIVER_VIN",
].includes(net),
)
? -90
: 0,
...passiveSchematicPosition(part.name),
manufacturerPartNumber: purchased.componentModelEn,
supplierPartNumbers: { jlcpcb: [part.code] },
connections: {
pin1: `net.${part.nets[0]}`,
pin2: `net.${part.nets[1]}`,
},
}
const PassiveComponent = passiveComponents[part.code]
return <PassiveComponent key={part.name} {...layout} />
})}
{[
{ rail: "V5", x: -13, y: 16 },
{ rail: "V3V3", x: -9, y: 16 },
{ rail: "V1V1", x: -5, y: 16 },
{ rail: "GND", x: -1, y: 16 },
{ rail: "STEP", x: 9, y: 11 },
{ rail: "DIR", x: 0, y: 11 },
{ rail: "ENABLE", x: 23, y: 2 },
{ rail: "ARM", x: 9, y: -4 },
{ rail: "SWCLK", x: 4.2, y: -1 },
{ rail: "SWDIO", x: 3.5, y: 1.5 },
{ rail: "RUN", x: 5.5, y: -5.5 },
].map(({ rail, x, y }, index) => (
<group key={rail} pcbX={0} pcbY={0}>
<testpoint
name={`TP${index + 1}`}
footprintVariant="pad"
padDiameter="1.4mm"
footprint={
<footprint>
<smtpad
shape="circle"
radius="0.7mm"
portHints={["pin1"]}
solderPasteMargin="-0.7mm"
/>
</footprint>
}
pcbX={x}
pcbY={y}
{...schematicPosition(`TP${index + 1}`)}
connections={{ pin1: `net.${rail}` }}
/>
<silkscreentext
text={probeLabels[rail].text}
fontSize="1.8mm"
pcbX={probeLabels[rail].x}
pcbY={probeLabels[rail].y}
/>
</group>
))}
</>
)
}