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
scripts/copper_geometry.py
"""Physical pad, via and drilled-hole outlines shared by copper audits."""
from shapely.geometry import Point, Polygon, LineString, box
from shapely.affinity import rotate, translate
def geometry(part, drill=False):
shape=part.get('hole_shape',part.get('shape','circle')) if drill else part.get('shape','circle')
if shape=='polygon':
if drill: raise ValueError('Polygon drill unsupported')
return Polygon([(p['x'],p['y']) for p in part['points']])
x,y=part.get('x',0),part.get('y',0)
prefix='hole_' if drill else ('outer_' if part['type'] in ['pcb_plated_hole','pcb_via'] else '')
diameter=part.get(prefix+'diameter')
if diameter is None and shape=='circle': diameter=part.get('radius',0)*2
if shape=='circle':
assert diameter and diameter>0, part
return Point(x,y).buffer(diameter/2,quad_segs=64)
width,height=part[prefix+'width'],part[prefix+'height']
if shape in ['rect','rotated_rect']:
local=box(-width/2,-height/2,width/2,height/2)
elif shape in ['pill', 'rotated_pill']:
radius=min(width,height)/2
if width>=height: ends=[(-(width-height)/2,0),((width-height)/2,0)]
else: ends=[(0,-(height-width)/2),(0,(height-width)/2)]
local=LineString(ends).buffer(radius,quad_segs=64)
else: raise ValueError(f'Unsupported shape: {shape}')
return translate(rotate(local,part.get('ccw_rotation',0),origin=(0,0)),x,y)