shibosoftwaredev/f1c100s-linux-nema17-stepper-controller

A four-layer NEMA 17 motor-controller PCB combining an Allwinner F1C100S Linux computer, USB‑PD/buck power system, W5500 Ethernet, STM32 real-time motion control, DRV8825 stepper driver, protection/temperature/current telemetry, USB interfaces, and local LED/buzzer diagnostics.

Version
0.4.56
License
unset
Stars
0

scripts/find-usb-adc-via.py

from route_geometry import *
from shapely.ops import unary_union
from shapely import contains_xy
import numpy as np
c=load_circuit("routing/usb-top-placement.circuit.json");root=connectivity(c)
m=json.loads(Path("routing/net-map.json").read_text())["roots"]
ports={e["pcb_port_id"]:e for e in c if e["type"]=="pcb_port"}
cu=json.loads(Path("routing/usb-top-seed-physical.json").read_text());obs=[]
for e in c:
    if e["type"] in ["pcb_smtpad","pcb_plated_hole"]:
        p=ports.get(e.get("pcb_port_id"));n=m[root(p["source_port_id"])] if p else None
        obs.append(geometry(e,"outer_" if e["type"]=="pcb_plated_hole" else "").buffer(.331 if n=="N158" else .354))
        if e["type"]=="pcb_plated_hole":obs.append(geometry(e,"hole_").buffer(.429))
    elif e["type"]=="pcb_hole":obs.append(geometry(e,"hole_").buffer(.429))
for w in cu["wires"]:
    if w["net"]!="N158":obs.append(LineString(w["points"]).buffer(w["width"]/2+.354))
for v in cu["vias"]:
    if v["net"]!="N158":obs.append(Point(v["x"],v["y"]).buffer(.554))
x,y=np.meshgrid(np.arange(9,13.001,.05),np.arange(8.3,11.301,.05));blocked=contains_xy(unary_union(obs),x,y)
out=[(round(float(a),3),round(float(b),3)) for a,b in zip(x[~blocked],y[~blocked])]
out.sort(key=lambda p:math.dist(p,(10.8,10.1)))
print(json.dumps(dict(legalViaSites=len(out),nearest=out[:40])))