gokul/macro-six-usbc
USB-powered ATmega32U4 controller board with protected/switched 5 V power, six tactile keys, rotary encoder, reset/boot/ISP interfaces, power LED, and six daisy-chained SK6812 RGB LEDs driven through MOSFETs.
- Version
- 0.1.6
- License
- MIT
- Stars
- 0
enclosure/hardware.py
"""Nominal purchased screw/nut CAD, positioned in the existing case holes."""
import math
import cadquery as cq
import trimesh
def screw(spec):
x,y=spec['xy']
z=spec['seat_z']
shaft=(cq.Workplane('XY').circle(spec['diameter']/2).extrude(spec['length'])
.edges('<Z').chamfer(.12).translate((x,y,z-spec['length'])))
head=(cq.Workplane('XY').circle(spec['head_diameter']/2).extrude(spec['head_height'])
.edges('>Z').fillet(spec['head_height']/3).translate((x,y,z)))
result=shaft.union(head)
for width,height in [(spec['diameter'],.5),(.5,spec['diameter'])]:
recess=(cq.Workplane('XY').box(width,height,.9,centered=(True,True,False))
.translate((x,y,z+spec['head_height']-.7)))
result=result.cut(recess)
return result
def add_hardware(ctx):
solids=[]
for i,xy in enumerate(ctx['mounts']):
spec={'xy':xy,'seat_z':20,'diameter':3,'length':16,'head_diameter':6,'head_height':2.4}
solids.append((f'case-M3x16-{i+1}',screw(spec)))
for i,(x,y) in enumerate(ctx['plate_mounts']):
spec={'xy':(x,y),'seat_z':20,'diameter':2,'length':10,'head_diameter':4,'head_height':1.6}
solids.append((f'plate-M2x10-{i+1}',screw(spec)))
nut=(cq.Workplane('XY').polygon(6,4/math.cos(math.pi/6)).extrude(1.6)
.cut(cq.Workplane('XY').circle(1).extrude(1.6)).translate((x,y,10.1)))
solids.append((f'plate-M2-nut-{i+1}',nut))
for name,solid in solids:
assert solid.val().isValid(),name
ctx['assembly'].add(solid,name=name,color=cq.Color(.67,.69,.72))
vertices,faces=solid.val().tessellate(.1,.25)
m=trimesh.Trimesh(vertices=[v.toTuple() for v in vertices],faces=faces,process=True)
m.visual.face_colors=[171,176,184,255]
ctx['scene'].add_geometry(m,node_name=name)
return [name for name,solid in solids]