ShiboSoftwareDev/nema8-20mm-dual-usbc-stepper-controller
A compact 4-layer USB‑C PD/data controller board using a CH32X035 MCU and TMC2209 driver to power and control a NEMA‑8 stepper motor, with 3.3‑V regulation, USB ESD/reverse-polarity/TVS protection, current sensing, and boot control.
- Version
- 1.0.12
- License
- unset
- Stars
- 0
scripts/inspect-usb-resistor-placement.mjs
import fs from "node:fs"
import { runAllRoutingChecks } from "@tscircuit/checks"
const original = JSON.parse(fs.readFileSync("dist/index/circuit.json", "utf8"))
.filter((element) => !String(element.type).endsWith("error"))
const transformEndpoint = (trace, portIds, transform) => ({
...trace,
route: trace.route.map((point) => (
portIds.has(point.start_pcb_port_id) || portIds.has(point.end_pcb_port_id)
? { ...point, ...transform(point.x, point.y) }
: point
)),
})
const dpPortIds = new Set(["pcb_port_36", "pcb_port_37"])
const dmPortIds = new Set(["pcb_port_34", "pcb_port_35"])
const candidate = original.map((element) => {
if (element.type === "pcb_trace") {
const dpShifted = transformEndpoint(element, dpPortIds, (x, y) => ({ x: x - 0.6, y }))
return transformEndpoint(dpShifted, dmPortIds, (x, y) => ({
x: -1.6 - (y - 2.5),
y: 1.5 + (x + 1.5),
}))
}
if (element.pcb_component_id === "pcb_component_6" && typeof element.x === "number") {
return { ...element, x: element.x - 0.6 }
}
if (element.type === "pcb_component" && element.pcb_component_id === "pcb_component_6") {
return { ...element, center: { ...element.center, x: element.center.x - 0.6 } }
}
if (element.pcb_component_id === "pcb_component_5" && typeof element.x === "number") {
return {
...element,
x: -1.6 - (element.y - 2.5),
y: 1.5 + (element.x + 1.5),
...(typeof element.width === "number" ? { width: element.height, height: element.width } : {}),
...(typeof element.rotation === "number" ? { rotation: element.rotation + 90 } : {}),
}
}
if (element.type === "pcb_component" && element.pcb_component_id === "pcb_component_5") {
return { ...element, center: { ...element.center, x: -1.6, y: 1.5 }, rotation: (element.rotation ?? 0) + 90 }
}
return element
})
const before = await runAllRoutingChecks(original)
const after = await runAllRoutingChecks(candidate)
const beforeMessages = new Set(before.map((error) => error.message))
const afterMessages = new Set(after.map((error) => error.message))
console.log(`before ${before.length}; after ${after.length}`)
console.log("removed:", [...beforeMessages].filter((message) => !afterMessages.has(message)))
console.log("added:", [...afterMessages].filter((message) => !beforeMessages.has(message)))