ShiboSoftwareDev/nema8-20mm-dual-usbc-stepper-controller
A compact 4-layer USB‑C PD stepper-motor controller PCB using a CH32X035 MCU, TMC2209 driver, dual USB‑C ports, power protection/regulation, ESD/TVS diodes, current-sense resistors, and NEMA‑8 motor connector.
- Version
- 1.0.13
- License
- unset
- Stars
- 0
scripts/search-usb-cc-tails.mjs
import fs from "node:fs"
import { runAllRoutingChecks } from "@tscircuit/checks"
let circuit = JSON.parse(fs.readFileSync("dist/index/circuit.json", "utf8"))
.filter((element) => !String(element.type).endsWith("error"))
const wire = (x, y, layer, extra = {}) => ({ route_type: "wire", x, y, width: 0.15, layer, ...extra })
const replaceTail = (input, traceId, viaIndex, laneX, laneStartY, endpointY) => input.map((element) => {
if (element.type !== "pcb_trace" || element.pcb_trace_id !== traceId) return element
const via = element.route[viaIndex]
const endpoint = element.route[element.route.length - 1]
return {
...element,
route: [
...element.route.slice(0, viaIndex + 1),
wire(via.x, via.y, "bottom"),
wire(laneX, laneStartY, "bottom"),
wire(laneX, endpointY, "bottom"),
wire(endpoint.x, endpoint.y, "bottom", { end_pcb_port_id: endpoint.end_pcb_port_id }),
],
}
})
let errors = await runAllRoutingChecks(circuit)
console.log(`start\t${errors.length}`)
const searches = [
{ traceId: "source_net_8_0", viaIndex: 33, endpointY: -0.8, lanes: [-2.8,-2.6,-2.4,-2.2,-2.0,-1.8], starts: [-2.4,-2.2,-2.0,-1.8,-1.6] },
{ traceId: "source_net_7_0", viaIndex: 23, endpointY: -0.4, lanes: [-2.8,-2.6,-2.4,-2.2,-2.0,-1.8], starts: [-4.4,-4.2,-4.0,-3.8,-3.6] },
]
for (const search of searches) {
let best = { count: errors.length, circuit, errors, lane: 0, start: 0 }
for (const lane of search.lanes) {
for (const start of search.starts) {
const candidate = replaceTail(circuit, search.traceId, search.viaIndex, lane, start, search.endpointY)
const candidateErrors = await runAllRoutingChecks(candidate)
if (candidateErrors.length < best.count) {
best = { count: candidateErrors.length, circuit: candidate, errors: candidateErrors, lane, start }
}
}
}
circuit = best.circuit
errors = best.errors
console.log(`${search.traceId}\t${best.count}\t${best.lane},${best.start}`)
}
console.log(errors.map((error) => error.message).join("\n"))